[OTLayout] Minor refactoring

This commit is contained in:
Behdad Esfahbod 2013-02-13 11:22:42 -05:00
parent 407fc12466
commit c074ebc466
2 changed files with 23 additions and 16 deletions

View File

@ -1029,8 +1029,9 @@ struct MarkBasePosFormat1
/* now we search backwards for a non-mark glyph */ /* now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->idx, 1); hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->idx, 1);
skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
do { do {
if (!skippy_iter.prev (LookupFlag::IgnoreMarks)) return TRACE_RETURN (false); if (!skippy_iter.prev ()) return TRACE_RETURN (false);
/* We only want to attach to the first of a MultipleSubst sequence. Reject others. */ /* We only want to attach to the first of a MultipleSubst sequence. Reject others. */
if (0 == get_lig_comp (c->buffer->info[skippy_iter.idx])) break; if (0 == get_lig_comp (c->buffer->info[skippy_iter.idx])) break;
skippy_iter.reject (); skippy_iter.reject ();
@ -1132,7 +1133,8 @@ struct MarkLigPosFormat1
/* now we search backwards for a non-mark glyph */ /* now we search backwards for a non-mark glyph */
hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->idx, 1); hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->idx, 1);
if (!skippy_iter.prev (LookupFlag::IgnoreMarks)) return TRACE_RETURN (false); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
/* The following assertion is too strong, so we've disabled it. */ /* The following assertion is too strong, so we've disabled it. */
if (!(c->buffer->info[skippy_iter.idx].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE)) {/*return TRACE_RETURN (false);*/} if (!(c->buffer->info[skippy_iter.idx].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE)) {/*return TRACE_RETURN (false);*/}
@ -1247,7 +1249,8 @@ struct MarkMarkPosFormat1
/* 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_backward_iterator_t skippy_iter (c, c->buffer->idx, 1); hb_apply_context_t::skipping_backward_iterator_t skippy_iter (c, c->buffer->idx, 1);
if (!skippy_iter.prev (c->lookup_props & ~LookupFlag::IgnoreFlags)) return TRACE_RETURN (false); skippy_iter.set_lookup_props (c->lookup_props & ~LookupFlag::IgnoreFlags);
if (!skippy_iter.prev ()) return TRACE_RETURN (false);
if (!(c->buffer->info[skippy_iter.idx].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK)) { return TRACE_RETURN (false); } if (!(c->buffer->info[skippy_iter.idx].glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK)) { return TRACE_RETURN (false); }

View File

@ -281,9 +281,9 @@ struct hb_apply_context_t
has_glyph_classes (gdef.has_glyph_classes ()), has_glyph_classes (gdef.has_glyph_classes ()),
debug_depth (0) {} debug_depth (0) {}
void set_recurse_func (recurse_func_t func) { recurse_func = func; } inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; } inline void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
void set_lookup (const Lookup &l) { lookup_props = l.get_props (); } inline void set_lookup (const Lookup &l) { lookup_props = l.get_props (); }
struct skipping_forward_iterator_t struct skipping_forward_iterator_t
{ {
@ -293,12 +293,17 @@ struct hb_apply_context_t
bool context_match = false) bool context_match = false)
{ {
c = c_; c = c_;
lookup_props = c->lookup_props;
idx = start_index_; idx = start_index_;
num_items = num_items_; num_items = num_items_;
mask = context_match ? -1 : c->lookup_mask; mask = context_match ? -1 : c->lookup_mask;
syllable = context_match ? 0 : c->buffer->cur().syllable (); syllable = context_match ? 0 : c->buffer->cur().syllable ();
end = c->buffer->len; end = c->buffer->len;
} }
inline void set_lookup_props (unsigned int lookup_props_)
{
lookup_props = lookup_props_;
}
inline bool has_no_chance (void) const inline bool has_no_chance (void) const
{ {
return unlikely (num_items && idx + num_items >= end); return unlikely (num_items && idx + num_items >= end);
@ -307,7 +312,7 @@ struct hb_apply_context_t
{ {
num_items++; num_items++;
} }
inline bool next (unsigned int lookup_props) inline bool next (void)
{ {
assert (num_items > 0); assert (num_items > 0);
do do
@ -319,14 +324,11 @@ struct hb_apply_context_t
num_items--; num_items--;
return (c->buffer->info[idx].mask & mask) && (!syllable || syllable == c->buffer->info[idx].syllable ()); return (c->buffer->info[idx].mask & mask) && (!syllable || syllable == c->buffer->info[idx].syllable ());
} }
inline bool next (void)
{
return next (c->lookup_props);
}
unsigned int idx; unsigned int idx;
protected: protected:
hb_apply_context_t *c; hb_apply_context_t *c;
unsigned int lookup_props;
unsigned int num_items; unsigned int num_items;
hb_mask_t mask; hb_mask_t mask;
uint8_t syllable; uint8_t syllable;
@ -342,11 +344,16 @@ struct hb_apply_context_t
bool match_syllable_ = true) bool match_syllable_ = true)
{ {
c = c_; c = c_;
lookup_props = c->lookup_props;
idx = start_index_; idx = start_index_;
num_items = num_items_; num_items = num_items_;
mask = mask_ ? mask_ : c->lookup_mask; mask = mask_ ? mask_ : c->lookup_mask;
syllable = match_syllable_ ? c->buffer->cur().syllable () : 0; syllable = match_syllable_ ? c->buffer->cur().syllable () : 0;
} }
inline void set_lookup_props (unsigned int lookup_props_)
{
lookup_props = lookup_props_;
}
inline bool has_no_chance (void) const inline bool has_no_chance (void) const
{ {
return unlikely (idx < num_items); return unlikely (idx < num_items);
@ -355,7 +362,7 @@ struct hb_apply_context_t
{ {
num_items++; num_items++;
} }
inline bool prev (unsigned int lookup_props) inline bool prev (void)
{ {
assert (num_items > 0); assert (num_items > 0);
do do
@ -367,14 +374,11 @@ struct hb_apply_context_t
num_items--; num_items--;
return (c->buffer->out_info[idx].mask & mask) && (!syllable || syllable == c->buffer->out_info[idx].syllable ()); return (c->buffer->out_info[idx].mask & mask) && (!syllable || syllable == c->buffer->out_info[idx].syllable ());
} }
inline bool prev (void)
{
return prev (c->lookup_props);
}
unsigned int idx; unsigned int idx;
protected: protected:
hb_apply_context_t *c; hb_apply_context_t *c;
unsigned int lookup_props;
unsigned int num_items; unsigned int num_items;
hb_mask_t mask; hb_mask_t mask;
uint8_t syllable; uint8_t syllable;