From 969c9705ae0c64577c3f69f5300fec975f952e1f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 5 May 2010 01:23:44 -0400 Subject: [PATCH] Move context_length into apply_context --- src/hb-ot-layout-gpos-private.hh | 9 ++-- src/hb-ot-layout-gsub-private.hh | 9 ++-- src/hb-ot-layout-gsubgpos-private.hh | 70 ++++++++++++++++------------ 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh index 605102d69..cfd2411d0 100644 --- a/src/hb-ot-layout-gpos-private.hh +++ b/src/hb-ot-layout-gpos-private.hh @@ -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); } diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh index f0306a372..87dfcd2e8 100644 --- a/src/hb-ot-layout-gsub-private.hh +++ b/src/hb-ot-layout-gsub-private.hh @@ -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); } diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 5398b8a9a..80968dce6 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -44,17 +44,16 @@ #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