diff options
author | Theppitak Karoonboonyanan <thep@linux.thai.net> | 2004-10-02 03:27:29 +0000 |
---|---|---|
committer | Theppitak Karoonboonyanan <tkaroonb@src.gnome.org> | 2004-10-02 03:27:29 +0000 |
commit | 922f0deebf3927ca9168da41db8be423b37fb489 (patch) | |
tree | 52f050d724766b550399a14443b0b52070e1e4b1 /modules | |
parent | 28e4c860f283c5165a550bc6d72cbdebc4a4b420 (diff) | |
download | pango-922f0deebf3927ca9168da41db8be423b37fb489.tar.gz |
Make Thai module prefer OpenType tables, if available, to PUA
2004-10-02 Theppitak Karoonboonyanan <thep@linux.thai.net>
Make Thai module prefer OpenType tables, if available, to PUA
substitutions. (#153927)
* modules/thai/thai-ot.[ch]:
Merge get_gsub_ruleset() and get_gpos_ruleset() into an exported
function thai_ot_get_ruleset(). Rearrange thai_ot_shape() to call
it properly.
* modules/thai/thai-fc.c:
Try OT ruleset before PUA glyph sets.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/thai/thai-fc.c | 7 | ||||
-rw-r--r-- | modules/thai/thai-ot.c | 128 | ||||
-rw-r--r-- | modules/thai/thai-ot.h | 3 |
3 files changed, 61 insertions, 77 deletions
diff --git a/modules/thai/thai-fc.c b/modules/thai/thai-fc.c index e67c05c5..f2760aa2 100644 --- a/modules/thai/thai-fc.c +++ b/modules/thai/thai-fc.c @@ -34,6 +34,7 @@ #include "pangofc-font.h" #include "thai-shaper.h" +#include "thai-ot.h" /* No extra fields needed */ typedef PangoEngineShape ThaiEngineFc; @@ -152,8 +153,10 @@ thai_get_font_info (PangoFont *font) font_info = g_new (ThaiFontInfo, 1); font_info->font = font; - /* detect font set by determining availibility of glyphs */ - if (contain_glyphs(font, tis620_2)) + /* detect font set by determining availibility of OT ruleset & glyphs */ + if (thai_ot_get_ruleset (font)) + font_info->font_set = THAI_FONT_TIS; + else if (contain_glyphs(font, tis620_2)) font_info->font_set = THAI_FONT_TIS_WIN; else if (contain_glyphs(font, tis620_1)) font_info->font_set = THAI_FONT_TIS_MAC; diff --git a/modules/thai/thai-ot.c b/modules/thai/thai-ot.c index 33fdce3f..e02a50cf 100644 --- a/modules/thai/thai-ot.c +++ b/modules/thai/thai-ot.c @@ -44,70 +44,62 @@ maybe_add_gpos_feature (PangoOTRuleset *ruleset, } } -static PangoOTRuleset * -get_gsub_ruleset (FT_Face face) +PangoOTRuleset * +thai_ot_get_ruleset (PangoFont *font) { - PangoOTInfo *info = pango_ot_info_get (face); - GQuark ruleset_quark = g_quark_from_string ("thai-gsub-ruleset"); - PangoOTRuleset *ruleset; + PangoFcFont *fc_font; + FT_Face face; + PangoOTInfo *info; + PangoOTRuleset *ruleset = NULL; - if (!info) - return NULL; + g_return_if_fail (font != NULL); - ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark); + fc_font = PANGO_FC_FONT (font); + face = pango_fc_font_lock_face (fc_font); + g_assert (face != NULL); - if (!ruleset) + info = pango_ot_info_get (face); + if (info != NULL) { - PangoOTTag thai_tag = FT_MAKE_TAG ('t', 'h', 'a', 'i'); - guint script_index; + static GQuark ruleset_quark = 0; - ruleset = pango_ot_ruleset_new (info); + if (!ruleset_quark) + ruleset_quark = g_quark_from_string ("thai-ot-ruleset"); - if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GSUB, - thai_tag, &script_index)) - { - maybe_add_gsub_feature (ruleset, info, script_index, FT_MAKE_TAG ('c','c','m','p'), 0xFFFF); - maybe_add_gsub_feature (ruleset, info, script_index, FT_MAKE_TAG ('l','i','g','a'), 0xFFFF); - } - - g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset, - (GDestroyNotify)g_object_unref); + ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark); + if (!ruleset) + { + PangoOTTag thai_tag = FT_MAKE_TAG ('t', 'h', 'a', 'i'); + guint script_index; + + ruleset = pango_ot_ruleset_new (info); + + if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GSUB, + thai_tag, &script_index)) + { + maybe_add_gsub_feature (ruleset, info, script_index, + FT_MAKE_TAG ('c','c','m','p'), 0xFFFF); + maybe_add_gsub_feature (ruleset, info, script_index, + FT_MAKE_TAG ('l','i','g','a'), 0xFFFF); + } + + if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GPOS, + thai_tag, &script_index)) + { + maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('k','e','r','n'), 0xFFFF); + maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('m','a','r','k'), 0xFFFF); + maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('m','k','m','k'), 0xFFFF); + } + + g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset, + (GDestroyNotify)g_object_unref); + } } - return ruleset; -} - - -static PangoOTRuleset * -get_gpos_ruleset (FT_Face face) -{ - PangoOTInfo *info = pango_ot_info_get (face); - GQuark ruleset_quark = g_quark_from_string ("thai-gpos-ruleset"); - PangoOTRuleset *ruleset; - - if (!info) - return NULL; - - ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark); - - if (!ruleset) - { - PangoOTTag thai_tag = FT_MAKE_TAG ('t', 'h', 'a', 'i'); - guint script_index; - - ruleset = pango_ot_ruleset_new (info); - - if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GPOS, - thai_tag, &script_index)) - { - maybe_add_gpos_feature (ruleset, info, script_index, FT_MAKE_TAG ('k','e','r','n'), 0xFFFF); - maybe_add_gpos_feature (ruleset, info, script_index, FT_MAKE_TAG ('m','a','r','k'), 0xFFFF); - maybe_add_gpos_feature (ruleset, info, script_index, FT_MAKE_TAG ('m','k','m','k'), 0xFFFF); - } - - g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset, - (GDestroyNotify)g_object_unref); - } + pango_fc_font_unlock_face (fc_font); return ruleset; } @@ -117,27 +109,20 @@ void thai_ot_shape (PangoFont *font, PangoGlyphString *glyphs) { - FT_Face face; - PangoOTRuleset *gsub_ruleset, *gpos_ruleset; - PangoFcFont *fc_font; + PangoOTRuleset *ot_ruleset; g_return_if_fail (font != NULL); g_return_if_fail (glyphs != NULL); - fc_font = PANGO_FC_FONT (font); - face = pango_fc_font_lock_face (fc_font); - g_assert (face != NULL); - - gsub_ruleset = get_gsub_ruleset (face); - gpos_ruleset = get_gpos_ruleset (face); + ot_ruleset = thai_ot_get_ruleset (font); - if (gsub_ruleset != NULL || gpos_ruleset != NULL) + if (ot_ruleset != NULL) { gint i; PangoOTBuffer *buffer; /* prepare ot buffer */ - buffer = pango_ot_buffer_new (fc_font); + buffer = pango_ot_buffer_new (PANGO_FC_FONT (font)); for (i = 0; i < glyphs->num_glyphs; i++) { pango_ot_buffer_add_glyph (buffer, @@ -146,18 +131,11 @@ thai_ot_shape (PangoFont *font, glyphs->log_clusters[i]); } - /* do gsub processing */ - if (gsub_ruleset != NULL) - pango_ot_ruleset_substitute (gsub_ruleset, buffer); - - /* do gpos processing */ - if (gpos_ruleset != NULL) - pango_ot_ruleset_position (gpos_ruleset, buffer); + pango_ot_ruleset_substitute (ot_ruleset, buffer); + pango_ot_ruleset_position (ot_ruleset, buffer); pango_ot_buffer_output (buffer, glyphs); pango_ot_buffer_destroy (buffer); } - - pango_fc_font_unlock_face (fc_font); } diff --git a/modules/thai/thai-ot.h b/modules/thai/thai-ot.h index 43f79ef8..4e195e8c 100644 --- a/modules/thai/thai-ot.h +++ b/modules/thai/thai-ot.h @@ -10,6 +10,9 @@ #include "pango-ot.h" +PangoOTRuleset * +thai_ot_get_ruleset (PangoFont *font); + void thai_ot_shape (PangoFont *font, PangoGlyphString *glyphs); |