diff --git a/include/gdi.h b/include/gdi.h index 3bcc290a..27da3eca 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -6228,7 +6228,7 @@ typedef enum { * See [Unicode Standard Annex #24: Script names](https://www.unicode.org/reports/tr24/). */ typedef enum { - SCRIPT_INVALID_CODE = -1, + SCRIPT_INVALID_CODE = 0xFF, SCRIPT_COMMON = 0, /* Zyyy */ SCRIPT_INHERITED, /* Zinh (Qaai) */ SCRIPT_ARABIC, /* Arab */ @@ -8924,7 +8924,7 @@ MG_EXPORT int GUIAPI UCharFullyDecompose (Uchar32 ch, BOOL compat, Uchar32 *result, int result_len); /** - * \fn int GUIAPI UCharGetScriptType (Uchar32 ch) + * \fn ScriptType GUIAPI UCharGetScriptType (Uchar32 ch) * * Looks up the script code for a particular character (as defined * by Unicode Standard Annex #24). No check is made for @ch being a @@ -8939,10 +8939,10 @@ MG_EXPORT int GUIAPI UCharFullyDecompose (Uchar32 ch, BOOL compat, * * Since: 3.4.0 */ -MG_EXPORT int GUIAPI UCharGetScriptType (Uchar32 ch); +MG_EXPORT ScriptType GUIAPI UCharGetScriptType (Uchar32 ch); /** - * \fn Uint32 ScriptTypeToISO15924 (int script) + * \fn Uint32 ScriptTypeToISO15924 (ScriptType script) * * Looks up the ISO 15924 code for @script. ISO 15924 assigns four-letter * codes to scripts. For example, the code for Arabic is 'Arab'. The @@ -8963,10 +8963,10 @@ MG_EXPORT int GUIAPI UCharGetScriptType (Uchar32 ch); * * Since: 3.4.0 */ -MG_EXPORT Uint32 GUIAPI ScriptTypeToISO15924 (int script); +MG_EXPORT Uint32 GUIAPI ScriptTypeToISO15924 (ScriptType script); /** - * \fn int ScriptTypeFromISO15924 (Uint32 iso15924) + * \fn ScriptType ScriptTypeFromISO15924 (Uint32 iso15924) * * Looks up the Unicode script type for @iso15924. ISO 15924 assigns four-letter * codes to scripts. For example, the code for Arabic is 'Arab'. @@ -8986,7 +8986,7 @@ MG_EXPORT Uint32 GUIAPI ScriptTypeToISO15924 (int script); * * Since: 3.4.0 */ -MG_EXPORT int GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924); +MG_EXPORT ScriptType GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924); /** * \fn int ScriptTypeFromISO15924Code (const char* iso15924) @@ -9006,7 +9006,7 @@ MG_EXPORT int GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924); * * Since: 3.4.0 */ -static inline int GUIAPI ScriptTypeFromISO15924Code (const char* iso15924) +static inline ScriptType GUIAPI ScriptTypeFromISO15924Code (const char* iso15924) { return ScriptTypeFromISO15924(MAKEDWORD32(iso15924[3], iso15924[2], iso15924[1], iso15924[0])); @@ -11586,7 +11586,7 @@ MG_EXPORT int GUIAPI GetGlyphInfo (LOGFONT* logfont, Glyph32 glyph_value, */ typedef enum { /** Unknown language code */ - LANGCODE_unknown = -1, + LANGCODE_unknown = 0xFF, /** Language code for Afar */ LANGCODE_aa = 0, /** Language code for Abkhazian */ @@ -11631,6 +11631,8 @@ typedef enum { LANGCODE_da, /** Language code for German */ LANGCODE_de, + /** Language code for Divehi */ + LANGCODE_dv, /** Language code for Bhutani */ LANGCODE_dz, /** Language code for Greek */ @@ -11888,7 +11890,7 @@ typedef enum { * * Since: 3.4.0 */ -MG_EXPORT int GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1); +MG_EXPORT LanguageCode GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1); /** * LanguageCodeFromISO639s1Code: @@ -11902,7 +11904,7 @@ MG_EXPORT int GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1); * * Since: 3.4.0 */ -static inline int GUIAPI LanguageCodeFromISO639s1Code(const char* iso639_1) +static inline LanguageCode GUIAPI LanguageCodeFromISO639s1Code(const char* iso639_1) { return LanguageCodeFromISO639s1(MAKEWORD16(iso639_1[1], iso639_1[0])); @@ -11912,11 +11914,11 @@ static inline int GUIAPI LanguageCodeFromISO639s1Code(const char* iso639_1) MG_EXPORT const char* GUIAPI LanguageCodeToISO639s1(LanguageCode lc); /** Get the sample language code (ISO639-1) from the specific script type */ -MG_EXPORT const char* GUIAPI GetSampleLanguageFromScript(ScriptType st); +MG_EXPORT LanguageCode GUIAPI GetSampleLanguageForScript(ScriptType st); -/** Get language code and script type from ISO639 language name. */ -MG_EXPORT ScriptType GUIAPI GetLangScriptFromName(const char* lang_name, - int* lang_code); +/** Get language code and scripts for ISO639 language name. */ +MG_EXPORT const ScriptType* GUIAPI GetScriptsForLang(const char* lang_name, + LanguageCode* lang_code, int* nr_scripts); /** Normalize script type according to language code */ MG_EXPORT ScriptType GUIAPI NormalizeScriptType(LanguageCode cl, diff --git a/src/font/language-code.c b/src/font/language-code.c index 9064e609..5870c3f2 100644 --- a/src/font/language-code.c +++ b/src/font/language-code.c @@ -67,6 +67,7 @@ static const Uint16 iso639_1_codes[] = PACK('c', 'y'), // Welch PACK('d', 'a'), // Danish PACK('d', 'e'), // German + PACK('d', 'v'), // Divehi PACK('d', 'z'), // Bhutani PACK('e', 'l'), // Greek PACK('e', 'n'), // English @@ -190,7 +191,7 @@ static const Uint16 iso639_1_codes[] = #undef PACK }; -int GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1) +LanguageCode GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1) { unsigned int lower = 0; unsigned int upper = TABLESIZE (iso639_1_codes) - 1; @@ -205,7 +206,7 @@ int GUIAPI LanguageCodeFromISO639s1 (Uint16 iso639_1) else if (iso639_1 > iso639_1_codes[mid]) lower = mid + 1; else - return (int)mid; + return (LanguageCode)mid; mid = (lower + upper) / 2; } while (lower <= upper); @@ -237,6 +238,7 @@ static const char* iso639_1_codes_str[] = "cy", // Welch "da", // Danish "de", // German + "dv", // Divehi "dz", // Bhutani "el", // Greek "en", // English @@ -371,180 +373,180 @@ const char* GUIAPI LanguageCodeToISO639s1 (LanguageCode lc) return ""; } -static const char sample_language_of_script[][3] = { - "", /* SCRIPT_COMMON */ - "", /* SCRIPT_INHERITED */ - "ar", /* SCRIPT_ARABIC */ - "hy", /* SCRIPT_ARMENIAN */ - "bn", /* SCRIPT_BENGALI */ - "zh", /* SCRIPT_BOPOMOFO: Used primarily in Taiwan, but not part of the standard zh-tw orthography */ - "", /* SCRIPT_CHEROKEE; no ISO639-1 code; ISO639-2 code: chr */ - "", /* SCRIPT_COPTIC; no ISO639-1 code; ISO639-2 code: cop */ - "ru", /* SCRIPT_CYRILLIC */ - "", /* SCRIPT_DESERET: Deseret was used to write English */ - "hi", /* SCRIPT_DEVANAGARI */ - "am", /* SCRIPT_ETHIOPIC */ - "ka", /* SCRIPT_GEORGIAN */ - "", /* SCRIPT_GOTHIC */ - "el", /* SCRIPT_GREEK */ - "gu", /* SCRIPT_GUJARATI */ - "pa", /* SCRIPT_GURMUKHI */ - "", /* SCRIPT_HAN */ - "ko", /* SCRIPT_HANGUL */ - "he", /* SCRIPT_HEBREW */ - "ja", /* SCRIPT_HIRAGANA */ - "kn", /* SCRIPT_KANNADA */ - "ja", /* SCRIPT_KATAKANA */ - "km", /* SCRIPT_KHMER */ - "lo", /* SCRIPT_LAO */ - "en", /* SCRIPT_LATIN */ - "ml", /* SCRIPT_MALAYALAM */ - "mn", /* SCRIPT_MONGOLIAN */ - "my", /* SCRIPT_MYANMAR */ - "", /* SCRIPT_OGHAM; Ogham was used to write old Irish */ - "", /* SCRIPT_OLD_ITALIC */ - "or", /* SCRIPT_ORIYA */ - "", /* SCRIPT_RUNIC */ - "si", /* SCRIPT_SINHALA */ - "", /* SCRIPT_SYRIAC; no ISO639-1 code; ISO639-2 code: syr */ - "ta", /* SCRIPT_TAMIL */ - "te", /* SCRIPT_TELUGU */ - "dv", /* SCRIPT_THAANA */ - "th", /* SCRIPT_THAI */ - "bo", /* SCRIPT_TIBETAN */ - "iu", /* SCRIPT_CANADIAN_ABORIGINAL */ - "", /* SCRIPT_YI */ - "tl", /* SCRIPT_TAGALOG */ +static const LanguageCode sample_language_of_script[] = { + LANGCODE_unknown, /* SCRIPT_COMMON */ + LANGCODE_unknown, /* SCRIPT_INHERITED */ + LANGCODE_ar, /* SCRIPT_ARABIC */ + LANGCODE_hy, /* SCRIPT_ARMENIAN */ + LANGCODE_bn, /* SCRIPT_BENGALI */ + LANGCODE_zh, /* SCRIPT_BOPOMOFO: Used primarily in Taiwan, but not part of the standard zh-tw orthography */ + LANGCODE_unknown, /* SCRIPT_CHEROKEE; no ISO639-1 code; ISO639-2 code: chr */ + LANGCODE_unknown, /* SCRIPT_COPTIC; no ISO639-1 code; ISO639-2 code: cop */ + LANGCODE_ru, /* SCRIPT_CYRILLIC */ + LANGCODE_unknown, /* SCRIPT_DESERET: Deseret was used to write English */ + LANGCODE_hi, /* SCRIPT_DEVANAGARI */ + LANGCODE_am, /* SCRIPT_ETHIOPIC */ + LANGCODE_ka, /* SCRIPT_GEORGIAN */ + LANGCODE_unknown, /* SCRIPT_GOTHIC */ + LANGCODE_el, /* SCRIPT_GREEK */ + LANGCODE_gu, /* SCRIPT_GUJARATI */ + LANGCODE_pa, /* SCRIPT_GURMUKHI */ + LANGCODE_unknown, /* SCRIPT_HAN */ + LANGCODE_ko, /* SCRIPT_HANGUL */ + LANGCODE_he, /* SCRIPT_HEBREW */ + LANGCODE_ja, /* SCRIPT_HIRAGANA */ + LANGCODE_kn, /* SCRIPT_KANNADA */ + LANGCODE_ja, /* SCRIPT_KATAKANA */ + LANGCODE_km, /* SCRIPT_KHMER */ + LANGCODE_lo, /* SCRIPT_LAO */ + LANGCODE_en, /* SCRIPT_LATIN */ + LANGCODE_ml, /* SCRIPT_MALAYALAM */ + LANGCODE_mn, /* SCRIPT_MONGOLIAN */ + LANGCODE_my, /* SCRIPT_MYANMAR */ + LANGCODE_unknown, /* SCRIPT_OGHAM; Ogham was used to write old Irish */ + LANGCODE_unknown, /* SCRIPT_OLD_ITALIC */ + LANGCODE_or, /* SCRIPT_ORIYA */ + LANGCODE_unknown, /* SCRIPT_RUNIC */ + LANGCODE_si, /* SCRIPT_SINHALA */ + LANGCODE_unknown, /* SCRIPT_SYRIAC; no ISO639-1 code; ISO639-2 code: syr */ + LANGCODE_ta, /* SCRIPT_TAMIL */ + LANGCODE_te, /* SCRIPT_TELUGU */ + LANGCODE_dv, /* SCRIPT_THAANA */ + LANGCODE_th, /* SCRIPT_THAI */ + LANGCODE_bo, /* SCRIPT_TIBETAN */ + LANGCODE_iu, /* SCRIPT_CANADIAN_ABORIGINAL */ + LANGCODE_unknown, /* SCRIPT_YI */ + LANGCODE_tl, /* SCRIPT_TAGALOG */ /* Phillipino languages/scripts */ - "", /* SCRIPT_HANUNOO; no ISO639-1 code and ISO639-2 code; hnn? */ - "", /* SCRIPT_BUHID; no ISO639-1 code and ISO639-2 code; bku? */ - "", /* SCRIPT_TAGBANWA; no ISO639-1 code and ISO639-2 code; tbw? */ + LANGCODE_unknown, /* SCRIPT_HANUNOO; no ISO639-1 code and ISO639-2 code; hnn? */ + LANGCODE_unknown, /* SCRIPT_BUHID; no ISO639-1 code and ISO639-2 code; bku? */ + LANGCODE_unknown, /* SCRIPT_TAGBANWA; no ISO639-1 code and ISO639-2 code; tbw? */ - "", /* SCRIPT_BRAILLE */ - "", /* SCRIPT_CYPRIOT */ - "", /* SCRIPT_LIMBU */ - "", /* SCRIPT_OSMANYA; Used for Somali (so) in the past */ - "", /* SCRIPT_SHAVIAN; The Shavian alphabet was designed for English */ - "", /* SCRIPT_LINEAR_B */ - "", /* SCRIPT_TAI_LE */ - "", /* SCRIPT_UGARITIC; no ISO639-1 code; ISO639-2 code: uga */ + LANGCODE_unknown, /* SCRIPT_BRAILLE */ + LANGCODE_unknown, /* SCRIPT_CYPRIOT */ + LANGCODE_unknown, /* SCRIPT_LIMBU */ + LANGCODE_unknown, /* SCRIPT_OSMANYA; Used for Somali (so) in the past */ + LANGCODE_unknown, /* SCRIPT_SHAVIAN; The Shavian alphabet was designed for English */ + LANGCODE_unknown, /* SCRIPT_LINEAR_B */ + LANGCODE_unknown, /* SCRIPT_TAI_LE */ + LANGCODE_unknown, /* SCRIPT_UGARITIC; no ISO639-1 code; ISO639-2 code: uga */ - "", /* SCRIPT_NEW_TAI_LUE */ - "", /* SCRIPT_BUGINESE; no ISO639-1 code; ISO639-2 code: bug */ - "", /* SCRIPT_GLAGOLITIC: The original script for Old Church Slavonic (chu), later written with Cyrillic */ - "", /* SCRIPT_TIFINAGH: Used for for Berber (ber), but Arabic script is more common */ - "", /* SCRIPT_SYLOTI_NAGRI; no ISO639-1 code and ISO639-2 code; syl? */ - "", /* SCRIPT_OLD_PERSIAN; no ISO639-1 code; ISO639-2 code: peo */ - "", /* SCRIPT_KHAROSHTHI */ + LANGCODE_unknown, /* SCRIPT_NEW_TAI_LUE */ + LANGCODE_unknown, /* SCRIPT_BUGINESE; no ISO639-1 code; ISO639-2 code: bug */ + LANGCODE_unknown, /* SCRIPT_GLAGOLITIC: The original script for Old Church Slavonic (chu), later written with Cyrillic */ + LANGCODE_unknown, /* SCRIPT_TIFINAGH: Used for for Berber (ber), but Arabic script is more common */ + LANGCODE_unknown, /* SCRIPT_SYLOTI_NAGRI; no ISO639-1 code and ISO639-2 code; syl? */ + LANGCODE_unknown, /* SCRIPT_OLD_PERSIAN; no ISO639-1 code; ISO639-2 code: peo */ + LANGCODE_unknown, /* SCRIPT_KHAROSHTHI */ - "", /* SCRIPT_UNKNOWN */ - "", /* SCRIPT_BALINESE */ - "", /* SCRIPT_CUNEIFORM */ - "", /* SCRIPT_PHOENICIAN */ - "", /* SCRIPT_PHAGS_PA */ - "", /* SCRIPT_NKO; no ISO639-1 code; ISO639-2 code: nqo */ + LANGCODE_unknown, /* SCRIPT_UNKNOWN */ + LANGCODE_unknown, /* SCRIPT_BALINESE */ + LANGCODE_unknown, /* SCRIPT_CUNEIFORM */ + LANGCODE_unknown, /* SCRIPT_PHOENICIAN */ + LANGCODE_unknown, /* SCRIPT_PHAGS_PA */ + LANGCODE_unknown, /* SCRIPT_NKO; no ISO639-1 code; ISO639-2 code: nqo */ /* Unicode-5.1 additions */ - "", /* SCRIPT_KAYAH_LI */ - "", /* SCRIPT_LEPCHA */ - "", /* SCRIPT_REJANG */ - "", /* SCRIPT_SUNDANESE */ - "", /* SCRIPT_SAURASHTRA */ - "", /* SCRIPT_CHAM */ - "", /* SCRIPT_OL_CHIKI */ - "", /* SCRIPT_VAI */ - "", /* SCRIPT_CARIAN */ - "", /* SCRIPT_LYCIAN */ - "", /* SCRIPT_LYDIAN */ + LANGCODE_unknown, /* SCRIPT_KAYAH_LI */ + LANGCODE_unknown, /* SCRIPT_LEPCHA */ + LANGCODE_unknown, /* SCRIPT_REJANG */ + LANGCODE_unknown, /* SCRIPT_SUNDANESE */ + LANGCODE_unknown, /* SCRIPT_SAURASHTRA */ + LANGCODE_unknown, /* SCRIPT_CHAM */ + LANGCODE_unknown, /* SCRIPT_OL_CHIKI */ + LANGCODE_unknown, /* SCRIPT_VAI */ + LANGCODE_unknown, /* SCRIPT_CARIAN */ + LANGCODE_unknown, /* SCRIPT_LYCIAN */ + LANGCODE_unknown, /* SCRIPT_LYDIAN */ /* Unicode-6.0 additions */ - "", /* SCRIPT_BATAK */ - "", /* SCRIPT_BRAHMI */ - "", /* SCRIPT_MANDAIC */ + LANGCODE_unknown, /* SCRIPT_BATAK */ + LANGCODE_unknown, /* SCRIPT_BRAHMI */ + LANGCODE_unknown, /* SCRIPT_MANDAIC */ /* Unicode-6.1 additions */ - "", /* SCRIPT_CHAKMA */ - "", /* SCRIPT_MEROITIC_CURSIVE */ - "", /* SCRIPT_MEROITIC_HIEROGLYPHS */ - "", /* SCRIPT_MIAO */ - "", /* SCRIPT_SHARADA */ - "", /* SCRIPT_SORA_SOMPENG */ - "", /* SCRIPT_TAKRI */ + LANGCODE_unknown, /* SCRIPT_CHAKMA */ + LANGCODE_unknown, /* SCRIPT_MEROITIC_CURSIVE */ + LANGCODE_unknown, /* SCRIPT_MEROITIC_HIEROGLYPHS */ + LANGCODE_unknown, /* SCRIPT_MIAO */ + LANGCODE_unknown, /* SCRIPT_SHARADA */ + LANGCODE_unknown, /* SCRIPT_SORA_SOMPENG */ + LANGCODE_unknown, /* SCRIPT_TAKRI */ /* Unicode 7.0 additions */ - "", /* SCRIPT_BASSA_VAH, Bass */ - "", /* SCRIPT_CAUCASIAN_ALBANIAN, Aghb */ - "", /* SCRIPT_DUPLOYAN, Dupl */ - "", /* SCRIPT_ELBASAN, Elba */ - "", /* SCRIPT_GRANTHA, Gran */ - "", /* SCRIPT_KHOJKI, Khoj */ - "", /* SCRIPT_KHUDAWADI, Sind */ - "", /* SCRIPT_LINEAR_A, Lina */ - "", /* SCRIPT_MAHAJANI, Mahj */ - "", /* SCRIPT_MANICHAEAN, Manu */ - "", /* SCRIPT_MENDE_KIKAKUI, Mend */ - "", /* SCRIPT_MODI, Modi */ - "", /* SCRIPT_MRO, Mroo */ - "", /* SCRIPT_NABATAEAN, Nbat */ - "", /* SCRIPT_OLD_NORTH_ARABIAN, Narb */ - "", /* SCRIPT_OLD_PERMIC, Perm */ - "", /* SCRIPT_PAHAWH_HMONG, Hmng */ - "", /* SCRIPT_PALMYRENE, Palm */ - "", /* SCRIPT_PAU_CIN_HAU, Pauc */ - "", /* SCRIPT_PSALTER_PAHLAVI, Phlp */ - "", /* SCRIPT_SIDDHAM, Sidd */ - "", /* SCRIPT_TIRHUTA, Tirh */ - "", /* SCRIPT_WARANG_CITI, Wara */ + LANGCODE_unknown, /* SCRIPT_BASSA_VAH, Bass */ + LANGCODE_unknown, /* SCRIPT_CAUCASIAN_ALBANIAN, Aghb */ + LANGCODE_unknown, /* SCRIPT_DUPLOYAN, Dupl */ + LANGCODE_unknown, /* SCRIPT_ELBASAN, Elba */ + LANGCODE_unknown, /* SCRIPT_GRANTHA, Gran */ + LANGCODE_unknown, /* SCRIPT_KHOJKI, Khoj */ + LANGCODE_unknown, /* SCRIPT_KHUDAWADI, Sind */ + LANGCODE_unknown, /* SCRIPT_LINEAR_A, Lina */ + LANGCODE_unknown, /* SCRIPT_MAHAJANI, Mahj */ + LANGCODE_unknown, /* SCRIPT_MANICHAEAN, Manu */ + LANGCODE_unknown, /* SCRIPT_MENDE_KIKAKUI, Mend */ + LANGCODE_unknown, /* SCRIPT_MODI, Modi */ + LANGCODE_unknown, /* SCRIPT_MRO, Mroo */ + LANGCODE_unknown, /* SCRIPT_NABATAEAN, Nbat */ + LANGCODE_unknown, /* SCRIPT_OLD_NORTH_ARABIAN, Narb */ + LANGCODE_unknown, /* SCRIPT_OLD_PERMIC, Perm */ + LANGCODE_unknown, /* SCRIPT_PAHAWH_HMONG, Hmng */ + LANGCODE_unknown, /* SCRIPT_PALMYRENE, Palm */ + LANGCODE_unknown, /* SCRIPT_PAU_CIN_HAU, Pauc */ + LANGCODE_unknown, /* SCRIPT_PSALTER_PAHLAVI, Phlp */ + LANGCODE_unknown, /* SCRIPT_SIDDHAM, Sidd */ + LANGCODE_unknown, /* SCRIPT_TIRHUTA, Tirh */ + LANGCODE_unknown, /* SCRIPT_WARANG_CITI, Wara */ /* Unicode 8.0 additions */ - "", /* SCRIPT_AHOM, Ahom */ - "", /* SCRIPT_ANATOLIAN_HIEROGLYPHS, Hluw */ - "", /* SCRIPT_HATRAN, Hatr */ - "", /* SCRIPT_MULTANI, Mult */ - "", /* SCRIPT_OLD_HUNGARIAN, Hung */ - "", /* SCRIPT_SIGNWRITING, Sgnw */ + LANGCODE_unknown, /* SCRIPT_AHOM, Ahom */ + LANGCODE_unknown, /* SCRIPT_ANATOLIAN_HIEROGLYPHS, Hluw */ + LANGCODE_unknown, /* SCRIPT_HATRAN, Hatr */ + LANGCODE_unknown, /* SCRIPT_MULTANI, Mult */ + LANGCODE_unknown, /* SCRIPT_OLD_HUNGARIAN, Hung */ + LANGCODE_unknown, /* SCRIPT_SIGNWRITING, Sgnw */ /* Unicode 9.0 additions */ - "", /* SCRIPT_ADLAM, Adlm */ - "", /* SCRIPT_BHAIKSUKI, Bhks */ - "", /* SCRIPT_MARCHEN, Marc */ - "", /* SCRIPT_NEWA, Newa */ - "", /* SCRIPT_OSAGE, Osge */ - "", /* SCRIPT_TANGUT, Tang */ + LANGCODE_unknown, /* SCRIPT_ADLAM, Adlm */ + LANGCODE_unknown, /* SCRIPT_BHAIKSUKI, Bhks */ + LANGCODE_unknown, /* SCRIPT_MARCHEN, Marc */ + LANGCODE_unknown, /* SCRIPT_NEWA, Newa */ + LANGCODE_unknown, /* SCRIPT_OSAGE, Osge */ + LANGCODE_unknown, /* SCRIPT_TANGUT, Tang */ /* Unicode 10.0 additions */ - "", /* SCRIPT_MASARAM_GONDI, Gonm */ - "", /* SCRIPT_NUSHU, Nshu */ - "", /* SCRIPT_SOYOMBO, Soyo */ - "", /* SCRIPT_ZANABAZAR_SQUARE, Zanb */ + LANGCODE_unknown, /* SCRIPT_MASARAM_GONDI, Gonm */ + LANGCODE_unknown, /* SCRIPT_NUSHU, Nshu */ + LANGCODE_unknown, /* SCRIPT_SOYOMBO, Soyo */ + LANGCODE_unknown, /* SCRIPT_ZANABAZAR_SQUARE, Zanb */ /* Unicode 11.0 additions */ - "", /* SCRIPT_DOGRA, Dogr */ - "", /* SCRIPT_GUNJALA_GONDI, Gong */ - "", /* SCRIPT_HANIFI_ROHINGYA, Rohg */ - "", /* SCRIPT_MAKASAR, Maka */ - "", /* SCRIPT_MEDEFAIDRIN, Medf */ - "", /* SCRIPT_OLD_SOGDIAN, Sogo */ - "", /* SCRIPT_SOGDIAN, Sogd */ + LANGCODE_unknown, /* SCRIPT_DOGRA, Dogr */ + LANGCODE_unknown, /* SCRIPT_GUNJALA_GONDI, Gong */ + LANGCODE_unknown, /* SCRIPT_HANIFI_ROHINGYA, Rohg */ + LANGCODE_unknown, /* SCRIPT_MAKASAR, Maka */ + LANGCODE_unknown, /* SCRIPT_MEDEFAIDRIN, Medf */ + LANGCODE_unknown, /* SCRIPT_OLD_SOGDIAN, Sogo */ + LANGCODE_unknown, /* SCRIPT_SOGDIAN, Sogd */ /* Unicode 12.0 additions */ - "", /* SCRIPT_ELYMAIC, Elymaic */ - "", /* SCRIPT_NANDINAGARI, Nandinagari */ - "", /* SCRIPT_NYIAKENG_PUACHUE_HMONG, Nyiakeng Puachue Hmong */ - "", /* SCRIPT_WANCHO, Wancho */ + LANGCODE_unknown, /* SCRIPT_ELYMAIC, Elymaic */ + LANGCODE_unknown, /* SCRIPT_NANDINAGARI, Nandinagari */ + LANGCODE_unknown, /* SCRIPT_NYIAKENG_PUACHUE_HMONG, Nyiakeng Puachue Hmong */ + LANGCODE_unknown, /* SCRIPT_WANCHO, Wancho */ }; -const char* GetSampleLanguageFromScript(ScriptType st) +LanguageCode GetSampleLanguageForScript(ScriptType st) { switch (st) { case SCRIPT_INVALID_CODE: - return ""; + return LANGCODE_unknown; default: return sample_language_of_script[st]; } - return ""; + return LANGCODE_unknown; } #endif /* _MGCHARSET_UNICODE */ diff --git a/src/font/unicode-script.c b/src/font/unicode-script.c index 5d094e2c..184016fa 100644 --- a/src/font/unicode-script.c +++ b/src/font/unicode-script.c @@ -69,12 +69,12 @@ static inline int unichar_get_script_bsearch (Uchar32 ch) return SCRIPT_UNKNOWN; } -int GUIAPI UCharGetScriptType (Uchar32 ch) +ScriptType GUIAPI UCharGetScriptType (Uchar32 ch) { if (ch < EASY_SCRIPTS_RANGE) - return unicode_script_easy_table[ch]; + return (ScriptType)unicode_script_easy_table[ch]; else - return unichar_get_script_bsearch (ch); + return (ScriptType)unichar_get_script_bsearch (ch); } /* http://unicode.org/iso15924/ */ @@ -264,18 +264,18 @@ static const Uint32 iso15924_tags[] = #undef PACK }; -Uint32 GUIAPI ScriptTypeToISO15924 (int script) +Uint32 GUIAPI ScriptTypeToISO15924 (ScriptType script) { if (script == SCRIPT_INVALID_CODE) return 0; - if (script < 0 || script >= (int) TABLESIZE (iso15924_tags)) + if (script < 0 || script >= (ScriptType) TABLESIZE (iso15924_tags)) return 0x5A7A7A7A; return iso15924_tags[script]; } -int GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924) +ScriptType GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924) { unsigned int i; @@ -284,7 +284,7 @@ int GUIAPI ScriptTypeFromISO15924 (Uint32 iso15924) for (i = 0; i < TABLESIZE (iso15924_tags); i++) if (iso15924_tags[i] == iso15924) - return (int) i; + return (ScriptType) i; return SCRIPT_UNKNOWN; } @@ -298,9 +298,10 @@ static int comp_lang(const void *k1, const void *k2) return strcmp(sl1->lang, sl2->lang); } -ScriptType GUIAPI GetLangScriptFromName(const char* lang_name, - int* lang_code) +const ScriptType* GUIAPI GetScriptsForLang(const char* lang_name, + LanguageCode* lang_code, int* nr_scripts) { + const ScriptType* scripts; const ScriptTypeForLang* matched; matched = bsearch(lang_name, _script_for_lang, @@ -310,13 +311,50 @@ ScriptType GUIAPI GetLangScriptFromName(const char* lang_name, if (matched) { if (lang_code) *lang_code = LanguageCodeFromISO639s1Code(matched->lang); - return matched->scripts[0]; + scripts = matched->scripts; + if (nr_scripts) { + int i; + + for (i = 0; i < TABLESIZE(_script_for_lang->scripts); i++) { + if (_script_for_lang->scripts[i] == 0) + break; + } + + *nr_scripts = i; + } + + return scripts; } if (lang_code) *lang_code = LANGCODE_unknown; - return SCRIPT_INVALID_CODE; + return NULL; +} + +BOOL __mg_language_includes_script(LanguageCode lc, ScriptType script) +{ + const ScriptType *scripts; + int num_scripts, j; + + /* copied from the one in pango-script.c */ +#define REAL_SCRIPT(script) \ + ((script) > SCRIPT_INHERITED && (script) != SCRIPT_UNKNOWN) + + if (!REAL_SCRIPT (script)) + return TRUE; + +#undef REAL_SCRIPT + + scripts = GetScriptsForLang (LanguageCodeToISO639s1(lc), &lc, &num_scripts); + if (!scripts) + return TRUE; + + for (j = 0; j < num_scripts; j++) + if (scripts[j] == script) + return TRUE; + + return FALSE; } /* @@ -386,7 +424,7 @@ typedef struct { {LTR, NONE, S, FALSE} const ScriptTypeProperties script_properties[] = -{/* ISO 15924 code */ +{ {LTR, NONE, S, FALSE}, /* Zyyy */ {LTR, NONE, S, FALSE}, /* Qaai */ {RTL, NONE, S, FALSE}, /* Arab */ diff --git a/src/include/unicode-ops.h b/src/include/unicode-ops.h index c8d99d4c..44e64984 100644 --- a/src/include/unicode-ops.h +++ b/src/include/unicode-ops.h @@ -132,6 +132,8 @@ EmojiIterator* __mg_emoji_iterator_init (EmojiIterator *iter, BOOL __mg_emoji_iterator_next (EmojiIterator *iter); void __mg_emoji_iterator_fini (EmojiIterator *iter); +BOOL __mg_language_includes_script(LanguageCode lc, ScriptType script); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/newgdi/glyphruninfo.c b/src/newgdi/glyphruninfo.c index 5272bbbb..4df256bc 100644 --- a/src/newgdi/glyphruninfo.c +++ b/src/newgdi/glyphruninfo.c @@ -83,6 +83,9 @@ typedef struct _GLYPHRUNSTATE { int emb_end_offset; BidiLevel emb_level; + LanguageCode lang; + ScriptType script; + GlyphOrient orient; GlyphOrientPolicy orient_policy; GlyphOrient ort_rsv; @@ -121,6 +124,25 @@ static void update_end (GLYPHRUNSTATE *state) state->run_end = state->emoji_iter.end; } +static LanguageCode compute_derived_language (LanguageCode lang, + ScriptType script) +{ + LanguageCode derived_lang; + + /* Make sure the language tag is consistent with the derived + * script. There is no point in marking up a section of + * Arabic text with the "en" language tag. + */ + if ((lang != LANGCODE_unknown) && + __mg_language_includes_script(lang, script)) + derived_lang = lang; + else { + derived_lang = GetSampleLanguageForScript(script); + } + + return derived_lang; +} + static void state_update_for_new_run (GLYPHRUNSTATE *state) { if (state->changed & (SCRIPT_CHANGED | WIDTH_CHANGED)) { @@ -135,15 +157,16 @@ static void state_update_for_new_run (GLYPHRUNSTATE *state) orient, orient_policy); } -#if 0 if (state->changed & (SCRIPT_CHANGED | LANG_CHANGED)) { LanguageCode old_derived_lang = state->derived_lang; - state->derived_lang = compute_derived_language (state->lang, state->script); + state->derived_lang = compute_derived_language (state->lang, + state->script); if (old_derived_lang != state->derived_lang) state->changed |= DERIVED_LANG_CHANGED; } +#if 0 if ((state->changed & DERIVED_LANG_CHANGED) || !state->lang_engine) { state->lang_engine = _pango_get_language_engine (); } @@ -171,10 +194,6 @@ static void state_process_run (GLYPHRUNSTATE *state) * We assume that all fonts have the ASCII space, and for other space * characters if they don't, HarfBuzz will compatibility-decompose them * to ASCII space... - * See bugs #355987 and #701652. - * - * We don't want to change fonts just for variation selectors. - * See bug #781123. */ type = UCharGetCategory (wc); if ((type == UCHAR_CATEGORY_CONTROL ||