?? pango-language.c
字號:
* * Get a string that is representative of the characters needed to * render a particular language. This function is a bad hack for * internal use by renderers and Pango. * * Return value: the sample string. This value is owned by Pango * and must not be freed. **/G_CONST_RETURN char *pango_language_get_sample_string (PangoLanguage *language){ const char *result; if (language) { const char *lang_str = pango_language_to_string (language); LangInfo *lang_info = bsearch (lang_str, lang_texts, G_N_ELEMENTS (lang_texts), sizeof (LangInfo), lang_info_compare); if (lang_info) result = lang_info->str; else result = "French (Fran\303\247ais)"; /* Assume iso-8859-1 */ } else { /* Complete junk */ result = "\330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205 \304\215esky \316\225\316\273\316\273\316\267\316\275\316\271\316\272\316\254 Fran\303\247ais \346\227\245\346\234\254\350\252\236 \355\225\234\352\270\200 \320\240\321\203\321\201\321\201\320\272\320\270\320\271 \344\270\255\346\226\207,\346\231\256\351\200\232\350\257\235,\346\261\211\350\257\255 T\303\274rk\303\247e"; } return result;}#include "pango-script-lang-table.h"static intscript_for_lang_compare (gconstpointer key, gconstpointer member){ PangoLanguage *lang = (PangoLanguage *)key; const PangoScriptForLang *script_for_lang = member; return lang_compare_first_component (lang, script_for_lang->lang);}/** * pango_language_includes_script: * @language: a #PangoLanguage, or %NULL * @script: a #PangoScript * * Determines if @script is one of the scripts used to * write @language. The returned value is conservative; * if nothing is known about the language tag @language, * %TRUE will be returned, since, as far as Pango knows, * @script might be used to write @language. * * This routine is used in Pango's itemization process when * determining if a supplied language tag is relevant to * a particular section of text. It probably is not useful for * applications in most circumstances. * * Return value: %TRUE if @script is one of the scripts used * to write @language or if nothing is known about @language * (including the case that @language is %NULL), * %FALSE otherwise. * Since: 1.4 **/gbooleanpango_language_includes_script (PangoLanguage *language, PangoScript script){ PangoScriptForLang *script_for_lang; unsigned int j; const char *lang_str;#define REAL_SCRIPT(script) \ ((script) > PANGO_SCRIPT_INHERITED) if (language == NULL || !REAL_SCRIPT (script)) return TRUE; lang_str = pango_language_to_string (language); /* This bsearch could be optimized to occur only once if * we store the pointer to the PangoScriptForLang in the * same block as the string value for the PangoLanguage. */ script_for_lang = bsearch (lang_str, pango_script_for_lang, G_N_ELEMENTS (pango_script_for_lang), sizeof (PangoScriptForLang), script_for_lang_compare); if (!script_for_lang) return TRUE; else { gboolean found = FALSE; /* find the best matching language */ /* go to the final one matching in the first component */ while (script_for_lang + 1 < pango_script_for_lang + G_N_ELEMENTS (pango_script_for_lang) && script_for_lang_compare (lang_str, script_for_lang + 1) == 0) script_for_lang++; /* go back, find which one matches completely */ while (script_for_lang >= pango_script_for_lang && script_for_lang_compare (lang_str, script_for_lang) == 0) { if (pango_language_matches (language, script_for_lang->lang)) { found = TRUE; break; } script_for_lang--; } if (!found) return TRUE; } for (j = 0; j < G_N_ELEMENTS (script_for_lang->scripts); j++) if (script_for_lang->scripts[j] == script) return TRUE; return FALSE;}static PangoLanguage **parse_default_languages (void){ char *p; gboolean done = FALSE; GArray *langs; p = getenv ("PANGO_LANGUAGE"); if (p == NULL) p = getenv ("LANGUAGE"); if (p == NULL) return NULL; p = g_strdup (p); langs = g_array_new (TRUE, FALSE, sizeof (PangoLanguage *)); while (!done) { char *end = strpbrk (p, LANGUAGE_SEPARATORS); if (!end) { end = p + strlen (p); done = TRUE; } else *end = '\0'; /* skip empty languages, and skip the language 'C' */ if (p != end && !(p + 1 == end && *p == 'C')) { PangoLanguage *l = pango_language_from_string (p); g_array_append_val (langs, l); } if (!done) p = end + 1; } return (PangoLanguage **) g_array_free (langs, FALSE);}static PangoLanguage *_pango_script_get_default_language (PangoScript script){ static gboolean initialized = FALSE; static PangoLanguage * const * languages = NULL; static GHashTable *hash = NULL; PangoLanguage *result, * const * p; if (G_UNLIKELY (!initialized)) { languages = parse_default_languages (); if (languages) hash = g_hash_table_new (NULL, NULL); initialized = TRUE; } if (!languages) return NULL; if (g_hash_table_lookup_extended (hash, GINT_TO_POINTER (script), NULL, (gpointer *) (gpointer) &result)) return result; for (p = languages; *p; p++) if (pango_language_includes_script (*p, script)) break; result = *p; g_hash_table_insert (hash, GINT_TO_POINTER (script), result); return result;}/** * pango_script_get_sample_language: * @script: a #PangoScript * * Given a script, finds a language tag that is reasonably * representative of that script. This will usually be the * most widely spoken or used language written in that script: * for instance, the sample language for %PANGO_SCRIPT_CYRILLIC * is <literal>ru</literal> (Russian), the sample language * for %PANGO_SCRIPT_ARABIC is <literal>ar</literal>. * * For some * scripts, no sample language will be returned because there * is no language that is sufficiently representative. The best * example of this is %PANGO_SCRIPT_HAN, where various different * variants of written Chinese, Japanese, and Korean all use * significantly different sets of Han characters and forms * of shared characters. No sample language can be provided * for many historical scripts as well. * * As of 1.18, this function checks the environment variables * PANGO_LANGUAGE and LANGUAGE (checked in that order) first. * If one of them is set, it is parsed as a list of language tags * separated by colons or other separators. This function * will return the first language in the parsed list that Pango * believes may use @script for writing. This last predicate * is tested using pango_language_includes_script(). This can * be used to control Pango's font selection for non-primary * languages. For example, a PANGO_LANGUAGE enviroment variable * set to "en:fa" makes Pango choose fonts suitable for Persian (fa) * instead of Arabic (ar) when a segment of Arabic text is found * in an otherwise non-Arabic text. The same trick can be used to * choose a default language for %PANGO_SCRIPT_HAN when setting * context language is not feasible. * * Return value: a #PangoLanguage that is representative * of the script, or %NULL if no such language exists. * * Since: 1.4 **/PangoLanguage *pango_script_get_sample_language (PangoScript script){ /* Note that in the following, we want * pango_language_includes_script() for the sample language * to include the script, so alternate orthographies * (Shavian for English, Osmanya for Somali, etc), typically * have no sample language */ static const char sample_languages[][4] = { "", /* PANGO_SCRIPT_COMMON */ "", /* PANGO_SCRIPT_INHERITED */ "ar", /* PANGO_SCRIPT_ARABIC */ "hy", /* PANGO_SCRIPT_ARMENIAN */ "bn", /* PANGO_SCRIPT_BENGALI */ /* Used primarily in Taiwan, but not part of the standard * zh-tw orthography */ "", /* PANGO_SCRIPT_BOPOMOFO */ "chr", /* PANGO_SCRIPT_CHEROKEE */ "cop", /* PANGO_SCRIPT_COPTIC */ "ru", /* PANGO_SCRIPT_CYRILLIC */ /* Deseret was used to write English */ "", /* PANGO_SCRIPT_DESERET */ "hi", /* PANGO_SCRIPT_DEVANAGARI */ "am", /* PANGO_SCRIPT_ETHIOPIC */ "ka", /* PANGO_SCRIPT_GEORGIAN */ "", /* PANGO_SCRIPT_GOTHIC */ "el", /* PANGO_SCRIPT_GREEK */ "gu", /* PANGO_SCRIPT_GUJARATI */ "pa", /* PANGO_SCRIPT_GURMUKHI */ "", /* PANGO_SCRIPT_HAN */ "ko", /* PANGO_SCRIPT_HANGUL */ "he", /* PANGO_SCRIPT_HEBREW */ "ja", /* PANGO_SCRIPT_HIRAGANA */ "kn", /* PANGO_SCRIPT_KANNADA */ "ja", /* PANGO_SCRIPT_KATAKANA */ "km", /* PANGO_SCRIPT_KHMER */ "lo", /* PANGO_SCRIPT_LAO */ "en", /* PANGO_SCRIPT_LATIN */ "ml", /* PANGO_SCRIPT_MALAYALAM */ "mn", /* PANGO_SCRIPT_MONGOLIAN */ "my", /* PANGO_SCRIPT_MYANMAR */ /* Ogham was used to write old Irish */ "", /* PANGO_SCRIPT_OGHAM */ "", /* PANGO_SCRIPT_OLD_ITALIC */ "or", /* PANGO_SCRIPT_ORIYA */ "", /* PANGO_SCRIPT_RUNIC */ "si", /* PANGO_SCRIPT_SINHALA */ "syr", /* PANGO_SCRIPT_SYRIAC */ "ta", /* PANGO_SCRIPT_TAMIL */ "te", /* PANGO_SCRIPT_TELUGU */ "dv", /* PANGO_SCRIPT_THAANA */ "th", /* PANGO_SCRIPT_THAI */ "bo", /* PANGO_SCRIPT_TIBETAN */ "iu", /* PANGO_SCRIPT_CANADIAN_ABORIGINAL */ "", /* PANGO_SCRIPT_YI */ "tl", /* PANGO_SCRIPT_TAGALOG */ /* There are no ISO-636 language codes for the following * Phillipino languages/scripts */ "", /* PANGO_SCRIPT_HANUNOO */ "", /* PANGO_SCRIPT_BUHID */ "", /* PANGO_SCRIPT_TAGBANWA */ "", /* PANGO_SCRIPT_BRAILLE */ "", /* PANGO_SCRIPT_CYPRIOT */ "", /* PANGO_SCRIPT_LIMBU */ /* Used for Somali (so) in the past */ "", /* PANGO_SCRIPT_OSMANYA */ /* The Shavian alphabet was designed for English */ "", /* PANGO_SCRIPT_SHAVIAN */ "", /* PANGO_SCRIPT_LINEAR_B */ "", /* PANGO_SCRIPT_TAI_LE */ "uga", /* PANGO_SCRIPT_UGARITIC */ "", /* PANGO_SCRIPT_NEW_TAI_LUE */ "bug", /* PANGO_SCRIPT_BUGINESE */ /* The original script for Old Church Slavonic (chu), later * written with Cyrillic */ "", /* PANGO_SCRIPT_GLAGOLITIC */ /* Used for for Berber (ber), but Arabic script is more common */ "", /* PANGO_SCRIPT_TIFINAGH */ /* Syloti Nagri is used for Sylheti, no ISO 639 code */ "", /* PANGO_SCRIPT_SYLOTI_NAGRI */ "peo", /* PANGO_SCRIPT_OLD_PERSIAN */ "", /* PANGO_SCRIPT_KHAROSHTHI */ "", /* PANGO_SCRIPT_UNKNOWN */ "", /* PANGO_SCRIPT_BALINESE */ "", /* PANGO_SCRIPT_CUNEIFORM */ "", /* PANGO_SCRIPT_PHOENICIAN */ "", /* PANGO_SCRIPT_PHAGS_PA */ "nqo" /* PANGO_SCRIPT_NKO */ }; const char *sample_language; PangoLanguage *result; g_return_val_if_fail (script >= 0, NULL); if ((guint)script >= G_N_ELEMENTS (sample_languages)) return NULL; result = _pango_script_get_default_language (script); if (result) return result; sample_language = sample_languages[script]; if (!sample_language[0]) return NULL; else return pango_language_from_string (sample_language);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -