[PATCH] dwrite: Update to IDWriteFont3

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 7 08:10:17 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/font.c       | 132 ++++++++++++++++++++++++++++++-----------------
 dlls/dwrite/tests/font.c |  38 ++++++++++++--
 include/dwrite_3.idl     |   9 ++++
 3 files changed, 130 insertions(+), 49 deletions(-)

diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 0ebb49c..6ce439d 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -138,7 +138,7 @@ struct dwrite_fontfamily {
 };
 
 struct dwrite_font {
-    IDWriteFont2 IDWriteFont2_iface;
+    IDWriteFont3 IDWriteFont3_iface;
     LONG ref;
 
     IDWriteFontFamily *family;
@@ -248,9 +248,9 @@ static inline struct dwrite_fontface *impl_from_IDWriteFontFace3(IDWriteFontFace
     return CONTAINING_RECORD(iface, struct dwrite_fontface, IDWriteFontFace3_iface);
 }
 
-static inline struct dwrite_font *impl_from_IDWriteFont2(IDWriteFont2 *iface)
+static inline struct dwrite_font *impl_from_IDWriteFont3(IDWriteFont3 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont2_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont3_iface);
 }
 
 static inline struct dwrite_fontfile *impl_from_IDWriteFontFile(IDWriteFontFile *iface)
@@ -1223,9 +1223,9 @@ static HRESULT get_fontface_from_font(struct dwrite_font *font, IDWriteFontFace3
     return hr;
 }
 
-static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont3 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
 
@@ -1235,7 +1235,7 @@ static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid
         IsEqualIID(riid, &IID_IUnknown))
     {
         *obj = iface;
-        IDWriteFont2_AddRef(iface);
+        IDWriteFont3_AddRef(iface);
         return S_OK;
     }
 
@@ -1243,17 +1243,17 @@ static HRESULT WINAPI dwritefont_QueryInterface(IDWriteFont2 *iface, REFIID riid
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI dwritefont_AddRef(IDWriteFont2 *iface)
+static ULONG WINAPI dwritefont_AddRef(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     ULONG ref = InterlockedIncrement(&This->ref);
     TRACE("(%p)->(%d)\n", This, ref);
     return ref;
 }
 
-static ULONG WINAPI dwritefont_Release(IDWriteFont2 *iface)
+static ULONG WINAPI dwritefont_Release(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p)->(%d)\n", This, ref);
@@ -1267,9 +1267,9 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont2 *iface)
     return ref;
 }
 
-static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont2 *iface, IDWriteFontFamily **family)
+static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont3 *iface, IDWriteFontFamily **family)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)->(%p)\n", This, family);
 
     *family = This->family;
@@ -1277,30 +1277,30 @@ static HRESULT WINAPI dwritefont_GetFontFamily(IDWriteFont2 *iface, IDWriteFontF
     return S_OK;
 }
 
-static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont2 *iface)
+static DWRITE_FONT_WEIGHT WINAPI dwritefont_GetWeight(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)\n", This);
     return This->data->weight;
 }
 
-static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont2 *iface)
+static DWRITE_FONT_STRETCH WINAPI dwritefont_GetStretch(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)\n", This);
     return This->data->stretch;
 }
 
-static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont2 *iface)
+static DWRITE_FONT_STYLE WINAPI dwritefont_GetStyle(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)\n", This);
     return This->style;
 }
 
-static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     IDWriteFontFace3 *fontface;
     HRESULT hr;
 
@@ -1313,17 +1313,17 @@ static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont2 *iface)
     return IDWriteFontFace3_IsSymbolFont(fontface);
 }
 
-static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont2 *iface, IDWriteLocalizedStrings **names)
+static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont3 *iface, IDWriteLocalizedStrings **names)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)->(%p)\n", This, names);
     return clone_localizedstring(This->data->names, names);
 }
 
-static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont2 *iface,
+static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont3 *iface,
     DWRITE_INFORMATIONAL_STRING_ID stringid, IDWriteLocalizedStrings **strings, BOOL *exists)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     struct dwrite_font_data *data = This->data;
     HRESULT hr;
 
@@ -1367,24 +1367,24 @@ static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont2 *iface,
     return S_OK;
 }
 
-static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont2 *iface)
+static DWRITE_FONT_SIMULATIONS WINAPI dwritefont_GetSimulations(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)\n", This);
     return This->data->simulations;
 }
 
