dwrite: Add newer CreateFontFaceReference() variant.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
6f7a9158f4
commit
7e665fd267
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue