Signed-off-by: Nikolay Sivov nsivov@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);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/font.c | 11 +++++++++-- dlls/dwrite/tests/font.c | 10 ++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 84e3af8b70..9280b5d32a 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -6280,9 +6280,16 @@ static UINT32 WINAPI fontfacereference1_GetFontAxisValueCount(IDWriteFontFaceRef static HRESULT WINAPI fontfacereference1_GetFontAxisValues(IDWriteFontFaceReference1 *iface, DWRITE_FONT_AXIS_VALUE *axis_values, UINT32 value_count) { - FIXME("%p, %p, %u.\n", iface, axis_values, value_count); + struct dwrite_fontfacereference *reference = impl_from_IDWriteFontFaceReference1(iface);
- return E_NOTIMPL; + TRACE("%p, %p, %u.\n", iface, axis_values, value_count); + + if (value_count < reference->axis_values_count) + return E_NOT_SUFFICIENT_BUFFER; + + memcpy(axis_values, reference->axis_values, value_count * sizeof(*axis_values)); + + return S_OK; }
static const IDWriteFontFaceReference1Vtbl fontfacereferencevtbl = diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 219a0510ea..3dff4a6191 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -9408,6 +9408,16 @@ static void test_font_resource(void) ok(!ret, "Unexpected result.\n"); IDWriteFontFaceReference1_Release(reference2);
+ memset(axis_values, 0, sizeof(axis_values)); + hr = IDWriteFontFaceReference1_GetFontAxisValues(reference, axis_values, 1); + ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr); + ok(!axis_values[0].axisTag, "Unexpected axis tag.\n"); + + memset(axis_values, 0, sizeof(axis_values)); + hr = IDWriteFontFaceReference1_GetFontAxisValues(reference, axis_values, 2); + ok(hr == S_OK, "Failed to get axis values, hr %#x.\n", hr); + ok(axis_values[0].axisTag == DWRITE_FONT_AXIS_TAG_WEIGHT, "Unexpected axis tag.\n"); + IDWriteFontFaceReference1_Release(reference);
IDWriteFontFile_Release(fontfile);