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