Nikolay Sivov : dwrite: Implement SetFontFallback().

Alexandre Julliard julliard at wine.codeweavers.com
Tue Mar 17 11:01:59 CDT 2015


Module: wine
Branch: master
Commit: fa1fe44c342e1912d54b3cc02281877915735ec9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fa1fe44c342e1912d54b3cc02281877915735ec9

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Mar 15 03:52:35 2015 +0300

dwrite: Implement SetFontFallback().

---

 dlls/dwrite/layout.c       | 26 ++++++++++++++++++--------
 dlls/dwrite/tests/layout.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 58 insertions(+), 9 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 8e8bc9d..7326aa3 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -235,6 +235,16 @@ static HRESULT get_fontfallback_from_format(const struct dwrite_textformat_data
     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)
 {
     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)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
-    FIXME("(%p)->(%p): stub\n", This, fallback);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, fallback);
+    return set_fontfallback_for_format(&This->format, 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)
 {
     struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface);
-    FIXME("(%p)->(%p): stub\n", This, fallback);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, fallback);
+    return IDWriteTextLayout2_SetFontFallback(&This->IDWriteTextLayout2_iface, fallback);
 }
 
 static HRESULT WINAPI dwritetextformat1_layout_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback)
 {
     struct dwrite_textlayout *This = impl_layout_form_IDWriteTextFormat1(iface);
-    TRACE("(%p)->(%p): stub\n", This, fallback);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, fallback);
+    return IDWriteTextLayout2_GetFontFallback(&This->IDWriteTextLayout2_iface, fallback);
 }
 
 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)
 {
     struct dwrite_textformat *This = impl_from_IDWriteTextFormat1(iface);
-    FIXME("(%p)->(%p): stub\n", This, fallback);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, fallback);
+    return set_fontfallback_for_format(&This->format, fallback);
 }
 
 static HRESULT WINAPI dwritetextformat1_GetFontFallback(IDWriteTextFormat1 *iface, IDWriteFontFallback **fallback)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index b06c6bc..5b15c37 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -1204,10 +1204,12 @@ static void test_SetVerticalGlyphOrientation(void)
 static void test_fallback(void)
 {
     static const WCHAR strW[] = {'a','b','c','d',0};
-    IDWriteFontFallback *fallback;
+    IDWriteFontFallback *fallback, *fallback2;
     IDWriteTextLayout2 *layout2;
+    IDWriteTextFormat1 *format1;
     IDWriteTextFormat *format;
     IDWriteTextLayout *layout;
+    IDWriteFactory2 *factory2;
     IDWriteFactory *factory;
     HRESULT hr;
 
@@ -1238,6 +1240,43 @@ if (0) /* crashes on native */
     ok(hr == S_OK, "got 0x%08x\n", hr);
     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);
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list