Nikolay Sivov : dwrite: Add font set builder stub.

Alexandre Julliard julliard at winehq.org
Thu Jan 21 16:19:16 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Jan 21 16:36:52 2021 +0300

dwrite: Add font set builder stub.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/dwrite_private.h |   1 +
 dlls/dwrite/font.c           | 146 +++++++++++++++++++++++++++++++++++++++++++
 dlls/dwrite/main.c           |  12 ++--
 dlls/dwrite/tests/font.c     |  17 +++--
 4 files changed, 161 insertions(+), 15 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index f3636876251..9fd9e0bc68f 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -346,6 +346,7 @@ extern void factory_unlock(IDWriteFactory7 *factory) DECLSPEC_HIDDEN;
 extern HRESULT create_inmemory_fileloader(IDWriteInMemoryFontFileLoader **loader) DECLSPEC_HIDDEN;
 extern HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UINT32 face_index,
         IDWriteFontResource **resource) DECLSPEC_HIDDEN;
+extern HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret) DECLSPEC_HIDDEN;
 
 struct dwrite_fontface;
 
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 392c1dd0ee8..014240a1c8f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -250,6 +250,13 @@ struct dwrite_fontresource
     IDWriteFactory7 *factory;
 };
 
+struct dwrite_fontset_builder
+{
+    IDWriteFontSetBuilder2 IDWriteFontSetBuilder2_iface;
+    LONG refcount;
+    IDWriteFactory7 *factory;
+};
+
 static void dwrite_grab_font_table(void *context, UINT32 table, const BYTE **data, UINT32 *size, void **data_context)
 {
     struct dwrite_fontface *fontface = context;
@@ -373,6 +380,11 @@ static struct dwrite_fontresource *impl_from_IDWriteFontResource(IDWriteFontReso
     return CONTAINING_RECORD(iface, struct dwrite_fontresource, IDWriteFontResource_iface);
 }
 
+static struct dwrite_fontset_builder *impl_from_IDWriteFontSetBuilder2(IDWriteFontSetBuilder2 *iface)
+{
+    return CONTAINING_RECORD(iface, struct dwrite_fontset_builder, IDWriteFontSetBuilder2_iface);
+}
+
 static HRESULT get_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics)
 {
     static const DWRITE_GLYPH_METRICS nil;
@@ -7105,3 +7117,137 @@ HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UI
 
     return S_OK;
 }
