[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