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