⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pango-language.c

📁 linux
💻 C
📖 第 1 页 / 共 2 页
字号:
 * * 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 + -