Nikolay Sivov : dwrite: Map Mac language id to locale name.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 4 09:19:32 CST 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Nov  4 16:36:16 2014 +0300

dwrite: Map Mac language id to locale name.

---

 dlls/dwrite/opentype.c | 284 +++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 278 insertions(+), 6 deletions(-)

diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 6d48f90..8a14336 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -262,6 +262,250 @@ enum TT_NAME_MAC_ENCODING_ID
     TT_NAME_MAC_ENCODING_UNINTERPRETED
 };
 
+enum TT_NAME_MAC_LANGUAGE_ID
+{
+    TT_NAME_MAC_LANGID_ENGLISH = 0,
+    TT_NAME_MAC_LANGID_FRENCH,
+    TT_NAME_MAC_LANGID_GERMAN,
+    TT_NAME_MAC_LANGID_ITALIAN,
+    TT_NAME_MAC_LANGID_DUTCH,
+    TT_NAME_MAC_LANGID_SWEDISH,
+    TT_NAME_MAC_LANGID_SPANISH,
+    TT_NAME_MAC_LANGID_DANISH,
+    TT_NAME_MAC_LANGID_PORTUGUESE,
+    TT_NAME_MAC_LANGID_NORWEGIAN,
+    TT_NAME_MAC_LANGID_HEBREW,
+    TT_NAME_MAC_LANGID_JAPANESE,
+    TT_NAME_MAC_LANGID_ARABIC,
+    TT_NAME_MAC_LANGID_FINNISH,
+    TT_NAME_MAC_LANGID_GREEK,
+    TT_NAME_MAC_LANGID_ICELANDIC,
+    TT_NAME_MAC_LANGID_MALTESE,
+    TT_NAME_MAC_LANGID_TURKISH,
+    TT_NAME_MAC_LANGID_CROATIAN,
+    TT_NAME_MAC_LANGID_TRAD_CHINESE,
+    TT_NAME_MAC_LANGID_URDU,
+    TT_NAME_MAC_LANGID_HINDI,
+    TT_NAME_MAC_LANGID_THAI,
+    TT_NAME_MAC_LANGID_KOREAN,
+    TT_NAME_MAC_LANGID_LITHUANIAN,
+    TT_NAME_MAC_LANGID_POLISH,
+    TT_NAME_MAC_LANGID_HUNGARIAN,
+    TT_NAME_MAC_LANGID_ESTONIAN,
+    TT_NAME_MAC_LANGID_LATVIAN,
+    TT_NAME_MAC_LANGID_SAMI,
+    TT_NAME_MAC_LANGID_FAROESE,
+    TT_NAME_MAC_LANGID_FARSI,
+    TT_NAME_MAC_LANGID_RUSSIAN,
+    TT_NAME_MAC_LANGID_SIMPL_CHINESE,
+    TT_NAME_MAC_LANGID_FLEMISH,
+    TT_NAME_MAC_LANGID_GAELIC,
+    TT_NAME_MAC_LANGID_ALBANIAN,
+    TT_NAME_MAC_LANGID_ROMANIAN,
+    TT_NAME_MAC_LANGID_CZECH,
+    TT_NAME_MAC_LANGID_SLOVAK,
+    TT_NAME_MAC_LANGID_SLOVENIAN,
+    TT_NAME_MAC_LANGID_YIDDISH,
+    TT_NAME_MAC_LANGID_SERBIAN,
+    TT_NAME_MAC_LANGID_MACEDONIAN,
+    TT_NAME_MAC_LANGID_BULGARIAN,
+    TT_NAME_MAC_LANGID_UKRAINIAN,
+    TT_NAME_MAC_LANGID_BYELORUSSIAN,
+    TT_NAME_MAC_LANGID_UZBEK,
+    TT_NAME_MAC_LANGID_KAZAKH,
+    TT_NAME_MAC_LANGID_AZERB_CYR,
+    TT_NAME_MAC_LANGID_AZERB_ARABIC,
+    TT_NAME_MAC_LANGID_ARMENIAN,
+    TT_NAME_MAC_LANGID_GEORGIAN,
+    TT_NAME_MAC_LANGID_MOLDAVIAN,
+    TT_NAME_MAC_LANGID_KIRGHIZ,
+    TT_NAME_MAC_LANGID_TAJIKI,
+    TT_NAME_MAC_LANGID_TURKMEN,
+    TT_NAME_MAC_LANGID_MONGOLIAN,
+    TT_NAME_MAC_LANGID_MONGOLIAN_CYR,
+    TT_NAME_MAC_LANGID_PASHTO,
+    TT_NAME_MAC_LANGID_KURDISH,
+    TT_NAME_MAC_LANGID_KASHMIRI,
+    TT_NAME_MAC_LANGID_SINDHI,
+    TT_NAME_MAC_LANGID_TIBETAN,
+    TT_NAME_MAC_LANGID_NEPALI,
+    TT_NAME_MAC_LANGID_SANSKRIT,
+    TT_NAME_MAC_LANGID_MARATHI,
+    TT_NAME_MAC_LANGID_BENGALI,
+    TT_NAME_MAC_LANGID_ASSAMESE,
+    TT_NAME_MAC_LANGID_GUJARATI,
+    TT_NAME_MAC_LANGID_PUNJABI,
+    TT_NAME_MAC_LANGID_ORIYA,
+    TT_NAME_MAC_LANGID_MALAYALAM,
+    TT_NAME_MAC_LANGID_KANNADA,
+    TT_NAME_MAC_LANGID_TAMIL,
+    TT_NAME_MAC_LANGID_TELUGU,
+    TT_NAME_MAC_LANGID_SINHALESE,
+    TT_NAME_MAC_LANGID_BURMESE,
+    TT_NAME_MAC_LANGID_KHMER,
+    TT_NAME_MAC_LANGID_LAO,
+    TT_NAME_MAC_LANGID_VIETNAMESE,
+    TT_NAME_MAC_LANGID_INDONESIAN,
+    TT_NAME_MAC_LANGID_TAGALONG,
+    TT_NAME_MAC_LANGID_MALAY_ROMAN,
+    TT_NAME_MAC_LANGID_MALAY_ARABIC,
+    TT_NAME_MAC_LANGID_AMHARIC,
+    TT_NAME_MAC_LANGID_TIGRINYA,
+    TT_NAME_MAC_LANGID_GALLA,
+    TT_NAME_MAC_LANGID_SOMALI,
+    TT_NAME_MAC_LANGID_SWAHILI,
+    TT_NAME_MAC_LANGID_KINYARWANDA,
+    TT_NAME_MAC_LANGID_RUNDI,
+    TT_NAME_MAC_LANGID_NYANJA,
+    TT_NAME_MAC_LANGID_MALAGASY,
+    TT_NAME_MAC_LANGID_ESPERANTO,
+    TT_NAME_MAC_LANGID_WELSH,
+    TT_NAME_MAC_LANGID_BASQUE,
+    TT_NAME_MAC_LANGID_CATALAN,
+    TT_NAME_MAC_LANGID_LATIN,
+    TT_NAME_MAC_LANGID_QUENCHUA,
+    TT_NAME_MAC_LANGID_GUARANI,
+    TT_NAME_MAC_LANGID_AYMARA,
+    TT_NAME_MAC_LANGID_TATAR,
+    TT_NAME_MAC_LANGID_UIGHUR,
+    TT_NAME_MAC_LANGID_DZONGKHA,
+    TT_NAME_MAC_LANGID_JAVANESE,
+    TT_NAME_MAC_LANGID_SUNDANESE,
+    TT_NAME_MAC_LANGID_GALICIAN,
+    TT_NAME_MAC_LANGID_AFRIKAANS,
+    TT_NAME_MAC_LANGID_BRETON,
+    TT_NAME_MAC_LANGID_INUKTITUT,
+    TT_NAME_MAC_LANGID_SCOTTISH_GAELIC,
+    TT_NAME_MAC_LANGID_MANX_GAELIC,
+    TT_NAME_MAC_LANGID_IRISH_GAELIC,
+    TT_NAME_MAC_LANGID_TONGAN,
+    TT_NAME_MAC_LANGID_GREEK_POLYTONIC,
+    TT_NAME_MAC_LANGID_GREENLANDIC,
+    TT_NAME_MAC_LANGID_AZER_ROMAN
+};
+
+/* Names are indexed with TT_NAME_MAC_LANGUAGE_ID values */
+static const char name_mac_langid_to_locale[][10] = {
+    "en-US",
+    "fr-FR",
+    "de-DE",
+    "it-IT",
+    "nl-NL",
+    "sv-SE",
+    "es-ES",
+    "da-DA",
+    "pt-PT",
+    "no-NO",
+    "he-IL",
+    "ja-JP",
+    "ar-AR",
+    "fi-FI",
+    "el-GR",
+    "is-IS",
+    "mt-MT",
+    "tr-TR",
+    "hr-HR",
+    "zh-HK",
+    "ur-PK",
+    "hi-IN",
+    "th-TH",
+    "ko-KR",
+    "lt-LT",
+    "pl-PL",
+    "hu-HU",
+    "et-EE",
+    "lv-LV",
+    "se-NO",
+    "fo-FO",
+    "fa-IR",
+    "ru-RU",
+    "zh-CN",
+    "nl-BE",
+    "gd-GB",
+    "sq-AL",
+    "ro-RO",
+    "cs-CZ",
+    "sk-SK",
+    "sl-SI",
+    "",
+    "sr-Latn",
+    "mk-MK",
+    "bg-BG",
+    "uk-UA",
+    "be-BY",
+    "uz-Latn",
+    "kk-KZ",
+    "az-Cyrl-AZ",
+    "az-AZ",
+    "hy-AM",
+    "ka-GE",
+    "",
+    "",
+    "tg-TJ",
+    "tk-TM",
+    "mn-Mong",
+    "mn-MN",
+    "ps-AF",
+    "ku-Arab",
+    "",
+    "sd-Arab",
+    "bo-CN",
+    "ne-NP",
+    "sa-IN",
+    "mr-IN",
+    "bn-IN",
+    "as-IN",
+    "gu-IN",
+    "pa-Arab",
+    "or-IN",
+    "ml-IN",
+    "kn-IN",
+    "ta-LK",
+    "te-IN",
+    "si-LK",
+    "",
+    "km-KH",
+    "lo-LA",
+    "vi-VN",
+    "id-ID",
+    "",
+    "ms-MY",
+    "ms-Arab",
+    "am-ET",
+    "ti-ET",
+    "",
+    "",
+    "sw-KE",
+    "rw-RW",
+    "",
+    "",
+    "",
+    "",
+    "cy-GB",
+    "eu-ES",
+    "ca-ES",
+    "",
+    "",
+    "",
+    "",
+    "tt-RU",
+    "ug-CN",
+    "",
+    "",
+    "",
+    "gl-ES",
+    "af-ZA",
+    "br-FR",
+    "iu-Latn-CA",
+    "gd-GB",
+    "",
+    "ga-IE",
+    "",
+    "",
+    "kl-GL",
+    "az-Latn"
+};
+
 enum OPENTYPE_STRING_ID
 {
     OPENTYPE_STRING_COPYRIGHT_NOTICE = 0,
@@ -737,6 +981,39 @@ static UINT get_name_record_codepage(enum OPENTYPE_PLATFORM_ID platform, USHORT
     return codepage;
 }
 
+static void get_name_record_locale(enum OPENTYPE_PLATFORM_ID platform, USHORT lang_id, WCHAR *locale, USHORT locale_len)
+{
+    static const WCHAR enusW[] = {'e','n','-','U','S',0};
+
+    switch (platform) {
+    case OPENTYPE_PLATFORM_MAC:
+    {
+        const char *locale_name = NULL;
+
+        if (lang_id > TT_NAME_MAC_LANGID_AZER_ROMAN)
+            ERR("invalid mac lang id %d\n", lang_id);
+        else if (!name_mac_langid_to_locale[lang_id][0])
+            FIXME("failed to map mac lang id %d to locale name\n", lang_id);
+        else
+            locale_name = name_mac_langid_to_locale[lang_id];
+
+        if (locale_name)
+            MultiByteToWideChar(CP_ACP, 0, name_mac_langid_to_locale[lang_id], -1, locale, locale_len);
+        else
+            strcpyW(locale, enusW);
+        break;
+    }
+    case OPENTYPE_PLATFORM_WIN:
+        if (!LCIDToLocaleName(MAKELCID(lang_id, SORT_DEFAULT), locale, locale_len, 0)) {
+            FIXME("failed to get locale name for lcid=0x%08x\n", MAKELCID(lang_id, SORT_DEFAULT));
+            strcpyW(locale, enusW);
+        }
+        break;
+    default:
+        FIXME("unknown platform %d\n", platform);
+    }
+}
+
 HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMATIONAL_STRING_ID id, IDWriteLocalizedStrings **strings)
 {
     const TT_NAME_V0 *header;
@@ -790,6 +1067,7 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
             UINT codepage;
 
             codepage = get_name_record_codepage(platform, encoding);
+            get_name_record_locale(platform, lang_id, locale, sizeof(locale)/sizeof(WCHAR));
 
             if (codepage) {
                 DWORD len = MultiByteToWideChar(codepage, 0, (LPSTR)(storage_area + offset), length, NULL, 0);
@@ -806,12 +1084,6 @@ HRESULT opentype_get_font_strings_from_id(const void *table_data, DWRITE_INFORMA
                     name_string[i] = GET_BE_WORD(name_string[i]);
             }
 
-            if (!LCIDToLocaleName(MAKELCID(lang_id, SORT_DEFAULT), locale, sizeof(locale)/sizeof(WCHAR), 0)) {
-                static const WCHAR enusW[] = {'e','n','-','u','s',0};
-                FIXME("failed to get locale name for lcid=0x%08x\n", MAKELCID(lang_id, SORT_DEFAULT));
-                strcpyW(locale, enusW);
-            }
-
             TRACE("string %s for locale %s found\n", debugstr_w(name_string), debugstr_w(locale));
             add_localizedstring(*strings, locale, name_string);
             heap_free(name_string);




More information about the wine-cvs mailing list