Nikolay Sivov : dwrite: Initial implementation of fontset filtering.

Alexandre Julliard julliard at winehq.org
Wed Mar 10 14:58:45 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Mar 10 12:30:29 2021 +0300

dwrite: Initial implementation of fontset filtering.

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           | 82 ++++++++++++++++++++++++++++++++++++++++++--
 dlls/dwrite/main.c           | 13 +++++++
 3 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 7f7c933e7e2..8c09a315f54 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -299,6 +299,7 @@ extern HRESULT clone_localizedstrings(IDWriteLocalizedStrings *iface, IDWriteLoc
 extern void    set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN;
 extern void    sort_localizedstrings(IDWriteLocalizedStrings*) DECLSPEC_HIDDEN;
 extern unsigned int get_localizedstrings_count(IDWriteLocalizedStrings *strings) DECLSPEC_HIDDEN;
+extern BOOL localizedstrings_contains(IDWriteLocalizedStrings *strings, const WCHAR *str) DECLSPEC_HIDDEN;
 extern HRESULT get_system_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection1 **collection) DECLSPEC_HIDDEN;
 extern HRESULT get_eudc_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection3 **collection) DECLSPEC_HIDDEN;
 extern IDWriteTextAnalyzer2 *get_text_analyzer(void) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index c0642b5bbe4..3da6b555c02 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -7280,6 +7280,47 @@ static HRESULT WINAPI dwritefontset_GetPropertyOccurrenceCount(IDWriteFontSet3 *
     return E_NOTIMPL;
 }
 
+static BOOL fontset_entry_is_matching(struct dwrite_fontset_entry *entry, DWRITE_FONT_PROPERTY const *props,
+        unsigned int count)
+{
+    IDWriteLocalizedStrings *value;
+    unsigned int i;
+    BOOL ret;
+
+    for (i = 0; i < count; ++i)
+    {
+        switch (props[i].propertyId)
+        {
+            case DWRITE_FONT_PROPERTY_ID_POSTSCRIPT_NAME:
+            case DWRITE_FONT_PROPERTY_ID_FULL_NAME:
+                if (!(value = fontset_entry_get_property(entry, props[i].propertyId)))
+                    return FALSE;
+
+                ret = localizedstrings_contains(value, props[i].propertyValue);
+                IDWriteLocalizedStrings_Release(value);
+                if (!ret) return FALSE;
+                break;
+            case DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FAMILY_NAME:
+            case DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FAMILY_NAME:
+            case DWRITE_FONT_PROPERTY_ID_WEIGHT_STRETCH_STYLE_FACE_NAME:
+            case DWRITE_FONT_PROPERTY_ID_WIN32_FAMILY_NAME:
+            case DWRITE_FONT_PROPERTY_ID_DESIGN_SCRIPT_LANGUAGE_TAG:
+            case DWRITE_FONT_PROPERTY_ID_SUPPORTED_SCRIPT_LANGUAGE_TAG:
+            case DWRITE_FONT_PROPERTY_ID_SEMANTIC_TAG:
+            case DWRITE_FONT_PROPERTY_ID_WEIGHT:
+            case DWRITE_FONT_PROPERTY_ID_STRETCH:
+            case DWRITE_FONT_PROPERTY_ID_STYLE:
+            case DWRITE_FONT_PROPERTY_ID_TYPOGRAPHIC_FACE_NAME:
+                FIXME("Unsupported property %d.\n", props[i].propertyId);
+                /* fallthrough */
+            default:
+                return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
 static HRESULT WINAPI dwritefontset_GetMatchingFonts_(IDWriteFontSet3 *iface, WCHAR const *family, DWRITE_FONT_WEIGHT weight,
         DWRITE_FONT_STRETCH stretch,  DWRITE_FONT_STYLE style, IDWriteFontSet **fontset)
 {
@@ -7289,11 +7330,46 @@ static HRESULT WINAPI dwritefontset_GetMatchingFonts_(IDWriteFontSet3 *iface, WC
 }
 
 static HRESULT WINAPI dwritefontset_GetMatchingFonts(IDWriteFontSet3 *iface, DWRITE_FONT_PROPERTY const *props, UINT32 count,
-        IDWriteFontSet **fontset)
+        IDWriteFontSet **filtered_set)
 {
-    FIXME("%p, %p, %u, %p.\n", iface, props, count, fontset);
+    struct dwrite_fontset *set = impl_from_IDWriteFontSet3(iface);
+    struct dwrite_fontset_entry **entries;
+    unsigned int i, matched_count = 0;
+    struct dwrite_fontset *object;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p, %u, %p.\n", iface, props, count, filtered_set);
+
+    if (!props && count)
+        return E_INVALIDARG;
+
+    if (!(object = heap_alloc_zero(sizeof(*object))))
+        return E_OUTOFMEMORY;
+
+    if (!(entries = heap_calloc(set->count, sizeof(*entries))))
+    {
+        heap_free(object);
+        return E_OUTOFMEMORY;
+    }
+
+    for (i = 0; i < set->count; ++i)
+    {
+        if (fontset_entry_is_matching(set->entries[i], props, count))
+        {
+            entries[matched_count++] = addref_fontset_entry(set->entries[i]);
+        }
+    }
+
+    if (!matched_count)
+    {
+        heap_free(entries);
+        entries = NULL;
+    }
+
+    init_fontset(object, set->factory, entries, matched_count);
+
+    *filtered_set = (IDWriteFontSet *)&object->IDWriteFontSet3_iface;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI dwritefontset1_GetMatchingFonts(IDWriteFontSet3 *iface, DWRITE_FONT_PROPERTY const *property,
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index ea5a8e018cc..51020d6f586 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -564,6 +564,19 @@ unsigned int get_localizedstrings_count(IDWriteLocalizedStrings *iface)
     return strings->count;
 }
 
+BOOL localizedstrings_contains(IDWriteLocalizedStrings *iface, const WCHAR *str)
+{
+    struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface);
+    unsigned int i;
+
+    for (i = 0; i < strings->count; ++i)
+    {
+        if (!lstrcmpiW(strings->data[i].string, str)) return TRUE;
+    }
+
+    return FALSE;
+}
+
 struct collectionloader
 {
     struct list entry;




More information about the wine-cvs mailing list