[OT] Zero mark advances if the shaper desires so
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 1 Aug 2012 03:08:25 +0000 (23:08 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 1 Aug 2012 03:17:22 +0000 (23:17 -0400)
Enabled for all shapers except for Indic.

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

index 0f73d6d..2cff581 100644 (file)
@@ -299,4 +299,5 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
   NULL, /* override_features */
   NULL, /* normalization_preference */
   setup_masks_arabic,
+  true, /* zero_width_marks */
 };
index 55eedab..ba51821 100644 (file)
@@ -1245,4 +1245,5 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
   override_features_indic,
   NULL, /* normalization_preference */
   setup_masks_indic,
+  false, /* zero_width_marks */
 };
index 1815366..015ee08 100644 (file)
@@ -93,6 +93,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
   NULL, /* override_features */
   normalization_preference_default,
   NULL, /* setup_masks */
+  true, /* zero_width_marks */
 };
 
 
@@ -201,4 +202,5 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
   NULL, /* override_features */
   NULL, /* normalization_preference */
   setup_masks_thai,
+  true, /* zero_width_marks */
 };
index c0864fe..8ef41e8 100644 (file)
@@ -93,6 +93,8 @@ struct hb_ot_complex_shaper_t
                       const hb_ot_map_t            *map,
                       hb_buffer_t                  *buffer,
                       hb_font_t                    *font);
+
+  bool zero_width_marks;
 };
 
 #define HB_COMPLEX_SHAPER_IMPLEMENT(name) extern HB_INTERNAL const hb_ot_complex_shaper_t _hb_ot_complex_shaper_##name;
index 843a543..ac15b2a 100644 (file)
@@ -402,6 +402,18 @@ hb_position_default (hb_ot_shape_context_t *c)
 }
 
 static void
+hb_zero_mark_advances (hb_ot_shape_context_t *c)
+{
+  unsigned int count = c->buffer->len;
+  for (unsigned int i = 0; i < count; i++)
+    if (c->buffer->info[i].glyph_props() & HB_OT_LAYOUT_GLYPH_CLASS_MARK)
+    {
+      c->buffer->pos[i].x_advance = 0;
+      c->buffer->pos[i].y_advance = 0;
+    }
+}
+
+static void
 hb_ot_position_complex (hb_ot_shape_context_t *c)
 {
 
@@ -429,6 +441,9 @@ hb_ot_position_complex (hb_ot_shape_context_t *c)
     c->applied_position_complex = true;
   }
 
+  if (c->plan->shaper->zero_width_marks)
+    hb_zero_mark_advances (c);
+
   hb_ot_layout_position_finish (c->font, c->buffer);
 
   return;