Move context_length into apply_context
authorBehdad Esfahbod <behdad@behdad.org>
Wed, 5 May 2010 05:23:44 +0000 (01:23 -0400)
committerBehdad Esfahbod <behdad@behdad.org>
Wed, 5 May 2010 05:23:44 +0000 (01:23 -0400)
src/hb-ot-layout-gpos-private.hh
src/hb-ot-layout-gsub-private.hh
src/hb-ot-layout-gsubgpos-private.hh

index 605102d..cfd2411 100644 (file)
@@ -577,7 +577,7 @@ struct PairPosFormat1
   inline bool apply (APPLY_ARG_DEF) const
   {
     TRACE_APPLY ();
-    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
     if (unlikely (context->buffer->in_pos + 2 > end))
       return false;
 
@@ -670,7 +670,7 @@ struct PairPosFormat2
   inline bool apply (APPLY_ARG_DEF) const
   {
     TRACE_APPLY ();
-    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
     if (unlikely (context->buffer->in_pos + 2 > end))
       return false;
 
@@ -1495,6 +1495,7 @@ struct PosLookup : Lookup
 
     context->layout = layout;
     context->buffer = buffer;
+    context->context_length = context_length;
     context->nesting_level_left = nesting_level_left;
     context->lookup_flag = get_flag ();
 
@@ -1608,10 +1609,10 @@ static inline bool position_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
   if (unlikely (context->nesting_level_left == 0))
     return false;
 
-  if (unlikely (context_length < 1))
+  if (unlikely (context->context_length < 1))
     return false;
 
-  return l.apply_once (context->layout, context->buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
+  return l.apply_once (context->layout, context->buffer, context->context_length, context->nesting_level_left - 1, apply_depth + 1);
 }
 
 
index f0306a3..87dfcd2 100644 (file)
@@ -367,7 +367,7 @@ struct Ligature
     TRACE_APPLY ();
     unsigned int i, j;
     unsigned int count = component.len;
-    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+    unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
     if (unlikely (context->buffer->in_pos + count > end))
       return false;
 
@@ -597,7 +597,7 @@ struct ReverseChainSingleSubstFormat1
   inline bool apply (APPLY_ARG_DEF) const
   {
     TRACE_APPLY ();
-    if (unlikely (context_length != NO_CONTEXT))
+    if (unlikely (context->context_length != NO_CONTEXT))
       return false; /* No chaining to this type */
 
     unsigned int index = (this+coverage) (IN_CURGLYPH ());
@@ -780,6 +780,7 @@ struct SubstLookup : Lookup
 
     context->layout = layout;
     context->buffer = buffer;
+    context->context_length = context_length;
     context->nesting_level_left = nesting_level_left;
     context->lookup_flag = get_flag ();
 
@@ -927,10 +928,10 @@ static inline bool substitute_lookup (APPLY_ARG_DEF, unsigned int lookup_index)
   if (unlikely (context->nesting_level_left == 0))
     return false;
 
-  if (unlikely (context_length < 1))
+  if (unlikely (context->context_length < 1))
     return false;
 
-  return l.apply_once (context->layout, context->buffer, context_length, context->nesting_level_left - 1, apply_depth + 1);
+  return l.apply_once (context->layout, context->buffer, context->context_length, context->nesting_level_left - 1, apply_depth + 1);
 }
 
 
index 5398b8a..80968dc 100644 (file)
 
 #define APPLY_ARG_DEF \
        hb_apply_context_t *context, \
-       unsigned int context_length HB_UNUSED, \
        unsigned int apply_depth HB_UNUSED
 #define APPLY_ARG \
        context, \
-       context_length, \
        (HB_DEBUG_APPLY ? apply_depth + 1 : 0)
 
 struct hb_apply_context_t
 {
   hb_ot_layout_context_t *layout;
   hb_buffer_t *buffer;
+  unsigned int context_length;
   unsigned int nesting_level_left;
   unsigned int lookup_flag;
   unsigned int property; /* propety of first glyph (TODO remove) */
@@ -103,7 +102,7 @@ static inline bool match_input (APPLY_ARG_DEF,
                                unsigned int *context_length_out)
 {
   unsigned int i, j;
-  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
   if (unlikely (context->buffer->in_pos + count > end))
     return false;
 
@@ -158,7 +157,7 @@ static inline bool match_lookahead (APPLY_ARG_DEF,
                                    unsigned int offset)
 {
   unsigned int i, j;
-  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
   if (unlikely (context->buffer->in_pos + offset + count > end))
     return false;
 
@@ -201,7 +200,7 @@ static inline bool apply_lookup (APPLY_ARG_DEF,
                                 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
                                 apply_lookup_func_t apply_func)
 {
-  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context_length);
+  unsigned int end = MIN (context->buffer->in_length, context->buffer->in_pos + context->context_length);
   if (unlikely (context->buffer->in_pos + count > end))
     return false;
 
@@ -267,14 +266,20 @@ static inline bool context_lookup (APPLY_ARG_DEF,
                                   const LookupRecord lookupRecord[],
                                   ContextLookupContext &lookup_context)
 {
-  return match_input (APPLY_ARG,
-                     inputCount, input,
-                     lookup_context.funcs.match, lookup_context.match_data,
-                     &context_length) &&
-        apply_lookup (APPLY_ARG,
-                      inputCount,
-                      lookupCount, lookupRecord,
-                      lookup_context.funcs.apply);
+  unsigned int new_context_length;
+  if (!match_input (APPLY_ARG,
+                   inputCount, input,
+                   lookup_context.funcs.match, lookup_context.match_data,
+                   &new_context_length)) return false;
+  unsigned int old_context_length;
+  old_context_length = context->context_length;
+  context->context_length = new_context_length;
+  bool ret = apply_lookup (APPLY_ARG,
+                          inputCount,
+                          lookupCount, lookupRecord,
+                          lookup_context.funcs.apply);
+  context->context_length = old_context_length;
+  return ret;
 }
 
 struct Rule
@@ -529,26 +534,31 @@ static inline bool chain_context_lookup (APPLY_ARG_DEF,
   /* First guess */
   if (unlikely (context->buffer->out_pos < backtrackCount ||
                context->buffer->in_pos + inputCount + lookaheadCount > context->buffer->in_length ||
-               inputCount + lookaheadCount > context_length))
+               inputCount + lookaheadCount > context->context_length))
     return false;
 
   unsigned int offset;
-  return match_backtrack (APPLY_ARG,
-                         backtrackCount, backtrack,
-                         lookup_context.funcs.match, lookup_context.match_data[0]) &&
-        match_input (APPLY_ARG,
-                     inputCount, input,
-                     lookup_context.funcs.match, lookup_context.match_data[1],
-                     &offset) &&
-        match_lookahead (APPLY_ARG,
-                         lookaheadCount, lookahead,
-                         lookup_context.funcs.match, lookup_context.match_data[2],
-                         offset) &&
-        (context_length = offset, true) &&
-        apply_lookup (APPLY_ARG,
-                      inputCount,
-                      lookupCount, lookupRecord,
-                      lookup_context.funcs.apply);
+  if (!(match_backtrack (APPLY_ARG,
+                        backtrackCount, backtrack,
+                        lookup_context.funcs.match, lookup_context.match_data[0]) &&
+       match_input (APPLY_ARG,
+                    inputCount, input,
+                    lookup_context.funcs.match, lookup_context.match_data[1],
+                    &offset) &&
+       match_lookahead (APPLY_ARG,
+                        lookaheadCount, lookahead,
+                        lookup_context.funcs.match, lookup_context.match_data[2],
+                        offset))) return false;
+
+  unsigned int old_context_length;
+  old_context_length = context->context_length;
+  context->context_length = offset;
+  bool ret = apply_lookup (APPLY_ARG,
+                          inputCount,
+                          lookupCount, lookupRecord,
+                          lookup_context.funcs.apply);
+  context->context_length = old_context_length;
+  return ret;
 }
 
 struct ChainRule