Module: wine Branch: master Commit: c3252c37743eb813d2cc928fd3f57d00ebdfa28a URL: http://source.winehq.org/git/wine.git/?a=commit;h=c3252c37743eb813d2cc928fd3...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Sep 21 14:41:25 2017 +0300
dwrite: Added custom IDWriteFontFallback stub.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/analyzer.c | 64 +++++++++++++++++++++++++++++++++++++++++++--- dlls/dwrite/tests/layout.c | 57 ++++++++++++++++++++++++++--------------- 2 files changed, 98 insertions(+), 23 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c index 23c2c0e..db488a0 100644 --- a/dlls/dwrite/analyzer.c +++ b/dlls/dwrite/analyzer.c @@ -209,6 +209,7 @@ static const struct fallback_mapping fontfallback_neutral_data[] = {
struct dwrite_fontfallback { IDWriteFontFallback IDWriteFontFallback_iface; + LONG ref; IDWriteFactory5 *factory; IDWriteFontCollection1 *systemcollection; const struct fallback_mapping *mappings; @@ -2178,6 +2179,50 @@ void release_system_fontfallback(IDWriteFontFallback *iface) 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) { struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface); @@ -2239,13 +2284,26 @@ static HRESULT WINAPI fontfallbackbuilder_AddMappings(IDWriteFontFallbackBuilder }
static HRESULT WINAPI fontfallbackbuilder_CreateFontFallback(IDWriteFontFallbackBuilder *iface, - IDWriteFontFallback **fallback) + IDWriteFontFallback **ret) { 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 = diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index d606b8e..ba3e852 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -4655,8 +4655,8 @@ static void test_FontFallbackBuilder(void) { static const WCHAR localeW[] = {'l','o','c','a','l','e',0}; static const WCHAR strW[] = {'A',0}; + IDWriteFontFallback *fallback, *fallback2; IDWriteFontFallbackBuilder *builder; - IDWriteFontFallback *fallback; DWRITE_UNICODE_RANGE range; IDWriteFactory2 *factory2; IDWriteFactory *factory; @@ -4684,10 +4684,27 @@ static void test_FontFallbackBuilder(void) }
fallback = NULL; + EXPECT_REF(factory2, 2); + EXPECT_REF(builder, 1); hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); -todo_wine { 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); ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
@@ -4724,17 +4741,14 @@ todo_wine { hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, NULL, NULL, NULL, 4.0f); ok(hr == S_OK, "got 0x%08x\n", hr); } - if (fallback) - IDWriteFontFallback_Release(fallback); + IDWriteFontFallback_Release(fallback);
if (0) /* crashes on native */ hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, NULL);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
-if (hr == S_OK) { /* fallback font missing from system collection */ g_source = strW; mappedlength = 0; @@ -4742,13 +4756,14 @@ if (hr == S_OK) { font = (void*)0xdeadbeef; hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); +todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(mappedlength == 1, "got %u\n", mappedlength); ok(scale == 1.0f, "got %f\n", scale); ok(font == NULL, "got %p\n", font); - - IDWriteFontFallback_Release(fallback); } + IDWriteFontFallback_Release(fallback); + /* remap with custom collection */ range.first = range.last = 'A'; hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 5.0f); @@ -4756,24 +4771,25 @@ todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
-if (hr == S_OK) { g_source = strW; mappedlength = 0; scale = 0.0f; font = NULL; hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); +todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(mappedlength == 1, "got %u\n", mappedlength); ok(scale == 5.0f, "got %f\n", scale); ok(font != NULL, "got %p\n", font); - IDWriteFont_Release(font); +} + if (font) + IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); -} + range.first = 'B'; range.last = 'A'; hr = IDWriteFontFallbackBuilder_AddMapping(builder, &range, 1, &familyW, 1, &fallbackcollection, NULL, NULL, 6.0f); @@ -4781,24 +4797,25 @@ todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
-if (hr == S_OK) { g_source = strW; mappedlength = 0; scale = 0.0f; font = NULL; hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); +todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(mappedlength == 1, "got %u\n", mappedlength); ok(scale == 5.0f, "got %f\n", scale); ok(font != NULL, "got %p\n", font); - IDWriteFont_Release(font); +} + if (font) + IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); -} + /* explicit locale */ range.first = 'A'; range.last = 'B'; @@ -4807,24 +4824,24 @@ todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFallbackBuilder_CreateFontFallback(builder, &fallback); -todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
-if (hr == S_OK) { g_source = strW; mappedlength = 0; scale = 0.0f; font = NULL; hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, NULL, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); +todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(mappedlength == 1, "got %u\n", mappedlength); ok(scale == 5.0f, "got %f\n", scale); ok(font != NULL, "got %p\n", font); - IDWriteFont_Release(font); +} + if (font) + IDWriteFont_Release(font);
IDWriteFontFallback_Release(fallback); -}
IDWriteFontFallbackBuilder_Release(builder); ref = IDWriteFactory2_Release(factory2);