From 696266981df5ef6c62ad0115133dad1d6c1d9acc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 29 Jan 2015 13:08:41 +0100 Subject: [PATCH] [layout] Merge forward and backward iterators --- src/hb-ot-layout-gpos-table.hh | 12 ++--- src/hb-ot-layout-gsubgpos-private.hh | 71 +++++++--------------------- src/hb-ot-shape-fallback.cc | 2 +- 3 files changed, 23 insertions(+), 62 deletions(-) diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index ea592371f..93c550716 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -684,7 +684,7 @@ 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_forward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, 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 +753,7 @@ 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_forward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); if (!skippy_iter.next ()) return TRACE_RETURN (false); unsigned int len1 = valueFormat1.get_len (); @@ -902,7 +902,7 @@ 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_forward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, 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 +1045,7 @@ 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_backward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); do { if (!skippy_iter.prev ()) return TRACE_RETURN (false); @@ -1149,7 +1149,7 @@ 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_backward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); if (!skippy_iter.prev ()) return TRACE_RETURN (false); @@ -1265,7 +1265,7 @@ 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_backward_iterator_t skippy_iter (c, buffer->idx, 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, 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 8a733e8f6..e983964ee 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -390,17 +390,17 @@ struct hb_apply_context_t const void *match_data; }; - struct skipping_forward_iterator_t - { - inline skipping_forward_iterator_t (hb_apply_context_t *c_, - unsigned int start_index_, - unsigned int num_items_, - bool context_match = false) : - idx (start_index_), - c (c_), - match_glyph_data (NULL), - num_items (num_items_), - end (c->buffer->len) + 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_), + c (c_), + match_glyph_data (NULL), + num_items (num_items_), + end (c->buffer->len) { matcher.set_lookup_props (c->lookup_props); /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */ @@ -421,6 +421,7 @@ struct hb_apply_context_t } inline void reject (void) { num_items++; match_glyph_data--; } + inline bool next (void) { assert (num_items > 0); @@ -448,47 +449,6 @@ struct hb_apply_context_t } return false; } - - unsigned int idx; - protected: - hb_apply_context_t *c; - matcher_t matcher; - const USHORT *match_glyph_data; - - unsigned int num_items; - unsigned int end; - }; - - struct skipping_backward_iterator_t - { - inline skipping_backward_iterator_t (hb_apply_context_t *c_, - unsigned int start_index_, - unsigned int num_items_, - bool context_match = false) : - idx (start_index_), - c (c_), - match_glyph_data (NULL), - num_items (num_items_) - { - matcher.set_lookup_props (c->lookup_props); - /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */ - matcher.set_ignore_zwnj (context_match || c->table_index == 1); - /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if asked to. */ - 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, - const void *match_data, - const USHORT glyph_data[]) - { - matcher.set_match_func (match_func, match_data); - match_glyph_data = glyph_data; - } - - inline void reject (void) { num_items++; match_glyph_data--; } inline bool prev (void) { assert (num_items > 0); @@ -524,6 +484,7 @@ struct hb_apply_context_t const USHORT *match_glyph_data; unsigned int num_items; + unsigned int end; }; inline bool @@ -737,7 +698,7 @@ static inline bool match_input (hb_apply_context_t *c, hb_buffer_t *buffer = c->buffer; - hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, buffer->idx, count - 1); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, buffer->idx, count - 1); skippy_iter.set_match_func (match_func, match_data, input); /* @@ -905,7 +866,7 @@ static inline bool match_backtrack (hb_apply_context_t *c, { TRACE_APPLY (NULL); - hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, c->buffer->backtrack_len (), count, true); skippy_iter.set_match_func (match_func, match_data, backtrack); for (unsigned int i = 0; i < count; i++) @@ -924,7 +885,7 @@ static inline bool match_lookahead (hb_apply_context_t *c, { TRACE_APPLY (NULL); - hb_apply_context_t::skipping_forward_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true); + hb_apply_context_t::skipping_iterator_t skippy_iter (c, c->buffer->idx + offset - 1, count, true); 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 80d7da82f..0b93bd811 100644 --- a/src/hb-ot-shape-fallback.cc +++ b/src/hb-ot-shape-fallback.cc @@ -447,7 +447,7 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan, hb_glyph_position_t *pos = buffer->pos; for (unsigned int idx = 0; idx < count;) { - OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, idx, 1); + OT::hb_apply_context_t::skipping_iterator_t skippy_iter (&c, idx, 1); if (!skippy_iter.next ()) { idx++;