[PATCH 1/2] dwrite: Compare axis values when testing for face reference equality.

Nikolay Sivov nsivov at codeweavers.com
Mon Dec 9 02:09:36 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c       | 28 +++++++++++++------
 dlls/dwrite/tests/font.c | 60 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 75 insertions(+), 13 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 2670a22839..84e3af8b70 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -236,6 +236,8 @@ struct dwrite_fontfacereference
     IDWriteFactory7 *factory;
 };
 
+static const IDWriteFontFaceReference1Vtbl fontfacereferencevtbl;
+
 struct dwrite_fontresource
 {
     IDWriteFontResource IDWriteFontResource_iface;
@@ -1896,6 +1898,16 @@ struct dwrite_fontface *unsafe_impl_from_IDWriteFontFace(IDWriteFontFace *iface)
     return CONTAINING_RECORD(iface, struct dwrite_fontface, IDWriteFontFace5_iface);
 }
 
+static struct dwrite_fontfacereference *unsafe_impl_from_IDWriteFontFaceReference(IDWriteFontFaceReference *iface)
+{
+    if (!iface)
+        return NULL;
+    if (iface->lpVtbl != (IDWriteFontFaceReferenceVtbl *)&fontfacereferencevtbl)
+        return NULL;
+    return CONTAINING_RECORD((IDWriteFontFaceReference1 *)iface, struct dwrite_fontfacereference,
+            IDWriteFontFaceReference1_iface);
+}
+
 void get_logfont_from_font(IDWriteFont *iface, LOGFONTW *lf)
 {
     struct dwrite_font *font = unsafe_impl_from_IDWriteFont(iface);
@@ -6132,18 +6144,18 @@ static HRESULT WINAPI fontfacereference_CreateFontFaceWithSimulations(IDWriteFon
 static BOOL WINAPI fontfacereference_Equals(IDWriteFontFaceReference1 *iface, IDWriteFontFaceReference *ref)
 {
     struct dwrite_fontfacereference *reference = impl_from_IDWriteFontFaceReference1(iface);
-    IDWriteFontFile *file;
+    struct dwrite_fontfacereference *other = unsafe_impl_from_IDWriteFontFaceReference(ref);
     BOOL ret;
 
     TRACE("%p, %p.\n", iface, ref);
 
-    if (FAILED(IDWriteFontFaceReference_GetFontFile(ref, &file)))
-        return FALSE;
-
-    ret = is_same_fontfile(reference->file, file) &&
-            reference->index == IDWriteFontFaceReference_GetFontFaceIndex(ref) &&
-            reference->simulations == IDWriteFontFaceReference_GetSimulations(ref);
-    IDWriteFontFile_Release(file);
+    ret = is_same_fontfile(reference->file, other->file) && reference->index == other->index &&
+            reference->simulations == other->simulations;
+    if (reference->axis_values_count)
+    {
+        ret &= reference->axis_values_count == other->axis_values_count &&
+                !memcmp(reference->axis_values, other->axis_values, reference->axis_values_count * sizeof(*reference->axis_values));
+    }
 
     return ret;
 }
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index a0d36e2f0b..219a0510ea 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -9279,13 +9279,14 @@ static void test_font_resource(void)
     IDWriteFontFaceReference1 *reference, *reference2;
     IDWriteFontResource *resource, *resource2;
     IDWriteFontFile *fontfile, *fontfile2;
-    DWRITE_FONT_AXIS_VALUE axis_value;
+    DWRITE_FONT_AXIS_VALUE axis_values[2];
     IDWriteFontFace5 *fontface5;
     IDWriteFontFace *fontface;
     IDWriteFactory6 *factory;
     UINT32 count, index;
     HRESULT hr;
     ULONG ref;
+    BOOL ret;
 
     if (!(factory = create_factory_iid(&IID_IDWriteFactory6)))
     {
@@ -9316,9 +9317,9 @@ static void test_font_resource(void)
     ok(!index, "Unexpected index %u.\n", index);
 
     /* Specify axis value, font has no variations. */
-    axis_value.axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
-    axis_value.value = 400.0f;
-    hr = IDWriteFontResource_CreateFontFaceReference(resource, DWRITE_FONT_SIMULATIONS_NONE, &axis_value, 1, &reference);
+    axis_values[0].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+    axis_values[0].value = 400.0f;
+    hr = IDWriteFontResource_CreateFontFaceReference(resource, DWRITE_FONT_SIMULATIONS_NONE, axis_values, 1, &reference);
     ok(hr == S_OK, "Failed to create reference object, hr %#x.\n", hr);
 
     count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference);
@@ -9326,7 +9327,7 @@ static void test_font_resource(void)
 
     IDWriteFontFaceReference1_Release(reference);
 
-    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, &axis_value, 1,
+    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, axis_values, 1,
             &reference);
     count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference);
     ok(count == 1, "Unexpected axis value count.\n");
@@ -9360,6 +9361,55 @@ static void test_font_resource(void)
 
     IDWriteFontFace5_Release(fontface5);
 
+    /* Reference equality regarding set axis values. */
+    axis_values[0].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+    axis_values[0].value = 400.0f;
+    axis_values[1].axisTag = DWRITE_FONT_AXIS_TAG_ITALIC;
+    axis_values[1].value = 1.0f;
+    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, axis_values, 2,
+            &reference);
+    count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference);
+    ok(count == 2, "Unexpected axis value count.\n");
+
+    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, NULL, 0,
+            &reference2);
+    count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference2);
+    ok(!count, "Unexpected axis value count.\n");
+
+    ret = IDWriteFontFaceReference1_Equals(reference, (IDWriteFontFaceReference *)reference2);
+    ok(!ret, "Unexpected result.\n");
+    IDWriteFontFaceReference1_Release(reference2);
+
+    /* Different values order. */
+    axis_values[0].axisTag = DWRITE_FONT_AXIS_TAG_ITALIC;
+    axis_values[0].value = 1.0f;
+    axis_values[1].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+    axis_values[1].value = 400.0f;
+    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, axis_values, 2,
+            &reference2);
+    count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference2);
+    ok(count == 2, "Unexpected axis value count.\n");
+
+    ret = IDWriteFontFaceReference1_Equals(reference, (IDWriteFontFaceReference *)reference2);
+    ok(!ret, "Unexpected result.\n");
+    IDWriteFontFaceReference1_Release(reference2);
+
+    /* Different axis values. */
+    axis_values[0].axisTag = DWRITE_FONT_AXIS_TAG_ITALIC;
+    axis_values[0].value = 1.0f;
+    axis_values[1].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+    axis_values[1].value = 401.0f;
+    hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, axis_values, 2,
+            &reference2);
+    count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference2);
+    ok(count == 2, "Unexpected axis value count.\n");
+
+    ret = IDWriteFontFaceReference1_Equals(reference, (IDWriteFontFaceReference *)reference2);
+    ok(!ret, "Unexpected result.\n");
+    IDWriteFontFaceReference1_Release(reference2);
+
+    IDWriteFontFaceReference1_Release(reference);
+
     IDWriteFontFile_Release(fontfile);
 
     IDWriteFontFace_Release(fontface);
-- 
2.24.0




More information about the wine-devel mailing list