-static void WINAPI dwritefont_GetMetrics(IDWriteFont2 *iface, DWRITE_FONT_METRICS *metrics)
+static void WINAPI dwritefont_GetMetrics(IDWriteFont3 *iface, DWRITE_FONT_METRICS *metrics)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
 
     TRACE("(%p)->(%p)\n", This, metrics);
     memcpy(metrics, &This->data->metrics, sizeof(*metrics));
 }
 
-static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont2 *iface, UINT32 value, BOOL *exists)
+static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont3 *iface, UINT32 value, BOOL *exists)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     IDWriteFontFace3 *fontface;
     UINT16 index;
     HRESULT hr;
@@ -1406,9 +1406,9 @@ static HRESULT WINAPI dwritefont_HasCharacter(IDWriteFont2 *iface, UINT32 value,
     return S_OK;
 }
 
-static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont2 *iface, IDWriteFontFace **face)
+static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont3 *iface, IDWriteFontFace **face)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     HRESULT hr;
 
     TRACE("(%p)->(%p)\n", This, face);
@@ -1420,23 +1420,23 @@ static HRESULT WINAPI dwritefont_CreateFontFace(IDWriteFont2 *iface, IDWriteFont
     return hr;
 }
 
-static void WINAPI dwritefont1_GetMetrics(IDWriteFont2 *iface, DWRITE_FONT_METRICS1 *metrics)
+static void WINAPI dwritefont1_GetMetrics(IDWriteFont3 *iface, DWRITE_FONT_METRICS1 *metrics)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)->(%p)\n", This, metrics);
     *metrics = This->data->metrics;
 }
 
-static void WINAPI dwritefont1_GetPanose(IDWriteFont2 *iface, DWRITE_PANOSE *panose)
+static void WINAPI dwritefont1_GetPanose(IDWriteFont3 *iface, DWRITE_PANOSE *panose)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     TRACE("(%p)->(%p)\n", This, panose);
     *panose = This->data->panose;
 }
 
-static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont2 *iface, UINT32 max_count, DWRITE_UNICODE_RANGE *ranges, UINT32 *count)
+static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont3 *iface, UINT32 max_count, DWRITE_UNICODE_RANGE *ranges, UINT32 *count)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     IDWriteFontFace3 *fontface;
     HRESULT hr;
 
@@ -1449,9 +1449,9 @@ static HRESULT WINAPI dwritefont1_GetUnicodeRanges(IDWriteFont2 *iface, UINT32 m
     return IDWriteFontFace3_GetUnicodeRanges(fontface, max_count, ranges, count);
 }
 
-static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     IDWriteFontFace3 *fontface;
     HRESULT hr;
 
@@ -1464,9 +1464,9 @@ static BOOL WINAPI dwritefont1_IsMonospacedFont(IDWriteFont2 *iface)
     return IDWriteFontFace3_IsMonospacedFont(fontface);
 }
 
-static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont2 *iface)
+static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont3 *iface)
 {
-    struct dwrite_font *This = impl_from_IDWriteFont2(iface);
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
     IDWriteFontFace3 *fontface;
     HRESULT hr;
 
@@ -1479,7 +1479,42 @@ static BOOL WINAPI dwritefont2_IsColorFont(IDWriteFont2 *iface)
     return IDWriteFontFace3_IsColorFont(fontface);
 }
 
