diff options
Diffstat (limited to 'modules/thai/thai-ot.c')
-rw-r--r-- | modules/thai/thai-ot.c | 92 |
1 files changed, 87 insertions, 5 deletions
diff --git a/modules/thai/thai-ot.c b/modules/thai/thai-ot.c index bd57b9b9..15956c4d 100644 --- a/modules/thai/thai-ot.c +++ b/modules/thai/thai-ot.c @@ -120,19 +120,93 @@ thai_ot_get_ruleset (PangoFont *font) return ruleset; } +static PangoOTRuleset * +lao_ot_get_ruleset (PangoFont *font) +{ + PangoFcFont *fc_font; + FT_Face face; + PangoOTInfo *info; + PangoOTRuleset *ruleset = NULL; + + g_return_val_if_fail (font != NULL, NULL); + + fc_font = PANGO_FC_FONT (font); + face = pango_fc_font_lock_face (fc_font); + g_assert (face != NULL); + + info = pango_ot_info_get (face); + if (info != NULL) + { + static GQuark ruleset_quark = 0; + + if (!ruleset_quark) + ruleset_quark = g_quark_from_string ("lao-ot-ruleset"); + + ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark); + if (!ruleset) + { + PangoOTTag thai_tag = FT_MAKE_TAG ('l', 'a', 'o', ' '); + 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; + } + } + } + + pango_fc_font_unlock_face (fc_font); + + return ruleset; +} + void thai_ot_shape (PangoFont *font, PangoGlyphString *glyphs) { - PangoOTRuleset *ot_ruleset; + PangoOTRuleset *th_ruleset; + PangoOTRuleset *lo_ruleset; g_return_if_fail (font != NULL); g_return_if_fail (glyphs != NULL); - ot_ruleset = thai_ot_get_ruleset (font); + th_ruleset = thai_ot_get_ruleset (font); + lo_ruleset = lao_ot_get_ruleset (font); - if (ot_ruleset != NULL) + if (th_ruleset != NULL || lo_ruleset != NULL) { gint i; PangoOTBuffer *buffer; @@ -147,8 +221,16 @@ thai_ot_shape (PangoFont *font, glyphs->log_clusters[i]); } - pango_ot_ruleset_substitute (ot_ruleset, buffer); - pango_ot_ruleset_position (ot_ruleset, buffer); + if (th_ruleset != NULL) + { + pango_ot_ruleset_substitute (th_ruleset, buffer); + pango_ot_ruleset_position (th_ruleset, buffer); + } + if (lo_ruleset != NULL) + { + pango_ot_ruleset_substitute (lo_ruleset, buffer); + pango_ot_ruleset_position (lo_ruleset, buffer); + } pango_ot_buffer_output (buffer, glyphs); pango_ot_buffer_destroy (buffer); |