+
+static HRESULT WINAPI dwritefontsetbuilder_QueryInterface(IDWriteFontSetBuilder2 *iface,
+        REFIID riid, void **obj)
+{
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
+
+    if (IsEqualIID(riid, &IID_IDWriteFontSetBuilder2) ||
+            IsEqualIID(riid, &IID_IDWriteFontSetBuilder1) ||
+            IsEqualIID(riid, &IID_IDWriteFontSetBuilder) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *obj = iface;
+        IDWriteFontSetBuilder2_AddRef(iface);
+        return S_OK;
+    }
+
+    WARN("Unsupported interface %s.\n", debugstr_guid(riid));
+    *obj = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI dwritefontsetbuilder_AddRef(IDWriteFontSetBuilder2 *iface)
+{
+    struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface);
+    ULONG refcount = InterlockedIncrement(&builder->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    return refcount;
+}
+
+static ULONG WINAPI dwritefontsetbuilder_Release(IDWriteFontSetBuilder2 *iface)
+{
+    struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface);
+    ULONG refcount = InterlockedDecrement(&builder->refcount);
+
+    TRACE("%p, refcount %u.\n", iface, refcount);
+
+    if (!refcount)
+    {
+        IDWriteFactory7_Release(builder->factory);
+        heap_free(builder);
+    }
+
+    return refcount;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference_(IDWriteFontSetBuilder2 *iface,
+        IDWriteFontFaceReference *ref, DWRITE_FONT_PROPERTY const *props, UINT32 prop_count)
+{
+    FIXME("%p, %p, %p, %u.\n", iface, ref, props, prop_count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference(IDWriteFontSetBuilder2 *iface,
+        IDWriteFontFaceReference *ref)
+{
+    FIXME("%p, %p.\n", iface, ref);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder_AddFontSet(IDWriteFontSetBuilder2 *iface, IDWriteFontSet *fontset)
+{
+    FIXME("%p, %p.\n", iface, fontset);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder_CreateFontSet(IDWriteFontSetBuilder2 *iface, IDWriteFontSet **fontset)
+{
+    FIXME("%p, %p.\n", iface, fontset);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder1_AddFontFile(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file)
+{
+    FIXME("%p, %p.\n", iface, file);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder2_AddFont(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file,
+        unsigned int face_index, DWRITE_FONT_SIMULATIONS simulations, const DWRITE_FONT_AXIS_VALUE *axis_values,
+        unsigned int num_values, const DWRITE_FONT_AXIS_RANGE *axis_ranges, unsigned int num_ranges,
+        const DWRITE_FONT_PROPERTY *props, unsigned int num_properties)
+{
+    FIXME("%p, %p, %u, %#x, %p, %u, %p, %u, %p, %u.\n", iface, file, face_index, simulations, axis_values, num_values,
+            axis_ranges, num_ranges, props, num_properties);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI dwritefontsetbuilder2_AddFontFile(IDWriteFontSetBuilder2 *iface, const WCHAR *filepath)
+{
+    FIXME("%p, %s.\n", iface, debugstr_w(filepath));
+
+    return E_NOTIMPL;
+}
+
+static const IDWriteFontSetBuilder2Vtbl fontsetbuildervtbl =
+{
+    dwritefontsetbuilder_QueryInterface,
+    dwritefontsetbuilder_AddRef,
+    dwritefontsetbuilder_Release,
+    dwritefontsetbuilder_AddFontFaceReference_,
+    dwritefontsetbuilder_AddFontFaceReference,
+    dwritefontsetbuilder_AddFontSet,
+    dwritefontsetbuilder_CreateFontSet,
+    dwritefontsetbuilder1_AddFontFile,
+    dwritefontsetbuilder2_AddFont,
+    dwritefontsetbuilder2_AddFontFile,
+};
+
+HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2 **ret)
+{
+    struct dwrite_fontset_builder *builder;
+
+    *ret = NULL;
+
+    if (!(builder = heap_alloc_zero(sizeof(*builder))))
+        return E_OUTOFMEMORY;
+
+    builder->IDWriteFontSetBuilder2_iface.lpVtbl = &fontsetbuildervtbl;
+    builder->refcount = 1;
+    builder->factory = factory;
+    IDWriteFactory7_AddRef(builder->factory);
+
+    *ret = &builder->IDWriteFontSetBuilder2_iface;
+
+    return S_OK;
+}
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index dd9bd4dc6a3..0cc0edd1ffc 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1501,9 +1501,9 @@ static HRESULT WINAPI dwritefactory3_GetSystemFontSet(IDWriteFactory7 *iface, ID
 
 static HRESULT WINAPI dwritefactory3_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder **builder)
 {
-    FIXME("%p, %p: stub\n", iface, builder);
+    TRACE("%p, %p.\n", iface, builder);
 
-    return E_NOTIMPL;
+    return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder);
 }
 
 static HRESULT WINAPI dwritefactory3_CreateFontCollectionFromFontSet(IDWriteFactory7 *iface, IDWriteFontSet *fontset,
@@ -1644,9 +1644,9 @@ static HRESULT WINAPI dwritefactory4_ComputeGlyphOrigins(IDWriteFactory7 *iface,
 
 static HRESULT WINAPI dwritefactory5_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder1 **builder)
 {
-    FIXME("%p, %p: stub\n", iface, builder);
+    TRACE("%p, %p.\n", iface, builder);
 
-    return E_NOTIMPL;
+    return create_fontset_builder(iface, (IDWriteFontSetBuilder2 **)builder);
 }
 
 static HRESULT WINAPI dwritefactory5_CreateInMemoryFontFileLoader(IDWriteFactory7 *iface,
@@ -1725,9 +1725,9 @@ static HRESULT WINAPI dwritefactory6_CreateFontCollectionFromFontSet(IDWriteFact
 
 static HRESULT WINAPI dwritefactory6_CreateFontSetBuilder(IDWriteFactory7 *iface, IDWriteFontSetBuilder2 **builder)
 {
-    FIXME("%p, %p.\n", iface, builder);
+    TRACE("%p, %p.\n", iface, builder);
 
-    return E_NOTIMPL;
+    return create_fontset_builder(iface, builder);
 }
 
 static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *familyname,
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 193f8ed9c48..872405b1639 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -9371,21 +9371,15 @@ static void test_fontsetbuilder(void)
     HRESULT hr;
 
     factory = create_factory_iid(&IID_IDWriteFactory3);
-    if (!factory) {
-        skip("IDWriteFontSetBuilder is not supported.\n");
+    if (!factory)
+    {
+        win_skip("IDWriteFontSetBuilder is not supported.\n");
         return;
     }
 
     EXPECT_REF(factory, 1);
     hr = IDWriteFactory3_CreateFontSetBuilder(factory, &builder);
-todo_wine
     ok(hr == S_OK, "Failed to create font set builder, hr %#x.\n", hr);
-
-    if (FAILED(hr)) {
-        IDWriteFactory3_Release(factory);
-        return;
-    }
-
     EXPECT_REF(factory, 2);
     IDWriteFontSetBuilder_Release(builder);
 
@@ -9419,12 +9413,16 @@ todo_wine
 
             EXPECT_REF(ref, 1);
             hr = IDWriteFontSetBuilder_AddFontFaceReference(builder, ref);
+       todo_wine
             ok(hr == S_OK, "Failed to add fontface reference, hr %#x.\n", hr);
             EXPECT_REF(ref, 1);
 
             hr = IDWriteFontSetBuilder_CreateFontSet(builder, &fontset);
+       todo_wine
             ok(hr == S_OK, "Failed to create a font set, hr %#x.\n", hr);
 
+        if (SUCCEEDED(hr))
+        {
             setcount = IDWriteFontSet_GetFontCount(fontset);
             ok(setcount == 1, "Unexpected font count %u.\n", setcount);
 
@@ -9490,6 +9488,7 @@ todo_wine
             }
 
             IDWriteFontSet_Release(fontset);
+        }
             IDWriteFontFaceReference_Release(ref);
             IDWriteFontSetBuilder_Release(builder);
 




More information about the wine-cvs mailing list