dwrite: Initial implementation of fontset filtering.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-03-10 12:30:29 +03:00 committed by Alexandre Julliard
parent 0ce34328bd
commit b6ffd6cb78
3 changed files with 93 additions and 3 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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;