[GSUB] Further optimize the main switch
This commit is contained in:
parent
13068232e7
commit
eca8e33710
|
@ -735,11 +735,8 @@ struct SubstLookupSubTable {
|
||||||
friend struct SubstLookup;
|
friend struct SubstLookup;
|
||||||
|
|
||||||
inline bool substitute (LOOKUP_ARGS_DEF,
|
inline bool substitute (LOOKUP_ARGS_DEF,
|
||||||
unsigned int lookup_type) const {
|
unsigned int property,
|
||||||
|
unsigned int lookup_type) const {
|
||||||
unsigned int property;
|
|
||||||
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch (lookup_type) {
|
switch (lookup_type) {
|
||||||
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS, property);
|
case GSUB_Single: return u.single.substitute (LOOKUP_ARGS, property);
|
||||||
|
@ -805,23 +802,21 @@ struct SubstLookup : Lookup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool substitute_once (hb_ot_layout_t *layout,
|
inline bool substitute_once (hb_ot_layout_t *layout,
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
unsigned int context_length,
|
unsigned int context_length,
|
||||||
unsigned int nesting_level_left) const {
|
unsigned int nesting_level_left) const {
|
||||||
|
|
||||||
unsigned int lookup_type = get_type ();
|
unsigned int lookup_type = get_type ();
|
||||||
unsigned int lookup_flag = get_flag ();
|
unsigned int lookup_flag = get_flag ();
|
||||||
|
|
||||||
if (HB_UNLIKELY (nesting_level_left == 0))
|
unsigned int property;
|
||||||
return false;
|
if (!_hb_ot_layout_check_glyph_property (layout, IN_CURITEM (), lookup_flag, &property))
|
||||||
nesting_level_left--;
|
|
||||||
|
|
||||||
if (HB_UNLIKELY (context_length < 1))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < get_subtable_count (); i++)
|
for (unsigned int i = 0; i < get_subtable_count (); i++)
|
||||||
if (get_subtable (i).substitute (LOOKUP_ARGS,
|
if (get_subtable (i).substitute (LOOKUP_ARGS,
|
||||||
|
property,
|
||||||
lookup_type))
|
lookup_type))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
@ -903,6 +898,7 @@ inline bool ExtensionSubstFormat1::substitute (LOOKUP_ARGS_DEF, unsigned int pro
|
||||||
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
/* XXX either check in sanitize or here that the lookuptype is not 7 again,
|
||||||
* or we can loop indefinitely. */
|
* or we can loop indefinitely. */
|
||||||
return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (LOOKUP_ARGS,
|
return (*(SubstLookupSubTable *)(((char *) this) + extensionOffset)).substitute (LOOKUP_ARGS,
|
||||||
|
property,
|
||||||
get_type ());
|
get_type ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -910,6 +906,13 @@ static inline bool substitute_lookup (LOOKUP_ARGS_DEF, unsigned int lookup_index
|
||||||
const GSUB &gsub = *(layout->gsub);
|
const GSUB &gsub = *(layout->gsub);
|
||||||
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
const SubstLookup &l = gsub.get_lookup (lookup_index);
|
||||||
|
|
||||||
|
if (HB_UNLIKELY (nesting_level_left == 0))
|
||||||
|
return false;
|
||||||
|
nesting_level_left--;
|
||||||
|
|
||||||
|
if (HB_UNLIKELY (context_length < 1))
|
||||||
|
return false;
|
||||||
|
|
||||||
return l.substitute_once (layout, buffer, context_length, nesting_level_left);
|
return l.substitute_once (layout, buffer, context_length, nesting_level_left);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue