[apply] Use a context object to reduce number of parameters passed around
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 29 Apr 2010 06:19:21 +0000 (02:19 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 29 Apr 2010 06:19:21 +0000 (02:19 -0400)
src/hb-open-type-private.hh
src/hb-ot-layout-gpos-private.hh
src/hb-ot-layout-gsub-private.hh
src/hb-ot-layout-gsubgpos-private.hh

index 1b33183a7c55b6dead47da93f069d198a080328a..a062aff19c92662e16da00fd7ef41abe6ca8dc57 100644 (file)
@@ -138,15 +138,14 @@ ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type))
        context, \
        (HB_DEBUG_SANITIZE ? sanitize_depth + 1 : 0)
 
-
-typedef struct _hb_sanitize_context_t hb_sanitize_context_t;
-struct _hb_sanitize_context_t
+struct hb_sanitize_context_t
 {
   const char *start, *end;
   hb_bool_t writable;
   unsigned int edit_count;
 };
 
+
 static HB_GNUC_UNUSED void
 _hb_sanitize_init (hb_sanitize_context_t *context,
                   hb_blob_t *blob)
index fe6ac6385cb8290aec0cdf1846686c357e5b86d9..4bfa89f0e9d03081fcfe89c616139672f4fd13ce 100644 (file)
@@ -566,7 +566,7 @@ struct PairPosFormat1
       return false;
 
     unsigned int j = buffer->in_pos + 1;
-    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (j == end))
        return false;
@@ -658,7 +658,7 @@ struct PairPosFormat2
       return false;
 
     unsigned int j = buffer->in_pos + 1;
-    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (j == end))
        return false;
@@ -913,7 +913,7 @@ struct CursivePosFormat1
     gpi->last = HB_OT_LAYOUT_GPOS_NO_LAST;
 
     /* We don't handle mark glyphs here. */
-    if (property == HB_OT_LAYOUT_GLYPH_CLASS_MARK)
+    if (apply_context->property == HB_OT_LAYOUT_GLYPH_CLASS_MARK)
       return false;
 
     unsigned int index = (this+coverage) (IN_CURGLYPH ());
@@ -941,7 +941,7 @@ struct CursivePosFormat1
       POSITION (last_pos)->x_advance = gpi->anchor_x - entry_x;
     }
 
-    if  (lookup_flag & LookupFlag::RightToLeft)
+    if  (apply_context->lookup_flag & LookupFlag::RightToLeft)
     {
       POSITION (last_pos)->cursive_chain = last_pos - buffer->in_pos;
       POSITION (last_pos)->y_offset = entry_y - gpi->anchor_y;
@@ -1028,6 +1028,7 @@ struct MarkBasePosFormat1
       return false;
 
     /* now we search backwards for a non-mark glyph */
+    unsigned int property;
     unsigned int j = buffer->in_pos;
     do
     {
@@ -1127,6 +1128,7 @@ struct MarkLigPosFormat1
       return false;
 
     /* now we search backwards for a non-mark glyph */
+    unsigned int property;
     unsigned int j = buffer->in_pos;
     do
     {
@@ -1243,13 +1245,14 @@ struct MarkMarkPosFormat1
       return false;
 
     /* now we search backwards for a suitable mark glyph until a non-mark glyph */
+    unsigned int property;
     unsigned int j = buffer->in_pos;
     do
     {
       if (HB_UNLIKELY (!j))
        return false;
       j--;
-    } while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, &property));
+    } while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, &property));
 
     if (!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK))
       return false;
@@ -1454,10 +1457,12 @@ struct PosLookup : Lookup
                          unsigned int    apply_depth) const
   {
     unsigned int lookup_type = get_type ();
-    unsigned int lookup_flag = get_flag ();
-    unsigned int property;
+    hb_apply_context_t apply_context[1];
+
+    apply_context->nesting_level_left = nesting_level_left;
+    apply_context->lookup_flag = get_flag ();
 
-    if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), lookup_flag, &property))
+    if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), apply_context->lookup_flag, &apply_context->property))
       return false;
 
     for (unsigned int i = 0; i < get_subtable_count (); i++)
