dwrite: Implement SetFontFallback().

This commit is contained in:
Nikolay Sivov 2015-03-15 03:52:35 +03:00 committed by Alexandre Julliard
parent c2c3001387
commit fa1fe44c34
2 changed files with 58 additions and 9 deletions

View File

@ -235,6 +235,16 @@ static HRESULT get_fontfallback_from_format(const struct dwrite_textformat_data
return S_OK; return S_OK;
} }
static HRESULT set_fontfallback_for_format(struct dwrite_textformat_data *format, IDWriteFontFallback *fallback)
{
if (format->fallback)
IDWriteFontFallback_Release(format->fallback);
format->fallback = fallback;
if (fallback)
IDWriteFontFallback_AddRef(fallback);
return S_OK;
}
static struct layout_run *alloc_layout_run(void) static struct layout_run *alloc_layout_run(void)
{ {
struct layout_run *ret; struct layout_run *ret;
@ -1867,8 +1877,8 @@ static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextlayout2_GetOpticalAlignment(IDW
static HRESULT WINAPI dwritetextlayout2_SetFontFallback(IDWriteTextLayout2 *iface, IDWriteFontFallback *fallback) static HRESULT WINAPI dwritetextlayout2_SetFontFallback(IDWriteTextLayout2 *iface, IDWriteFontFallback *fallback)
{ {
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface); struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
FIXME("(%p)->(%p): stub\n", This, fallback); TRACE("(%p)->(%p)\n", This, fallback);
return E_NOTIMPL; return set_fontfallback_for_format(&This->format, fallback);
} }
static HRESULT WINAPI dwritetextlayout2_GetFontFallback(IDWriteTextLayout2 *iface, IDWriteFontFallback **fallback) static HRESULT WINAPI dwritetextlayout2_GetFontFallback(IDWriteTextLayout2 *iface, IDWriteFontFallback **fallback)
@ -2228,15 +2238,15 @@ static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextformat1_layout_GetOpticalAlignm
static HRESULT WINAPI dwritetextformat1_layout_SetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback *fallback) static HRESULT WINAPI dwritetextformat1_layout_SetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback *fallback)
{ {
struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface); struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface);
FIXME("(%p)->(%p): stub\n", This, fallback); TRACE("(%p)->(%p)\n", This, fallback);
return E_NOTIMPL; return IDWriteTextLayout2_SetFontFallback(&This->IDWriteTextLayout2_iface, fallback);
} }
static HRESULT WINAPI dwritetextformat1_layout_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback) static HRESULT WINAPI dwritetextformat1_layout_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback)
{ {
struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface); struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface);
TRACE("(%p)->(%p): stub\n", This, fallback); TRACE("(%p)->(%p)\n", This, fallback);
return E_NOTIMPL; return IDWriteTextLayout2_GetFontFallback(&This->IDWriteTextLayout2_iface, fallback);
} }
static const IDWriteTextFormat1Vtbl dwritetextformat1_layout_vtbl = { static const IDWriteTextFormat1Vtbl dwritetextformat1_layout_vtbl = {
@ -3055,8 +3065,8 @@ static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextformat1_GetOpticalAlignment(IDW
static HRESULT WINAPI dwritetextformat1_SetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback *fallback) static HRESULT WINAPI dwritetextformat1_SetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback *fallback)
{ {
struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface); struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface);
FIXME("(%p)->(%p): stub\n", This, fallback); TRACE("(%p)->(%p)\n", This, fallback);
return E_NOTIMPL; return set_fontfallback_for_format(&This->format, fallback);
} }
static HRESULT WINAPI dwritetextformat1_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback) static HRESULT WINAPI dwritetextformat1_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback)

View File

@ -1204,10 +1204,12 @@ static void test_SetVerticalGlyphOrientation(void)
static void test_fallback(void) static void test_fallback(void)
{ {
static const WCHAR strW[] = {'a','b','c','d',0}; static const WCHAR strW[] = {'a','b','c','d',0};
IDWriteFontFallback *fallback; IDWriteFontFallback *fallback, *fallback2;
IDWriteTextLayout2 *layout2; IDWriteTextLayout2 *layout2;
IDWriteTextFormat1 *format1;
IDWriteTextFormat *format; IDWriteTextFormat *format;
IDWriteTextLayout *layout; IDWriteTextLayout *layout;
IDWriteFactory2 *factory2;
IDWriteFactory *factory; IDWriteFactory *factory;
HRESULT hr; HRESULT hr;
@ -1238,6 +1240,43 @@ if (0) /* crashes on native */
ok(hr == S_OK, "got 0x%08x\n", hr); ok(hr == S_OK, "got 0x%08x\n", hr);
ok(fallback == NULL, "got %p\n", fallback); ok(fallback == NULL, "got %p\n", fallback);
hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (void**)&format1);
ok(hr == S_OK, "got 0x%08x\n", hr);
fallback = (void*)0xdeadbeef;
hr = IDWriteTextFormat1_GetFontFallback(format1, &fallback);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(fallback == NULL, "got %p\n", fallback);
hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory2, (void**)&factory2);
ok(hr == S_OK, "got 0x%08x\n", hr);
fallback = NULL;
hr = IDWriteFactory2_GetSystemFontFallback(factory2, &fallback);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
if (hr == S_OK) {
ok(fallback != NULL, "got %p\n", fallback);
hr = IDWriteTextFormat1_SetFontFallback(format1, fallback);
ok(hr == S_OK, "got 0x%08x\n", hr);
fallback2 = (void*)0xdeadbeef;
hr = IDWriteTextLayout2_GetFontFallback(layout2, &fallback2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(fallback2 == fallback, "got %p\n", fallback2);
hr = IDWriteTextLayout2_SetFontFallback(layout2, NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
fallback2 = (void*)0xdeadbeef;
hr = IDWriteTextFormat1_GetFontFallback(format1, &fallback2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(fallback2 == NULL, "got %p\n", fallback2);
IDWriteFontFallback_Release(fallback);
}
IDWriteTextFormat1_Release(format1);
IDWriteTextLayout2_Release(layout2); IDWriteTextLayout2_Release(layout2);
IDWriteFactory_Release(factory); IDWriteFactory_Release(factory);
} }