Let shapers decide when to apply ccmp and locl
authorBehdad Esfahbod <behdad@behdad.org>
Fri, 8 Jul 2011 04:22:40 +0000 (00:22 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Fri, 8 Jul 2011 04:22:40 +0000 (00:22 -0400)
Instead of always applying those two features before the complex shaper,
let the complex shaper decide whether they should be applied first.

Also add stub for Indic's final_reordering().

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

index 3b0bb93..9720f7a 100644 (file)
@@ -163,6 +163,8 @@ _hb_ot_shape_complex_collect_features_arabic (hb_ot_map_builder_t *map, const hb
    * TODO: Add test cases for these two.
    */
 
+  map->add_bool_feature (HB_TAG('c','c','m','p'));
+
   map->add_gsub_pause (NULL, NULL);
 
   unsigned int num_features = props->script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
index e3832f4..53464aa 100644 (file)
@@ -281,13 +281,29 @@ static const hb_tag_t indic_other_features[] =
   HB_TAG('b','l','w','m'),
 };
 
+static void
+final_reordering (const hb_ot_map_t *map,
+                 hb_face_t *face,
+                 hb_buffer_t *buffer,
+                 void *user_data HB_UNUSED)
+{
+}
 
 void
 _hb_ot_shape_complex_collect_features_indic (hb_ot_map_builder_t *map, const hb_segment_properties_t  *props)
 {
+  map->add_bool_feature (HB_TAG('l','o','c','l'));
+  /* The Indic specs do not require ccmp, but we apply since if there is a
+   * use of it, it's typically at the beginning. */
+  map->add_bool_feature (HB_TAG('c','c','m','p'));
+
+  map->add_gsub_pause (NULL, NULL);
+
   for (unsigned int i = 0; i < ARRAY_LENGTH (indic_basic_features); i++)
     map->add_bool_feature (indic_basic_features[i].tag, indic_basic_features[i].is_global);
 
+  map->add_gsub_pause (final_reordering, NULL);
+
   for (unsigned int i = 0; i < ARRAY_LENGTH (indic_other_features); i++)
     map->add_bool_feature (indic_other_features[i], true);
 }
index 8378e81..7a84d9b 100644 (file)
 HB_BEGIN_DECLS
 
 
-hb_tag_t early_features[] = {
+hb_tag_t common_features[] = {
   HB_TAG('c','c','m','p'),
   HB_TAG('l','o','c','l'),
-};
-
-hb_tag_t common_features[] = {
   HB_TAG('m','a','r','k'),
   HB_TAG('m','k','m','k'),
   HB_TAG('r','l','i','g'),
@@ -94,8 +91,6 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
       planner->map.add_bool_feature (array[i]); \
   } HB_STMT_END
 
-  ADD_FEATURES (early_features);
-
   hb_ot_shape_complex_collect_features (planner->shaper, &planner->map, props);
 
   ADD_FEATURES (common_features);