Use LanguageCode and ScriptType types for external APIs

This commit is contained in:
Vincent Wei
2019-03-19 11:48:24 +08:00
parent cbd54e0766
commit 14bfe263a3
5 changed files with 240 additions and 177 deletions
+146 -144
View File
File diff suppressed because it is too large Load Diff
+50 -12
View File
@@ -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 */
+2
View File
@@ -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 */
+25 -6
View File
@@ -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 ||