Akihiro Sagawa : gdi32: Improve the font enumeration order for complex script locales.
Alexandre Julliard
julliard at winehq.org
Wed Mar 12 15:23:44 CDT 2014
Module: wine
Branch: master
Commit: 04e8b00ab08a046f52ffbbd841b17b10b3bf720a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=04e8b00ab08a046f52ffbbd841b17b10b3bf720a
Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date: Fri Mar 7 01:22:19 2014 +0900
gdi32: Improve the font enumeration order for complex script locales.
---
dlls/gdi32/freetype.c | 11 ++++++++++-
dlls/gdi32/tests/font.c | 14 +++++++++-----
2 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 5f4a570..cece358 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5527,12 +5527,20 @@ static INT load_script_name( UINT id, WCHAR buffer[LF_FACESIZE] )
return i;
}
+static inline BOOL is_complex_script_ansi_cp(UINT ansi_cp)
+{
+ return (ansi_cp == 874 /* Thai */
+ || ansi_cp == 1255 /* Hebrew */
+ || ansi_cp == 1256 /* Arabic */
+ );
+}
/***************************************************
* create_enum_charset_list
*
* This function creates charset enumeration list because in DEFAULT_CHARSET
* case, the ANSI codepage's charset takes precedence over other charsets.
+ * Above rule doesn't apply if the ANSI codepage uses complex script (e.g. Thai).
* This function works as a filter other than DEFAULT_CHARSET case.
*/
static DWORD create_enum_charset_list(DWORD charset, struct enum_charset_list *list)
@@ -5553,7 +5561,8 @@ static DWORD create_enum_charset_list(DWORD charset, struct enum_charset_list *l
/* Set the current codepage's charset as the first element. */
acp = GetACP();
- if (TranslateCharsetInfo((DWORD*)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE) &&
+ if (!is_complex_script_ansi_cp(acp) &&
+ TranslateCharsetInfo((DWORD*)(INT_PTR)acp, &csi, TCI_SRCCODEPAGE) &&
csi.fs.fsCsb[0] != 0) {
list->element[n].mask = csi.fs.fsCsb[0];
list->element[n].charset = csi.ciCharset;
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index daa160c..a9d2fb0 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -2957,7 +2957,7 @@ static INT CALLBACK enum_multi_charset_font_proc(const LOGFONTA *lf, const TEXTM
if (TranslateCharsetInfo(ULongToPtr(target->lfCharSet), &csi, TCI_SRCCHARSET)) {
fs = ntm->ntmFontSig.fsCsb[0] & valid_bits;
- if ((fs & csi.fs.fsCsb[0]) && (fs & ~csi.fs.fsCsb[0])) {
+ if ((fs & csi.fs.fsCsb[0]) && (fs & ~csi.fs.fsCsb[0]) && (fs & FS_LATIN1)) {
*target = *lf;
return FALSE;
}
@@ -2998,13 +2998,13 @@ static void test_EnumFontFamiliesEx_default_charset(void)
{
struct enum_font_data efd;
LOGFONTA target, enum_font;
- DWORD ret;
+ UINT acp;
HDC hdc;
CHARSETINFO csi;
- ret = GetACP();
- if (!TranslateCharsetInfo(ULongToPtr(ret), &csi, TCI_SRCCODEPAGE)) {
- skip("TranslateCharsetInfo failed for code page %d.\n", ret);
+ acp = GetACP();
+ if (!TranslateCharsetInfo(ULongToPtr(acp), &csi, TCI_SRCCODEPAGE)) {
+ skip("TranslateCharsetInfo failed for code page %u.\n", acp);
return;
}
@@ -3018,6 +3018,10 @@ static void test_EnumFontFamiliesEx_default_charset(void)
skip("suitable font isn't found for charset %d.\n", enum_font.lfCharSet);
return;
}
+ if (acp == 874 || acp == 1255 || acp == 1256) {
+ /* these codepage use complex script, expecting ANSI_CHARSET here. */
+ target.lfCharSet = ANSI_CHARSET;
+ }
efd.total = 0;
memset(&enum_font, 0, sizeof(enum_font));
More information about the wine-cvs
mailing list