[Indic] For old-style Indic tables, move Halant around
authorBehdad Esfahbod <behdad@behdad.org>
Sun, 31 Jul 2011 01:08:10 +0000 (21:08 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Sun, 31 Jul 2011 01:08:10 +0000 (21:08 -0400)
In old-style Indic OT standards, the post-base Halants are moved after
their base.  Emulate that by moving first post-base Halant to
post-last-consonant.

Brings test-shape-complex failures down from 88 to 54.  Getting there!

src/hb-ot-map-private.hh
src/hb-ot-shape-complex-indic.cc

index 2327e04..5e6aca3 100644 (file)
@@ -60,6 +60,9 @@ struct hb_ot_map_t
     return map ? map->_1_mask : 0;
   }
 
     return map ? map->_1_mask : 0;
   }
 
+  inline hb_tag_t get_chosen_script (unsigned int table_index) const
+  { return chosen_script[table_index]; }
+
   inline void substitute (hb_face_t *face, hb_buffer_t *buffer) const
   { apply (0, (hb_ot_map_t::apply_lookup_func_t) hb_ot_layout_substitute_lookup, face, buffer); }
   inline void position (hb_font_t *font, hb_buffer_t *buffer) const
   inline void substitute (hb_face_t *face, hb_buffer_t *buffer) const
   { apply (0, (hb_ot_map_t::apply_lookup_func_t) hb_ot_layout_substitute_lookup, face, buffer); }
   inline void position (hb_font_t *font, hb_buffer_t *buffer) const
index d51b508..cc51b9c 100644 (file)
@@ -506,6 +506,26 @@ found_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t
     info[start].mask = mask_array[RPHF];
    }
 
     info[start].mask = mask_array[RPHF];
    }
 
+  /* For old-style Indic script tags, move the first post-base Halant after
+   * last consonant. */
+  if ((map->get_chosen_script (0) & 0x000000FF) != '2') {
+    /* We should only do this for Indic scripts which have a version two I guess. */
+    for (i = base + 1; i < end; i++)
+      if (info[i].indic_category() == OT_H) {
+        unsigned int j;
+        for (j = end - 1; j > i; j--)
+         if ((FLAG (info[j].indic_category()) & (FLAG (OT_C) | FLAG (OT_Ra))))
+           break;
+       if (j > i) {
+         /* Move Halant to after last consonant. */
+         hb_glyph_info_t t = info[i];
+         memmove (&info[i], &info[i + 1], (j - i) * sizeof (info[0]));
+         info[j] = t;
+       }
+        break;
+      }
+  }
+
   /* Attach ZWJ, ZWNJ, nukta, and halant to previous char to move with them. */
   for (i = start + 1; i < end; i++)
     if ((FLAG (info[i].indic_category()) &
   /* Attach ZWJ, ZWNJ, nukta, and halant to previous char to move with them. */
   for (i = start + 1; i < end; i++)
     if ((FLAG (info[i].indic_category()) &