diff options
-rw-r--r-- | ChangeLog | 34 | ||||
-rw-r--r-- | docs/pango-docs.sgml | 3 | ||||
-rw-r--r-- | docs/pango-sections.txt | 5 | ||||
-rw-r--r-- | docs/tmpl/main.sgml | 3 | ||||
-rw-r--r-- | docs/tmpl/opentype.sgml | 46 | ||||
-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 | ||||
-rw-r--r-- | tests/Makefile.am | 21 | ||||
-rw-r--r-- | tests/test-ot-tags.c | 131 |
11 files changed, 695 insertions, 24 deletions
@@ -1,5 +1,39 @@ 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. + +2007-05-10 Behdad Esfahbod <behdad@gnome.org> + + Bug 437534 – pango_language_includes_script is buggy + + * pango/pango-language.c (lang_compare_first_component), + (lang_info_compare), (script_for_lang_compare), + (pango_language_includes_script): Fix script_for_lang table lookup. + +2007-05-10 Behdad Esfahbod <behdad@gnome.org> + * pango/pangofc-fontmap.c (pango_fc_font_description_from_pattern), (pango_fc_face_describe): Don't set gravity in pango_fc_font_description_from_pattern() if it was not set on the diff --git a/docs/pango-docs.sgml b/docs/pango-docs.sgml index c38cf8f7..b8670dec 100644 --- a/docs/pango-docs.sgml +++ b/docs/pango-docs.sgml @@ -116,4 +116,7 @@ <index role="1.16"> <title>Index of new symbols in 1.16</title> </index> + <index role="1.18"> + <title>Index of new symbols in 1.18</title> + </index> </book> diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt index 6c9e6426..e7348d31 100644 --- a/docs/pango-sections.txt +++ b/docs/pango-sections.txt @@ -943,6 +943,7 @@ PangoOTRuleset PangoOTTableType PANGO_OT_ALL_GLYPHS PANGO_OT_DEFAULT_LANGUAGE +PANGO_OT_DEFAULT_SCRIPT pango_ot_info_get pango_ot_info_find_script pango_ot_info_find_language @@ -962,6 +963,10 @@ pango_ot_ruleset_new pango_ot_ruleset_add_feature pango_ot_ruleset_substitute pango_ot_ruleset_position +pango_ot_tag_from_language +pango_ot_tag_from_script +pango_ot_tag_to_language +pango_ot_tag_to_script </SECTION> <SECTION> diff --git a/docs/tmpl/main.sgml b/docs/tmpl/main.sgml index 9a3a9f39..dc3ed934 100644 --- a/docs/tmpl/main.sgml +++ b/docs/tmpl/main.sgml @@ -50,8 +50,9 @@ fields: @lang_engine: the engine for doing rendering-system-independent processing. @font: the font for this segment. @level: the bidirectional level for this segment. -@gravity: the glyph orientation for this segment. +@gravity: the glyph orientation for this segment (A #PangoGravity). @flags: boolean flags for this segment (currently only one) (Since: 1.16). +@script: the detected script for this segment (A #PangoScript) (Since: 1.18). @language: the detected language for this segment. @extra_attrs: extra attributes for this segment. diff --git a/docs/tmpl/opentype.sgml b/docs/tmpl/opentype.sgml index f1a304fe..1bc78474 100644 --- a/docs/tmpl/opentype.sgml +++ b/docs/tmpl/opentype.sgml @@ -96,12 +96,20 @@ feature should be applied to all glyphs. <!-- ##### MACRO PANGO_OT_DEFAULT_LANGUAGE ##### --> <para> -This is used as the language index in pango_ot_info_find_feature() when a +This is used as the language index in pango_ot_info_find_feature() when the default language system of the script is desired. </para> +<!-- ##### MACRO PANGO_OT_DEFAULT_SCRIPT ##### --> +<para> +Expands to the #PangoOTTag corresponding to the special OpenType +script tag 'DFLT'. +</para> + + + <!-- ##### FUNCTION pango_ot_info_get ##### --> <para> @@ -297,3 +305,39 @@ the default language system of the script is desired. @buffer: +<!-- ##### FUNCTION pango_ot_tag_from_language ##### --> +<para> + +</para> + +@language: +@Returns: + + +<!-- ##### FUNCTION pango_ot_tag_from_script ##### --> +<para> + +</para> + +@script: +@Returns: + + +<!-- ##### FUNCTION pango_ot_tag_to_language ##### --> +<para> + +</para> + +@language_tag: +@Returns: + + +<!-- ##### FUNCTION pango_ot_tag_to_script ##### --> +<para> + +</para> + +@script_tag: +@Returns: + + 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 diff --git a/tests/Makefile.am b/tests/Makefile.am index 549b89c4..d05667e3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -44,29 +44,16 @@ check_PROGRAMS = testboundaries testcolor testscript if HAVE_CAIRO check_PROGRAMS += testiter endif - -gen_all_unicode_SOURCES = gen-all-unicode.c - -testboundaries_SOURCES = testboundaries.c - -testcolor_SOURCES = testcolor.c - -testiter_SOURCES = testiter.c - -testscript_SOURCES = testscript.c - - -dump_boundaries_SOURCES = dump-boundaries.c +if HAVE_FREETYPE +check_PROGRAMS += test-ot-tags +endif gen_all_unicode_LDADD = $(GLIB_LIBS) - testboundaries_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la - testcolor_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la - testiter_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la ../pango/libpangocairo-$(PANGO_API_VERSION).la - testscript_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la +test_ot_tags_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la ../pango/libpangoft2-$(PANGO_API_VERSION).la dump_boundaries_LDADD = ../pango/libpango-$(PANGO_API_VERSION).la diff --git a/tests/test-ot-tags.c b/tests/test-ot-tags.c new file mode 100644 index 00000000..dbfca369 --- /dev/null +++ b/tests/test-ot-tags.c @@ -0,0 +1,131 @@ +/* -*- mode: C; c-file-style: "gnu" -*- */ +/* Pango + * testscript.c: Test cases for PangoScriptIter + * + * Copyright (C) 2002 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. + */ + +#define PANGO_ENABLE_ENGINE +#include <pango/pango-ot.h> + +#undef VERBOSE + +#define ASSERT(stmt) G_STMT_START { \ + if (stmt) { } \ + else \ + { \ + g_warning ("%s:%d (%s): assertion '%s' failed", \ + __FILE__, __LINE__, G_GNUC_PRETTY_FUNCTION, #stmt); \ + exit (1); \ + } \ +} G_STMT_END + +static void +test_script_tags (void) +{ + gunichar ch; + PangoScript i, max_script; + + /* we need to know what the maximum script number is. but we don't + * provide an api for that. instead of looking into internal tables, + * we'll go over all chars and see what their script is, taking the max! + */ + + max_script = PANGO_SCRIPT_INVALID_CODE; + for (ch = 0; ch <= 0x10FFFF; ch++) + max_script = MAX (max_script, pango_script_for_unichar (ch)); + + for (i = PANGO_SCRIPT_COMMON; i <= max_script; i++) + { + PangoOTTag tag = pango_ot_tag_from_script (i); + PangoScript j = pango_ot_tag_to_script (tag); + + if (i <= PANGO_SCRIPT_INHERITED || i == PANGO_SCRIPT_UNKNOWN) + { + ASSERT (tag == PANGO_OT_DEFAULT_SCRIPT); + ASSERT (j == PANGO_SCRIPT_COMMON); + } + else if (tag == FT_MAKE_TAG ('k', 'a', 'n', 'a')) + { + /* Hiragana and Katakana both map to tag 'kana' */ + ASSERT (i == PANGO_SCRIPT_HIRAGANA || i == PANGO_SCRIPT_KATAKANA); + ASSERT (j == PANGO_SCRIPT_HIRAGANA || j == PANGO_SCRIPT_KATAKANA); + } + else + { + if (j != i) + g_error ("Got back %d for script %d (OT tag '%c%c%c%c')", j, i, + tag>>24, (tag>>16)&255, (tag>>8)&255, tag&255); + } + } + + ASSERT (pango_ot_tag_to_script (FT_MAKE_TAG ('X', 'Y', 'Z', ' ')) == PANGO_SCRIPT_UNKNOWN); +} + +static void +test_language_tags (void) +{ + /* just test it for a few known languages to make sure it's working */ + const char languages[][6] = { + "xy", /* hopefully nonexistent */ + "aa", + "az_IR", + "en", + "en_US", + "fa", + "fa_IR", + "fr", + "zh_CN", + "zu" + }; + unsigned int i; + + for (i = 0; i < G_N_ELEMENTS (languages); i++) + { + PangoLanguage *l = pango_language_from_string (languages[i]); + PangoOTTag tag = pango_ot_tag_from_language (l); + PangoLanguage *m = pango_ot_tag_to_language (tag); + + if (i == 0) + { + ASSERT (tag == PANGO_OT_DEFAULT_LANGUAGE); + ASSERT (strcmp (pango_language_to_string (m), "xx") == 0); + } + else + { + if (tag == PANGO_OT_DEFAULT_LANGUAGE) + g_error ("Got PANGO_OT_DEFAULT_LANGUAGE for language '%s'", pango_language_to_string (l)); + + if (!pango_language_matches (l, pango_language_to_string (m))) + g_error ("Got back %s for language %s (OT tag '%c%c%c%c')", + pango_language_to_string (m), pango_language_to_string (l), + tag>>24, (tag>>16)&255, (tag>>8)&255, tag&255); + } + } +} + +int +main (int argc, char **argv) +{ + g_setenv ("PANGO_RC_FILE", "./pangorc", TRUE); + + test_script_tags (); + test_language_tags (); + + return 0; +} |