[OTLayout] Clean up closure() a bit

This commit is contained in:
Behdad Esfahbod 2012-11-23 17:55:40 -05:00
parent adf7758a27
commit 9b34677f36
3 changed files with 23 additions and 19 deletions

View File

@ -1141,6 +1141,13 @@ struct SubstLookup : Lookup
return TRACE_RETURN (c->default_return_value ());
}
static inline void_t closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index);
inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
{
c->set_recurse_func (closure_recurse_func);
return process (c);
}
template <typename set_t>
inline void add_coverage (set_t *glyphs) const
{
@ -1173,7 +1180,6 @@ struct SubstLookup : Lookup
}
static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index);
inline bool apply_string (hb_apply_context_t *c, const hb_set_digest_t *digest) const
{
bool ret = false;
@ -1323,20 +1329,6 @@ struct GSUB : GSUBGPOS
static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
static inline void_t closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
{
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
const SubstLookup &l = gsub.get_lookup (lookup_index);
return l.process (c);
}
inline hb_closure_context_t::return_t closure_lookup (hb_face_t *face,
hb_set_t *glyphs,
unsigned int lookup_index) const
{
hb_closure_context_t c (face, glyphs, closure_recurse_func);
return get_lookup (lookup_index).process (&c);
}
#if 0
inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c,
unsigned int lookup_index) const
@ -1385,6 +1377,13 @@ inline bool ExtensionSubst::is_reverse (void) const
return SubstLookup::lookup_type_is_reverse (type);
}
inline void_t SubstLookup::closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index)
{
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
const SubstLookup &l = gsub.get_lookup (lookup_index);
return l.process (c);
}
inline bool SubstLookup::apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_index)
{
const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);

View File

@ -65,7 +65,7 @@ struct hb_closure_context_t
bool stop_sublookup_iteration (const return_t r) const { return false; }
return_t recurse (unsigned int lookup_index)
{
if (unlikely (nesting_level_left == 0))
if (unlikely (nesting_level_left == 0 || !recurse_func))
return default_return_value ();
nesting_level_left--;
@ -82,13 +82,14 @@ struct hb_closure_context_t
hb_closure_context_t (hb_face_t *face_,
hb_set_t *glyphs_,
recurse_func_t recurse_func_,
unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
face (face_),
glyphs (glyphs_),
recurse_func (recurse_func_),
recurse_func (NULL),
nesting_level_left (nesting_level_left_),
debug_depth (0) {}
void set_recurse_func (recurse_func_t func) { recurse_func = func; }
};

View File

@ -498,7 +498,11 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
unsigned int lookup_index,
hb_set_t *glyphs)
{
_get_gsub (face).closure_lookup (face, glyphs, lookup_index);
OT::hb_closure_context_t c (face, glyphs);
const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
l.closure (&c);
}
/*