[lookup] Add skippy_iter.reset() Towards reducing the cost of initializing skippy_iter()
diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 93c5507..321453c 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh
@@ -684,7 +684,8 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 02642f8..3bdf10c 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -338,14 +338,12 @@ 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ { 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 0b93bd8..e399ecd 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc
@@ -441,13 +441,14 @@ 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++;