[subset] Add memoization of GSUB lookup closures.

This commit is contained in:
Garret Rieger 2018-06-05 17:14:42 -07:00
parent 78d92e0f27
commit 45186b9b8c
3 changed files with 37 additions and 4 deletions

View File

@ -1156,10 +1156,13 @@ struct SubstLookup : Lookup
return_trace (dispatch (c));
}
inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
inline hb_closure_context_t::return_t closure (hb_closure_context_t *c, unsigned int this_index) const
{
TRACE_CLOSURE (this);
c->set_recurse_func (dispatch_recurse_func<hb_closure_context_t>);
if (!c->start_lookup (this_index))
return_trace (HB_VOID);
c->set_recurse_func (dispatch_closure_recurse_func);
return_trace (dispatch (c));
}
@ -1258,6 +1261,14 @@ struct SubstLookup : Lookup
template <typename context_t>
static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
static inline hb_closure_context_t::return_t dispatch_closure_recurse_func
(hb_closure_context_t *c, unsigned int lookup_index)
{
if (!c->start_lookup (lookup_index))
return HB_VOID;
return dispatch_recurse_func (c, lookup_index);
}
template <typename context_t>
inline typename context_t::return_t dispatch (context_t *c) const
{ return Lookup::dispatch<SubstLookupSubTable> (c); }

View File

@ -32,6 +32,7 @@
#include "hb-private.hh"
#include "hb-debug.hh"
#include "hb-buffer-private.hh"
#include "hb-map-private.hh"
#include "hb-ot-layout-gdef-table.hh"
#include "hb-set-private.hh"
@ -59,6 +60,20 @@ struct hb_closure_context_t :
return HB_VOID;
}
bool start_lookup (unsigned int lookup_index)
{
if (is_lookup_done (lookup_index))
return false;
done_lookups->set (lookup_index, glyphs->get_population ());
return true;
}
bool is_lookup_done (unsigned int lookup_index)
{
// Have we visited this lookup with the current set of glyphs?
return done_lookups->get (lookup_index) == glyphs->get_population ();
}
hb_face_t *face;
hb_set_t *glyphs;
recurse_func_t recurse_func;
@ -67,14 +82,19 @@ struct hb_closure_context_t :
hb_closure_context_t (hb_face_t *face_,
hb_set_t *glyphs_,
hb_map_t *done_lookups_,
unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
face (face_),
glyphs (glyphs_),
done_lookups (done_lookups_),
recurse_func (nullptr),
nesting_level_left (nesting_level_left_),
debug_depth (0) {}
void set_recurse_func (recurse_func_t func) { recurse_func = func; }
private:
hb_map_t *done_lookups;
};

View File

@ -44,6 +44,7 @@
#include "hb-ot-color-sbix-table.hh"
#include "hb-ot-color-svg-table.hh"
#include "hb-ot-name-table.hh"
#include "hb-map-private.hh"
hb_ot_layout_t *
@ -943,11 +944,12 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
unsigned int lookup_index,
hb_set_t *glyphs)
{
OT::hb_closure_context_t c (face, glyphs);
hb_auto_t<hb_map_t> done_lookups;
OT::hb_closure_context_t c (face, glyphs, &done_lookups);
const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
l.closure (&c);
l.closure (&c, lookup_index);
}
/*