[subset] Add memoization of GSUB lookup closures.
This commit is contained in:
parent
78d92e0f27
commit
45186b9b8c
|
@ -1156,10 +1156,13 @@ struct SubstLookup : Lookup
|
||||||
return_trace (dispatch (c));
|
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);
|
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));
|
return_trace (dispatch (c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1258,6 +1261,14 @@ struct SubstLookup : Lookup
|
||||||
template <typename context_t>
|
template <typename context_t>
|
||||||
static inline typename context_t::return_t dispatch_recurse_func (context_t *c, unsigned int lookup_index);
|
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>
|
template <typename context_t>
|
||||||
inline typename context_t::return_t dispatch (context_t *c) const
|
inline typename context_t::return_t dispatch (context_t *c) const
|
||||||
{ return Lookup::dispatch<SubstLookupSubTable> (c); }
|
{ return Lookup::dispatch<SubstLookupSubTable> (c); }
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "hb-private.hh"
|
#include "hb-private.hh"
|
||||||
#include "hb-debug.hh"
|
#include "hb-debug.hh"
|
||||||
#include "hb-buffer-private.hh"
|
#include "hb-buffer-private.hh"
|
||||||
|
#include "hb-map-private.hh"
|
||||||
#include "hb-ot-layout-gdef-table.hh"
|
#include "hb-ot-layout-gdef-table.hh"
|
||||||
#include "hb-set-private.hh"
|
#include "hb-set-private.hh"
|
||||||
|
|
||||||
|
@ -59,6 +60,20 @@ struct hb_closure_context_t :
|
||||||
return HB_VOID;
|
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_face_t *face;
|
||||||
hb_set_t *glyphs;
|
hb_set_t *glyphs;
|
||||||
recurse_func_t recurse_func;
|
recurse_func_t recurse_func;
|
||||||
|
@ -67,14 +82,19 @@ struct hb_closure_context_t :
|
||||||
|
|
||||||
hb_closure_context_t (hb_face_t *face_,
|
hb_closure_context_t (hb_face_t *face_,
|
||||||
hb_set_t *glyphs_,
|
hb_set_t *glyphs_,
|
||||||
|
hb_map_t *done_lookups_,
|
||||||
unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
|
unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) :
|
||||||
face (face_),
|
face (face_),
|
||||||
glyphs (glyphs_),
|
glyphs (glyphs_),
|
||||||
|
done_lookups (done_lookups_),
|
||||||
recurse_func (nullptr),
|
recurse_func (nullptr),
|
||||||
nesting_level_left (nesting_level_left_),
|
nesting_level_left (nesting_level_left_),
|
||||||
debug_depth (0) {}
|
debug_depth (0) {}
|
||||||
|
|
||||||
void set_recurse_func (recurse_func_t func) { recurse_func = func; }
|
void set_recurse_func (recurse_func_t func) { recurse_func = func; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
hb_map_t *done_lookups;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#include "hb-ot-color-sbix-table.hh"
|
#include "hb-ot-color-sbix-table.hh"
|
||||||
#include "hb-ot-color-svg-table.hh"
|
#include "hb-ot-color-svg-table.hh"
|
||||||
#include "hb-ot-name-table.hh"
|
#include "hb-ot-name-table.hh"
|
||||||
|
#include "hb-map-private.hh"
|
||||||
|
|
||||||
|
|
||||||
hb_ot_layout_t *
|
hb_ot_layout_t *
|
||||||
|
@ -943,11 +944,12 @@ hb_ot_layout_lookup_substitute_closure (hb_face_t *face,
|
||||||
unsigned int lookup_index,
|
unsigned int lookup_index,
|
||||||
hb_set_t *glyphs)
|
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);
|
const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
|
||||||
|
|
||||||
l.closure (&c);
|
l.closure (&c, lookup_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue