[Indic] For scripts without Half forms, always choose first consonant as base
authorBehdad Esfahbod <behdad@behdad.org>
Tue, 17 Jul 2012 18:23:28 +0000 (14:23 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Tue, 17 Jul 2012 18:23:28 +0000 (14:23 -0400)
In such scripts (ie. Khmer), a ZWJ/ZWNJ shouldn't stop the search for
base.  So, instead just choose the first consonant as base directly.

Test sequence:
U+1798,200c,U+17C9,U+17D2,U+179B,U+17C1,U+17C7

src/hb-ot-shape-complex-indic.cc

index 70068ae..2690511 100644 (file)
@@ -352,35 +352,46 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
       has_reph = true;
     };
 
-    /* -> starting from the end of the syllable, move backwards */
-    unsigned int i = end;
-    do {
-      i--;
-      /* -> until a consonant is found */
-      if (is_consonant (info[i]))
-      {
-       /* -> that does not have a below-base or post-base form
-        * (post-base forms have to follow below-base forms), */
-       if (info[i].indic_position() != POS_BELOW_C &&
-           info[i].indic_position() != POS_POST_C)
+    if (basic_mask_array[HALF])
+    {
+      /* -> starting from the end of the syllable, move backwards */
+      unsigned int i = end;
+      do {
+       i--;
+       /* -> until a consonant is found */
+       if (is_consonant (info[i]))
        {
+         /* -> that does not have a below-base or post-base form
+          * (post-base forms have to follow below-base forms), */
+         if (info[i].indic_position() != POS_BELOW_C &&
+             info[i].indic_position() != POS_POST_C)
+         {
+           base = i;
+           break;
+         }
+
+         /* -> or that is not a pre-base reordering Ra,
+          *
+          * TODO
+          */
+
+         /* -> or arrive at the first consonant. The consonant stopped at will
+          * be the base. */
          base = i;
-         break;
        }
+       else
+         if (is_joiner (info[i]))
+           break;
+      } while (i > limit);
+    }
+    else
+    {
+      /* In scripts without half forms (eg. Khmer), the first consonant is always the base. */
 
-       /* -> or that is not a pre-base reordering Ra,
-        *
-        * TODO
-        */
+      if (!has_reph)
+       base = limit;
+    }
 
-       /* -> or arrive at the first consonant. The consonant stopped at will
-        * be the base. */
-       base = i;
-      }
-      else
-       if (is_joiner (info[i]))
-         break;
-    } while (i > limit);
     if (base < start)
       base = start; /* Just in case... */