[PATCH 1/4] dwrite: Implement CreateTextFormat() for IDWriteFactory6.

Nikolay Sivov nsivov at codeweavers.com
Tue Apr 26 01:15:25 CDT 2022


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/dwrite_private.h |  5 +++--
 dlls/dwrite/format.c         | 13 ++++++++-----
 dlls/dwrite/main.c           | 34 ++++++++++++++++++++++++++++------
 dlls/dwrite/tests/layout.c   |  5 +----
 4 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index fdc916adc40..944f4cab635 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -286,8 +286,9 @@ struct dwrite_fontface
 };
 
 extern HRESULT create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD,const WCHAR *locale,BOOL,IDWriteNumberSubstitution**) DECLSPEC_HIDDEN;
-extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH,
-                                 FLOAT,const WCHAR*,IDWriteTextFormat**) DECLSPEC_HIDDEN;
+extern HRESULT create_text_format(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale, REFIID riid,
+        void **out) DECLSPEC_HIDDEN;
 extern HRESULT create_textlayout(const struct textlayout_desc*,IDWriteTextLayout**) DECLSPEC_HIDDEN;
 extern HRESULT create_trimmingsign(IDWriteFactory7 *factory, IDWriteTextFormat *format,
         IDWriteInlineObject **sign) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/format.c b/dlls/dwrite/format.c
index 133ca87e97f..dd120fe032e 100644
--- a/dlls/dwrite/format.c
+++ b/dlls/dwrite/format.c
@@ -711,12 +711,14 @@ struct dwrite_textformat *unsafe_impl_from_IDWriteTextFormat(IDWriteTextFormat *
         CONTAINING_RECORD(iface, struct dwrite_textformat, IDWriteTextFormat3_iface) : NULL;
 }
 
-HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight,
-        DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale, IDWriteTextFormat **format)
+HRESULT create_text_format(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight,
+        DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale,
+        REFIID riid, void **out)
 {
     struct dwrite_textformat *object;
+    HRESULT hr;
 
-    *format = NULL;
+    *out = NULL;
 
     if (size <= 0.0f)
         return E_INVALIDARG;
@@ -746,9 +748,10 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle
     object->format.collection = collection;
     IDWriteFontCollection_AddRef(object->format.collection);
 
-    *format = (IDWriteTextFormat *)&object->IDWriteTextFormat3_iface;
+    hr = IDWriteTextFormat3_QueryInterface(&object->IDWriteTextFormat3_iface, riid, out);
+    IDWriteTextFormat3_Release(&object->IDWriteTextFormat3_iface);
 
-    return S_OK;
+    return hr;
 }
 
 static HRESULT WINAPI dwritetrimmingsign_QueryInterface(IDWriteInlineObject *iface, REFIID riid, void **obj)
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 01b47e673bb..c869ec3df54 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1199,7 +1199,8 @@ static HRESULT WINAPI dwritefactory_CreateTextFormat(IDWriteFactory7 *iface, WCH
         return hr;
     }
 
-    hr = create_textformat(family_name, collection, weight, style, stretch, size, locale, format);
+    hr = create_text_format(family_name, collection, weight, style, stretch, size, locale,
+            &IID_IDWriteTextFormat, (void **)format);
     IDWriteFontCollection_Release(collection);
     return hr;
 }
@@ -1895,14 +1896,35 @@ static HRESULT WINAPI dwritefactory6_CreateFontSetBuilder(IDWriteFactory7 *iface
     return create_fontset_builder(iface, builder);
 }
 
-static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *familyname,
+static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *family_name,
         IDWriteFontCollection *collection, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_axis,
-        FLOAT fontsize, const WCHAR *localename, IDWriteTextFormat3 **format)
+        float size, const WCHAR *locale, IDWriteTextFormat3 **format)
 {
-    FIXME("%p, %s, %p, %p, %u, %.8e, %s, %p.\n", iface, debugstr_w(familyname), collection, axis_values, num_axis,
-            fontsize, debugstr_w(localename), format);
+    struct dwritefactory *factory = impl_from_IDWriteFactory7(iface);
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %s, %p, %p, %u, %.8e, %s, %p.\n", iface, debugstr_w(family_name), collection, axis_values, num_axis,
+            size, debugstr_w(locale), format);
+
+    *format = NULL;
+
+    if (axis_values)
+        FIXME("Axis values are ignored.\n");
+
+    if (collection)
+    {
+        IDWriteFontCollection_AddRef(collection);
+    }
+    else if (FAILED(hr = factory_get_system_collection(factory, DWRITE_FONT_FAMILY_MODEL_TYPOGRAPHIC,
+            &IID_IDWriteFontCollection, (void **)&collection)))
+    {
+        return hr;
+    }
+
+    hr = create_text_format(family_name, collection, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+            DWRITE_FONT_STRETCH_NORMAL, size, locale, &IID_IDWriteTextFormat3, (void **)format);
+    IDWriteFontCollection_Release(collection);
+    return hr;
 }
 
 static HRESULT WINAPI dwritefactory7_GetSystemFontSet(IDWriteFactory7 *iface, BOOL include_downloadable,
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 43b6efa107b..24ec3be7585 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -5986,11 +5986,8 @@ static void test_text_format_axes(void)
     }
 
     hr = IDWriteFactory6_CreateTextFormat(factory, L"test_family", NULL, NULL, 0, 10.0f, L"en-us", &format3);
-    todo_wine
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
 
-if (SUCCEEDED(hr))
-{
     hr = IDWriteTextFormat3_GetFontCollection(format3, &collection);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
 
@@ -6025,7 +6022,7 @@ if (SUCCEEDED(hr))
     ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "Unexpected font weight %d.\n", weight);
 
     IDWriteTextFormat3_Release(format3);
-}
+
     hr = IDWriteFactory_CreateTextFormat((IDWriteFactory *)factory, L"test_family", NULL,
             DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_ITALIC, DWRITE_FONT_STRETCH_EXPANDED,
             10.0f, L"en-us", &format);
-- 
2.35.1




More information about the wine-devel mailing list