-static const IDWriteFont2Vtbl dwritefontvtbl = {
+static HRESULT WINAPI dwritefont3_CreateFontFace(IDWriteFont3 *iface, IDWriteFontFace3 **fontface)
+{
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+    FIXME("(%p)->(%p): stub\n", This, fontface);
+    return E_NOTIMPL;
+}
+
+static BOOL WINAPI dwritefont3_Equals(IDWriteFont3 *iface, IDWriteFont *font)
+{
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+    FIXME("(%p)->(%p): stub\n", This, font);
+    return FALSE;
+}
+
+static HRESULT WINAPI dwritefont3_GetFontFaceReference(IDWriteFont3 *iface, IDWriteFontFaceReference **reference)
+{
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+    FIXME("(%p)->(%p): stub\n", This, reference);
+    return E_NOTIMPL;
+}
+
+static BOOL WINAPI dwritefont3_HasCharacter(IDWriteFont3 *iface, UINT32 ch)
+{
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+    FIXME("(%p)->(0x%x): stub\n", This, ch);
+    return FALSE;
+}
+
+static DWRITE_LOCALITY WINAPI dwritefont3_GetLocality(IDWriteFont3 *iface)
+{
+    struct dwrite_font *This = impl_from_IDWriteFont3(iface);
+    FIXME("(%p): stub\n", This);
+    return DWRITE_LOCALITY_LOCAL;
+}
+
+static const IDWriteFont3Vtbl dwritefontvtbl = {
     dwritefont_QueryInterface,
     dwritefont_AddRef,
     dwritefont_Release,
@@ -1498,7 +1533,12 @@ static const IDWriteFont2Vtbl dwritefontvtbl = {
     dwritefont1_GetPanose,
     dwritefont1_GetUnicodeRanges,
     dwritefont1_IsMonospacedFont,
-    dwritefont2_IsColorFont
+    dwritefont2_IsColorFont,
+    dwritefont3_CreateFontFace,
+    dwritefont3_Equals,
+    dwritefont3_GetFontFaceReference,
+    dwritefont3_HasCharacter,
+    dwritefont3_GetLocality
 };
 
 static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *family, IDWriteFont **font)
@@ -1509,7 +1549,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
     This = heap_alloc(sizeof(struct dwrite_font));
     if (!This) return E_OUTOFMEMORY;
 
-    This->IDWriteFont2_iface.lpVtbl = &dwritefontvtbl;
+    This->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl;
     This->ref = 1;
     This->family = family;
     IDWriteFontFamily_AddRef(family);
@@ -1517,7 +1557,7 @@ static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily *fam
     This->data = data;
     InterlockedIncrement(&This->data->ref);
 
-    *font = (IDWriteFont*)&This->IDWriteFont2_iface;
+    *font = (IDWriteFont*)&This->IDWriteFont3_iface;
 
     return S_OK;
 }
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index cd63ce7..0e3f6ee 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -26,7 +26,7 @@
 
 #include "windows.h"
 #include "winternl.h"
-#include "dwrite_2.h"
+#include "dwrite_3.h"
 #include "initguid.h"
 #include "d2d1.h"
 
@@ -2415,8 +2415,6 @@ static void test_GetFontFromFontFace(void)
     DELETE_FONTFILE(path);
 }
 
-
-
 static void test_GetFirstMatchingFont(void)
 {
     DWRITE_FONT_SIMULATIONS simulations;
@@ -5268,6 +5266,39 @@ static void test_TranslateColorGlyphRun(void)
     IDWriteFactory2_Release(factory2);
 }
 
+static void test_HasCharacter(void)
+{
+    IDWriteFactory3 *factory3;
+    IDWriteFactory *factory;
+    IDWriteFont3 *font3;
+    IDWriteFont *font;
+    HRESULT hr;
+    BOOL ret;
+
+    factory = create_factory();
+
+    font = get_tahoma_instance(factory, DWRITE_FONT_STYLE_NORMAL);
+    ok(font != NULL, "failed to create font\n");
+
+    /* Win8 is broken, QI claims to support IDWriteFont3, but in fact it does not */
+    hr = IDWriteFactory_QueryInterface(factory, &IID_IDWriteFactory3, (void**)&factory3);
+    if (hr == S_OK) {
+        hr = IDWriteFont_QueryInterface(font, &IID_IDWriteFont3, (void**)&font3);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        ret = IDWriteFont3_HasCharacter(font3, 'A');
+        ok(ret, "got %d\n", ret);
+
+        IDWriteFont3_Release(font3);
+        IDWriteFactory3_Release(factory3);
+    }
+    else
+        skip("IDWriteFont3 is not supported.\n");
+
+    IDWriteFont_Release(font);
+    IDWriteFactory_Release(factory);
+}
+
 START_TEST(font)
 {
     IDWriteFactory *factory;
@@ -5320,6 +5351,7 @@ START_TEST(font)
     test_IsSymbolFont();
     test_GetPaletteEntries();
     test_TranslateColorGlyphRun();
+    test_HasCharacter();
 
     IDWriteFactory_Release(factory);
 }
diff --git a/include/dwrite_3.idl b/include/dwrite_3.idl
index dc19cf9..967cd95 100644
--- a/include/dwrite_3.idl
+++ b/include/dwrite_3.idl
@@ -252,3 +252,12 @@ interface IDWriteTextLayout3 : IDWriteTextLayout2
     HRESULT GetLineSpacing(DWRITE_LINE_SPACING *spacing);
     HRESULT GetLineMetrics(DWRITE_LINE_METRICS1 *metrics, UINT32 max_count, UINT32 *count);
 }
+
+[
+    local,
+    object,
+    uuid(9a1b41c3-d3bb-466a-87fc-fe67556a3b65)
+]
+interface IDWriteFactory3 : IDWriteFactory2
+{
+}
-- 
2.7.0




More information about the wine-patches mailing list