From b051be542a8945ec14b0192bbc285f3e1a78c8f1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 29 Jan 2015 13:40:39 +0100 Subject: [PATCH] [lookup] Add skippy_iter.reset() Towards reducing the cost of initializing skippy_iter() --- src/hb-ot-layout-gpos-table.hh | 18 ++++++++++++------ src/hb-ot-layout-gsubgpos-private.hh | 27 ++++++++++++++++++--------- src/hb-ot-shape-fallback.cc | 3 ++- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 93c550716..321453c2f 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -684,7 +684,8 @@ struct PairPosFormat1 unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return TRACE_RETURN (false); return TRACE_RETURN ((this+pairSet[index]).apply (c, &valueFormat1, skippy_iter.idx)); @@ -753,7 +754,8 @@ struct PairPosFormat2 unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint); if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return TRACE_RETURN (false); unsigned int len1 = valueFormat1.get_len (); @@ -902,7 +904,8 @@ struct CursivePosFormat1 const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; if (!this_record.exitAnchor) return TRACE_RETURN (false); - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); if (!skippy_iter.next ()) return TRACE_RETURN (false); const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)]; @@ -1045,7 +1048,8 @@ struct MarkBasePosFormat1 if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false); /* now we search backwards for a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); do { if (!skippy_iter.prev ()) return TRACE_RETURN (false); @@ -1149,7 +1153,8 @@ struct MarkLigPosFormat1 if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false); /* now we search backwards for a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); if (!skippy_iter.prev ()) return TRACE_RETURN (false); @@ -1265,7 +1270,8 @@ struct MarkMarkPosFormat1 if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false); /* now we search backwards for a suitable mark glyph until a non-mark glyph */ - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags); if (!skippy_iter.prev ()) return TRACE_RETURN (false); diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 02642f88d..3bdf10c09 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -338,14 +338,12 @@ struct hb_apply_context_t struct skipping_iterator_t { inline skipping_iterator_t (hb_apply_context_t *c_, - unsigned int start_index_, - unsigned int num_items_, bool context_match = false) : - idx (start_index_), + idx (0), c (c_), match_glyph_data (NULL), - num_items (num_items_), - end (c->buffer->len) + num_items (0), + end (0) { matcher.set_lookup_props (c->lookup_props); /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */ @@ -354,7 +352,6 @@ struct hb_apply_context_t matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zwj); if (!context_match) matcher.set_mask (c->lookup_mask); - matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0); } inline void set_lookup_props (unsigned int lookup_props) { matcher.set_lookup_props (lookup_props); } inline void set_match_func (matcher_t::match_func_t match_func, @@ -365,6 +362,15 @@ struct hb_apply_context_t match_glyph_data = glyph_data; } + inline void reset (unsigned int start_index_, + unsigned int num_items_) + { + idx = start_index_; + num_items = num_items_; + end = c->buffer->len; + matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().syllable () : 0); + } + inline void reject (void) { num_items++; match_glyph_data--; } inline bool next (void) @@ -699,7 +705,8 @@ static inline bool match_input (hb_apply_context_t *c, hb_buffer_t *buffer = c->buffer; - hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, count - 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c); + skippy_iter.reset (buffer->idx, count - 1); skippy_iter.set_match_func (match_func, match_data, input); /* @@ -867,7 +874,8 @@ static inline bool match_backtrack (hb_apply_context_t *c, { TRACE_APPLY (NULL); - hb_apply_context_t::skipping_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, true); + skippy_iter.reset (c->buffer->backtrack_len (), count); skippy_iter.set_match_func (match_func, match_data, backtrack); for (unsigned int i = 0; i < count; i++) @@ -886,7 +894,8 @@ static inline bool match_lookahead (hb_apply_context_t *c, { TRACE_APPLY (NULL); - hb_apply_context_t::skipping_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, true); + skippy_iter.reset (c->buffer->idx + offset - 1, count); skippy_iter.set_match_func (match_func, match_data, lookahead); for (unsigned int i = 0; i < count; i++) diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc index 0b93bd811..e399ecd79 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -441,13 +441,14 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, OT::hb_apply_context_t c (1, font, buffer); c.set_lookup_mask (plan->kern_mask); c.set_lookup_props (OT::LookupFlag::IgnoreMarks); + OT::hb_apply_context_t::skipping_iterator_t skippy_iter (&c); unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; hb_glyph_position_t *pos = buffer->pos; for (unsigned int idx = 0; idx < count;) { - OT::hb_apply_context_t::skipping_iterator_t skippy_iter (&c, idx, 1); + skippy_iter.reset (idx, 1); if (!skippy_iter.next ()) { idx++;