mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-30 06:23:22 +08:00
Use LanguageCode and ScriptType types for external APIs
This commit is contained in:
+146
-144
File diff suppressed because it is too large
Load Diff
+50
-12
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
Reference in New Issue
Block a user