[lookup] Add skippy_iter.reset()
Towards reducing the cost of initializing skippy_iter()
This commit is contained in:
parent
2cecc38c7c
commit
b051be542a
|
@ -684,7 +684,8 @@ struct PairPosFormat1
|
||||||
unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
|
unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
|
||||||
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
|
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);
|
if (!skippy_iter.next ()) return TRACE_RETURN (false);
|
||||||
|
|
||||||
return TRACE_RETURN ((this+pairSet[index]).apply (c, &valueFormat1, skippy_iter.idx));
|
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);
|
unsigned int index = (this+coverage).get_coverage (buffer->cur().codepoint);
|
||||||
if (likely (index == NOT_COVERED)) return TRACE_RETURN (false);
|
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);
|
if (!skippy_iter.next ()) return TRACE_RETURN (false);
|
||||||
|
|
||||||
unsigned int len1 = valueFormat1.get_len ();
|
unsigned int len1 = valueFormat1.get_len ();
|
||||||
|
@ -902,7 +904,8 @@ struct CursivePosFormat1
|
||||||
const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)];
|
const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)];
|
||||||
if (!this_record.exitAnchor) return TRACE_RETURN (false);
|
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);
|
if (!skippy_iter.next ()) return TRACE_RETURN (false);
|
||||||
|
|
||||||
const EntryExitRecord &next_record = entryExitRecord[(this+coverage).get_coverage (buffer->info[skippy_iter.idx].codepoint)];
|
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);
|
if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
|
||||||
|
|
||||||
/* now we search backwards for a non-mark glyph */
|
/* 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);
|
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
|
||||||
do {
|
do {
|
||||||
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
||||||
|
@ -1149,7 +1153,8 @@ struct MarkLigPosFormat1
|
||||||
if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
|
if (likely (mark_index == NOT_COVERED)) return TRACE_RETURN (false);
|
||||||
|
|
||||||
/* now we search backwards for a non-mark glyph */
|
/* 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);
|
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
|
||||||
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
||||||
|
|
||||||
|
@ -1265,7 +1270,8 @@ struct MarkMarkPosFormat1
|
||||||
if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
|
if (likely (mark1_index == NOT_COVERED)) return TRACE_RETURN (false);
|
||||||
|
|
||||||
/* now we search backwards for a suitable mark glyph until a non-mark glyph */
|
/* 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);
|
skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
|
||||||
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
|
||||||
|
|
||||||
|
|
|
@ -338,14 +338,12 @@ struct hb_apply_context_t
|
||||||
struct skipping_iterator_t
|
struct skipping_iterator_t
|
||||||
{
|
{
|
||||||
inline skipping_iterator_t (hb_apply_context_t *c_,
|
inline skipping_iterator_t (hb_apply_context_t *c_,
|
||||||
unsigned int start_index_,
|
|
||||||
unsigned int num_items_,
|
|
||||||
bool context_match = false) :
|
bool context_match = false) :
|
||||||
idx (start_index_),
|
idx (0),
|
||||||
c (c_),
|
c (c_),
|
||||||
match_glyph_data (NULL),
|
match_glyph_data (NULL),
|
||||||
num_items (num_items_),
|
num_items (0),
|
||||||
end (c->buffer->len)
|
end (0)
|
||||||
{
|
{
|
||||||
matcher.set_lookup_props (c->lookup_props);
|
matcher.set_lookup_props (c->lookup_props);
|
||||||
/* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
|
/* 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);
|
matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zwj);
|
||||||
if (!context_match)
|
if (!context_match)
|
||||||
matcher.set_mask (c->lookup_mask);
|
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_lookup_props (unsigned int lookup_props) { matcher.set_lookup_props (lookup_props); }
|
||||||
inline void set_match_func (matcher_t::match_func_t match_func,
|
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;
|
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 void reject (void) { num_items++; match_glyph_data--; }
|
||||||
|
|
||||||
inline bool next (void)
|
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_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);
|
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);
|
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);
|
skippy_iter.set_match_func (match_func, match_data, backtrack);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < count; i++)
|
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);
|
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);
|
skippy_iter.set_match_func (match_func, match_data, lookahead);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < count; i++)
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
|
|
@ -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);
|
OT::hb_apply_context_t c (1, font, buffer);
|
||||||
c.set_lookup_mask (plan->kern_mask);
|
c.set_lookup_mask (plan->kern_mask);
|
||||||
c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
|
c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
|
||||||
|
OT::hb_apply_context_t::skipping_iterator_t skippy_iter (&c);
|
||||||
|
|
||||||
unsigned int count = buffer->len;
|
unsigned int count = buffer->len;
|
||||||
hb_glyph_info_t *info = buffer->info;
|
hb_glyph_info_t *info = buffer->info;
|
||||||
hb_glyph_position_t *pos = buffer->pos;
|
hb_glyph_position_t *pos = buffer->pos;
|
||||||
for (unsigned int idx = 0; idx < count;)
|
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 ())
|
if (!skippy_iter.next ())
|
||||||
{
|
{
|
||||||
idx++;
|
idx++;
|
||||||
|
|
Loading…
Reference in New Issue