diff options
Diffstat (limited to 'modules/thai/thai-ot.c')
-rw-r--r-- | modules/thai/thai-ot.c | 148 |
1 files changed, 71 insertions, 77 deletions
diff --git a/modules/thai/thai-ot.c b/modules/thai/thai-ot.c index 33fdce3f..bd57b9b9 100644 --- a/modules/thai/thai-ot.c +++ b/modules/thai/thai-ot.c @@ -9,7 +9,7 @@ #include "thai-ot.h" -static void +static gint maybe_add_gsub_feature (PangoOTRuleset *ruleset, PangoOTInfo *info, guint script_index, @@ -24,10 +24,12 @@ maybe_add_gsub_feature (PangoOTRuleset *ruleset, { pango_ot_ruleset_add_feature (ruleset, PANGO_OT_TABLE_GSUB, feature_index, property_bit); + return 1; } + return 0; } -static void +static gint maybe_add_gpos_feature (PangoOTRuleset *ruleset, PangoOTInfo *info, guint script_index, @@ -41,73 +43,79 @@ maybe_add_gpos_feature (PangoOTRuleset *ruleset, { pango_ot_ruleset_add_feature (ruleset, PANGO_OT_TABLE_GPOS, feature_index, property_bit); + return 1; } + return 0; } -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_val_if_fail (font != NULL, 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; - - ruleset = pango_ot_ruleset_new (info); + static GQuark ruleset_quark = 0; - 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 (!ruleset_quark) + ruleset_quark = g_quark_from_string ("thai-ot-ruleset"); - 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; + gint n = 0; + + ruleset = pango_ot_ruleset_new (info); + + if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GSUB, + thai_tag, &script_index)) + { + n += maybe_add_gsub_feature (ruleset, info, script_index, + FT_MAKE_TAG ('c','c','m','p'), + 0xFFFF); + n += 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)) + { + n += maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('k','e','r','n'), + 0xFFFF); + n += maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('m','a','r','k'), + 0xFFFF); + n += maybe_add_gpos_feature (ruleset, info, script_index, + FT_MAKE_TAG ('m','k','m','k'), + 0xFFFF); + } + + if (n > 0) + g_object_set_qdata_full (G_OBJECT (info), ruleset_quark, ruleset, + (GDestroyNotify)g_object_unref); + else + { + g_object_unref (ruleset); + ruleset = NULL; + } + } } - 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 +125,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 +147,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); } |