@@ -1562,14 +1567,13 @@ static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
   const GPOS &gpos = *(context->face->ot_layout.gpos);
   const PosLookup &l = gpos.get_lookup (lookup_index);
 
-  if (HB_UNLIKELY (nesting_level_left == 0))
+  if (HB_UNLIKELY (apply_context->nesting_level_left == 0))
     return false;
-  nesting_level_left--;
 
   if (HB_UNLIKELY (context_length < 1))
     return false;
 
-  return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth);
+  return l.apply_once (context, buffer, context_length, apply_context->nesting_level_left - 1, apply_depth + 1);
 }
 
 
index 9940ebaabb0c01abf0ee98f2aae4c5bd2169eb25..f3b3e83a2ec093808beaa13c353e93e6e7a78ff3 100644 (file)
@@ -49,7 +49,7 @@ struct SingleSubstFormat1
 
     /* We inherit the old glyph class to the substituted glyph */
     if (_hb_ot_layout_has_new_glyph_classes (context->face))
-      _hb_ot_layout_set_glyph_property (context->face, glyph_id, property);
+      _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property);
 
     return true;
   }
@@ -91,7 +91,7 @@ struct SingleSubstFormat2
 
     /* We inherit the old glyph class to the substituted glyph */
     if (_hb_ot_layout_has_new_glyph_classes (context->face))
-      _hb_ot_layout_set_glyph_property (context->face, glyph_id, property);
+      _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property);
 
     return true;
   }
@@ -165,6 +165,7 @@ struct Sequence
     /* This is a guess only ... */
     if (_hb_ot_layout_has_new_glyph_classes (context->face))
     {
+      unsigned int property = apply_context->property;
       if (property == HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE)
         property = HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH;
 
@@ -295,7 +296,7 @@ struct AlternateSubstFormat1
 
     /* We inherit the old glyph class to the substituted glyph */
     if (_hb_ot_layout_has_new_glyph_classes (context->face))
-      _hb_ot_layout_set_glyph_property (context->face, glyph_id, property);
+      _hb_ot_layout_set_glyph_property (context->face, glyph_id, apply_context->property);
 
     return true;
   }
@@ -364,7 +365,8 @@ struct Ligature
 
     for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++)
     {
-      while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, &property))
+      unsigned int property;
+      while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, &property))
       {
        if (HB_UNLIKELY (j + count - i == end))
          return false;
@@ -405,7 +407,7 @@ struct Ligature
 
       for ( i = 1; i < count; i++ )
       {
-       while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), lookup_flag, NULL))
+       while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), apply_context->lookup_flag, NULL))
          _hb_buffer_add_output_glyph (buffer, IN_CURGLYPH (), i, lig_id);
 
        (buffer->in_pos)++;
@@ -472,7 +474,7 @@ struct LigatureSubstFormat1
     TRACE_APPLY ();
     hb_codepoint_t glyph_id = IN_CURGLYPH ();
 
-    bool first_is_mark = !!(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
+    bool first_is_mark = !!(apply_context->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
 
     unsigned int index = (this+coverage) (glyph_id);
     if (HB_LIKELY (index == NOT_COVERED))
@@ -757,17 +759,19 @@ struct SubstLookup : Lookup
   }
 
 
-  inline bool apply_once (hb_ot_layout_context_t *context,
-                         hb_buffer_t    *buffer,
-                         unsigned int    context_length,
-                         unsigned int    nesting_level_left,
-                         unsigned int    apply_depth) const
+  inline bool apply_once ( hb_ot_layout_context_t *context,
+                         hb_buffer_t *buffer,
+                         unsigned int context_length,
+                         unsigned int nesting_level_left,
+                         unsigned int apply_depth) const
   {
     unsigned int lookup_type = get_type ();
-    unsigned int lookup_flag = get_flag ();
-    unsigned int property;
+    hb_apply_context_t apply_context[1];
 
-    if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), lookup_flag, &property))
+    apply_context->nesting_level_left = nesting_level_left;
+    apply_context->lookup_flag = get_flag ();
+
+    if (!_hb_ot_layout_check_glyph_property (context->face, IN_CURINFO (), apply_context->lookup_flag, &apply_context->property))
       return false;
 
     if (HB_UNLIKELY (lookup_type == SubstLookupSubTable::Extension))
