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