Nikolay Sivov : dwrite: Support Mac platform id and some of its encodings when reading 'name' table.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Oct 29 07:36:58 CDT 2014


Module: wine
Branch: master
Commit: 6128e73f7734db4d03048e05c574ebcd90618e6a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6128e73f7734db4d03048e05c574ebcd90618e6a

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Oct 27 13:40:37 2014 +0300

dwrite: Support Mac platform id and some of its encodings when reading 'name' table.

---

 dlls/dwrite/opentype.c | 156 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 128 insertions(+), 28 deletions(-)

diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index c6f7a52..21b1cb2 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -201,6 +201,15 @@ typedef struct {
     TT_NameRecord nameRecord[1];
 } TT_NAME_V0;
 
+enum OPENTYPE_PLATFORM_ID
+{
+    OPENTYPE_PLATFORM_UNICODE = 0,
+    OPENTYPE_PLATFORM_MAC,
+    OPENTYPE_PLATFORM_ISO,
+    OPENTYPE_PLATFORM_WIN,
+    OPENTYPE_PLATFORM_CUSTOM
+};
+
 enum TT_NAME_WINDOWS_ENCODING_ID
 {
     TT_NAME_WINDOWS_ENCODING_SYMBOL = 0,
@@ -216,6 +225,43 @@ enum TT_NAME_WINDOWS_ENCODING_ID
     TT_NAME_WINDOWS_ENCODING_UCS4
 };
 
+enum TT_NAME_MAC_ENCODING_ID
+{
+    TT_NAME_MAC_ENCODING_ROMAN = 0,
+    TT_NAME_MAC_ENCODING_JAPANESE,
+    TT_NAME_MAC_ENCODING_TRAD_CHINESE,
+    TT_NAME_MAC_ENCODING_KOREAN,
+    TT_NAME_MAC_ENCODING_ARABIC,
+    TT_NAME_MAC_ENCODING_HEBREW,
+    TT_NAME_MAC_ENCODING_GREEK,
+    TT_NAME_MAC_ENCODING_RUSSIAN,
+    TT_NAME_MAC_ENCODING_RSYMBOL,
+    TT_NAME_MAC_ENCODING_DEVANAGARI,
+    TT_NAME_MAC_ENCODING_GURMUKHI,
+    TT_NAME_MAC_ENCODING_GUJARATI,
+    TT_NAME_MAC_ENCODING_ORIYA,
+    TT_NAME_MAC_ENCODING_BENGALI,
+    TT_NAME_MAC_ENCODING_TAMIL,
+    TT_NAME_MAC_ENCODING_TELUGU,
+    TT_NAME_MAC_ENCODING_KANNADA,
+    TT_NAME_MAC_ENCODING_MALAYALAM,
+    TT_NAME_MAC_ENCODING_SINHALESE,
+    TT_NAME_MAC_ENCODING_BURMESE,
+    TT_NAME_MAC_ENCODING_KHMER,
+    TT_NAME_MAC_ENCODING_THAI,
+    TT_NAME_MAC_ENCODING_LAOTIAN,
+    TT_NAME_MAC_ENCODING_GEORGIAN,
+    TT_NAME_MAC_ENCODING_ARMENIAN,
+    TT_NAME_MAC_ENCODING_SIMPL_CHINESE,
+    TT_NAME_MAC_ENCODING_TIBETAN,
+    TT_NAME_MAC_ENCODING_MONGOLIAN,
+    TT_NAME_MAC_ENCODING_GEEZ,
+    TT_NAME_MAC_ENCODING_SLAVIC,
+    TT_NAME_MAC_ENCODING_VIETNAMESE,
+    TT_NAME_MAC_ENCODING_SINDHI,
+    TT_NAME_MAC_ENCODING_UNINTERPRETED
+};
+
 enum OPENTYPE_STRING_ID
 {
     OPENTYPE_STRING_COPYRIGHT_NOTICE = 0,
@@ -615,6 +661,82 @@ VOID get_font_properties(LPCVOID os2, LPCVOID head, LPCVOID post, DWRITE_FONT_ME
     }
 }
 
