On Sat, 2005-02-05 at 16:14 -0500, Owen Taylor wrote: > The comments I do have: > > - It's not actually necessary to use separate rulesets for GPOS and > GSUB .. other modules do that, but that's just a carry over > from older versions of Pango where you couldn't separately apply > the GSUB and GPOS rules if you needed to do processing in-between. Turns out that this was important. > All this is handled in the pango/opentype so it's strange that you'd > have problems with Pango and not in Qt since they share almost identical > code. > > If you can give a test case of: > > - Input string (and what font you are using) > - Image of output you get > - Image of what output you expect > > I can take a look. I actually had such a test string around, which was the "90 Years" string that Javier Sola sent me in response to the request I sent out a while ago. I debugged that a bit and the problem turned out to be quite simple .. both your get_gsub_ruleset() and get_gpos_ruleset() calls were using the same quark to cache the ruleset on the PangoOTInfo, "pango-khmer-ruleset". So, the ruleset with only the GSUB rules was being reused for GPOS positioning. Once I fixed that, by simply combining the two rulesets, things seemed to work better. (On the one test string...) I've attached a diff against your version. One other thing I noticed is that in addition to the C99/C++ comments, the code also mixes declarations and code, which is also only C++ or C99. So, that needs to be fixed as well. Regards, Owen
--- khmer-fc.c.bak 2005-01-17 03:30:38.000000000 -0500
+++ khmer-fc.c 2005-02-05 17:49:16.267143176 -0500
@@ -411,7 +411,7 @@
}
static PangoOTRuleset *
-get_gsub_ruleset (FT_Face face)
+get_ruleset (FT_Face face)
{
PangoOTRuleset *ruleset;
static GQuark ruleset_quark = 0;
@@ -448,37 +448,6 @@
maybe_add_GSUB_feature (ruleset, info, script_index, FT_MAKE_TAG ('c','l','i','g'), clig);
}
- 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)
-{
- PangoOTRuleset *ruleset;
- static GQuark ruleset_quark = 0;
-
- PangoOTInfo *info = pango_ot_info_get (face);
-
- if (!ruleset_quark)
- ruleset_quark = g_quark_from_string ("pango-khmer-ruleset");
-
- if (!info)
- return NULL;
-
- ruleset = g_object_get_qdata (G_OBJECT (info), ruleset_quark);
-
- if (!ruleset)
- {
- PangoOTTag khmer_tag = FT_MAKE_TAG ('k', 'h', 'm', 'r');
- guint script_index;
-
- ruleset = pango_ot_ruleset_new (info);
-
if (pango_ot_info_find_script (info, PANGO_OT_TABLE_GPOS,
khmer_tag, &script_index))
{
@@ -687,14 +656,12 @@
} // while
/* do gsub processing */
- PangoOTRuleset *gsub_ruleset = get_gsub_ruleset (face);
- if (gsub_ruleset != NULL)
- pango_ot_ruleset_substitute (gsub_ruleset, buffer);
-
- /* do gpos processing */
- PangoOTRuleset *gpos_ruleset = get_gpos_ruleset (face);
- if (gpos_ruleset != NULL)
- pango_ot_ruleset_position (gpos_ruleset, buffer);
+ PangoOTRuleset *ruleset = get_ruleset (face);
+ if (ruleset != NULL)
+ {
+ pango_ot_ruleset_substitute (ruleset, buffer);
+ pango_ot_ruleset_position (ruleset, buffer);
+ }
pango_ot_buffer_output (buffer, glyphs);
Attachment:
signature.asc
Description: This is a digitally signed message part