Commit c3252c37 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

dwrite: Added custom IDWriteFontFallback stub.

parent ca13227e
...@@ -209,6 +209,7 @@ static const struct fallback_mapping fontfallback_neutral_data[] = { ...@@ -209,6 +209,7 @@ static const struct fallback_mapping fontfallback_neutral_data[] = {
struct dwrite_fontfallback { struct dwrite_fontfallback {
IDWriteFontFallback IDWriteFontFallback_iface; IDWriteFontFallback IDWriteFontFallback_iface;
LONG ref;
IDWriteFactory5 *factory; IDWriteFactory5 *factory;
IDWriteFontCollection1 *systemcollection; IDWriteFontCollection1 *systemcollection;
const struct fallback_mapping *mappings; const struct fallback_mapping *mappings;
...@@ -2178,6 +2179,50 @@ void release_system_fontfallback(IDWriteFontFallback *iface) ...@@ -2178,6 +2179,50 @@ void release_system_fontfallback(IDWriteFontFallback *iface)
heap_free(fallback); heap_free(fallback);
} }
static ULONG WINAPI customfontfallback_AddRef(IDWriteFontFallback *iface)
{
struct dwrite_fontfallback *fallback = impl_from_IDWriteFontFallback(iface);
ULONG ref = InterlockedIncrement(&fallback->ref);
TRACE("(%p)->(%d)\n", fallback, ref);
return ref;
}
static ULONG WINAPI customfontfallback_Release(IDWriteFontFallback *iface)
{
struct dwrite_fontfallback *fallback = impl_from_IDWriteFontFallback(iface);
ULONG ref = InterlockedDecrement(&fallback->ref);
TRACE("(%p)->(%d)\n", fallback, ref);
if (!ref) {
IDWriteFactory5_Release(fallback->factory);
heap_free(fallback);
}
return ref;
}
static HRESULT WINAPI customfontfallback_MapCharacters(IDWriteFontFallback *iface, IDWriteTextAnalysisSource *source,
UINT32 position, UINT32 length, IDWriteFontCollection *basecollection, const WCHAR *basefamily,
DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, UINT32 *mapped_length,
IDWriteFont **ret_font, FLOAT *scale)
{
struct dwrite_fontfallback *fallback = impl_from_IDWriteFontFallback(iface);
FIXME("(%p)->(%p %u %u %p, %s, %u, %u, %u, %p, %p, %p)\n", fallback, source, position, length,
basecollection, debugstr_w(basefamily), weight, style, stretch, mapped_length, ret_font, scale);
return E_NOTIMPL;
}
static const IDWriteFontFallbackVtbl customfontfallbackvtbl =
{
fontfallback_QueryInterface,
customfontfallback_AddRef,
customfontfallback_Release,
customfontfallback_MapCharacters,
};
static HRESULT WINAPI fontfallbackbuilder_QueryInterface(IDWriteFontFallbackBuilder *iface, REFIID riid, void **obj) static HRESULT WINAPI fontfallbackbuilder_QueryInterface(IDWriteFontFallbackBuilder *iface, REFIID riid, void **obj)
{ {
struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface); struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface);
...@@ -2239,13 +2284,26 @@ static HRESULT WINAPI fontfallbackbuilder_AddMappings(IDWriteFontFallbackBuilder ...@@ -2239,13 +2284,26 @@ static HRESULT WINAPI fontfallbackbuilder_AddMappings(IDWriteFontFallbackBuilder
} }
static HRESULT WINAPI fontfallbackbuilder_CreateFontFallback(IDWriteFontFallbackBuilder *iface, static HRESULT WINAPI fontfallbackbuilder_CreateFontFallback(IDWriteFontFallbackBuilder *iface,
IDWriteFontFallback **fallback) IDWriteFontFallback **ret)
{ {
struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface); struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface);
struct dwrite_fontfallback *fallback;
FIXME("(%p)->(%p): stub\n", fallbackbuilder, fallback); FIXME("(%p)->(%p): stub\n", fallbackbuilder, ret);
return E_NOTIMPL; *ret = NULL;
fallback = heap_alloc(sizeof(*fallback));
if (!fallback)
return E_OUTOFMEMORY;
fallback->IDWriteFontFallback_iface.lpVtbl = &customfontfallbackvtbl;
fallback->ref = 1;
fallback->factory = fallbackbuilder->factory;
IDWriteFactory5_AddRef(fallback->factory);
*ret = &fallback->IDWriteFontFallback_iface;
return S_OK;
} }
static const IDWriteFontFallbackBuilderVtbl fontfallbackbuildervtbl = static const IDWriteFontFallbackBuilderVtbl fontfallbackbuildervtbl =
......
...@@ -4655,8 +4655,8 @@ static void test_FontFallbackBuilder(void) ...@@ -4655,8 +4655,8 @@ static void test_FontFallbackBuilder(void)
{ {
static const WCHAR localeW[] = {'l','o','c','a','l','e',0}; static const WCHAR localeW[] = {'l','o','c','a','l','e',0};
static const WCHAR strW[] = {'A',0}; static const WCHAR strW[] = {'A',0};
IDWriteFontFallback *fallback, *fallback2;
IDWriteFontFallbackBuilder *builder; IDWriteFontFallbackBuilder *builder;
IDWriteFontFallback *fallback;
DWRITE_UNICODE_RANGE range; DWRITE_UNICODE_RANGE range;
IDWriteFactory2 *factory2; IDWriteFactory2 *factory2;
IDWriteFactory *factory; IDWriteFactory *factory;
...@@ -4684,10 +4684,27 @@ static void test_FontFallbackBuilder(void) ...@@ -4684,10 +4684,27 @@ static void test_FontFallbackBuilder(void)
} }
fallback = NULL; fallback = NULL;
EXPECT_REF(factory2, 2);
EXPECT_REF(builder, 1);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
EXPECT_REF(factory2, 3);
EXPECT_REF(fallback, 1);
EXPECT_REF(builder, 1);
IDWriteFontFallback_AddRef(fallback);
EXPECT_REF(builder, 1);
EXPECT_REF(fallback, 2);
EXPECT_REF(factory2, 3);
IDWriteFontFallback_Release(fallback);
/* New instance is created every time, even if mappings have not changed. */
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback2);
ok(hr == S_OK, "Failed to create fallback object, hr %#x.\n", hr);
ok(fallback != fallback2, "Unexpected fallback instance.\n");
IDWriteFontFallback_Release(fallback2);
todo_wine {
hr = IDWriteFontFallbackBuilder_AddMapping(builder, NULL, 0, NULL, 0, NULL, NULL, NULL, 0.0f); hr = IDWriteFontFallbackBuilder_AddMapping(builder, NULL, 0, NULL, 0, NULL, NULL, NULL, 0.0f);
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
...@@ -4724,17 +4741,14 @@ todo_wine { ...@@ -4724,17 +4741,14 @@ todo_wine {
hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, NULL, NULL, NULL, 4.0f); hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, NULL, NULL, NULL, 4.0f);
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
} }
if (fallback)
IDWriteFontFallback_Release(fallback); IDWriteFontFallback_Release(fallback);
if (0) /* crashes on native */ if (0) /* crashes on native */
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, NULL); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, NULL);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
if (hr == S_OK) {
/* fallback font missing from system collection */ /* fallback font missing from system collection */
g_source = strW; g_source = strW;
mappedlength = 0; mappedlength = 0;
...@@ -4742,13 +4756,14 @@ if (hr == S_OK) { ...@@ -4742,13 +4756,14 @@ if (hr == S_OK) {
font = (void*)0xdeadbeef; font = (void*)0xdeadbeef;
hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(mappedlength == 1, "got %u\n", mappedlength); ok(mappedlength == 1, "got %u\n", mappedlength);
ok(scale == 1.0f, "got %f\n", scale); ok(scale == 1.0f, "got %f\n", scale);
ok(font == NULL, "got %p\n", font); ok(font == NULL, "got %p\n", font);
IDWriteFontFallback_Release(fallback);
} }
IDWriteFontFallback_Release(fallback);
/* remap with custom collection */ /* remap with custom collection */
range.first = range.last = 'A'; range.first = range.last = 'A';
hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 5.0f); hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 5.0f);
...@@ -4756,24 +4771,25 @@ todo_wine ...@@ -4756,24 +4771,25 @@ todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
if (hr == S_OK) {
g_source = strW; g_source = strW;
mappedlength = 0; mappedlength = 0;
scale = 0.0f; scale = 0.0f;
font = NULL; font = NULL;
hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(mappedlength == 1, "got %u\n", mappedlength); ok(mappedlength == 1, "got %u\n", mappedlength);
ok(scale == 5.0f, "got %f\n", scale); ok(scale == 5.0f, "got %f\n", scale);
ok(font != NULL, "got %p\n", font); ok(font != NULL, "got %p\n", font);
}
if (font)
IDWriteFont_Release(font); IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); IDWriteFontFallback_Release(fallback);
}
range.first = 'B'; range.first = 'B';
range.last = 'A'; range.last = 'A';
hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 6.0f); hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 6.0f);
...@@ -4781,24 +4797,25 @@ todo_wine ...@@ -4781,24 +4797,25 @@ todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
if (hr == S_OK) {
g_source = strW; g_source = strW;
mappedlength = 0; mappedlength = 0;
scale = 0.0f; scale = 0.0f;
font = NULL; font = NULL;
hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(mappedlength == 1, "got %u\n", mappedlength); ok(mappedlength == 1, "got %u\n", mappedlength);
ok(scale == 5.0f, "got %f\n", scale); ok(scale == 5.0f, "got %f\n", scale);
ok(font != NULL, "got %p\n", font); ok(font != NULL, "got %p\n", font);
}
if (font)
IDWriteFont_Release(font); IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); IDWriteFontFallback_Release(fallback);
}
/* explicit locale */ /* explicit locale */
range.first = 'A'; range.first = 'A';
range.last = 'B'; range.last = 'B';
...@@ -4807,24 +4824,24 @@ todo_wine ...@@ -4807,24 +4824,24 @@ todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
if (hr == S_OK) {
g_source = strW; g_source = strW;
mappedlength = 0; mappedlength = 0;
scale = 0.0f; scale = 0.0f;
font = NULL; font = NULL;
hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL,
DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale);
todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(mappedlength == 1, "got %u\n", mappedlength); ok(mappedlength == 1, "got %u\n", mappedlength);
ok(scale == 5.0f, "got %f\n", scale); ok(scale == 5.0f, "got %f\n", scale);
ok(font != NULL, "got %p\n", font); ok(font != NULL, "got %p\n", font);
}
if (font)
IDWriteFont_Release(font); IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); IDWriteFontFallback_Release(fallback);
}
IDWriteFontFallbackBuilder_Release(builder); IDWriteFontFallbackBuilder_Release(builder);
ref = IDWriteFactory2_Release(factory2); ref = IDWriteFactory2_Release(factory2);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment