Module: wine Branch: master Commit: f7f9339969d82480df790dfbb9fb7e059edb2881 URL: https://source.winehq.org/git/wine.git/?a=commit;h=f7f9339969d82480df790dfbb...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Dec 9 11:09:36 2019 +0300
dwrite: Compare axis values when testing for face reference equality.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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);