diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 1598bb6aee4..9447c59663c 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -262,8 +262,9 @@ extern void release_system_fontfallback(IDWriteFontFallback1 *fallback) DECLSPEC extern HRESULT create_fontfallback_builder(IDWriteFactory5*,IDWriteFontFallbackBuilder**) DECLSPEC_HIDDEN; extern HRESULT create_matching_font(IDWriteFontCollection*,const WCHAR*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH, IDWriteFont**) DECLSPEC_HIDDEN; -extern HRESULT create_fontfacereference(IDWriteFactory5*,IDWriteFontFile*,UINT32,DWRITE_FONT_SIMULATIONS, - IDWriteFontFaceReference**) DECLSPEC_HIDDEN; +extern HRESULT create_fontfacereference(IDWriteFactory5 *factory, IDWriteFontFile *file, UINT32 face_index, + DWRITE_FONT_SIMULATIONS simulations, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 axis_values_count, + IDWriteFontFaceReference1 **reference) DECLSPEC_HIDDEN; extern HRESULT factory_get_cached_fontface(IDWriteFactory5*,IDWriteFontFile*const*,UINT32,DWRITE_FONT_SIMULATIONS, struct list**,REFIID,void**) DECLSPEC_HIDDEN; extern void factory_detach_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection3 *collection) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 8045bce870c..c9f1e885d58 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -231,6 +231,8 @@ struct dwrite_fontfacereference IDWriteFontFile *file; UINT32 index; USHORT simulations; + DWRITE_FONT_AXIS_VALUE *axis_values; + UINT32 axis_values_count; IDWriteFactory5 *factory; }; @@ -6081,6 +6083,7 @@ static ULONG WINAPI fontfacereference_Release(IDWriteFontFaceReference1 *iface) { IDWriteFontFile_Release(reference->file); IDWriteFactory5_Release(reference->factory); + heap_free(reference->axis_values); heap_free(reference); } @@ -6253,9 +6256,11 @@ static HRESULT WINAPI fontfacereference1_CreateFontFace(IDWriteFontFaceReference static UINT32 WINAPI fontfacereference1_GetFontAxisValueCount(IDWriteFontFaceReference1 *iface) { - FIXME("%p.\n", iface); + struct dwrite_fontfacereference *reference = impl_from_IDWriteFontFaceReference1(iface); - return 0; + TRACE("%p.\n", iface); + + return reference->axis_values_count; } static HRESULT WINAPI fontfacereference1_GetFontAxisValues(IDWriteFontFaceReference1 *iface, @@ -6291,7 +6296,8 @@ static const IDWriteFontFaceReference1Vtbl fontfacereferencevtbl = }; HRESULT create_fontfacereference(IDWriteFactory5 *factory, IDWriteFontFile *file, UINT32 index, - DWRITE_FONT_SIMULATIONS simulations, IDWriteFontFaceReference **ret) + DWRITE_FONT_SIMULATIONS simulations, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 axis_values_count, + IDWriteFontFaceReference1 **ret) { struct dwrite_fontfacereference *object; @@ -6300,7 +6306,7 @@ HRESULT create_fontfacereference(IDWriteFactory5 *factory, IDWriteFontFile *file if (!is_simulation_valid(simulations)) return E_INVALIDARG; - object = heap_alloc(sizeof(*object)); + object = heap_alloc_zero(sizeof(*object)); if (!object) return E_OUTOFMEMORY; @@ -6313,8 +6319,18 @@ HRESULT create_fontfacereference(IDWriteFactory5 *factory, IDWriteFontFile *file IDWriteFontFile_AddRef(object->file); object->index = index; object->simulations = simulations; + if (axis_values_count) + { + if (!(object->axis_values = heap_alloc(axis_values_count * sizeof(*axis_values)))) + { + IDWriteFontFaceReference1_Release(&object->IDWriteFontFaceReference1_iface); + return E_OUTOFMEMORY; + } + memcpy(object->axis_values, axis_values, axis_values_count * sizeof(*axis_values)); + object->axis_values_count = axis_values_count; + } - *ret = (IDWriteFontFaceReference *)&object->IDWriteFontFaceReference1_iface; + *ret = &object->IDWriteFontFaceReference1_iface; return S_OK; } diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index e4b76823ff1..5f30b8e4f4e 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -1443,7 +1443,8 @@ static HRESULT WINAPI dwritefactory3_CreateFontFaceReference_(IDWriteFactory7 *i { TRACE("%p, %p, %u, %x, %p.\n", iface, file, index, simulations, reference); - return create_fontfacereference((IDWriteFactory5 *)iface, file, index, simulations, reference); + return create_fontfacereference((IDWriteFactory5 *)iface, file, index, simulations, NULL, 0, + (IDWriteFontFaceReference1 **)reference); } static HRESULT WINAPI dwritefactory3_CreateFontFaceReference(IDWriteFactory7 *iface, WCHAR const *path, @@ -1455,13 +1456,15 @@ static HRESULT WINAPI dwritefactory3_CreateFontFaceReference(IDWriteFactory7 *if TRACE("%p, %s, %p, %u, %#x, %p.\n", iface, debugstr_w(path), writetime, index, simulations, reference); - hr = IDWriteFactory5_CreateFontFileReference((IDWriteFactory5 *)iface, path, writetime, &file); - if (FAILED(hr)) { + hr = IDWriteFactory7_CreateFontFileReference(iface, path, writetime, &file); + if (FAILED(hr)) + { *reference = NULL; return hr; } - hr = IDWriteFactory5_CreateFontFaceReference_((IDWriteFactory5 *)iface, file, index, simulations, reference); + hr = create_fontfacereference((IDWriteFactory5 *)iface, file, index, simulations, NULL, 0, + (IDWriteFontFaceReference1 **)reference); IDWriteFontFile_Release(file); return hr; } @@ -1656,11 +1659,13 @@ static HRESULT WINAPI dwritefactory5_UnpackFontFile(IDWriteFactory7 *iface, DWRI static HRESULT WINAPI dwritefactory6_CreateFontFaceReference(IDWriteFactory7 *iface, IDWriteFontFile *file, UINT32 face_index, DWRITE_FONT_SIMULATIONS simulations, DWRITE_FONT_AXIS_VALUE const *axis_values, - UINT32 num_axis, IDWriteFontFaceReference1 **ref) + UINT32 axis_values_count, IDWriteFontFaceReference1 **reference) { - FIXME("%p, %p, %u, %#x, %p, %u, %p.\n", iface, file, face_index, simulations, axis_values, num_axis, ref); + TRACE("%p, %p, %u, %#x, %p, %u, %p.\n", iface, file, face_index, simulations, axis_values, axis_values_count, + reference); - return E_NOTIMPL; + return create_fontfacereference((IDWriteFactory5 *)iface, file, face_index, simulations, axis_values, + axis_values_count, reference); } static HRESULT WINAPI dwritefactory6_CreateFontResource(IDWriteFactory7 *iface, IDWriteFontFile *file, diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 83d6be44499..5ab01465b78 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -9239,6 +9239,7 @@ static void test_font_resource(void) IDWriteFontFaceReference1 *reference, *reference2; IDWriteFontResource *resource, *resource2; IDWriteFontFile *fontfile, *fontfile2; + DWRITE_FONT_AXIS_VALUE axis_value; IDWriteFontFace5 *fontface5; IDWriteFontFace *fontface; IDWriteFactory6 *factory; @@ -9274,22 +9275,34 @@ static void test_font_resource(void) index = IDWriteFontResource_GetFontFaceIndex(resource); 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); + ok(hr == S_OK, "Failed to create reference object, hr %#x.\n", hr); + + count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference); + ok(count == 1, "Unexpected axis value count.\n"); + + IDWriteFontFaceReference1_Release(reference); + + hr = IDWriteFactory6_CreateFontFaceReference(factory, fontfile, 0, DWRITE_FONT_SIMULATIONS_NONE, &axis_value, 1, + &reference); + count = IDWriteFontFaceReference1_GetFontAxisValueCount(reference); + ok(count == 1, "Unexpected axis value count.\n"); + IDWriteFontFaceReference1_Release(reference); + EXPECT_REF(resource, 1); hr = IDWriteFontResource_CreateFontFaceReference(resource, DWRITE_FONT_SIMULATIONS_NONE, NULL, 0, &reference); -todo_wine ok(hr == S_OK, "Failed to create reference object, hr %#x.\n", hr); EXPECT_REF(resource, 1); hr = IDWriteFontResource_CreateFontFaceReference(resource, DWRITE_FONT_SIMULATIONS_NONE, NULL, 0, &reference2); -todo_wine ok(hr == S_OK, "Failed to create reference object, hr %#x.\n", hr); - -if (SUCCEEDED(hr)) -{ ok(reference != reference2, "Unexpected reference instance.\n"); IDWriteFontFaceReference1_Release(reference2); IDWriteFontFaceReference1_Release(reference); -} + hr = IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace5, (void **)&fontface5); ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);