[PATCH 1/2] dwrite/tests: Add more tests for font sets.

Nikolay Sivov nsivov at codeweavers.com
Wed Mar 3 06:30:43 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/tests/font.c | 165 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 159 insertions(+), 6 deletions(-)

diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index d7ced109a2f..24ad30bc845 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -124,7 +124,7 @@ static void _expect_ref_broken(IUnknown* obj, ULONG ref, ULONG brokenref, int li
 
 static BOOL (WINAPI *pGetFontRealizationInfo)(HDC hdc, void *);
 
-static const WCHAR test_fontfile[] = {'w','i','n','e','_','t','e','s','t','_','f','o','n','t','.','t','t','f',0};
+static const WCHAR test_fontfile[] = L"wine_test_font.ttf";
 
 /* PANOSE is 10 bytes in size, need to pack the structure properly */
 #include "pshpack2.h"
@@ -9363,10 +9363,15 @@ static void test_AnalyzeContainerType(void)
 
 static void test_fontsetbuilder(void)
 {
+    IDWriteFontFaceReference *ref, *ref2, *ref3;
     IDWriteFontCollection1 *collection;
+    IDWriteFontSetBuilder1 *builder1;
     IDWriteFontSetBuilder *builder;
     IDWriteFactory3 *factory;
-    UINT32 count, i, ref;
+    UINT32 count, i, refcount;
+    IDWriteFontSet *fontset;
+    IDWriteFontFile *file;
+    WCHAR *path;
     HRESULT hr;
 
     factory = create_factory_iid(&IID_IDWriteFactory3);
@@ -9380,6 +9385,40 @@ static void test_fontsetbuilder(void)
     hr = IDWriteFactory3_CreateFontSetBuilder(factory, &builder);
     ok(hr == S_OK, "Failed to create font set builder, hr %#x.\n", hr);
     EXPECT_REF(factory, 2);
+
+    if (SUCCEEDED(hr = IDWriteFontSetBuilder_QueryInterface(builder, &IID_IDWriteFontSetBuilder1, (void **)&builder1)))
+    {
+        path = create_testfontfile(test_fontfile);
+
+        hr = IDWriteFactory3_CreateFontFileReference(factory, path, NULL, &file);
+        ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
+
+        hr = IDWriteFontSetBuilder1_AddFontFile(builder1, file);
+    todo_wine
+        ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
+
+        hr = IDWriteFontSetBuilder1_AddFontFile(builder1, file);
+    todo_wine
+        ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
+
+        hr = IDWriteFontSetBuilder1_CreateFontSet(builder1, &fontset);
+    todo_wine
+        ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
+
+        if (SUCCEEDED(hr))
+        {
+        /* No attempt to eliminate duplicates. */
+        count = IDWriteFontSet_GetFontCount(fontset);
+        ok(count == 2, "Unexpected font count %u.\n", count);
+
+        IDWriteFontSet_Release(fontset);
+        }
+
+        IDWriteFontFile_Release(file);
+        IDWriteFontSetBuilder1_Release(builder1);
+    }
+    else
+        win_skip("IDWriteFontSetBuilder1 is not available.\n");
     IDWriteFontSetBuilder_Release(builder);
 
     hr = IDWriteFactory3_GetSystemFontCollection(factory, FALSE, &collection, FALSE);
@@ -9395,8 +9434,8 @@ static void test_fontsetbuilder(void)
         ok(hr == S_OK, "Failed to get family, hr %#x.\n", hr);
 
         fontcount = IDWriteFontFamily1_GetFontCount(family);
-        for (j = 0; j < fontcount; j++) {
-            IDWriteFontFaceReference *ref, *ref2;
+        for (j = 0; j < fontcount; ++j)
+        {
             IDWriteFontSet *fontset;
             UINT32 setcount, id;
 
@@ -9428,6 +9467,12 @@ static void test_fontsetbuilder(void)
             hr = IDWriteFontSet_GetFontFaceReference(fontset, 0, &ref2);
             ok(hr == S_OK, "Failed to get font face reference, hr %#x.\n", hr);
             ok(ref2 != ref, "Unexpected reference.\n");
+
+            hr = IDWriteFontSet_GetFontFaceReference(fontset, 0, &ref3);
+            ok(hr == S_OK, "Failed to get font face reference, hr %#x.\n", hr);
+            ok(ref2 != ref3, "Unexpected reference.\n");
+
+            IDWriteFontFaceReference_Release(ref3);
             IDWriteFontFaceReference_Release(ref2);
 
             for (id = DWRITE_FONT_PROPERTY_ID_FAMILY_NAME; id < DWRITE_FONT_PROPERTY_ID_TOTAL; ++id)
@@ -9499,8 +9544,8 @@ static void test_fontsetbuilder(void)
 
     IDWriteFontCollection1_Release(collection);
 
-    ref = IDWriteFactory3_Release(factory);
-    ok(ref == 0, "factory not released, %u\n", ref);
+    refcount = IDWriteFactory3_Release(factory);
+    ok(!refcount, "Factory not released, %u.\n", refcount);
 }
 
 static void test_font_resource(void)
@@ -9805,6 +9850,112 @@ static void test_GetVerticalGlyphVariants(void)
     ok(!refcount, "Factory not released, refcount %u.\n", refcount);
 }
 
+static HANDLE get_collection_expiration_event(IDWriteFontCollection *collection)
+{
+    IDWriteFontCollection3 *collection3;
+    HANDLE event;
+    HRESULT hr;
+
+    hr = IDWriteFontCollection_QueryInterface(collection, &IID_IDWriteFontCollection3, (void **)&collection3);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    event = IDWriteFontCollection3_GetExpirationEvent(collection3);
+    IDWriteFontCollection3_Release(collection3);
+
+    return event;
+}
+
+static void test_expiration_event(void)
+{
+    IDWriteFontCollection *collection, *collection2;
+    IDWriteFontCollection3 *collection3;
+    IDWriteFactory *factory, *factory2;
+    unsigned int refcount;
+    HANDLE event, event2;
+    HRESULT hr;
+
+    factory = create_factory();
+
+    hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDWriteFontCollection_QueryInterface(collection, &IID_IDWriteFontCollection3, (void **)&collection3);
+    if (FAILED(hr))
+    {
+        win_skip("Expiration events are not supported.\n");
+        IDWriteFontCollection_Release(collection);
+        IDWriteFactory_Release(factory);
+        return;
+    }
+    IDWriteFontCollection3_Release(collection3);
+
+    event = get_collection_expiration_event(collection);
+todo_wine
+    ok(!!event, "Unexpected event handle.\n");
+
+    /* Compare handles with another isolated factory. */
+    factory2 = create_factory();
+
+    hr = IDWriteFactory_GetSystemFontCollection(factory2, &collection2, FALSE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    event2 = get_collection_expiration_event(collection2);
+todo_wine {
+    ok(!!event2, "Unexpected event handle.\n");
+    ok(event != event2, "Unexpected event handle.\n");
+}
+    IDWriteFontCollection_Release(collection2);
+
+    IDWriteFontCollection_Release(collection);
+
+    refcount = IDWriteFactory_Release(factory2);
+    ok(!refcount, "Unexpected factory refcount %u.\n", refcount);
+    refcount = IDWriteFactory_Release(factory);
+    ok(!refcount, "Unexpected factory refcount %u.\n", refcount);
+}
+
+static void test_family_font_set(void)
+{
+    IDWriteFontCollection *collection;
+    IDWriteFontFamily2 *family2;
+    IDWriteFontFamily *family;
+    IDWriteFactory *factory;
+    unsigned int refcount;
+    IDWriteFontSet1 *fontset, *fontset2;
+    HRESULT hr;
+
+    factory = create_factory();
+
+    hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IDWriteFontCollection_GetFontFamily(collection, 0, &family);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    if (SUCCEEDED(IDWriteFontFamily_QueryInterface(family, &IID_IDWriteFontFamily2, (void **)&family2)))
+    {
+        hr = IDWriteFontFamily2_GetFontSet(family2, &fontset);
+    todo_wine
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+        hr = IDWriteFontFamily2_GetFontSet(family2, &fontset2);
+    todo_wine
+        ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        ok(fontset != fontset2, "Unexpected fontset instance.\n");
+        IDWriteFontSet1_Release(fontset2);
+        IDWriteFontSet1_Release(fontset);
+    }
+        IDWriteFontFamily2_Release(family2);
+    }
+    else
+        win_skip("IDWriteFontFamily2 is not supported.\n");
+
+    IDWriteFontFamily_Release(family);
+    IDWriteFontCollection_Release(collection);
+
+    refcount = IDWriteFactory_Release(factory);
+    ok(!refcount, "Unexpected factory refcount %u.\n", refcount);
+}
+
 START_TEST(font)
 {
     IDWriteFactory *factory;
@@ -9875,6 +10026,8 @@ START_TEST(font)
     test_font_resource();
     test_IsColorFont();
     test_GetVerticalGlyphVariants();
+    test_expiration_event();
+    test_family_font_set();
 
     IDWriteFactory_Release(factory);
 }
-- 
2.30.1




More information about the wine-devel mailing list