+static UINT get_name_record_codepage(enum OPENTYPE_PLATFORM_ID platform, USHORT encoding)
+{
+    UINT codepage = 0;
+
+    switch (platform) {
+    case OPENTYPE_PLATFORM_MAC:
+        switch (encoding)
+        {
+            case TT_NAME_MAC_ENCODING_ROMAN:
+                codepage = 10000;
+                break;
+            case TT_NAME_MAC_ENCODING_JAPANESE:
+                codepage = 10001;
+                break;
+            case TT_NAME_MAC_ENCODING_TRAD_CHINESE:
+                codepage = 10002;
+                break;
+            case TT_NAME_MAC_ENCODING_KOREAN:
+                codepage = 10003;
+                break;
+            case TT_NAME_MAC_ENCODING_ARABIC:
+                codepage = 10004;
+                break;
+            case TT_NAME_MAC_ENCODING_HEBREW:
+                codepage = 10005;
+                break;
+            case TT_NAME_MAC_ENCODING_GREEK:
+                codepage = 10006;
+                break;
+            case TT_NAME_MAC_ENCODING_RUSSIAN:
+                codepage = 10007;
+                break;
+            case TT_NAME_MAC_ENCODING_SIMPL_CHINESE:
+                codepage = 10008;
+                break;
+            case TT_NAME_MAC_ENCODING_THAI:
+                codepage = 10021;
+                break;
+            default:
+                FIXME("encoding %u not handled, platform %d.\n", encoding, platform);
+                break;
+        }
+        break;
+    case OPENTYPE_PLATFORM_WIN:
+        switch (encoding)
+        {
+            case TT_NAME_WINDOWS_ENCODING_SYMBOL:
+            case TT_NAME_WINDOWS_ENCODING_UCS2:
+                break;
+            case TT_NAME_WINDOWS_ENCODING_SJIS:
+                codepage = 932;
+                break;
+            case TT_NAME_WINDOWS_ENCODING_PRC:
+                codepage = 936;
+                break;
+            case TT_NAME_WINDOWS_ENCODING_BIG5:
+                codepage = 950;
+                break;
+            case TT_NAME_WINDOWS_ENCODING_WANSUNG:
+                codepage = 20949;
+                break;
+            case TT_NAME_WINDOWS_ENCODING_JOHAB:
+                codepage = 1361;
+                break;
+            default:
+                FIXME("encoding %u not handled, platform %d.\n", encoding, platform);
+                break;
+        }
+        break;
+    default:
+        FIXME("unknown platform %d\n", platform);
+    }
+
+    return codepage;
+}
+
 HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMATIONAL_STRING_ID id, IDWriteLocalizedStrings **strings)
 {
     const TT_NAME_V0 *header;
@@ -649,7 +771,10 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
 
         /* Right now only accept unicode and windows encoded fonts */
         platform = GET_BE_WORD(record->platformID);
-        if (platform != 0 && platform != 3) {
+        if (platform != OPENTYPE_PLATFORM_UNICODE &&
+            platform != OPENTYPE_PLATFORM_MAC &&
+            platform != OPENTYPE_PLATFORM_WIN)
+        {
             FIXME("platform %i not supported\n", platform);
             continue;
         }
@@ -662,34 +787,9 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
         if (lang_id < 0x8000) {
             WCHAR locale[LOCALE_NAME_MAX_LENGTH];
             WCHAR *name_string;
-            UINT codepage = 0;
+            UINT codepage;
 
-            if (platform == 3)
-            {
-                switch (encoding)
-                {
-                    case TT_NAME_WINDOWS_ENCODING_SYMBOL:
-                    case TT_NAME_WINDOWS_ENCODING_UCS2:
-                        break;
-                    case TT_NAME_WINDOWS_ENCODING_SJIS:
-                        codepage = 932;
-                        break;
-                    case TT_NAME_WINDOWS_ENCODING_PRC:
-                        codepage = 936;
-                        break;
-                    case TT_NAME_WINDOWS_ENCODING_BIG5:
-                        codepage = 950;
-                        break;
-                    case TT_NAME_WINDOWS_ENCODING_WANSUNG:
-                        codepage = 20949;
-                        break;
-                    case TT_NAME_WINDOWS_ENCODING_JOHAB:
-                        codepage = 1361;
-                        break;
-                    default:
-                        FIXME("encoding %d not handled.\n", encoding);
-                }
-            }
+            codepage = get_name_record_codepage(platform, encoding);
 
             if (codepage) {
                 DWORD len = MultiByteToWideChar(codepage, 0, (LPSTR)(storage_area + offset), length, NULL, 0);




More information about the wine-cvs mailing list