summaryrefslogtreecommitdiff
path: root/modules/thai/thai-ot.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/thai/thai-ot.c')
-rw-r--r--modules/thai/thai-ot.c92
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);