diff options
author | Owen Taylor <otaylor@redhat.com> | 2001-06-14 20:38:25 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2001-06-14 20:38:25 +0000 |
commit | 5ee19fca3c7c3da53ef4f000efdb3bbf4dcb1a04 (patch) | |
tree | 17a70e18597aae753e36a983150500bd9362dcfd | |
parent | 3a42444e7f2449598106338be7e6ec9468bb7946 (diff) | |
download | pango-5ee19fca3c7c3da53ef4f000efdb3bbf4dcb1a04.tar.gz |
Add a new PangoLanguage type to represent language tags; these can
Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com>
* pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage
type to represent language tags; these can efficiently be compared
and don't need to be copied. Also add pango_language_matches()
to match a language tag against a pattern.
* pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs
from PangoItem to PangoAnalysis. Add a language tag field to
PangoAnalysis. (#55894)
* pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return
the language tag as well.
* pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage,
and make it hold a PangoLanguage.
* pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to
pango_context_{get,set}_language().
* **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes.
* modules/basic/basic-x.c modules/basic/tables-big.i: Add support
for ordering character sets differently for different language
tags.
* pango/itemize.c: Remove old, unused file.
* pango/pango-context.c (pango_itemize): Reduce number of mallocs
by allocating one array of PangoAnalysis instead of many arrays.
58 files changed, 843 insertions, 587 deletions
@@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-0 b/ChangeLog.pre-1-0 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-0 +++ b/ChangeLog.pre-1-0 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-2 +++ b/ChangeLog.pre-1-2 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index ce51a947..572613b2 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,34 @@ +Sat Jun 9 17:36:09 2001 Owen Taylor <otaylor@redhat.com> + + * pango/pango-types.h pango/pango-utils.c: Add a new PangoLanguage + type to represent language tags; these can efficiently be compared + and don't need to be copied. Also add pango_language_matches() + to match a language tag against a pattern. + + * pango/pango-item.[ch] pango/pango-layout.c: Move extra_attrs + from PangoItem to PangoAnalysis. Add a language tag field to + PangoAnalysis. (#55894) + + * pango/pango-attributes.[ch] (pango_attr_iterator_get_font): Return + the language tag as well. + + * pango/pango-attributes.[ch]: Rename PangoAttrLang to PangoAttrLanguage, + and make it hold a PangoLanguage. + + * pango/pango-context.[ch]: Rename pango_context_{get,set}_lang() to + pango_context_{get,set}_language(). + + * **.[ch]: Adapt to PangoLanguage and s/lang/language/ changes. + + * modules/basic/basic-x.c modules/basic/tables-big.i: Add support + for ordering character sets differently for different language + tags. + + * pango/itemize.c: Remove old, unused file. + + * pango/pango-context.c (pango_itemize): Reduce number of mallocs + by allocating one array of PangoAnalysis instead of many arrays. + 2001-06-12 Havoc Pennington <hp@redhat.com> * docs/Makefile.am (dist-hook): don't ignore errors from missing diff --git a/docs/tmpl/fonts.sgml b/docs/tmpl/fonts.sgml index ece5f072..4efada71 100644 --- a/docs/tmpl/fonts.sgml +++ b/docs/tmpl/fonts.sgml @@ -245,10 +245,11 @@ a font. It contains the following members: </para> @font: -@lang: +@language: @ch: @Returns: <!-- # Unused Parameters # --> +@lang: @char: @@ -267,8 +268,10 @@ a font. It contains the following members: </para> @font: -@lang: +@language: @Returns: +<!-- # Unused Parameters # --> +@lang: <!-- ##### FUNCTION pango_font_get_glyph_extents ##### --> @@ -288,8 +291,10 @@ a font. It contains the following members: </para> @font: -@lang: +@language: @metrics: +<!-- # Unused Parameters # --> +@lang: <!-- ##### MACRO PANGO_TYPE_FONT ##### --> diff --git a/docs/tmpl/freetype-fonts.sgml b/docs/tmpl/freetype-fonts.sgml index 1847ec0d..af453165 100644 --- a/docs/tmpl/freetype-fonts.sgml +++ b/docs/tmpl/freetype-fonts.sgml @@ -144,8 +144,10 @@ FreeType Fonts and Rendering </para> @font: -@lang: +@language: @Returns: +<!-- # Unused Parameters # --> +@lang: <!-- ##### FUNCTION pango_ft2_get_face ##### --> diff --git a/docs/tmpl/main.sgml b/docs/tmpl/main.sgml index b4512b60..e9fc6b12 100644 --- a/docs/tmpl/main.sgml +++ b/docs/tmpl/main.sgml @@ -80,7 +80,6 @@ a segment of text. It contains the following fields: @offset: @length: @num_chars: -@extra_attrs: @analysis: <!-- ##### STRUCT PangoAnalysis ##### --> @@ -115,6 +114,8 @@ fields: @lang_engine: @font: @level: +@language: +@extra_attrs: <!-- ##### STRUCT PangoLangRange ##### --> <para> @@ -145,9 +146,6 @@ It contains the following fields: </tbody></tgroup></informaltable> </para> -@start: -@length: -@lang: <!-- ##### ENUM PangoDirection ##### --> <para> @@ -286,24 +284,6 @@ for text. @direction: -<!-- ##### FUNCTION pango_context_get_lang ##### --> -<para> - -</para> - -@context: -@Returns: - - -<!-- ##### FUNCTION pango_context_set_lang ##### --> -<para> - -</para> - -@context: -@lang: - - <!-- ##### FUNCTION pango_context_load_font ##### --> <para> diff --git a/docs/tmpl/modules.sgml b/docs/tmpl/modules.sgml index 8fa14679..47ea089a 100644 --- a/docs/tmpl/modules.sgml +++ b/docs/tmpl/modules.sgml @@ -42,10 +42,12 @@ modules </para> -@lang: +@language: @engine_type_id: @render_type_id: @Returns: +<!-- # Unused Parameters # --> +@lang: <!-- ##### FUNCTION pango_map_get_entry ##### --> diff --git a/docs/tmpl/text-attributes.sgml b/docs/tmpl/text-attributes.sgml index 466318ed..70256d69 100644 --- a/docs/tmpl/text-attributes.sgml +++ b/docs/tmpl/text-attributes.sgml @@ -28,7 +28,7 @@ attribute is listed in parentheses after the description. </para> @PANGO_ATTR_INVALID: -@PANGO_ATTR_LANG: language tag (#PangoAttrString) +@PANGO_ATTR_LANGUAGE: @PANGO_ATTR_FAMILY: font family name list (#PangoAttrString) @PANGO_ATTR_STYLE: font slant style (#PangoAttrInt) @PANGO_ATTR_WEIGHT: font weight (#PangoAttrInt) @@ -182,15 +182,6 @@ sets all aspects of the font description at once. @attr: -<!-- ##### FUNCTION pango_attr_lang_new ##### --> -<para> - -</para> - -@lang: -@Returns: - - <!-- ##### FUNCTION pango_attr_family_new ##### --> <para> @@ -589,7 +580,10 @@ attributes currently in effect can be queried. @iterator: @base: @current: +@language: @extra_attrs: +<!-- # Unused Parameters # --> +@lang: <!-- ##### FUNCTION pango_attr_iterator_destroy ##### --> diff --git a/examples/viewer-qt.cc b/examples/viewer-qt.cc index 7f49bcf7..881d8dec 100644 --- a/examples/viewer-qt.cc +++ b/examples/viewer-qt.cc @@ -150,7 +150,7 @@ ViewerView::ViewerView (QWidget *parent, QStatusBar *status) : QScrollView (pare setHScrollBarMode (QScrollView::AlwaysOff); context_ = pango_x_get_context (x11Display()); - pango_context_set_lang (context_, "en_US"); + pango_context_set_language (context_, pango_language_from_string ("en-us")); highlight_para_ = NULL; highlight_index_ = 0; diff --git a/modules/arabic/arabic-fc.c b/modules/arabic/arabic-fc.c index 4ee981a2..0771d6df 100644 --- a/modules/arabic/arabic-fc.c +++ b/modules/arabic/arabic-fc.c @@ -301,7 +301,7 @@ arabic_engine_shape (PangoFont *font, static PangoCoverage * arabic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { return pango_font_get_coverage (font, lang); } diff --git a/modules/arabic/arabic-x.c b/modules/arabic/arabic-x.c index 4ab5d6bf..75534025 100644 --- a/modules/arabic/arabic-x.c +++ b/modules/arabic/arabic-x.c @@ -298,7 +298,7 @@ arabic_engine_shape (PangoFont *font, static PangoCoverage * arabic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/arabic/arabic-xft.c b/modules/arabic/arabic-xft.c index 4ee981a2..0771d6df 100644 --- a/modules/arabic/arabic-xft.c +++ b/modules/arabic/arabic-xft.c @@ -301,7 +301,7 @@ arabic_engine_shape (PangoFont *font, static PangoCoverage * arabic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { return pango_font_get_coverage (font, lang); } diff --git a/modules/basic/basic-fc.c b/modules/basic/basic-fc.c index 6f6e869a..7df5a129 100644 --- a/modules/basic/basic-fc.c +++ b/modules/basic/basic-fc.c @@ -226,7 +226,7 @@ basic_engine_shape (PangoFont *font, static PangoCoverage * basic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { return pango_font_get_coverage (font, lang); } diff --git a/modules/basic/basic-ft2.c b/modules/basic/basic-ft2.c index 01218dc5..9c5dac66 100644 --- a/modules/basic/basic-ft2.c +++ b/modules/basic/basic-ft2.c @@ -283,7 +283,7 @@ basic_engine_shape (PangoFont *font, static PangoCoverage * basic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result; #if 0 diff --git a/modules/basic/basic-win32.c b/modules/basic/basic-win32.c index 4581cc52..bd1b6dbe 100644 --- a/modules/basic/basic-win32.c +++ b/modules/basic/basic-win32.c @@ -221,7 +221,7 @@ basic_engine_shape (PangoFont *font, static PangoCoverage * basic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); gunichar wc; diff --git a/modules/basic/basic-x.c b/modules/basic/basic-x.c index 54417064..99316cc9 100644 --- a/modules/basic/basic-x.c +++ b/modules/basic/basic-x.c @@ -28,7 +28,9 @@ typedef struct _CharRange CharRange; typedef struct _Charset Charset; +typedef struct _CharsetOrdering CharsetOrdering; typedef struct _CharCache CharCache; +typedef struct _CharCachePointer CharCachePointer; typedef struct _MaskTable MaskTable; typedef PangoGlyph (*ConvFunc) (CharCache *cache, @@ -47,6 +49,12 @@ struct _Charset ConvFunc conv_func; }; +struct _CharsetOrdering +{ + const char *langs; + char charsets[MAX_CHARSETS]; +}; + struct _CharRange { guint16 start; @@ -64,10 +72,18 @@ struct _MaskTable struct _CharCache { + guint ref_count; + CharsetOrdering *ordering; MaskTable *mask_tables[256]; GIConv converters[MAX_CHARSETS]; }; +struct _CharCachePointer +{ + PangoLanguage *lang; + CharCache *cache; +}; + static PangoGlyph conv_8bit (CharCache *cache, Charset *charset, const char *input); @@ -112,17 +128,37 @@ static gint n_script_engines = G_N_ELEMENTS (script_engines); * X window system script engine portion */ +/* Structure of our cache: + * + * PangoFont => CharCachePointer ===\ + * | \ + * CharCachePointer ======> CharCache => CharsetOrdering + * | |======> MaskTable[0] => {subfonts,charset}[n_subfonts], + * | |======> MaskTable[1] => {subfonts,charset}[n_subfonts], + * | \======> MaskTable[...] => {subfonts,charset}[n_subfonts] + * | + * CharCachePointer ======> CharCache => CharsetOrdering + * |======> MaskTable[0] => {subfonts,charset}[n_subfonts], + * |======> MaskTable[1] => {subfonts,charset}[n_subfonts], + * \======> MaskTable[...] => {subfonts,charset}[n_subfonts] + * + * A CharCache structure caches the lookup of what subfonts can be used for what characters for a pair of a Font + * and CharsetOrdering. Multiple language tags can share the same CharsetOrdering - the list of CharCachePointer + * structures that is attached to the font as object data provides lookups from language tag to charcache. + */ static CharCache * -char_cache_new (void) +char_cache_new (CharsetOrdering *ordering) { CharCache *result; int i; result = g_new0 (CharCache, 1); + result->ref_count = 1; + result->ordering = ordering; for (i=0; i<MAX_CHARSETS; i++) result->converters[i] = (GIConv)-1; - + return result; } @@ -188,10 +224,12 @@ find_char (CharCache *cache, PangoFont *font, gunichar wc, const char *input) for (i=0; i<G_N_ELEMENTS(charsets); i++) { - if (mask & (1 << i)) + int charset_index = cache->ordering->charsets[i]; + + if (mask & (1 << charset_index)) { - charset_names[n_charsets] = charsets[i].x_charset; - charsets_map[n_charsets] = &charsets[i]; + charset_names[n_charsets] = charsets[charset_index].x_charset; + charsets_map[n_charsets] = &charsets[charset_index]; n_charsets++; } @@ -329,19 +367,90 @@ swap_range (PangoGlyphString *glyphs, int start, int end) } } +static void +char_caches_free (GSList *caches) +{ + GSList *tmp_list = caches; + while (tmp_list) + { + CharCachePointer *pointer = tmp_list->data; + + pointer->cache->ref_count--; + if (pointer->cache->ref_count == 0) + char_cache_free (pointer->cache); + g_free (pointer); + + tmp_list = tmp_list->next; + } + g_slist_free (caches); +} + +static CharsetOrdering * +ordering_for_lang (PangoLanguage *lang) +{ + int i; + + for (i = 0; i < G_N_ELEMENTS (charset_orderings) - 1; i++) + { + if (pango_language_matches (lang, charset_orderings[i].langs)) + return &charset_orderings[i]; + } + + return &charset_orderings[i]; +} + static CharCache * -get_char_cache (PangoFont *font) +get_char_cache (PangoFont *font, + PangoLanguage *lang) { GQuark cache_id = g_quark_from_string ("basic-char-cache"); - - CharCache *cache = g_object_get_qdata (G_OBJECT (font), cache_id); - if (!cache) + CharCache *cache = NULL; + CharCachePointer *pointer; + CharsetOrdering *ordering; + GSList *caches; + GSList *tmp_list; + + caches = g_object_get_qdata (G_OBJECT (font), cache_id); + tmp_list = caches; + while (tmp_list) + { + pointer = tmp_list->data; + if (pointer->lang == lang) + return pointer->cache; + + tmp_list = tmp_list->next; + } + + ordering = ordering_for_lang (lang); + + tmp_list = caches; + while (tmp_list) { - cache = char_cache_new (); - g_object_set_qdata_full (G_OBJECT (font), cache_id, - cache, (GDestroyNotify)char_cache_free); + pointer = tmp_list->data; + if (pointer->cache->ordering == ordering) + { + cache = pointer->cache; + break; + } + + tmp_list = tmp_list->next; } + if (!cache) + cache = char_cache_new (ordering); + else + cache->ref_count++; + + pointer = g_new (CharCachePointer, 1); + pointer->lang = lang; + pointer->cache = cache; + + caches = g_slist_prepend (caches, pointer); + + g_object_steal_qdata (G_OBJECT (font), cache_id); + g_object_set_qdata_full (G_OBJECT (font), cache_id, + caches, (GDestroyNotify)char_caches_free); + return cache; } @@ -363,7 +472,7 @@ basic_engine_shape (PangoFont *font, g_return_if_fail (length >= 0); g_return_if_fail (analysis != NULL); - cache = get_char_cache (font); + cache = get_char_cache (font, analysis->language); n_chars = g_utf8_strlen (text, length); pango_glyph_string_set_size (glyphs, n_chars); @@ -451,10 +560,10 @@ basic_engine_shape (PangoFont *font, } static PangoCoverage * -basic_engine_get_coverage (PangoFont *font, - const char *lang) +basic_engine_get_coverage (PangoFont *font, + PangoLanguage *lang) { - CharCache *cache = get_char_cache (font); + CharCache *cache = get_char_cache (font, lang); PangoCoverage *result = pango_coverage_new (); gunichar wc; diff --git a/modules/basic/basic-xft.c b/modules/basic/basic-xft.c index 6f6e869a..7df5a129 100644 --- a/modules/basic/basic-xft.c +++ b/modules/basic/basic-xft.c @@ -226,7 +226,7 @@ basic_engine_shape (PangoFont *font, static PangoCoverage * basic_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { return pango_font_get_coverage (font, lang); } diff --git a/modules/basic/tables-big.i b/modules/basic/tables-big.i index 2de955b9..3db74926 100644 --- a/modules/basic/tables-big.i +++ b/modules/basic/tables-big.i @@ -42,6 +42,13 @@ Charset charsets[] = { { 18, "ISO-10646", "iso10646-1", conv_ucs4 } }; +CharsetOrdering charset_orderings[] = { + { "zh-cn", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 15, 17 } }, + { "zh-tw", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 15, 17 } }, + { "ja", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 16, 17 } }, + { NULL, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 15, 16, 17 } }, +}; + const guint32 char_mask_map[] = { 0, ENC_ISO_8859_10|ENC_ISO_8859_1|ENC_ISO_8859_13|ENC_ISO_8859_14|ENC_ISO_8859_15|ENC_ISO_8859_2|ENC_ISO_8859_3|ENC_ISO_8859_4|ENC_ISO_8859_5|ENC_ISO_8859_6|ENC_ISO_8859_7|ENC_ISO_8859_8|ENC_ISO_8859_9|ENC_KOI8_R, diff --git a/modules/hangul/hangul-x.c b/modules/hangul/hangul-x.c index 0cc03e05..951819b1 100644 --- a/modules/hangul/hangul-x.c +++ b/modules/hangul/hangul-x.c @@ -661,7 +661,7 @@ hangul_engine_shape (PangoFont *font, static PangoCoverage * hangul_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); PangoXSubfont subfont; diff --git a/modules/hebrew/hebrew-x.c b/modules/hebrew/hebrew-x.c index 250840ef..ac4be81f 100644 --- a/modules/hebrew/hebrew-x.c +++ b/modules/hebrew/hebrew-x.c @@ -492,7 +492,7 @@ hebrew_engine_shape (PangoFont *font, static PangoCoverage * hebrew_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); diff --git a/modules/indic/bengali-x.c b/modules/indic/bengali-x.c index 64843c4c..308d3a23 100644 --- a/modules/indic/bengali-x.c +++ b/modules/indic/bengali-x.c @@ -106,7 +106,7 @@ static PangoEngineRange pango_indic_range[] = SCRIPT_ENGINE_DEFINITION static PangoCoverage * -pango_indic_engine_get_coverage (PangoFont * font, const char *lang) +pango_indic_engine_get_coverage (PangoFont * font, PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/indic/devanagari-x.c b/modules/indic/devanagari-x.c index d024e41f..8c7e1a75 100644 --- a/modules/indic/devanagari-x.c +++ b/modules/indic/devanagari-x.c @@ -81,7 +81,7 @@ static PangoEngineRange pango_indic_range[] = SCRIPT_ENGINE_DEFINITION static PangoCoverage * -pango_indic_engine_get_coverage (PangoFont * font, const char *lang) +pango_indic_engine_get_coverage (PangoFont * font, PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/indic/gujarati-x.c b/modules/indic/gujarati-x.c index ce1ffeac..f5e939dc 100644 --- a/modules/indic/gujarati-x.c +++ b/modules/indic/gujarati-x.c @@ -67,7 +67,7 @@ static PangoEngineRange pango_indic_range[] = SCRIPT_ENGINE_DEFINITION static PangoCoverage * -pango_indic_engine_get_coverage (PangoFont * font, const char *lang) +pango_indic_engine_get_coverage (PangoFont * font, PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/indic/gurmukhi-x.c b/modules/indic/gurmukhi-x.c index a8429ee3..f810e648 100644 --- a/modules/indic/gurmukhi-x.c +++ b/modules/indic/gurmukhi-x.c @@ -67,7 +67,7 @@ static PangoEngineRange pango_indic_range[] = SCRIPT_ENGINE_DEFINITION static PangoCoverage * -pango_indic_engine_get_coverage (PangoFont * font, const char *lang) +pango_indic_engine_get_coverage (PangoFont * font, PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/indic/myanmar-x.c b/modules/indic/myanmar-x.c index 1eb9dfce..bf6378b6 100644 --- a/modules/indic/myanmar-x.c +++ b/modules/indic/myanmar-x.c @@ -69,7 +69,7 @@ static PangoEngineRange pango_indic_range[] = SCRIPT_ENGINE_DEFINITION static PangoCoverage * -pango_engine_get_coverage (PangoFont * font, const char *lang) +pango_engine_get_coverage (PangoFont * font, PangoLanguage *lang) { gunichar i; PangoCoverage *result = pango_coverage_new (); diff --git a/modules/tamil/tamil-x.c b/modules/tamil/tamil-x.c index 76cd7c25..0e3009db 100644 --- a/modules/tamil/tamil-x.c +++ b/modules/tamil/tamil-x.c @@ -361,7 +361,7 @@ tamil_engine_shape (PangoFont *font, static PangoCoverage * tamil_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); diff --git a/modules/tamil/tamil-xft.c b/modules/tamil/tamil-xft.c index e1d32926..4e411625 100644 --- a/modules/tamil/tamil-xft.c +++ b/modules/tamil/tamil-xft.c @@ -377,7 +377,7 @@ tamil_engine_shape (PangoFont *font, static PangoCoverage * tamil_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { return pango_font_get_coverage (font, lang); } diff --git a/modules/thai/thai-x.c b/modules/thai/thai-x.c index 0fa21585..47310e54 100644 --- a/modules/thai/thai-x.c +++ b/modules/thai/thai-x.c @@ -847,7 +847,7 @@ thai_engine_shape (PangoFont *font, static PangoCoverage * thai_engine_get_coverage (PangoFont *font, - const char *lang) + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); diff --git a/pango/break.c b/pango/break.c index baf1ed86..de898895 100644 --- a/pango/break.c +++ b/pango/break.c @@ -1376,7 +1376,7 @@ pango_find_paragraph_boundary (const gchar *text, * @text: text to process * @length: length in bytes of @text * @level: embedding level, or -1 if unknown - * @language: language code + * @language: language tag * @log_attrs: array with one PangoLogAttr per character in @text, to be filled in * * Computes a PangoLogAttr for each character in @text @@ -1385,7 +1385,7 @@ void pango_get_log_attrs (const char *text, int length, int level, - const char *language, + PangoLanguage *language, PangoLogAttr *log_attrs) { int n_chars; diff --git a/pango/fonts.c b/pango/fonts.c index c8d58201..606da183 100644 --- a/pango/fonts.c +++ b/pango/fonts.c @@ -27,6 +27,7 @@ #include "pango-types.h" #include "pango-font.h" #include "pango-fontmap.h" +#include "pango-utils.h" /** * pango_font_description_copy: @@ -443,25 +444,25 @@ pango_font_describe (PangoFont *font) /** * pango_font_get_coverage: * @font: a #PangoFont - * @lang: the language tag (in the form of "en_US") + * @lang: the language tag * * Compute the coverage map for a given font and language tag. * * Return value: a newly allocated #PangoContext object. **/ PangoCoverage * -pango_font_get_coverage (PangoFont *font, - const char *lang) +pango_font_get_coverage (PangoFont *font, + PangoLanguage *language) { g_return_val_if_fail (font != NULL, NULL); - return PANGO_FONT_GET_CLASS (font)->get_coverage (font, lang); + return PANGO_FONT_GET_CLASS (font)->get_coverage (font, language); } /** * pango_font_find_shaper: * @font: a #PangoFont - * @lang: the language tag (in the form of "en_US") + * @language: the language tag * @ch: the ISO-10646 character code. * * Find the best matching shaper for a font for a particular @@ -470,15 +471,15 @@ pango_font_get_coverage (PangoFont *font, * Return value: the best matching shaper. **/ PangoEngineShape * -pango_font_find_shaper (PangoFont *font, - const char *lang, - guint32 ch) +pango_font_find_shaper (PangoFont *font, + PangoLanguage *language, + guint32 ch) { PangoEngineShape* shaper; g_return_val_if_fail (font != NULL, NULL); - shaper = PANGO_FONT_GET_CLASS (font)->find_shaper (font, lang, ch); + shaper = PANGO_FONT_GET_CLASS (font)->find_shaper (font, language, ch); return shaper; } @@ -514,9 +515,9 @@ pango_font_get_glyph_extents (PangoFont *font, /** * pango_font_get_metrics: * @font: a #PangoFont - * @lang: language tag used to determine which script to get the metrics - * for, or %NULL to indicate to get the metrics for the entire - * font. + * @language: language tag used to determine which script to get the metrics + * for, or %NULL to indicate to get the metrics for the entire + * font. * @metrics: Structure to fill in with the metrics of the font * * Get overall metric information for a font. Since the metrics may be @@ -527,10 +528,8 @@ pango_font_get_glyph_extents (PangoFont *font, void pango_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics) { - g_return_if_fail (font != NULL); - - PANGO_FONT_GET_CLASS (font)->get_metrics (font, lang, metrics); + PANGO_FONT_GET_CLASS (font)->get_metrics (font, language, metrics); } diff --git a/pango/itemize.c b/pango/itemize.c deleted file mode 100644 index b50101c4..00000000 --- a/pango/itemize.c +++ /dev/null @@ -1,232 +0,0 @@ -/* Pango - * itemize.c: - * - * Copyright (C) 1999 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 "pango-context.h" -#include "modules.h" - -static void add_engines (PangoContext *context, - gchar *text, - gint length, - PangoLangRange *lang_info, - gint n_langs, - gboolean force_exact, - PangoEngineInfo **shape_engines, - PangoEngineInfo **lang_engines); - -/** - * pango_itemize: - * @context: a structure holding information that affects - the itemization process. - * @text: the text to itemize. - * @length: the number of bytes (not characters) in text. - * This must be >= 0. - * @lang_info: an array of language tagging information. - * @n_langs: the number of elements in @lang_info. - * - * Breaks a piece of text into segments with consistent - * directional level and shaping engine. - * - * Returns a GList of PangoItem structures. - */ -GList * -pango_itemize (PangoContext *context, - gchar *text, - gint length, - PangoLangRange *lang_info, - gint n_langs) -{ - guint16 *text_ucs2; - gint n_chars; - guint8 *embedding_levels; - FriBidiCharType base_dir; - gint i; - PangoItem *item; - char *p, *next; - GList *result = NULL; - - PangoEngineInfo **shape_engines; - PangoEngineInfo **lang_engines; - - g_return_val_if_fail (context != NULL, NULL); - g_return_val_if_fail (length == 0 || text != NULL, NULL); - - if (length == 0) - return NULL; - - if (context->direction == PANGO_DIRECTION_RTL) - base_dir = FRIBIDI_TYPE_RTL; - else - base_dir = FRIBIDI_TYPE_LTR; - - if (length == 0) - return NULL; - - /* First, apply the bidirectional algorithm to break - * the text into directional runs. - */ - text_ucs2 = _pango_utf8_to_ucs2 (text, length); - if (!text_ucs2) - return NULL; - - n_chars = g_utf8_strlen (text, length); - embedding_levels = g_new (guint8, n_chars); - - /* Storing these as ranges would be a lot more efficient, - * but also more complicated... we take the simple - * approach for now. - */ - shape_engines = g_new0 (PangoEngineInfo *, n_chars); - lang_engines = g_new0 (PangoEngineInfo *, n_chars); - - pango_log2vis_get_embedding_levels (text_ucs2, n_chars, &base_dir, - embedding_levels); - - /* Now, make shaping-engine affilitations for characters in - * each run that have high-affinity. This means that there - * is a shaping engine specific to the current - * language/character pair. - */ - - add_engines (context, text, length, lang_info, n_langs, - TRUE, shape_engines, lang_engines); - - /* Fill in low-affinity shaping-engine affiliations for - * remainder of characters. - */ - - add_engines (context, text, length, lang_info, n_langs, - FALSE, shape_engines, lang_engines); - - /* Make a GList of PangoItems out of the above results - */ - - item = NULL; - p = text; - for (i=0; i<n_chars; i++) - { - next = g_utf8_next_char (p); - - if (i == 0 || - embedding_levels[i] != embedding_levels[i-1] || - shape_engines[i] != shape_engines[i-1] || - lang_engines[i] != lang_engines[i-1]) - { - if (item) - result = g_list_prepend (result, item); - item = pango_item_new (); - item->offset = p - text; - item->num_chars = 0; - item->analysis.level = embedding_levels[i]; - - if (shape_engines[i]) - item->analysis.shape_engine = (PangoEngineShape *)_pango_load_engine (shape_engines[i]->id); - else - item->analysis.shape_engine = NULL; - - if (lang_engines[i]) - item->analysis.lang_engine = (PangoEngineLang *)_pango_load_engine (lang_engines[i]->id); - else - item->analysis.lang_engine = NULL; - } - - item->length = (next - text) - item->offset; - item->num_chars++; - p = next; - } - - if (item) - result = g_list_prepend (result, item); - - g_free (text_ucs2); - - return g_list_reverse (result); -} - -static void -add_engines (PangoContext *context, - gchar *text, - gint length, - PangoLangRange *lang_info, - gint n_langs, - gboolean force_exact, - PangoEngineInfo **shape_engines, - PangoEngineInfo **lang_engines) -{ - char *pos; - char *last_lang = NULL; - gint n_chars; - PangoMap *shape_map = NULL; - PangoMap *lang_map = NULL; - GUChar4 wc; - int i, j; - - n_chars = g_utf8_strlen (text, length); - - pos = text; - last_lang = NULL; - for (i=0, j=0; i<n_chars; i++) - { - char *lang; - PangoSubmap *submap; - PangoMapEntry *entry; - - while (j < n_langs && lang_info[j].start < pos - text) - j++; - - if (j < n_langs && (pos - text) < lang_info[j].start + lang_info[j].length) - lang = lang_info[j].lang; - else - lang = context->lang; - - if (last_lang != lang && - (last_lang == 0 || lang == 0 || - strcmp (lang, last_lang) != 0)) - { - lang_map = pango_find_map (lang, PANGO_ENGINE_TYPE_LANG, - PANGO_RENDER_TYPE_NONE); - shape_map = pango_find_map (lang, PANGO_ENGINE_TYPE_SHAPE, - context->render_type); - last_lang = lang; - } - - wc = g_utf8_get_char (pos); - pos = g_utf8_next_char (pos); - - if (!lang_engines[i]) - { - submap = &lang_map->submaps[wc / 256]; - entry = submap->is_leaf ? &submap->d.entry : &submap->d.leaves[wc % 256]; - - if (entry->info && (!force_exact || entry->is_exact)) - lang_engines[i] = entry->info; - } - - if (!shape_engines[i]) - { - submap = &shape_map->submaps[wc / 256]; - entry = submap->is_leaf ? &submap->d.entry : &submap->d.leaves[wc % 256]; - - if (entry->info && (!force_exact || entry->is_exact)) - shape_engines[i] = entry->info; - } - } -} - diff --git a/pango/modules.c b/pango/modules.c index 3b2daba1..4f235452 100644 --- a/pango/modules.c +++ b/pango/modules.c @@ -53,7 +53,7 @@ struct _PangoMap struct _PangoMapInfo { - const gchar *lang; + PangoLanguage *language; guint engine_type_id; guint render_type_id; PangoMap *map; @@ -78,8 +78,7 @@ static void init_modules (void); /** * pango_find_map: - * @lang: the language tag for which to find the map (in the form - * en or en_US) + * @language: the language tag for which to find the map * @engine_type_id: the render type for the map to find * @render_type_id: the engine type for the map to find * @@ -90,9 +89,9 @@ static void init_modules (void); * Return value: **/ PangoMap * -pango_find_map (const char *lang, - guint engine_type_id, - guint render_type_id) +pango_find_map (PangoLanguage *language, + guint engine_type_id, + guint render_type_id) { GList *tmp_list = maps; PangoMapInfo *map_info = NULL; @@ -104,7 +103,7 @@ pango_find_map (const char *lang, if (map_info->engine_type_id == engine_type_id && map_info->render_type_id == render_type_id) { - if (strcmp (map_info->lang, lang) == 0) + if (map_info->language == language) break; else found_earlier = TRUE; @@ -116,7 +115,7 @@ pango_find_map (const char *lang, if (!tmp_list) { map_info = g_new (PangoMapInfo, 1); - map_info->lang = g_strdup (lang); + map_info->language = language; map_info->engine_type_id = engine_type_id; map_info->render_type_id = render_type_id; @@ -394,20 +393,12 @@ map_add_engine (PangoMapInfo *info, for (i=0; i<pair->info.n_ranges; i++) { - gchar **langs; gboolean is_exact = FALSE; - + if (pair->info.ranges[i].langs) { - langs = g_strsplit (pair->info.ranges[i].langs, ";", -1); - for (j=0; langs[j]; j++) - if (strcmp (langs[j], "*") == 0 || - strcmp (langs[j], info->lang) == 0) - { - is_exact = TRUE; - break; - } - g_strfreev (langs); + if (pango_language_matches (info->language, pair->info.ranges[i].langs)) + is_exact = TRUE; } for (submap = pair->info.ranges[i].start / 256; diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c index 6d5d5b90..b1748b88 100644 --- a/pango/pango-attributes.c +++ b/pango/pango-attributes.c @@ -1,4 +1,4 @@ -/* Pango +/* pango * pango-attributes.c: Attributed text * * Copyright (C) 2000 Red Hat Software @@ -21,7 +21,8 @@ #include <string.h> -#include <pango/pango-attributes.h> +#include "pango-attributes.h" +#include "pango-utils.h" struct _PangoAttrList { @@ -159,49 +160,75 @@ pango_attr_string_new (const PangoAttrClass *klass, } /** - * pango_attr_lang_new: - * @lang: language tag (in the form "en_US") + * pango_attr_family_new: + * @family: the family or comma separated list of families * - * Create a new language tag attribute. + * Create a new font family attribute. * * Return value: the new #PangoAttribute. **/ PangoAttribute * -pango_attr_lang_new (const char *lang) +pango_attr_family_new (const char *family) { static const PangoAttrClass klass = { - PANGO_ATTR_LANG, + PANGO_ATTR_FAMILY, pango_attr_string_copy, pango_attr_string_destroy, pango_attr_string_equal }; - g_return_val_if_fail (lang != NULL, NULL); + g_return_val_if_fail (family != NULL, NULL); - return pango_attr_string_new (&klass, lang); + return pango_attr_string_new (&klass, family); +} + +static PangoAttribute * +pango_attr_language_copy (const PangoAttribute *attr) +{ + return g_memdup (attr, sizeof (PangoAttrLanguage)); +} + +static void +pango_attr_language_destroy (PangoAttribute *attr) +{ + g_free (attr); +} + +static gboolean +pango_attr_language_equal (const PangoAttribute *attr1, + const PangoAttribute *attr2) +{ + return ((PangoAttrLanguage *)attr1)->value == ((PangoAttrLanguage *)attr2)->value; } /** - * pango_attr_family_new: - * @family: the family or comma separated list of families + * pango_attr_language_new: + * @language: language tag * - * Create a new font family attribute. + * Create a new language tag attribute. * * Return value: the new #PangoAttribute. **/ PangoAttribute * -pango_attr_family_new (const char *family) +pango_attr_language_new (PangoLanguage *language) { + PangoAttrLanguage *result; + static const PangoAttrClass klass = { - PANGO_ATTR_FAMILY, - pango_attr_string_copy, - pango_attr_string_destroy, - pango_attr_string_equal + PANGO_ATTR_LANGUAGE, + pango_attr_language_copy, + pango_attr_language_destroy, + pango_attr_language_equal }; - g_return_val_if_fail (family != NULL, NULL); + g_return_val_if_fail (language != NULL, NULL); - return pango_attr_string_new (&klass, family); + result = g_new (PangoAttrLanguage, 1); + + result->attr.klass = &klass; + result->value = language; + + return (PangoAttribute *)result; } static PangoAttribute * @@ -1346,18 +1373,21 @@ pango_attr_iterator_get (PangoAttrIterator *iterator, * an attribute in the #PangoAttrList associated with the structure, * or with @base. If you want to save this value, you should * allocate it on the stack and then use pango_font_description_copy(). + * @language: if non-%NULl, location to store language tag for item, or %NULL + * if non is found. * @extra_attrs: if non-%NULL, location in which to store a list of non-font * attributes at the the current position; only the highest priority * value of each attribute will be added to this list. In order * to free this value, you must call pango_attribute_destroy() on * each member. * - * Get the font + * Get the font and other attributes at the current iterator position. **/ void pango_attr_iterator_get_font (PangoAttrIterator *iterator, PangoFontDescription *base, PangoFontDescription *current, + PangoLanguage **language, GSList **extra_attrs) { GList *tmp_list1; @@ -1369,6 +1399,7 @@ pango_attr_iterator_get_font (PangoAttrIterator *iterator, gboolean have_weight = FALSE; gboolean have_stretch = FALSE; gboolean have_size = FALSE; + gboolean have_language = FALSE; g_return_if_fail (iterator != NULL); g_return_if_fail (base != NULL); @@ -1376,6 +1407,9 @@ pango_attr_iterator_get_font (PangoAttrIterator *iterator, *current = *base; + if (language) + *language = NULL; + if (extra_attrs) *extra_attrs = NULL; @@ -1471,7 +1505,16 @@ pango_attr_iterator_get_font (PangoAttrIterator *iterator, current->size = ((PangoAttrFloat *)attr)->value * base->size; } break; - + case PANGO_ATTR_LANGUAGE: + if (language) + { + if (!have_language) + { + have_language = TRUE; + *language = ((PangoAttrLanguage *)attr)->value; + } + } + break; default: if (extra_attrs) { diff --git a/pango/pango-attributes.h b/pango/pango-attributes.h index dc1d887a..ffdbdb2a 100644 --- a/pango/pango-attributes.h +++ b/pango/pango-attributes.h @@ -52,6 +52,7 @@ typedef struct _PangoAttribute PangoAttribute; typedef struct _PangoAttrClass PangoAttrClass; typedef struct _PangoAttrString PangoAttrString; +typedef struct _PangoAttrLanguage PangoAttrLanguage; typedef struct _PangoAttrInt PangoAttrInt; typedef struct _PangoAttrFloat PangoAttrFloat; typedef struct _PangoAttrColor PangoAttrColor; @@ -65,7 +66,7 @@ typedef struct _PangoAttrIterator PangoAttrIterator; typedef enum { PANGO_ATTR_INVALID, /* 0 is an invalid attribute type */ - PANGO_ATTR_LANG, /* PangoAttrString */ + PANGO_ATTR_LANGUAGE, /* PangoAttrLanguage */ PANGO_ATTR_FAMILY, /* PangoAttrString */ PANGO_ATTR_STYLE, /* PangoAttrInt */ PANGO_ATTR_WEIGHT, /* PangoAttrInt */ @@ -110,6 +111,12 @@ struct _PangoAttrString char *value; }; +struct _PangoAttrLanguage +{ + PangoAttribute attr; + PangoLanguage *value; +}; + struct _PangoAttrInt { PangoAttribute attr; @@ -148,7 +155,7 @@ void pango_attribute_destroy (PangoAttribute *attr); gboolean pango_attribute_equal (const PangoAttribute *attr1, const PangoAttribute *attr2); -PangoAttribute *pango_attr_lang_new (const char *lang); +PangoAttribute *pango_attr_language_new (PangoLanguage *language); PangoAttribute *pango_attr_family_new (const char *family); PangoAttribute *pango_attr_foreground_new (guint16 red, guint16 green, @@ -197,6 +204,7 @@ PangoAttribute * pango_attr_iterator_get (PangoAttrIterator *iterator void pango_attr_iterator_get_font (PangoAttrIterator *iterator, PangoFontDescription *base, PangoFontDescription *current, + PangoLanguage **language, GSList **extra_attrs); diff --git a/pango/pango-break.h b/pango/pango-break.h index 527a7cf5..d72ba0da 100644 --- a/pango/pango-break.h +++ b/pango/pango-break.h @@ -84,7 +84,7 @@ void pango_find_paragraph_boundary (const gchar *text, void pango_get_log_attrs (const char *text, int length, int level, - const char *language, + PangoLanguage *language, PangoLogAttr *log_attrs); /* This is the default break algorithm, used if no language diff --git a/pango/pango-context.c b/pango/pango-context.c index 95a96e85..056e4c32 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -31,7 +31,7 @@ struct _PangoContext { GObject parent_instance; - char *lang; + PangoLanguage *language; PangoDirection base_dir; PangoFontDescription *font_desc; @@ -51,10 +51,7 @@ static void add_engines (PangoContext *context, PangoAttrList *attrs, PangoAttrIterator *cached_iter, gint n_chars, - PangoEngineShape **shape_engines, - PangoEngineLang **lang_engines, - PangoFont **fonts, - GSList **extra_attr_lists); + PangoAnalysis *analyses); static void pango_context_init (PangoContext *context); static void pango_context_class_init (PangoContextClass *klass); @@ -96,7 +93,7 @@ pango_context_init (PangoContext *context) PangoFontDescription desc; context->base_dir = PANGO_DIRECTION_LTR; - context->lang = NULL; + context->language = NULL; context->font_maps = NULL; desc.family_name = "serif"; @@ -126,9 +123,6 @@ pango_context_finalize (GObject *object) context = PANGO_CONTEXT (object); - if (context->lang) - g_free (context->lang); - g_slist_foreach (context->font_maps, (GFunc)g_object_unref, NULL); g_slist_free (context->font_maps); @@ -429,38 +423,35 @@ pango_context_get_font_description (PangoContext *context) } /** - * pango_context_set_lang: + * pango_context_set_language: * @context: a #PangoContext - * @lang: the new language tag. + * @language: the new language tag. * * Sets the global language tag for the context. **/ void -pango_context_set_lang (PangoContext *context, - const char *lang) +pango_context_set_language (PangoContext *context, + PangoLanguage *language) { g_return_if_fail (context != NULL); - if (context->lang) - g_free (context->lang); - - context->lang = g_strdup (lang); + context->language = language; } /** - * pango_context_get_lang: + * pango_context_get_language: * @context: a #PangoContext * * Retrieves the global language tag for the context. * - * Return value: the global language tag. This value must be freed with g_free(). + * Return value: the global language tag. **/ -char * -pango_context_get_lang (PangoContext *context) +PangoLanguage * +pango_context_get_language (PangoContext *context) { g_return_val_if_fail (context != NULL, NULL); - return g_strdup (context->lang); + return context->language; } /** @@ -536,11 +527,8 @@ pango_itemize (PangoContext *context, const char *p; const char *next; GList *result = NULL; - - PangoEngineShape **shape_engines; - PangoEngineLang **lang_engines; - GSList **extra_attr_lists; - PangoFont **fonts; + + PangoAnalysis *analyses; g_return_val_if_fail (context != NULL, NULL); g_return_val_if_fail (start_index >= 0, NULL); @@ -565,14 +553,11 @@ pango_itemize (PangoContext *context, pango_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, embedding_levels); - /* Storing these as ranges would be a lot more efficient, - * but also more complicated... we take the simple - * approach for now. + /* Storing ranges would be more efficient, but also more + * complicated... we take the simple approach for now. */ - shape_engines = g_new0 (PangoEngineShape *, n_chars); - lang_engines = g_new0 (PangoEngineLang *, n_chars); - fonts = g_new0 (PangoFont *, n_chars); - extra_attr_lists = g_new0 (GSList *, n_chars); + + analyses = g_new0 (PangoAnalysis, n_chars); /* Now, fill in the appropriate shapers, language engines and fonts for * each character. @@ -581,8 +566,7 @@ pango_itemize (PangoContext *context, add_engines (context, text, start_index, length, attrs, cached_iter, n_chars, - shape_engines, lang_engines, fonts, - extra_attr_lists); + analyses); /* Make a GList of PangoItems out of the above results */ @@ -591,15 +575,19 @@ pango_itemize (PangoContext *context, p = text + start_index; for (i=0; i<n_chars; i++) { + PangoAnalysis *analysis = &analyses[i]; + PangoAnalysis *last_analysis = i > 0 ? &analyses[i-1] : 0; + next = g_utf8_next_char (p); if (i == 0 || text_ucs4[i] == '\t' || text_ucs4[i-1] == '\t' || embedding_levels[i] != embedding_levels[i-1] || - shape_engines[i] != shape_engines[i-1] || - lang_engines[i] != lang_engines[i-1] || - fonts[i] != fonts[i-1] || - extra_attr_lists[i] != extra_attr_lists[i-1]) + analysis->shape_engine != last_analysis->shape_engine || + analysis->lang_engine != last_analysis->lang_engine || + analysis->font != last_analysis->font || + analysis->language != last_analysis->language || + analysis->extra_attrs != last_analysis->extra_attrs) { /* assert that previous item got at least one char */ g_assert (item == NULL || item->length > 0); @@ -610,15 +598,16 @@ pango_itemize (PangoContext *context, item->num_chars = 0; item->analysis.level = embedding_levels[i]; - item->analysis.shape_engine = shape_engines[i]; - item->analysis.lang_engine = lang_engines[i]; + item->analysis.shape_engine = analysis->shape_engine; + item->analysis.lang_engine = analysis->lang_engine; - item->analysis.font = fonts[i]; + item->analysis.font = analysis->font; + item->analysis.language = analysis->language; /* Copy the extra attribute list if necessary */ - if (extra_attr_lists[i] && i != 0 && extra_attr_lists[i] == extra_attr_lists[i-1]) + if (analysis->extra_attrs && i != 0 && analysis->extra_attrs == last_analysis->extra_attrs) { - GSList *tmp_list = extra_attr_lists[i]; + GSList *tmp_list = analysis->extra_attrs; GSList *new_list = NULL; while (tmp_list) { @@ -626,27 +615,23 @@ pango_itemize (PangoContext *context, pango_attribute_copy (tmp_list->data)); tmp_list = tmp_list->next; } - item->extra_attrs = g_slist_reverse (new_list); + item->analysis.extra_attrs = g_slist_reverse (new_list); } else - item->extra_attrs = extra_attr_lists[i]; + item->analysis.extra_attrs = analysis->extra_attrs; result = g_list_prepend (result, item); } else - g_object_unref (G_OBJECT (fonts[i])); + g_object_unref (analysis->font); item->length = (next - text) - item->offset; item->num_chars++; p = next; } + g_free (analyses); g_free (embedding_levels); - g_free (shape_engines); - g_free (lang_engines); - g_free (fonts); - g_free (extra_attr_lists); - g_free (text_ucs4); return g_list_reverse (result); @@ -689,8 +674,8 @@ fallback_engine_shape (PangoFont *font, } static PangoCoverage* -fallback_engine_get_coverage (PangoFont *font, - const char *lang) +fallback_engine_get_coverage (PangoFont *font, + PangoLanguage *lang) { PangoCoverage *result = pango_coverage_new (); @@ -738,7 +723,7 @@ get_font (PangoFont **fonts, } if (result) - g_object_ref (G_OBJECT (result)); + g_object_ref (result); return result; } @@ -748,7 +733,7 @@ get_font (PangoFont **fonts, static void load_font (PangoContext *context, - char *lang, + PangoLanguage *language, PangoFontDescription *desc, PangoFont **current_fonts, PangoCoverage **current_coverages, @@ -762,7 +747,7 @@ load_font (PangoContext *context, { if (current_fonts[j]) { - g_object_unref (G_OBJECT (current_fonts[j])); + g_object_unref (current_fonts[j]); pango_coverage_unref (current_coverages[j]); } } @@ -778,7 +763,7 @@ load_font (PangoContext *context, if (current_fonts[*n_families]) { - current_coverages[*n_families] = pango_font_get_coverage (current_fonts[*n_families], lang); + current_coverages[*n_families] = pango_font_get_coverage (current_fonts[*n_families], language); (*n_families)++; } } @@ -807,7 +792,7 @@ load_font (PangoContext *context, current_fonts[0] = pango_context_load_font (context, desc); if (current_fonts[0]) { - current_coverages[0] = pango_font_get_coverage (current_fonts[0], lang); + current_coverages[0] = pango_font_get_coverage (current_fonts[0], language); *n_families = 1; } } @@ -832,7 +817,7 @@ load_font (PangoContext *context, current_fonts[0] = pango_context_load_font (context, desc); if (current_fonts[0]) { - current_coverages[0] = pango_font_get_coverage (current_fonts[0], lang); + current_coverages[0] = pango_font_get_coverage (current_fonts[0], language); *n_families = 1; } } @@ -876,13 +861,10 @@ add_engines (PangoContext *context, PangoAttrList *attrs, PangoAttrIterator *cached_iter, gint n_chars, - PangoEngineShape **shape_engines, - PangoEngineLang **lang_engines, - PangoFont **fonts, - GSList **extra_attr_lists) + PangoAnalysis *analyses) { const char *pos; - char *lang = NULL; + PangoLanguage *language = NULL; int next_index; GSList *extra_attrs = NULL; PangoMap *lang_map = NULL; @@ -891,7 +873,6 @@ add_engines (PangoContext *context, PangoFont *current_fonts[MAX_FAMILIES]; PangoCoverage *current_coverages[MAX_FAMILIES]; PangoAttrIterator *iterator; - PangoAttribute *attr; gboolean first_iteration = TRUE; gunichar wc; int i = 0, j; @@ -908,9 +889,11 @@ add_engines (PangoContext *context, pos = text + start_index; for (i=0; i<n_chars; i++) { + PangoAnalysis *analysis = &analyses[i]; + if (first_iteration || pos - text == next_index) { - char *next_lang; + PangoLanguage *next_language; PangoFontDescription next_desc; first_iteration = FALSE; @@ -924,20 +907,18 @@ add_engines (PangoContext *context, pango_attr_iterator_range (iterator, NULL, &next_index); } - attr = pango_attr_iterator_get (iterator, PANGO_ATTR_LANG); - if (attr) - next_lang = ((PangoAttrString *)attr)->value; - else - next_lang = context->lang; + pango_attr_iterator_get_font (iterator, context->font_desc, + &next_desc, &next_language, &extra_attrs); - if (i == 0 || - (lang != next_lang && - (lang == NULL || next_lang == NULL || strcmp (lang, next_lang) != 0))) + if (!next_language) + next_language = context->language; + + if (i == 0 || language != next_language) { static guint engine_type_id = 0; static guint render_type_id = 0; - lang = next_lang; + language = next_language; if (engine_type_id == 0) { @@ -945,39 +926,37 @@ add_engines (PangoContext *context, render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_NONE); } - lang_map = pango_find_map (next_lang, + lang_map = pango_find_map (next_language, engine_type_id, render_type_id); } - pango_attr_iterator_get_font (iterator, context->font_desc, - &next_desc, &extra_attrs); - if (i == 0 || !pango_font_description_equal (¤t_desc, &next_desc)) { current_desc = next_desc; - load_font (context, lang, ¤t_desc, + load_font (context, language, ¤t_desc, current_fonts, current_coverages, &n_families); } } wc = g_utf8_get_char (pos); pos = g_utf8_next_char (pos); - - lang_engines[i] = (PangoEngineLang *)pango_map_get_engine (lang_map, wc); - fonts[i] = get_font (current_fonts, current_coverages, n_families, wc); - + + analysis->lang_engine = (PangoEngineLang *)pango_map_get_engine (lang_map, wc); + analysis->font = get_font (current_fonts, current_coverages, n_families, wc); + analysis->language = language; + /* FIXME: handle reference counting properly on the shapers */ - if (fonts[i]) - shape_engines[i] = pango_font_find_shaper (fonts[i], lang, wc); + if (analysis->font) + analysis->shape_engine = pango_font_find_shaper (analysis->font, language, wc); else - shape_engines[i] = NULL; - - if (shape_engines[i] == NULL) - shape_engines[i] = &fallback_shaper; + analysis->shape_engine = NULL; + + if (analysis->shape_engine == NULL) + analysis->shape_engine = &fallback_shaper; - extra_attr_lists[i] = extra_attrs; + analysis->extra_attrs = extra_attrs; } g_assert (pos - text == start_index + length); @@ -986,7 +965,7 @@ add_engines (PangoContext *context, { if (current_fonts[j]) { - g_object_unref (G_OBJECT (current_fonts[j])); + g_object_unref (current_fonts[j]); pango_coverage_unref (current_coverages[j]); } } diff --git a/pango/pango-context.h b/pango/pango-context.h index 732c22ef..82ad982f 100644 --- a/pango/pango-context.h +++ b/pango/pango-context.h @@ -62,16 +62,15 @@ void pango_context_list_families (PangoContext *context PangoFont * pango_context_load_font (PangoContext *context, const PangoFontDescription *desc); -void pango_context_set_font_description (PangoContext *context, - const PangoFontDescription *desc); -PangoFontDescription *pango_context_get_font_description (PangoContext *context); -char * pango_context_get_lang (PangoContext *context); -void pango_context_set_lang (PangoContext *context, - const char *lang); -void pango_context_set_base_dir (PangoContext *context, - PangoDirection direction); -PangoDirection pango_context_get_base_dir (PangoContext *context); - +void pango_context_set_font_description (PangoContext *context, + const PangoFontDescription *desc); +PangoFontDescription * pango_context_get_font_description (PangoContext *context); +PangoLanguage *pango_context_get_language (PangoContext *context); +void pango_context_set_language (PangoContext *context, + PangoLanguage *language); +void pango_context_set_base_dir (PangoContext *context, + PangoDirection direction); +PangoDirection pango_context_get_base_dir (PangoContext *context); /* Break a string of Unicode characters into segments with * consistent shaping/language engine and bidrectional level. diff --git a/pango/pango-engine.h b/pango/pango-engine.h index 4673f360..447e0ee9 100644 --- a/pango/pango-engine.h +++ b/pango/pango-engine.h @@ -83,7 +83,7 @@ struct _PangoEngineShape PangoAnalysis *analysis, PangoGlyphString *glyphs); PangoCoverage *(*get_coverage) (PangoFont *font, - const char *lang); + PangoLanguage *language); }; /* A module should export the following functions */ diff --git a/pango/pango-font.h b/pango/pango-font.h index 0354d2be..cbbf4bcb 100644 --- a/pango/pango-font.h +++ b/pango/pango-font.h @@ -139,16 +139,16 @@ struct _PangoFontClass PangoFontDescription *(*describe) (PangoFont *font); PangoCoverage * (*get_coverage) (PangoFont *font, - const char *lang); + PangoLanguage *lang); PangoEngineShape * (*find_shaper) (PangoFont *font, - const char *lang, + PangoLanguage *lang, guint32 ch); void (*get_glyph_extents) (PangoFont *font, PangoGlyph glyph, PangoRectangle *ink_rect, PangoRectangle *logical_rect); void (*get_metrics) (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics); }; @@ -156,12 +156,12 @@ GType pango_font_get_type (void) G_GNUC_CONST; PangoFontDescription *pango_font_describe (PangoFont *font); PangoCoverage * pango_font_get_coverage (PangoFont *font, - const char *lang); + PangoLanguage *language); PangoEngineShape * pango_font_find_shaper (PangoFont *font, - const char *lang, + PangoLanguage *language, guint32 ch); void pango_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics); void pango_font_get_glyph_extents (PangoFont *font, PangoGlyph glyph, diff --git a/pango/pango-item.c b/pango/pango-item.c index 73f96d2b..e090fe57 100644 --- a/pango/pango-item.c +++ b/pango/pango-item.c @@ -55,18 +55,18 @@ pango_item_copy (PangoItem *item) result->length = item->length; result->num_chars = item->num_chars; + result->analysis = item->analysis; + g_object_ref (result->analysis.font); + extra_attrs = NULL; - tmp_list = item->extra_attrs; + tmp_list = item->analysis.extra_attrs; while (tmp_list) { extra_attrs = g_slist_prepend (extra_attrs, pango_attribute_copy (tmp_list->data)); tmp_list = tmp_list->next; } - result->extra_attrs = g_slist_reverse (extra_attrs); - - result->analysis = item->analysis; - g_object_ref (G_OBJECT (result->analysis.font)); + result->analysis.extra_attrs = g_slist_reverse (extra_attrs); return result; } @@ -80,13 +80,13 @@ pango_item_copy (PangoItem *item) void pango_item_free (PangoItem *item) { - if (item->extra_attrs) + if (item->analysis.extra_attrs) { - g_slist_foreach (item->extra_attrs, (GFunc)pango_attribute_destroy, NULL); - g_slist_free (item->extra_attrs); + g_slist_foreach (item->analysis.extra_attrs, (GFunc)pango_attribute_destroy, NULL); + g_slist_free (item->analysis.extra_attrs); } - - g_object_unref (G_OBJECT (item->analysis.font)); + + g_object_unref (item->analysis.font); g_free (item); } diff --git a/pango/pango-item.h b/pango/pango-item.h index d4b067eb..59e67945 100644 --- a/pango/pango-item.h +++ b/pango/pango-item.h @@ -36,8 +36,10 @@ struct _PangoAnalysis { PangoEngineShape *shape_engine; PangoEngineLang *lang_engine; - PangoFont *font; + PangoFont *font; guint8 level; + PangoLanguage *language; + GSList *extra_attrs; }; struct _PangoItem @@ -45,7 +47,6 @@ struct _PangoItem gint offset; gint length; gint num_chars; - GSList *extra_attrs; PangoAnalysis analysis; }; diff --git a/pango/pango-layout.c b/pango/pango-layout.c index f0424b26..a1990190 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -2274,20 +2274,29 @@ ensure_tab_width (PangoLayout *layout) PangoAttrList *tmp_attrs; PangoAttrIterator *iter; PangoFontDescription font_desc; + PangoLanguage *language; int i; layout_attrs = pango_layout_get_effective_attributes (layout); iter = pango_attr_list_get_iterator (layout_attrs); pango_attr_iterator_get_font (iter, pango_context_get_font_description (layout->context), - &font_desc, NULL); + &font_desc, &language, NULL); tmp_attrs = pango_attr_list_new (); + attr = pango_attr_font_desc_new (&font_desc); attr->start_index = 0; attr->end_index = 1; - pango_attr_list_insert_before (tmp_attrs, attr); + if (language) + { + attr = pango_attr_language_new (language); + attr->start_index = 0; + attr->end_index = 1; + pango_attr_list_insert_before (tmp_attrs, attr); + } + items = pango_itemize (layout->context, " ", 0, 1, tmp_attrs, NULL); pango_attr_iterator_destroy (iter); @@ -3345,6 +3354,7 @@ pango_layout_line_get_empty_extents (PangoLayoutLine *line, pango_attr_iterator_get_font (iter, base_font_desc, &font_desc, + NULL, NULL); break; } @@ -3365,9 +3375,9 @@ pango_layout_line_get_empty_extents (PangoLayoutLine *line, font = pango_context_load_font (layout->context, &font_desc); if (font) { - char *lang = pango_context_get_lang (layout->context); - pango_font_get_metrics (font, lang, &metrics); - g_free (lang); + pango_font_get_metrics (font, + pango_context_get_language (layout->context), + &metrics); logical_rect->y = - metrics.ascent; logical_rect->height = metrics.ascent + metrics.descent; @@ -3701,7 +3711,7 @@ pango_layout_get_item_properties (PangoItem *item, PangoRectangle *logical_rect, gboolean *shape_set) { - GSList *tmp_list = item->extra_attrs; + GSList *tmp_list = item->analysis.extra_attrs; if (shape_set) *shape_set = FALSE; diff --git a/pango/pango-markup.c b/pango/pango-markup.c index 9e6acd27..b408fc26 100644 --- a/pango/pango-markup.c +++ b/pango/pango-markup.c @@ -1193,7 +1193,8 @@ span_parse_func (MarkupData *md, if (lang) { - add_attribute (tag, pango_attr_lang_new (lang)); + add_attribute (tag, + pango_attr_language_new (pango_language_from_string (lang))); } return TRUE; diff --git a/pango/pango-modules.h b/pango/pango-modules.h index f76a1246..28863083 100644 --- a/pango/pango-modules.h +++ b/pango/pango-modules.h @@ -46,7 +46,7 @@ struct _PangoIncludedModule void (*unload) (PangoEngine *engine); }; -PangoMap * pango_find_map (const char *lang, +PangoMap * pango_find_map (PangoLanguage *language, guint engine_type_id, guint render_type_id); PangoMapEntry *pango_map_get_entry (PangoMap *map, diff --git a/pango/pango-types.h b/pango/pango-types.h index 91e21ba8..bc6beba9 100644 --- a/pango/pango-types.h +++ b/pango/pango-types.h @@ -33,6 +33,9 @@ typedef struct _PangoEngineShape PangoEngineShape; typedef struct _PangoFont PangoFont; typedef struct _PangoRectangle PangoRectangle; +/* Dummy typedef - internally it's a 'const char *' */ +typedef struct _PangoLanguage PangoLanguage; + /* A index of a glyph into a font. Rendering system dependent */ typedef guint32 PangoGlyph; @@ -71,14 +74,11 @@ typedef enum { PANGO_DIRECTION_TTB_RTL } PangoDirection; -/* Language tagging information - */ -struct _PangoLangRange -{ - gint start; - gint length; - gchar *lang; -}; +PangoLanguage *pango_language_from_string (const char *language); +#define pango_language_to_string(language) ((const char *)language) + +gboolean pango_language_matches (PangoLanguage *language, + const char *range_list); #ifdef __cplusplus extern "C" { diff --git a/pango/pango-utils.c b/pango/pango-utils.c index f0a5aafd..b5c6c511 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -570,7 +570,8 @@ read_config () if (!config_hash) { char *filename; - char *home; + const char *home; + const char *envvar; config_hash = g_hash_table_new (g_str_hash, g_str_equal); filename = g_strconcat (pango_get_sysconf_subdirectory (), @@ -589,9 +590,9 @@ read_config () g_free (filename); } - filename = g_getenv ("PANGO_RC_FILE"); - if (filename) - read_config_file (filename, TRUE); + envvar = g_getenv ("PANGO_RC_FILE"); + if (envvar) + read_config_file (envvar, TRUE); } } @@ -888,6 +889,140 @@ pango_parse_stretch (const char *str, return FALSE; } +static const char canon_map[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, '-', + 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 0, 0, 0, 0, 0 +}; + +static gboolean +lang_equal (gconstpointer v1, + gconstpointer v2) +{ + const guchar *p1 = v1; + const guchar *p2 = v2; + + while (*p2) + { + guchar value = canon_map[*p2]; + if (value && value != *p1++) + return FALSE; + p2++; + } + + return (*p1 == '\0'); +} + +static guint +lang_hash (gconstpointer key) +{ + const guchar *p = key; + guint h = 0; + while (*p) + { + guchar value = canon_map[*p]; + if (value) + h = (h << 5) - h + value; + p++; + } + + return h; +} + +/** + * pang_language_from_string: + * @language: a string representing a language tag + * + * Take a RFC-3066 format language tag as a string and convert it to a + * #PangoLang pointer that can be efficiently copied (copy the + * pointer) and compared with other language tags (compare the + * pointer.) + * + * This function first canonicalizes the string by by converting it to + * lowercase, mapping '_' to '-', and stripping all characters other + * than letters and '-'. + * + * Return value: an opaque pointer to a PangoLang structure. + * this will be valid forever after. + **/ +PangoLanguage * +pango_language_from_string (const char *language) +{ + static GHashTable *hash = NULL; + char *result; + int len; + char *p; + + if (!hash) + hash = g_hash_table_new (lang_hash, lang_equal); + + result = g_hash_table_lookup (hash, language); + if (result) + return (PangoLanguage *)result; + + len = strlen (language); + result = g_malloc (len + 1); + + p = result; + while (*language) + { + char value = canon_map[*(guchar *)language++]; + if (value) + *(p++) = value; + } + *p++ = '\0'; + + g_hash_table_insert (hash, result, result); + + return (PangoLanguage *)result; +} + +/** + * pango_language_matches: + * @language: a language tag (see pango_language_from_string()) + * @range_list: a list of language ranges, separated by ';' characters. + * each element must either be '*', or a RFC 3066 language range + * canonicalized as by pango_lang_canonicalize(). + * + * Checks if a language tag matches one of the elements in a list of + * language ranges. A language tag is considered to match a range + * in the list if the range is '*', the range is exactly the tag, + * or the range is a prefix of the tag, and the character after the + * tag is '-'. + **/ +gboolean +pango_language_matches (PangoLanguage *language, + const char *range_list) +{ + const char *lang_str = pango_language_to_string (language); + const char *p = range_list; + gboolean done = FALSE; + + while (!done) + { + const char *end = strchr (p, ';'); + if (!end) + { + end = p + strlen (p); + done = TRUE; + } + + if (strncmp (p, "*", 1) == 0 || + (strncmp (lang_str, p, end - p) == 0 && + (lang_str[end - p] == '\0' || lang_str[end - p] == '-'))) + return TRUE; + + p = end; + } + + return FALSE; +} + #ifdef HAVE_FRIBIDI void diff --git a/pango/pango-utils.h b/pango/pango-utils.h index e404daa6..00c31a57 100644 --- a/pango/pango-utils.h +++ b/pango/pango-utils.h @@ -73,7 +73,6 @@ G_CONST_RETURN char * pango_get_sysconf_subdirectory (void); */ G_CONST_RETURN char * pango_get_lib_subdirectory (void); - /* A couple of routines from fribidi that we either wrap or * provide ourselves. */ @@ -82,4 +81,5 @@ gboolean pango_log2vis_get_embedding_levels (gunichar *str, PangoDirection *pbase_dir, guint8 *embedding_level_list); gboolean pango_get_mirror_char (gunichar ch, + gunichar *mirrored_ch); diff --git a/pango/pangoft2-fontmap.c b/pango/pangoft2-fontmap.c index e42a3c15..e796732c 100644 --- a/pango/pangoft2-fontmap.c +++ b/pango/pangoft2-fontmap.c @@ -750,14 +750,13 @@ pango_ft2_font_map_read_aliases (PangoFT2FontMap *ft2fontmap) { char **files; char *files_str = pango_config_key_get ("PangoFT2/AliasFiles"); - char *home; char *tmp_str; int n; gboolean read_aliasfile; if (!files_str) { - home = g_get_home_dir (); + const char *home = g_get_home_dir (); if (home && *home) files_str = g_strconcat (home, @@ -955,7 +954,7 @@ free_coverages_foreach (gpointer key, PangoCoverage * pango_ft2_font_entry_get_coverage (PangoFT2FontEntry *entry, PangoFont *font, - const char *lang) + PangoLanguage *language) { guint32 ch; PangoMap *shape_map; @@ -984,14 +983,14 @@ pango_ft2_font_entry_get_coverage (PangoFT2FontEntry *entry, G_DIR_SEPARATOR_S "cache.ft2" G_DIR_SEPARATOR_S, font_as_filename, ".", - lang ? lang : "", + language ? pango_language_to_string (language) : "", NULL); g_free (font_as_filename); pango_font_description_free (description); PING (("trying to load %s", cache_file_name)); result = NULL; - if (g_file_get_contents (cache_file_name, &buf, &buflen, NULL)) + if (g_file_get_contents (cache_file_name, (char **)&buf, &buflen, NULL)) { result = pango_coverage_from_bytes (buf, buflen); g_free (buf); @@ -1003,7 +1002,7 @@ pango_ft2_font_entry_get_coverage (PangoFT2FontEntry *entry, coverage_hash = g_hash_table_new (g_str_hash, g_str_equal); - shape_map = pango_ft2_get_shaper_map (lang); + shape_map = pango_ft2_get_shaper_map (language); for (ch = 0; ch < 65536; ch++) { @@ -1014,7 +1013,7 @@ pango_ft2_font_entry_get_coverage (PangoFT2FontEntry *entry, if (!coverage) { PangoEngineShape *engine = (PangoEngineShape *)pango_map_get_engine (shape_map, ch); - coverage = engine->get_coverage (font, lang); + coverage = engine->get_coverage (font, language); g_hash_table_insert (coverage_hash, map_entry->info->id, coverage); } diff --git a/pango/pangoft2-private.h b/pango/pangoft2-private.h index 460f993d..ff53c4ef 100644 --- a/pango/pangoft2-private.h +++ b/pango/pangoft2-private.h @@ -110,10 +110,10 @@ struct _PangoFT2FontEntry GSList *cached_fonts; }; -PangoMap *pango_ft2_get_shaper_map (const char *lang); +PangoMap *pango_ft2_get_shaper_map (PangoLanguage *language); PangoCoverage *pango_ft2_font_entry_get_coverage (PangoFT2FontEntry *entry, PangoFont *font, - const char *lang); + PangoLanguage *language); void pango_ft2_font_entry_remove (PangoFT2FontEntry *entry, PangoFont *font); FT_Library *pango_ft2_fontmap_get_library (PangoFontMap *fontmap); diff --git a/pango/pangoft2.c b/pango/pangoft2.c index 6c59ce79..f50ff43c 100644 --- a/pango/pangoft2.c +++ b/pango/pangoft2.c @@ -48,7 +48,7 @@ typedef struct _PangoFT2ContextInfo PangoFT2ContextInfo; struct _PangoFT2MetricsInfo { - const char *lang; + PangoLanguage *language; PangoFontMetrics metrics; }; @@ -67,10 +67,10 @@ static void pango_ft2_font_finalize (GObject *object); static PangoFontDescription *pango_ft2_font_describe (PangoFont *font); static PangoCoverage * pango_ft2_font_get_coverage (PangoFont *font, - const char *lang); + PangoLanguage *language); static PangoEngineShape * pango_ft2_font_find_shaper (PangoFont *font, - const char *lang, + PangoLanguage *language, guint32 ch); static void pango_ft2_font_get_glyph_extents (PangoFont *font, @@ -79,7 +79,7 @@ static void pango_ft2_font_get_glyph_extents (PangoFont PangoRectangle *logical_rect); static void pango_ft2_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics); static void pango_ft2_get_item_properties (PangoItem *item, @@ -553,7 +553,7 @@ get_font_metrics_from_subfonts (PangoFont *font, */ static void get_font_metrics_from_string (PangoFont *font, - const char *lang, + PangoLanguage *language, const char *str, PangoFontMetrics *metrics) { @@ -586,7 +586,7 @@ get_font_metrics_from_string (PangoFont *font, gunichar wc = g_utf8_get_char (p); p = g_utf8_next_char (p); - shaper = pango_font_find_shaper (font, lang, wc); + shaper = pango_font_find_shaper (font, language, wc); if (p > start && (shaper != last_shaper || last_level != embedding_levels[i])) { @@ -670,36 +670,38 @@ LangInfo lang_texts[] = { static void pango_ft2_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics) { - PangoFT2MetricsInfo *info; + PangoFT2MetricsInfo *info = NULL; /* Quiet GCC */ PangoFT2Font *ft2font = (PangoFT2Font *)font; GSList *tmp_list; - const char *lookup_lang; + PangoLanguage *lookup_lang; const char *str; - if (lang) + if (language) { - LangInfo *lang_info = bsearch (lang, lang_texts, + 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) { - lookup_lang = lang_info->lang; + lookup_lang = pango_language_from_string (lang_info->lang); str = lang_info->str; } else { - lookup_lang = "UNKNOWN"; + lookup_lang = pango_language_from_string ("UNKNOWN"); str = "French (Français)"; /* Assume iso-8859-1 */ } } else { - lookup_lang = "NONE"; + lookup_lang = pango_language_from_string ("NONE"); /* Complete junk */ @@ -711,7 +713,7 @@ pango_ft2_font_get_metrics (PangoFont *font, { info = tmp_list->data; - if (info->lang == lookup_lang) /* We _don't_ need strcmp */ + if (info->language == lookup_lang) /* We _don't_ need strcmp */ break; tmp_list = tmp_list->next; @@ -720,11 +722,11 @@ pango_ft2_font_get_metrics (PangoFont *font, if (!tmp_list) { info = g_new (PangoFT2MetricsInfo, 1); - info->lang = lookup_lang; + info->language = lookup_lang; ft2font->metrics_by_lang = g_slist_prepend (ft2font->metrics_by_lang, info); - get_font_metrics_from_string (font, lang, str, &info->metrics); + get_font_metrics_from_string (font, language, str, &info->metrics); } *metrics = info->metrics; @@ -749,8 +751,8 @@ pango_ft2_n_subfonts (PangoFont *font) } PangoCoverage * -pango_ft2_get_coverage (PangoFont *font, - const char *lang) +pango_ft2_get_coverage (PangoFont *font, + PangoLanguage *language) { PangoFT2Font *ft2font = (PangoFT2Font *)font; PangoCoverage *result = pango_coverage_new (); @@ -878,7 +880,7 @@ pango_ft2_font_describe (PangoFont *font) } PangoMap * -pango_ft2_get_shaper_map (const char *lang) +pango_ft2_get_shaper_map (PangoLanguage *language) { static guint engine_type_id = 0; static guint render_type_id = 0; @@ -889,26 +891,26 @@ pango_ft2_get_shaper_map (const char *lang) render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_FT2); } - return pango_find_map (lang, engine_type_id, render_type_id); + return pango_find_map (language, engine_type_id, render_type_id); } static PangoCoverage * -pango_ft2_font_get_coverage (PangoFont *font, - const char *lang) +pango_ft2_font_get_coverage (PangoFont *font, + PangoLanguage *language) { PangoFT2Font *ft2font = (PangoFT2Font *)font; - return pango_ft2_font_entry_get_coverage (ft2font->entry, font, lang); + return pango_ft2_font_entry_get_coverage (ft2font->entry, font, language); } static PangoEngineShape * -pango_ft2_font_find_shaper (PangoFont *font, - const gchar *lang, - guint32 ch) +pango_ft2_font_find_shaper (PangoFont *font, + PangoLanguage *language, + guint32 ch) { PangoMap *shape_map = NULL; - shape_map = pango_ft2_get_shaper_map (lang); + shape_map = pango_ft2_get_shaper_map (language); return (PangoEngineShape *)pango_map_get_engine (shape_map, ch); } @@ -1107,7 +1109,7 @@ pango_ft2_get_item_properties (PangoItem *item, PangoAttrColor *bg_color, gboolean *bg_set) { - GSList *tmp_list = item->extra_attrs; + GSList *tmp_list = item->analysis.extra_attrs; if (fg_set) *fg_set = FALSE; diff --git a/pango/pangoft2.h b/pango/pangoft2.h index 77c3667d..0613d2da 100644 --- a/pango/pangoft2.h +++ b/pango/pangoft2.h @@ -65,15 +65,15 @@ typedef guint16 PangoFT2Subfont; #define PANGO_FT2_GLYPH_SUBFONT(glyph) ((glyph)>>16) #define PANGO_FT2_GLYPH_INDEX(glyph) ((glyph) & 0xFFFF) -int pango_ft2_n_subfonts (PangoFont *font); -PangoGlyph pango_ft2_get_unknown_glyph (PangoFont *font); -int pango_ft2_font_get_kerning (PangoFont *font, - PangoGlyph left, - PangoGlyph right); -PangoCoverage *pango_ft2_get_coverage (PangoFont *font, - const char *lang); -FT_Face pango_ft2_get_face (PangoFont *font, - PangoFT2Subfont subfont_index); +int pango_ft2_n_subfonts (PangoFont *font); +PangoGlyph pango_ft2_get_unknown_glyph (PangoFont *font); +int pango_ft2_font_get_kerning (PangoFont *font, + PangoGlyph left, + PangoGlyph right); +PangoCoverage *pango_ft2_get_coverage (PangoFont *font, + PangoLanguage *language); +FT_Face pango_ft2_get_face (PangoFont *font, + PangoFT2Subfont subfont_index); /* API for libraries that want to use PangoFT2 mixed with classic * FT2 fonts. diff --git a/pango/pangox-fontmap.c b/pango/pangox-fontmap.c index 631591f4..f95eb5d7 100644 --- a/pango/pangox-fontmap.c +++ b/pango/pangox-fontmap.c @@ -1349,7 +1349,7 @@ free_coverages_foreach (gpointer key, PangoCoverage * pango_x_font_entry_get_coverage (PangoXFontEntry *entry, PangoFont *font, - const char *lang) + PangoLanguage *language) { PangoXFont *xfont; PangoXFontMap *xfontmap = NULL; /* Quiet gcc */ @@ -1370,7 +1370,9 @@ pango_x_font_entry_get_coverage (PangoXFontEntry *entry, xfontmap = (PangoXFontMap *)pango_x_font_map_for_display (xfont->display); if (entry->xlfd) { - char *str = g_strconcat (lang ? lang : "*", "|", entry->xlfd, NULL); + const char *lang_str = language ? pango_language_to_string (language) : "*"; + + char *str = g_strconcat (lang_str, "|", entry->xlfd, NULL); result = pango_x_get_cached_coverage (xfontmap, str, &atom); g_free (str); } @@ -1388,7 +1390,7 @@ pango_x_font_entry_get_coverage (PangoXFontEntry *entry, coverage_hash = g_hash_table_new (g_str_hash, g_str_equal); - shape_map = pango_x_get_shaper_map (lang); + shape_map = pango_x_get_shaper_map (language); for (ch = 0; ch < 65536; ch++) { @@ -1399,7 +1401,7 @@ pango_x_font_entry_get_coverage (PangoXFontEntry *entry, if (!coverage) { PangoEngineShape *engine = (PangoEngineShape *)pango_map_get_engine (shape_map, ch); - coverage = engine->get_coverage (font, lang); + coverage = engine->get_coverage (font, language); g_hash_table_insert (coverage_hash, map_entry->info->id, coverage); } diff --git a/pango/pangox-private.h b/pango/pangox-private.h index 1549d03e..aa36d6f9 100644 --- a/pango/pangox-private.h +++ b/pango/pangox-private.h @@ -98,14 +98,14 @@ GType pango_x_font_map_get_type (void); PangoXFont * pango_x_font_new (PangoFontMap *fontmap, const char *spec, int size); -PangoMap * pango_x_get_shaper_map (const char *lang); +PangoMap * pango_x_get_shaper_map (PangoLanguage *language); char * pango_x_make_matching_xlfd (PangoFontMap *fontmap, char *xlfd, const char *charset, int size); PangoCoverage *pango_x_font_entry_get_coverage (PangoXFontEntry *entry, PangoFont *font, - const char *lang); + PangoLanguage *language); void pango_x_font_entry_remove (PangoXFontEntry *entry, PangoFont *font); diff --git a/pango/pangox.c b/pango/pangox.c index d1aef739..d5909883 100644 --- a/pango/pangox.c +++ b/pango/pangox.c @@ -116,7 +116,7 @@ struct _PangoXSubfontInfo struct _PangoXMetricsInfo { - const char *lang; + PangoLanguage *language; PangoFontMetrics metrics; }; @@ -158,16 +158,16 @@ static void pango_x_font_finalize (GObject *object); static PangoFontDescription *pango_x_font_describe (PangoFont *font); static PangoCoverage * pango_x_font_get_coverage (PangoFont *font, - const char *lang); + PangoLanguage *language); static PangoEngineShape * pango_x_font_find_shaper (PangoFont *font, - const char *lang, + PangoLanguage *language, guint32 ch); static void pango_x_font_get_glyph_extents (PangoFont *font, PangoGlyph glyph, PangoRectangle *ink_rect, PangoRectangle *logical_rect); static void pango_x_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics); static PangoXSubfontInfo * pango_x_find_subfont (PangoFont *font, @@ -770,7 +770,7 @@ get_font_metrics_from_subfonts (PangoFont *font, */ static void get_font_metrics_from_string (PangoFont *font, - const char *lang, + PangoLanguage *language, const char *str, PangoFontMetrics *metrics) { @@ -806,7 +806,7 @@ get_font_metrics_from_string (PangoFont *font, if (*p) { wc = g_utf8_get_char (p); - shaper = pango_font_find_shaper (font, lang, wc); + shaper = pango_font_find_shaper (font, language, wc); } else { @@ -824,7 +824,9 @@ get_font_metrics_from_string (PangoFont *font, analysis.shape_engine = last_shaper; analysis.lang_engine = NULL; analysis.font = font; + analysis.language = language; analysis.level = last_level; + analysis.extra_attrs = NULL; pango_shape (start, p - start, &analysis, glyph_str); @@ -900,36 +902,37 @@ LangInfo lang_texts[] = { static void pango_x_font_get_metrics (PangoFont *font, - const gchar *lang, + PangoLanguage *language, PangoFontMetrics *metrics) { PangoXMetricsInfo *info = NULL; /* Quiet gcc */ PangoXFont *xfont = (PangoXFont *)font; GSList *tmp_list; + const char *lang_str = pango_language_to_string (language); - const char *lookup_lang; + PangoLanguage *lookup_lang; const char *str; - if (lang) + if (language) { - LangInfo *lang_info = bsearch (lang, lang_texts, + LangInfo *lang_info = bsearch (lang_str, lang_texts, G_N_ELEMENTS (lang_texts), sizeof (LangInfo), lang_info_compare); if (lang_info) { - lookup_lang = lang_info->lang; + lookup_lang = pango_language_from_string (lang_info->lang); str = lang_info->str; } else { - lookup_lang = "UNKNOWN"; + lookup_lang = pango_language_from_string ("UNKNOWN"); str = "French (Français)"; /* Assume iso-8859-1 */ } } else { - lookup_lang = "NONE"; + lookup_lang = pango_language_from_string ("NONE"); /* Complete junk */ @@ -941,7 +944,7 @@ pango_x_font_get_metrics (PangoFont *font, { info = tmp_list->data; - if (info->lang == lookup_lang) /* We _don't_ need strcmp */ + if (info->language == lookup_lang) /* We _don't_ need strcmp */ break; tmp_list = tmp_list->next; @@ -954,7 +957,7 @@ pango_x_font_get_metrics (PangoFont *font, PangoContext *context; info = g_new (PangoXMetricsInfo, 1); - info->lang = lookup_lang; + info->language = lookup_lang; xfont->metrics_by_lang = g_slist_prepend (xfont->metrics_by_lang, info); @@ -965,7 +968,7 @@ pango_x_font_get_metrics (PangoFont *font, * chars in "0123456789" */ context = pango_x_get_context (pango_x_fontmap_get_display (xfont->fontmap)); - pango_context_set_lang (context, lookup_lang); + pango_context_set_language (context, lookup_lang); layout = pango_layout_new (context); pango_layout_set_text (layout, "0123456789", -1); @@ -1326,7 +1329,7 @@ pango_x_font_describe (PangoFont *font) } PangoMap * -pango_x_get_shaper_map (const char *lang) +pango_x_get_shaper_map (PangoLanguage *language) { static guint engine_type_id = 0; static guint render_type_id = 0; @@ -1337,26 +1340,26 @@ pango_x_get_shaper_map (const char *lang) render_type_id = g_quark_from_static_string (PANGO_RENDER_TYPE_X); } - return pango_find_map (lang, engine_type_id, render_type_id); + return pango_find_map (language, engine_type_id, render_type_id); } static PangoCoverage * -pango_x_font_get_coverage (PangoFont *font, - const char *lang) +pango_x_font_get_coverage (PangoFont *font, + PangoLanguage *language) { PangoXFont *xfont = (PangoXFont *)font; - return pango_x_font_entry_get_coverage (xfont->entry, font, lang); + return pango_x_font_entry_get_coverage (xfont->entry, font, language); } static PangoEngineShape * -pango_x_font_find_shaper (PangoFont *font, - const gchar *lang, - guint32 ch) +pango_x_font_find_shaper (PangoFont *font, + PangoLanguage *language, + guint32 ch) { PangoMap *shape_map = NULL; - shape_map = pango_x_get_shaper_map (lang); + shape_map = pango_x_get_shaper_map (language); return (PangoEngineShape *)pango_map_get_engine (shape_map, ch); } @@ -1675,7 +1678,7 @@ pango_x_get_item_properties (PangoItem *item, PangoAttrColor *bg_color, gboolean *bg_set) { - GSList *tmp_list = item->extra_attrs; + GSList *tmp_list = item->analysis.extra_attrs; if (fg_set) *fg_set = FALSE; |