On 27/12/13 16:21, Ed Trager wrote:

Hi, Martin, Richard, and Danh Hong,

With regard to forcing the re-ordering of the
UCD-enforced-but-totally-broken normalisation of TAI THAM TONE MARK plus
U+1A60, does the following approach in the OpenType feature file make
sense as the quickest and cleanest way to do it or not?:

Basically the idea is to compose the out-of-order pair of characters
into a ligature; and then take that ligature and decompose it back to a
pair of characters that are in the correct order:

If there is a better way to do this in OpenType, please enlighten me!
:-)  I was trying to get this to work last night, so far without success:


The trouble with this idea (or at least one trouble with it!) is that by the time your lookups have a chance to do anything, harfbuzz has already inserted dotted-circle glyphs because it treated the (normalized) sequence as being a "broken" cluster. The pattern for a "consonant syllable" in the SEAsian shaper allows for a <sakot, consonant> pair (i.e. a subjoined consonant) among the various possible syllable-tail items, but it does not allow for the <sakot> and <cons> to be separated by other marks, which is what the normalization does.

You -might- be able to work around this by explicitly including the dotted circles in your ligature-composition rules, though that will make them all more cumbersome. The better way forward is for us to fix harfbuzz, as previously suggested.

Possible patch attached; Behdad, wdyt?


diff --git a/src/hb-unicode-private.hh b/src/hb-unicode-private.hh
index dd4d001..eac3144 100644
--- a/src/hb-unicode-private.hh
+++ b/src/hb-unicode-private.hh
@@ -107,8 +107,12 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE
   unsigned int
   modified_combining_class (hb_codepoint_t unicode)
   {
+    /* XXX This hack belongs to the SEA shaper (for Tai Tham):
+       reorder SAKOT to ensure it comes after any tone marks. */
+    if (unlikely (unicode == 0x1A60)) return 254;
+
     /* XXX This hack belongs to the Myanmar shaper. */
-    if (unicode == 0x1037) unicode = 0x103A;
+    if (unlikely (unicode == 0x1037)) unicode = 0x103A;
 
     return _hb_modified_combining_class[combining_class (unicode)];
   }
_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to