diff options
author | Behdad Esfahbod <behdad@gnome.org> | 2007-05-10 21:26:21 +0000 |
---|---|---|
committer | Behdad Esfahbod <behdad@src.gnome.org> | 2007-05-10 21:26:21 +0000 |
commit | dd0245c7629630c52a33f301ce5ba687ec353cff (patch) | |
tree | fefc5c8f24a7ad1fd4db35a1e33fe4fcce78a276 /pango | |
parent | f20dc94b7ed3bcf37f5bfc8bc5d8bf8596954a60 (diff) | |
download | pango-dd0245c7629630c52a33f301ce5ba687ec353cff.tar.gz |
New public API:
2007-05-10 Behdad Esfahbod <behdad@gnome.org>
* pango/Makefile.am:
* pango/pango-ot.h:
* pango/pango-ot-tag.c (pango_ot_tag_from_script),
(pango_ot_tag_to_script), (lang_compare_first_component),
(pango_ot_tag_from_language), (pango_ot_tag_to_language):
New public API:
PANGO_OT_DEFAULT_SCRIPT
pango_ot_tag_from_script()
pango_ot_tag_to_script()
pango_ot_tag_from_language()
pango_ot_tag_to_language()
* tests/Makefile.am:
* tests/test-ot-tags.c:
Test case for new functions.
* pango/pangoft2.def:
* docs/pango-docs.sgml:
* docs/pango-sections.txt:
* docs/tmpl/main.sgml:
* docs/tmpl/opentype.sgml:
Updated.
svn path=/trunk/; revision=2274
Diffstat (limited to 'pango')
-rw-r--r-- | pango/Makefile.am | 3 | ||||
-rw-r--r-- | pango/pango-ot-tag.c | 453 | ||||
-rw-r--r-- | pango/pango-ot.h | 16 | ||||
-rw-r--r-- | pango/pangoft2.def | 4 |
4 files changed, 471 insertions, 5 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am index 78765a0c..af0e6cf5 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -218,7 +218,8 @@ libpangoft2_1_0_la_SOURCES = \ pango-ot-private.h \ pango-ot-buffer.c \ pango-ot-info.c \ - pango-ot-ruleset.c + pango-ot-ruleset.c \ + pango-ot-tag.c if OS_WIN32 diff --git a/pango/pango-ot-tag.c b/pango/pango-ot-tag.c new file mode 100644 index 00000000..c3d853d4 --- /dev/null +++ b/pango/pango-ot-tag.c @@ -0,0 +1,453 @@ +/* Pango + * pango-ot-tag.h: + * + * Copyright (C) 2007 Red Hat Software + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <config.h> + +#include "pango-ot.h" + +/* + * complete list at: + * http://www.microsoft.com/typography/developers/opentype/scripttags.aspx + */ +static const char ot_scripts[][4] = { + "DFLT", /* PANGO_SCRIPT_COMMON */ + "DFLT", /* PANGO_SCRIPT_INHERITED */ + "arab", /* PANGO_SCRIPT_ARABIC */ + "armn", /* PANGO_SCRIPT_ARMENIAN */ + "beng", /* PANGO_SCRIPT_BENGALI */ + "bopo", /* PANGO_SCRIPT_BOPOMOFO */ + "cher", /* PANGO_SCRIPT_CHEROKEE */ + "copt", /* PANGO_SCRIPT_COPTIC */ + "cyrl", /* PANGO_SCRIPT_CYRILLIC */ + "dsrt", /* PANGO_SCRIPT_DESERET */ + "deva", /* PANGO_SCRIPT_DEVANAGARI */ + "ethi", /* PANGO_SCRIPT_ETHIOPIC */ + "geor", /* PANGO_SCRIPT_GEORGIAN */ + "goth", /* PANGO_SCRIPT_GOTHIC */ + "grek", /* PANGO_SCRIPT_GREEK */ + "gujr", /* PANGO_SCRIPT_GUJARATI */ + "guru", /* PANGO_SCRIPT_GURMUKHI */ + "hani", /* PANGO_SCRIPT_HAN */ + "hang", /* PANGO_SCRIPT_HANGUL */ + "hebr", /* PANGO_SCRIPT_HEBREW */ + "kana", /* PANGO_SCRIPT_HIRAGANA */ + "knda", /* PANGO_SCRIPT_KANNADA */ + "kana", /* PANGO_SCRIPT_KATAKANA */ + "khmr", /* PANGO_SCRIPT_KHMER */ + "lao ", /* PANGO_SCRIPT_LAO */ + "latn", /* PANGO_SCRIPT_LATIN */ + "mlym", /* PANGO_SCRIPT_MALAYALAM */ + "mong", /* PANGO_SCRIPT_MONGOLIAN */ + "mymr", /* PANGO_SCRIPT_MYANMAR */ + "ogam", /* PANGO_SCRIPT_OGHAM */ + "ital", /* PANGO_SCRIPT_OLD_ITALIC */ + "orya", /* PANGO_SCRIPT_ORIYA */ + "runr", /* PANGO_SCRIPT_RUNIC */ + "sinh", /* PANGO_SCRIPT_SINHALA */ + "syrc", /* PANGO_SCRIPT_SYRIAC */ + "taml", /* PANGO_SCRIPT_TAMIL */ + "telu", /* PANGO_SCRIPT_TELUGU */ + "thaa", /* PANGO_SCRIPT_THAANA */ + "thai", /* PANGO_SCRIPT_THAI */ + "tibt", /* PANGO_SCRIPT_TIBETAN */ + "cans", /* PANGO_SCRIPT_CANADIAN_ABORIGINAL */ + "yi ", /* PANGO_SCRIPT_YI */ + "tglg", /* PANGO_SCRIPT_TAGALOG */ + "hano", /* PANGO_SCRIPT_HANUNOO */ + "buhd", /* PANGO_SCRIPT_BUHID */ + "tagb", /* PANGO_SCRIPT_TAGBANWA */ + "brai", /* PANGO_SCRIPT_BRAILLE */ + "cprt", /* PANGO_SCRIPT_CYPRIOT */ + "limb", /* PANGO_SCRIPT_LIMBU */ + "osma", /* PANGO_SCRIPT_OSMANYA */ + "shaw", /* PANGO_SCRIPT_SHAVIAN */ + "linb", /* PANGO_SCRIPT_LINEAR_B */ + "tale", /* PANGO_SCRIPT_TAI_LE */ + "ugar", /* PANGO_SCRIPT_UGARITIC */ + "talu", /* PANGO_SCRIPT_NEW_TAI_LUE */ + "bugi", /* PANGO_SCRIPT_BUGINESE */ + "glag", /* PANGO_SCRIPT_GLAGOLITIC */ + "tfng", /* PANGO_SCRIPT_TIFINAGH */ + "sylo", /* PANGO_SCRIPT_SYLOTI_NAGRI */ + "xpeo", /* PANGO_SCRIPT_OLD_PERSIAN */ + "khar", /* PANGO_SCRIPT_KHAROSHTHI */ + "DFLT", /* PANGO_SCRIPT_UNKNOWN */ + "bali", /* PANGO_SCRIPT_BALINESE */ + "xsux", /* PANGO_SCRIPT_CUNEIFORM */ + "phnx", /* PANGO_SCRIPT_PHOENICIAN */ + "phag", /* PANGO_SCRIPT_PHAGS_PA */ + "nko " /* PANGO_SCRIPT_NKO */ +}; + +/** + * pango_ot_tag_from_script: + * @script: A #PangoScript. + * + * Finds the OpenType script tag corresponding to @script. + * + * The %PANGO_SCRIPT_COMMON, %PANGO_SCRIPT_INHERITED, and + * %PANGO_SCRIPT_UNKNOWN scripts are mapped to the OpenType + * 'DFLT' script tag that is also defined as + * %PANGO_OT_DEFAULT_SCRIPT. + * + * Note that multiple #PangoScript values may map to the same + * OpenType script tag. In particular, %PANGO_SCRIPT_HIRAGANA + * and %PANGO_SCRIPT_KATAKANA both map to the OT tag 'kana'. + * + * Return value: #PangoOTTag corresponding to @script or + * %PANGO_OT_DEFAULT_SCRIPT if none found. + * + * Since: 1.18 + **/ +PangoOTTag +pango_ot_tag_from_script (PangoScript script) +{ + g_return_val_if_fail (script >= 0 && (guint)script < G_N_ELEMENTS (ot_scripts), PANGO_OT_DEFAULT_SCRIPT); + + return GUINT32_FROM_BE (* (PangoOTTag *) ot_scripts[script]); +} + +/** + * pango_ot_tag_to_script: + * @script_tag: A #PangoOTTag OpenType script tag. + * + * Finds the #PangoScript corresponding to @script_tag. + * + * The 'DFLT' script tag is mapped to %PANGO_SCRIPT_COMMON. + * + * Note that an OpenType script tag may correspond to multiple + * #PangoScript values. In such cases, the #PangoScript value + * with the smallest value is returned. + * In particular, %PANGO_SCRIPT_HIRAGANA + * and %PANGO_SCRIPT_KATAKANA both map to the OT tag 'kana'. + * This function will return %PANGO_SCRIPT_HIRAGANA for + * 'kana'. + * + * Return value: #PangoScript corresponding to @script_tag or + * %PANGO_SCRIPT_UNKNOWN if none found. + * + * Since: 1.18 + **/ +PangoScript +pango_ot_tag_to_script (PangoOTTag script_tag) +{ + PangoScript i; + guint32 be_tag = GUINT32_TO_BE (script_tag); + + for (i = 0; i < (PangoScript) G_N_ELEMENTS (ot_scripts); i++) + { + guint32 tag = * (guint32 *) ot_scripts[i]; + + if (tag == be_tag) + return i; + } + + return PANGO_SCRIPT_UNKNOWN; +} + + +typedef struct { + char language[6]; + char tag[4]; +} LangTag; + +/* + * complete list at: + * http://www.microsoft.com/OpenType/OTSpec/languagetags.htm + * + * Generated by intersecting the above list with the ISO 639-2 codes + * and then adjusting manually. A lot of items missing still, feel + * free to add. Keep sorted for bsearch purpose. + */ +static const LangTag ot_languages[] = { + {"aa", "AFR "}, + {"ab", "ABK "}, + {"ady", "ADY "}, + {"af", "AFK "}, + {"am", "AMH "}, + {"ar", "ARA "}, + {"as", "ASM "}, + {"awa", "AWA "}, + {"ay", "AYM "}, + {"az", "AZE "}, + {"ba", "BSH "}, + {"bem", "BEM "}, + {"bg", "BGR "}, + {"bho", "BHO "}, + {"bik", "BIK "}, + {"bin", "EDO "}, + {"bm", "BMB "}, + {"bn", "BEN "}, + {"bo", "TIB "}, + {"br", "BRE "}, + {"ca", "CAT "}, + {"ce", "CHE "}, + {"ceb", "CEB "}, + {"chp", "CHP "}, + {"chr", "CHR "}, + {"cop", "COP "}, + {"cr", "CRE "}, + {"crh", "CRT "}, + {"cs", "CSY "}, + {"cu", "CSL "}, + {"cv", "CHU "}, + {"cy", "WEL "}, + {"da", "DAN "}, + {"dar", "DAR "}, + {"din", "DNK "}, + {"doi", "DGR "}, + {"dv", "DHV "}, + {"dz", "DZN "}, + {"ee", "EWE "}, + {"efi", "EFI "}, + {"en", "ENG "}, + {"eo", "NTO "}, + {"es", "ESP "}, + {"et", "ETI "}, + {"eu", "EUQ "}, + {"fa", "FAR "}, + {"fi", "FIN "}, + {"fil", "PIL "}, + {"fj", "FJI "}, + {"fo", "FOS "}, + {"fon", "FON "}, + {"fr", "FRA "}, + {"fur", "FRL "}, + {"ga", "IRI "}, + {"gaa", "GAD "}, + {"gd", "GAE "}, + {"gl", "GAL "}, + {"gn", "GUA "}, + {"gon", "GON "}, + {"gu", "GUJ "}, + {"ha", "HAU "}, + {"he", "IWR "}, + {"hi", "HIN "}, + {"hil", "HIL "}, + {"hr", "HRV "}, + {"hsb", "USB "}, + {"ht", "HAI "}, + {"hu", "HUN "}, + {"hy", "HYE "}, + {"id", "IND "}, + {"ig", "IBO "}, + {"inh", "ING "}, + {"is", "ISL "}, + {"it", "ITA "}, + {"iu", "INU "}, + {"ja", "JAN "}, + {"jv", "JAV "}, + {"ka", "KAT "}, + {"kam", "KMB "}, + {"kbd", "KAB "}, + {"kha", "KSI "}, + {"ki", "KIK "}, + {"kk", "KAZ "}, + {"kl", "GRN "}, + {"kn", "KAN "}, + {"ko", "KOR "}, + {"kok", "KOK "}, + {"kpe", "KPL "}, + {"kr", "KNR "}, + {"krl", "KRL "}, + {"kru", "KUU "}, + {"ks", "KSH "}, + {"ku", "KUR "}, + {"kum", "KUM "}, + {"ky", "KIR "}, + {"ln", "LIN "}, + {"lt", "LTH "}, + {"mai", "MTH "}, + {"mdf", "MOK "}, + {"men", "MDE "}, + {"mg", "MLG "}, + {"mi", "MRI "}, + {"mnc", "MCH "}, + {"mni", "MNI "}, + {"mo", "MOL "}, + {"mr", "MAR "}, + {"ms", "MLY "}, + {"mt", "MTS "}, + {"mwr", "MAW "}, + {"my", "BRM "}, + {"myv", "ERZ "}, + {"nl", "FLE "}, + {"nl", "NLD "}, + {"no", "NOR "}, + {"ny", "CHI "}, + {"om", "ORO "}, + {"or", "ORI "}, + {"os", "OSS "}, + {"pa", "PAN "}, + {"pi", "PAL "}, + {"pl", "PLK "}, + {"ps", "PAS "}, + {"pt", "PTG "}, + {"ro", "ROM "}, + {"rom", "ROY "}, + {"ru", "RUS "}, + {"sa", "SAN "}, + {"sat", "SAT "}, + {"sd", "SND "}, + {"sel", "SEL "}, + {"sg", "SGO "}, + {"shn", "SHN "}, + {"si", "SNH "}, + {"sid", "SID "}, + {"sk", "SKY "}, + {"sl", "SLV "}, + {"sm", "SMO "}, + {"smj", "LSM "}, + {"smn", "ISM "}, + {"sms", "SKS "}, + {"snk", "SNK "}, + {"so", "SML "}, + {"sq", "SQI "}, + {"sr", "SRB "}, + {"srr", "SRR "}, + {"sv", "SVE "}, + {"sw", "SWK "}, + {"syr", "SYR "}, + {"tg", "TAJ "}, + {"ti", "TGY "}, + {"tig", "TGR "}, + {"tk", "TKM "}, + {"tn", "TNA "}, + {"tr", "TRK "}, + {"ts", "TSG "}, + {"tw", "TWI "}, + {"udm", "UDM "}, + {"ug", "UYG "}, + {"uk", "UKR "}, + {"ur", "URD "}, + {"uz", "UZB "}, + {"ve", "VEN "}, + {"vi", "VIT "}, + {"wo", "WLF "}, + {"xal", "KLM "}, + {"xh", "XHS "}, + {"yo", "YBA "}, + {"zh-cn", "ZHS "}, + {"zh-hk", "ZHH "}, + {"zh-mo", "ZHT "}, + {"zh-sg", "ZHS "}, + {"zh-tw", "ZHT "}, + {"zu", "ZUL "} +}; + +static int +lang_compare_first_component (gconstpointer pa, + gconstpointer pb) +{ + const char *a = pa, *b = pb; + unsigned int da, db; + const char *p; + + p = strstr (a, "-"); + da = p ? (unsigned int) (p - a) : strlen (a); + + p = strstr (b, "-"); + db = p ? (unsigned int) (p - b) : strlen (b); + + return strncmp (a, b, MAX (da, db)); +} + +/** + * pango_ot_tag_from_language: + * @language: A #PangoLanguage. + * + * Finds the OpenType language-system tag best describing @language. + * + * Return value: #PangoOTTag best matching @language or + * %PANGO_OT_DEFAULT_LANGUAGE if none found. + * + * Since: 1.18 + **/ +PangoOTTag +pango_ot_tag_from_language (PangoLanguage *language) +{ + const char *lang_str = pango_language_to_string (language); + + /* find a language matching in the first component */ + LangTag *lang_tag = bsearch (lang_str, ot_languages, + G_N_ELEMENTS (ot_languages), sizeof (LangTag), + lang_compare_first_component); + + /* we now need to find the best language matching */ + if (lang_tag) + { + gboolean found = FALSE; + + /* go to the final one matching in the first component */ + while (lang_tag + 1 < ot_languages + G_N_ELEMENTS (ot_languages) && + lang_compare_first_component (lang_str, lang_tag + 1) == 0) + lang_tag++; + + /* go back, find which one matches completely */ + while (lang_tag >= ot_languages && + lang_compare_first_component (lang_str, lang_tag) == 0) + { + if (pango_language_matches (language, lang_tag->language)) + { + found = TRUE; + break; + } + + lang_tag--; + } + + if (!found) + lang_tag = NULL; + } + + if (lang_tag) + return GUINT32_FROM_BE (* (PangoOTTag *) lang_tag->tag); + + return PANGO_OT_DEFAULT_LANGUAGE; +} + +/** + * pango_ot_tag_to_language: + * @language_tag: A #PangoOTTag OpenType language-system tag. + * + * Finds a #PangoLanguage corresponding to @language_tag. + * + * Return value: #PangoLanguage best matching @language_tag or + * #PangoLanguage corresponding to the string "xx" if none found. + * + * Since: 1.18 + **/ +PangoLanguage * +pango_ot_tag_to_language (PangoOTTag language_tag) +{ + int i; + guint32 be_tag = GUINT32_TO_BE (language_tag); + + for (i = 0; i < (int) G_N_ELEMENTS (ot_languages); i++) + { + guint32 tag = * (guint32 *) ot_languages[i].tag; + + if (tag == be_tag) + return pango_language_from_string (ot_languages[i].language); + } + + return pango_language_from_string ("xx"); +} diff --git a/pango/pango-ot.h b/pango/pango-ot.h index 3d6c4f1f..ce8778f3 100644 --- a/pango/pango-ot.h +++ b/pango/pango-ot.h @@ -1,7 +1,7 @@ /* Pango * pango-ot.h: * - * Copyright (C) 2000 Red Hat Software + * Copyright (C) 2000,2007 Red Hat Software * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -25,12 +25,14 @@ #include <pango/pangofc-font.h> #include <pango/pango-glyph.h> #include <pango/pango-font.h> +#include <pango/pango-script.h> +#include <pango/pango-language.h> G_BEGIN_DECLS #ifdef PANGO_ENABLE_ENGINE -typedef guint32 PangoOTTag; +typedef guint32 PangoOTTag; typedef struct _PangoOTInfo PangoOTInfo; typedef struct _PangoOTBuffer PangoOTBuffer; @@ -44,8 +46,9 @@ typedef enum } PangoOTTableType; -#define PANGO_OT_ALL_GLYPHS ((guint)0xFFFF) -#define PANGO_OT_DEFAULT_LANGUAGE ((guint)0xFFFF) +#define PANGO_OT_ALL_GLYPHS ((guint) 0xFFFF) +#define PANGO_OT_DEFAULT_LANGUAGE ((PangoOTTag) 0xFFFF) +#define PANGO_OT_DEFAULT_SCRIPT ((PangoOTTag) FT_MAKE_TAG ('D', 'F', 'L', 'T')) /* Note that this must match HB_GlyphItem */ struct _PangoOTGlyph @@ -118,6 +121,11 @@ void pango_ot_ruleset_substitute (PangoOTRuleset *ruleset, void pango_ot_ruleset_position (PangoOTRuleset *ruleset, PangoOTBuffer *buffer); +PangoScript pango_ot_tag_to_script (PangoOTTag script_tag); +PangoOTTag pango_ot_tag_from_script (PangoScript script); +PangoLanguage* pango_ot_tag_to_language (PangoOTTag language_tag); +PangoOTTag pango_ot_tag_from_language (PangoLanguage *language); + #endif /* PANGO_ENABLE_ENGINE */ G_END_DECLS diff --git a/pango/pangoft2.def b/pango/pangoft2.def index 100909b7..826b3f8d 100644 --- a/pango/pangoft2.def +++ b/pango/pangoft2.def @@ -62,3 +62,7 @@ EXPORTS pango_ot_ruleset_new pango_ot_ruleset_position pango_ot_ruleset_substitute + pango_ot_tag_from_language + pango_ot_tag_from_script + pango_ot_tag_to_language + pango_ot_tag_to_script |