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>
This commit is contained in:
parent
ae67aa8bbf
commit
f7f9339969
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue