/* * Copyright © 2018 Google, Inc. * * This is part of HarfBuzz, a text shaping library. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and its documentation for any purpose, provided that the * above copyright notice and the following two paragraphs appear in * all copies of this software. * * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. * * Google Author(s): Behdad Esfahbod */ #ifndef HB_OT_NAME_LANGUAGE_STATIC_HH #define HB_OT_NAME_LANGUAGE_STATIC_HH #include "hb-ot-name-language.hh" /* Following two tables were generated by joining FreeType, FontConfig, * and OpenType specification language lists, then filled in missing * entries using: * https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings */ struct hb_ot_language_map_t { int cmp (unsigned int key) const { return key < code ? -1 : key > code ? +1 : 0; } uint16_t code; char lang[6]; }; static const hb_ot_language_map_t hb_ms_language_map[] = { {0x0001, "ar"}, /* ??? */ {0x0004, "zh"}, /* ??? */ {0x0009, "en"}, /* ??? */ {0x0401, "ar"}, /* Arabic (Saudi Arabia) */ {0x0402, "bg"}, /* Bulgarian (Bulgaria) */ {0x0403, "ca"}, /* Catalan (Catalan) */ {0x0404, "zh-tw"}, /* Chinese (Taiwan) */ {0x0405, "cs"}, /* Czech (Czech Republic) */ {0x0406, "da"}, /* Danish (Denmark) */ {0x0407, "de"}, /* German (Germany) */ {0x0408, "el"}, /* Greek (Greece) */ {0x0409, "en"}, /* English (United States) */ {0x040A, "es"}, /* Spanish (Traditional Sort) (Spain) */ {0x040B, "fi"}, /* Finnish (Finland) */ {0x040C, "fr"}, /* French (France) */ {0x040D, "he"}, /* Hebrew (Israel) */ {0x040E, "hu"}, /* Hungarian (Hungary) */ {0x040F, "is"}, /* Icelandic (Iceland) */ {0x0410, "it"}, /* Italian (Italy) */ {0x0411, "ja"}, /* Japanese (Japan) */ {0x0412, "ko"}, /* Korean (Korea) */ {0x0413, "nl"}, /* Dutch (Netherlands) */ {0x0414, "no"}, /* Norwegian (Bokmal) (Norway) */ {0x0415, "pl"}, /* Polish (Poland) */ {0x0416, "pt"}, /* Portuguese (Brazil) */ {0x0417, "rm"}, /* Romansh (Switzerland) */ {0x0418, "ro"}, /* Romanian (Romania) */ {0x0419, "ru"}, /* Russian (Russia) */ {0x041A, "hr"}, /* Croatian (Croatia) */ {0x041B, "sk"}, /* Slovak (Slovakia) */ {0x041C, "sq"}, /* Albanian (Albania) */ {0x041D, "sv"}, /* Swedish (Sweden) */ {0x041E, "th"}, /* Thai (Thailand) */ {0x041F, "tr"}, /* Turkish (Turkey) */ {0x0420, "ur"}, /* Urdu (Islamic Republic of Pakistan) */ {0x0421, "id"}, /* Indonesian (Indonesia) */ {0x0422, "uk"}, /* Ukrainian (Ukraine) */ {0x0423, "be"}, /* Belarusian (Belarus) */ {0x0424, "sl"}, /* Slovenian (Slovenia) */ {0x0425, "et"}, /* Estonian (Estonia) */ {0x0426, "lv"}, /* Latvian (Latvia) */ {0x0427, "lt"}, /* Lithuanian (Lithuania) */ {0x0428, "tg"}, /* Tajik (Cyrillic) (Tajikistan) */ {0x0429, "fa"}, /* Persian (Iran) */ {0x042A, "vi"}, /* Vietnamese (Vietnam) */ {0x042B, "hy"}, /* Armenian (Armenia) */ {0x042C, "az"}, /* Azeri (Latin) (Azerbaijan) */ {0x042D, "eu"}, /* Basque (Basque) */ {0x042E, "hsb"}, /* Upper Sorbian (Germany) */ {0x042F, "mk"}, /* Macedonian (FYROM) (Former Yugoslav Republic of Macedonia) */ {0x0430, "st"}, /* ??? */ {0x0431, "ts"}, /* ??? */ {0x0432, "tn"}, /* Setswana (South Africa) */ {0x0433, "ven"}, /* ??? */ {0x0434, "xh"}, /* isiXhosa (South Africa) */ {0x0435, "zu"}, /* isiZulu (South Africa) */ {0x0436, "af"}, /* Afrikaans (South Africa) */ {0x0437, "ka"}, /* Georgian (Georgia) */ {0x0438, "fo"}, /* Faroese (Faroe Islands) */ {0x0439, "hi"}, /* Hindi (India) */ {0x043A, "mt"}, /* Maltese (Malta) */ {0x043B, "se"}, /* Sami (Northern) (Norway) */ {0x043C, "ga"}, /* ??? */ {0x043D, "yi"}, /* ??? */ {0x043E, "ms"}, /* Malay (Malaysia) */ {0x043F, "kk"}, /* Kazakh (Kazakhstan) */ {0x0440, "ky"}, /* Kyrgyz (Kyrgyzstan) */ {0x0441, "sw"}, /* Kiswahili (Kenya) */ {0x0442, "tk"}, /* Turkmen (Turkmenistan) */ {0x0443, "uz"}, /* Uzbek (Latin) (Uzbekistan) */ {0x0444, "tt"}, /* Tatar (Russia) */ {0x0445, "bn"}, /* Bengali (India) */ {0x0446, "pa"}, /* Punjabi (India) */ {0x0447, "gu"}, /* Gujarati (India) */ {0x0448, "or"}, /* Odia (formerly Oriya) (India) */ {0x0449, "ta"}, /* Tamil (India) */ {0x044A, "te"}, /* Telugu (India) */ {0x044B, "kn"}, /* Kannada (India) */ {0x044C, "ml"}, /* Malayalam (India) */ {0x044D, "as"}, /* Assamese (India) */ {0x044E, "mr"}, /* Marathi (India) */ {0x044F, "sa"}, /* Sanskrit (India) */ {0x0450, "mn"}, /* Mongolian (Cyrillic) (Mongolia) */ {0x0451, "bo"}, /* Tibetan (PRC) */ {0x0452, "cy"}, /* Welsh (United Kingdom) */ {0x0453, "km"}, /* Khmer (Cambodia) */ {0x0454, "lo"}, /* Lao (Lao P.D.R.) */ {0x0455, "my"}, /* ??? */ {0x0456, "gl"}, /* Galician (Galician) */ {0x0457, "kok"}, /* Konkani (India) */ {0x0458, "mni"}, /* ??? */ {0x0459, "sd"}, /* ??? */ {0x045A, "syr"}, /* Syriac (Syria) */ {0x045B, "si"}, /* Sinhala (Sri Lanka) */ {0x045C, "chr"}, /* ??? */ {0x045D, "iu"}, /* Inuktitut (Canada) */ {0x045E, "am"}, /* Amharic (Ethiopia) */ {0x0460, "ks"}, /* ??? */ {0x0461, "ne"}, /* Nepali (Nepal) */ {0x0462, "fy"}, /* Frisian (Netherlands) */ {0x0463, "ps"}, /* Pashto (Afghanistan) */ {0x0464, "phi"}, /* Filipino (Philippines) */ {0x0465, "div"}, /* Divehi (Maldives) */ {0x0468, "ha"}, /* Hausa (Latin) (Nigeria) */ {0x046A, "yo"}, /* Yoruba (Nigeria) */ {0x046B, "quz"}, /* Quechua (Bolivia) */ {0x046C, "nso"}, /* Sesotho sa Leboa (South Africa) */ {0x046D, "ba"}, /* Bashkir (Russia) */ {0x046E, "lb"}, /* Luxembourgish (Luxembourg) */ {0x046F, "kl"}, /* Greenlandic (Greenland) */ {0x0470, "ibo"}, /* Igbo (Nigeria) */ {0x0471, "kau"}, /* ??? */ {0x0472, "om"}, /* ??? */ {0x0473, "ti"}, /* ??? */ {0x0474, "gn"}, /* ??? */ {0x0475, "haw"}, /* ??? */ {0x0476, "la"}, /* ??? */ {0x0477, "so"}, /* ??? */ {0x0478, "ii"}, /* Yi (PRC) */ {0x0479, "pap"}, /* ??? */ {0x047A, "arn"}, /* Mapudungun (Chile) */ {0x047C, "moh"}, /* Mohawk (Mohawk) */ {0x047E, "br"}, /* Breton (France) */ {0x0480, "ug"}, /* Uighur (PRC) */ {0x0481, "mi"}, /* Maori (New Zealand) */ {0x0482, "oc"}, /* Occitan (France) */ {0x0483, "co"}, /* Corsican (France) */ {0x0484, "gsw"}, /* Alsatian (France) */ {0x0485, "sah"}, /* Yakut (Russia) */ {0x0486, "qut"}, /* K'iche (Guatemala) */ {0x0487, "rw"}, /* Kinyarwanda (Rwanda) */ {0x0488, "wo"}, /* Wolof (Senegal) */ {0x048C, "fa"}, /* Dari (Afghanistan) */ {0x0801, "ar"}, /* Arabic (Iraq) */ {0x0804, "zh-cn"}, /* Chinese (People’s Republic of China) */ {0x0807, "de"}, /* German (Switzerland) */ {0x0809, "en"}, /* English (United Kingdom) */ {0x080A, "es"}, /* Spanish (Mexico) */ {0x080C, "fr"}, /* French (Belgium) */ {0x0810, "it"}, /* Italian (Switzerland) */ {0x0812, "ko"}, /* ??? */ {0x0813, "nl"}, /* Dutch (Belgium) */ {0x0814, "nn"}, /* Norwegian (Nynorsk) (Norway) */ {0x0816, "pt"}, /* Portuguese (Portugal) */ {0x0818, "mo"}, /* ??? */ {0x0819, "ru"}, /* ??? */ {0x081A, "sr"}, /* Serbian (Latin) (Serbia) */ {0x081D, "sv"}, /* Sweden (Finland) */ {0x0820, "ur"}, /* ??? */ {0x0827, "lt"}, /* ??? */ {0x082C, "az"}, /* Azeri (Cyrillic) (Azerbaijan) */ {0x082E, "dsb"}, /* Lower Sorbian (Germany) */ //{0x083B, ""}, /* Sami (Northern) (Sweden) */ {0x083C, "gd"}, /* Irish (Ireland) */ {0x083E, "ms"}, /* Malay (Brunei Darussalam) */ {0x0843, "uz"}, /* Uzbek (Cyrillic) (Uzbekistan) */ {0x0845, "bn"}, /* Bengali (Bangladesh) */ {0x0846, "ar"}, /* ??? */ {0x0850, "mn"}, /* Mongolian (Traditional) (People’s Republic of China) */ {0x0851, "dz"}, /* ??? */ {0x085D, "iu"}, /* Inuktitut (Latin) (Canada) */ {0x085F, "tzm"}, /* Tamazight (Latin) (Algeria) */ {0x0861, "ne"}, /* ??? */ //{0x086B, ""}, /* Quechua (Ecuador) */ {0x0873, "ti"}, /* ??? */ {0x0C01, "ar"}, /* Arabic (Egypt) */ {0x0C04, "zh-hk"}, /* Chinese (Hong Kong S.A.R.) */ {0x0C07, "de"}, /* German (Austria) */ {0x0C09, "en"}, /* English (Australia) */ {0x0C0A, "es"}, /* Spanish (Modern Sort) (Spain) */ {0x0C0C, "fr"}, /* French (Canada) */ {0x0C1A, "sr"}, /* Serbian (Cyrillic) (Serbia) */ {0x0C3B, "se"}, /* Sami (Northern) (Finland) */ //{0x0C6B, ""}, /* Quechua (Peru) */ {0x1001, "ar"}, /* Arabic (Libya) */ {0x1004, "zh-sg"}, /* Chinese (Singapore) */ {0x1007, "de"}, /* German (Luxembourg) */ {0x1009, "en"}, /* English (Canada) */ {0x100A, "es"}, /* Spanish (Guatemala) */ {0x100C, "fr"}, /* French (Switzerland) */ {0x101A, "hr"}, /* Croatian (Latin) (Bosnia and Herzegovina) */ {0x103B, "smj"}, /* Sami (Lule) (Norway) */ {0x1401, "ar"}, /* Arabic (Algeria) */ //{0x1404, ""}, /* Chinese (Macao S.A.R.) */ {0x1407, "de"}, /* German (Liechtenstein) */ {0x1409, "en"}, /* English (New Zealand) */ {0x140A, "es"}, /* Spanish (Costa Rica) */ {0x140C, "fr"}, /* French (Luxembourg) */ {0x141A, "bs"}, /* Bosnian (Latin) (Bosnia and Herzegovina) */ //{0x143B, ""}, /* Sami (Lule) (Sweden) */ {0x1801, "ar"}, /* Arabic (Morocco) */ {0x1809, "en"}, /* English (Ireland) */ {0x180A, "es"}, /* Spanish (Panama) */ {0x180C, "fr"}, /* French (Principality of Monaco) */ //{0x181A, ""}, /* Serbian (Latin) (Bosnia and Herzegovina) */ {0x183B, "sma"}, /* Sami (Southern) (Norway) */ {0x1C01, "ar"}, /* Arabic (Tunisia) */ {0x1C09, "en"}, /* English (South Africa) */ {0x1C0A, "es"}, /* Spanish (Dominican Republic) */ {0x1C0C, "fr"}, /* ??? */ //{0x1C1A, ""}, /* Serbian (Cyrillic) (Bosnia and Herzegovina) */ //{0x1C3B, ""}, /* Sami (Southern) (Sweden) */ {0x2001, "ar"}, /* Arabic (Oman) */ {0x2009, "en"}, /* English (Jamaica) */ {0x200A, "es"}, /* Spanish (Venezuela) */ {0x200C, "fr"}, /* ??? */ {0x201A, "bs"}, /* Bosnian (Cyrillic) (Bosnia and Herzegovina) */ {0x203B, "sms"}, /* Sami (Skolt) (Finland) */ {0x2401, "ar"}, /* Arabic (Yemen) */ {0x2409, "en"}, /* English (Caribbean) */ {0x240A, "es"}, /* Spanish (Colombia) */ {0x240C, "fr"}, /* ??? */ {0x243B, "smn"}, /* Sami (Inari) (Finland) */ {0x2801, "ar"}, /* Arabic (Syria) */ {0x2809, "en"}, /* English (Belize) */ {0x280A, "es"}, /* Spanish (Peru) */ {0x280C, "fr"}, /* ??? */ {0x2C01, "ar"}, /* Arabic (Jordan) */ {0x2C09, "en"}, /* English (Trinidad and Tobago) */ {0x2C0A, "es"}, /* Spanish (Argentina) */ {0x2C0C, "fr"}, /* ??? */ {0x3001, "ar"}, /* Arabic (Lebanon) */ {0x3009, "en"}, /* English (Zimbabwe) */ {0x300A, "es"}, /* Spanish (Ecuador) */ {0x300C, "fr"}, /* ??? */ {0x3401, "ar"}, /* Arabic (Kuwait) */ {0x3409, "en"}, /* English (Republic of the Philippines) */ {0x340A, "es"}, /* Spanish (Chile) */ {0x340C, "fr"}, /* ??? */ {0x3801, "ar"}, /* Arabic (U.A.E.) */ {0x380A, "es"}, /* Spanish (Uruguay) */ {0x380C, "fr"}, /* ??? */ {0x3C01, "ar"}, /* Arabic (Bahrain) */ {0x3C09, "en"}, /* ??? */ {0x3C0A, "es"}, /* Spanish (Paraguay) */ {0x3C0C, "fr"}, /* ??? */ {0x4001, "ar"}, /* Arabic (Qatar) */ {0x4009, "en"}, /* English (India) */ {0x400A, "es"}, /* Spanish (Bolivia) */ {0x4409, "en"}, /* English (Malaysia) */ {0x440A, "es"}, /* Spanish (El Salvador) */ {0x4809, "en"}, /* English (Singapore) */ {0x480A, "es"}, /* Spanish (Honduras) */ {0x4C0A, "es"}, /* Spanish (Nicaragua) */ {0x500A, "es"}, /* Spanish (Puerto Rico) */ {0x540A, "es"}, /* Spanish (United States) */ {0xE40A, "es"}, /* ??? */ {0xE40C, "fr"}, /* ??? */ }; static const hb_ot_language_map_t hb_mac_language_map[] = { { 0, "en"}, /* English */ { 1, "fr"}, /* French */ { 2, "de"}, /* German */ { 3, "it"}, /* Italian */ { 4, "nl"}, /* Dutch */ { 5, "sv"}, /* Swedish */ { 6, "es"}, /* Spanish */ { 7, "da"}, /* Danish */ { 8, "pt"}, /* Portuguese */ { 9, "no"}, /* Norwegian */ { 10, "he"}, /* Hebrew */ { 11, "ja"}, /* Japanese */ { 12, "ar"}, /* Arabic */ { 13, "fi"}, /* Finnish */ { 14, "el"}, /* Greek */ { 15, "is"}, /* Icelandic */ { 16, "mt"}, /* Maltese */ { 17, "tr"}, /* Turkish */ { 18, "hr"}, /* Croatian */ { 19, "zh-tw"}, /* Chinese (Traditional) */ { 20, "ur"}, /* Urdu */ { 21, "hi"}, /* Hindi */ { 22, "th"}, /* Thai */ { 23, "ko"}, /* Korean */ { 24, "lt"}, /* Lithuanian */ { 25, "pl"}, /* Polish */ { 26, "hu"}, /* Hungarian */ { 27, "et"}, /* Estonian */ { 28, "lv"}, /* Latvian */ //{ 29, ""}, /* Sami */ { 30, "fo"}, /* Faroese */ { 31, "fa"}, /* Farsi/Persian */ { 32, "ru"}, /* Russian */ { 33, "zh-cn"}, /* Chinese (Simplified) */ { 34, "nl"}, /* Flemish */ { 35, "ga"}, /* Irish Gaelic */ { 36, "sq"}, /* Albanian */ { 37, "ro"}, /* Romanian */ { 38, "cs"}, /* Czech */ { 39, "sk"}, /* Slovak */ { 40, "sl"}, /* Slovenian */ { 41, "yi"}, /* Yiddish */ { 42, "sr"}, /* Serbian */ { 43, "mk"}, /* Macedonian */ { 44, "bg"}, /* Bulgarian */ { 45, "uk"}, /* Ukrainian */ { 46, "be"}, /* Byelorussian */ { 47, "uz"}, /* Uzbek */ { 48, "kk"}, /* Kazakh */ { 49, "az"}, /* Azerbaijani (Cyrillic script) */ { 50, "az"}, /* Azerbaijani (Arabic script) */ { 51, "hy"}, /* Armenian */ { 52, "ka"}, /* Georgian */ { 53, "mo"}, /* Moldavian */ { 54, "ky"}, /* Kirghiz */ { 55, "tg"}, /* Tajiki */ { 56, "tk"}, /* Turkmen */ { 57, "mn"}, /* Mongolian (Mongolian script) */ { 58, "mn"}, /* Mongolian (Cyrillic script) */ { 59, "ps"}, /* Pashto */ { 60, "ku"}, /* Kurdish */ { 61, "ks"}, /* Kashmiri */ { 62, "sd"}, /* Sindhi */ { 63, "bo"}, /* Tibetan */ { 64, "ne"}, /* Nepali */ { 65, "sa"}, /* Sanskrit */ { 66, "mr"}, /* Marathi */ { 67, "bn"}, /* Bengali */ { 68, "as"}, /* Assamese */ { 69, "gu"}, /* Gujarati */ { 70, "pa"}, /* Punjabi */ { 71, "or"}, /* Oriya */ { 72, "ml"}, /* Malayalam */ { 73, "kn"}, /* Kannada */ { 74, "ta"}, /* Tamil */ { 75, "te"}, /* Telugu */ { 76, "si"}, /* Sinhalese */ { 77, "my"}, /* Burmese */ { 78, "km"}, /* Khmer */ { 79, "lo"}, /* Lao */ { 80, "vi"}, /* Vietnamese */ { 81, "id"}, /* Indonesian */ { 82, "tl"}, /* Tagalog */ { 83, "ms"}, /* Malay (Roman script) */ { 84, "ms"}, /* Malay (Arabic script) */ { 85, "am"}, /* Amharic */ { 86, "ti"}, /* Tigrinya */ { 87, "om"}, /* Galla */ { 88, "so"}, /* Somali */ { 89, "sw"}, /* Swahili */ { 90, "rw"}, /* Kinyarwanda/Ruanda */ { 91, "rn"}, /* Rundi */ { 92, "ny"}, /* Nyanja/Chewa */ { 93, "mg"}, /* Malagasy */ { 94, "eo"}, /* Esperanto */ {128, "cy"}, /* Welsh */ {129, "eu"}, /* Basque */ {130, "ca"}, /* Catalan */ {131, "la"}, /* Latin */ {132, "qu"}, /* Quechua */ {133, "gn"}, /* Guarani */ {134, "ay"}, /* Aymara */ {135, "tt"}, /* Tatar */ {136, "ug"}, /* Uighur */ {137, "dz"}, /* Dzongkha */ {138, "jw"}, /* Javanese (Roman script) */ {139, "su"}, /* Sundanese (Roman script) */ {140, "gl"}, /* Galician */ {141, "af"}, /* Afrikaans */ {142, "br"}, /* Breton */ {143, "iu"}, /* Inuktitut */ {144, "gd"}, /* Scottish Gaelic */ {145, "gv"}, /* Manx Gaelic */ {146, "ga"}, /* Irish Gaelic (with dot above) */ {147, "to"}, /* Tongan */ {148, "el"}, /* Greek (polytonic) */ {149, "ik"}, /* Greenlandic */ {150, "az"}, /* Azerbaijani (Roman script) */ }; static hb_language_t _hb_ot_name_language_for (unsigned int code, const hb_ot_language_map_t *array, unsigned int len) { #ifdef HB_NO_OT_NAME_LANGUAGE return HB_LANGUAGE_INVALID; #endif auto *entry = hb_bsearch (code, array, len); if (entry) return hb_language_from_string (entry->lang, -1); return HB_LANGUAGE_INVALID; } hb_language_t _hb_ot_name_language_for_ms_code (unsigned int code) { return _hb_ot_name_language_for (code, hb_ms_language_map, ARRAY_LENGTH (hb_ms_language_map)); } hb_language_t _hb_ot_name_language_for_mac_code (unsigned int code) { return _hb_ot_name_language_for (code, hb_mac_language_map, ARRAY_LENGTH (hb_mac_language_map)); } #endif /* HB_OT_NAME_LANGUAGE_STATIC_HH */