@@ -906,14 +910,13 @@ static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
   const GSUB &gsub = *(context->face->ot_layout.gsub);
   const SubstLookup &l = gsub.get_lookup (lookup_index);
 
-  if (HB_UNLIKELY (nesting_level_left == 0))
+  if (HB_UNLIKELY (apply_context->nesting_level_left == 0))
     return false;
-  nesting_level_left--;
 
   if (HB_UNLIKELY (context_length < 1))
     return false;
 
-  return l.apply_once (context, buffer, context_length, nesting_level_left, apply_depth);
+  return l.apply_once (context, buffer, context_length, apply_context->nesting_level_left - 1, apply_depth + 1);
 }
 
 
index d27cd80c72613eaa2192b093e8a02ea3f0cfa670..c317e54fdbdc343cc9befab322c8c183b4252ab9 100644 (file)
 
 
 #define APPLY_ARG_DEF \
+       hb_apply_context_t *apply_context, \
        hb_ot_layout_context_t *context, \
-       hb_buffer_t    *buffer, \
-       unsigned int    context_length HB_GNUC_UNUSED, \
-       unsigned int    nesting_level_left HB_GNUC_UNUSED, \
-       unsigned int    lookup_flag HB_GNUC_UNUSED, \
-       unsigned int    property HB_GNUC_UNUSED, /* propety of first glyph */ \
-       unsigned int    apply_depth HB_GNUC_UNUSED
+       hb_buffer_t *buffer, \
+       unsigned int context_length HB_GNUC_UNUSED, \
+       unsigned int apply_depth HB_GNUC_UNUSED
 #define APPLY_ARG \
+       apply_context, \
        context, \
        buffer, \
        context_length, \
-       nesting_level_left, \
-       lookup_flag, \
-       property, \
        (HB_DEBUG_APPLY ? apply_depth + 1 : 0)
 
+struct hb_apply_context_t
+{
+  unsigned int nesting_level_left;
+  unsigned int lookup_flag;
+  unsigned int property; /* propety of first glyph (TODO remove) */
+};
+
 
 typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const char *data);
 typedef bool (*apply_lookup_func_t) (APPLY_ARG_DEF, unsigned int lookup_index);
@@ -102,7 +105,7 @@ static inline bool match_input (APPLY_ARG_DEF,
 
   for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++)
   {
-    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, IN_INFO (j), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (j + count - i == end))
        return false;
@@ -129,7 +132,7 @@ static inline bool match_backtrack (APPLY_ARG_DEF,
 
   for (unsigned int i = 0, j = buffer->out_pos - 1; i < count; i++, j--)
   {
-    while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (j + 1 == count - i))
        return false;
@@ -157,7 +160,7 @@ static inline bool match_lookahead (APPLY_ARG_DEF,
 
   for (i = 0, j = buffer->in_pos + offset; i < count; i++, j++)
   {
-    while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, OUT_INFO (j), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (j + count - i == end))
        return false;
@@ -207,7 +210,7 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
    */
   for (unsigned int i = 0; i < count; /* NOP */)
   {
-    while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), lookup_flag, NULL))
+    while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), apply_context->lookup_flag, NULL))
     {
       if (HB_UNLIKELY (buffer->in_pos == end))
        return true;