From c435eb5c5199e06660efc5e35add3fad848b1cb0 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 19 Sep 2019 17:41:02 +0300 Subject: [PATCH] dwrite: Sort localized strings by locale name. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/dwrite/dwrite_private.h | 1 + dlls/dwrite/main.c | 14 ++++++++++++++ dlls/dwrite/opentype.c | 3 +++ 3 files changed, 18 insertions(+) diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 32ccd63c3eb..d0fed98d6f7 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -237,6 +237,7 @@ extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDE extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN; extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN; extern void set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN; +extern void sort_localizedstrings(IDWriteLocalizedStrings*) DECLSPEC_HIDDEN; extern HRESULT get_system_fontcollection(IDWriteFactory5*,IDWriteFontCollection1**) DECLSPEC_HIDDEN; extern HRESULT get_eudc_fontcollection(IDWriteFactory5*,IDWriteFontCollection1**) DECLSPEC_HIDDEN; extern IDWriteTextAnalyzer *get_text_analyzer(void) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index 3fe2b7eaa7c..fc72013feb6 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -520,6 +520,20 @@ void set_en_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *string) } } +static int localizedstrings_sorting_compare(const void *left, const void *right) +{ + const struct localizedpair *_l = left, *_r = right; + + return strcmpW(_l->locale, _r->locale); +}; + +void sort_localizedstrings(IDWriteLocalizedStrings *iface) +{ + struct localizedstrings *strings = impl_from_IDWriteLocalizedStrings(iface); + + qsort(strings->data, strings->count, sizeof(*strings->data), localizedstrings_sorting_compare); +} + struct collectionloader { struct list entry; diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c index fced4b0411c..efae402f91b 100644 --- a/dlls/dwrite/opentype.c +++ b/dlls/dwrite/opentype.c @@ -2010,6 +2010,9 @@ static HRESULT opentype_get_font_strings_from_id(const void *table_data, enum OP } } + if (*strings) + sort_localizedstrings(*strings); + return exists ? S_OK : E_FAIL; }