[GSUB] Further optimize the main switch

This commit is contained in:
Behdad Esfahbod 2009-05-17 09:07:27 -04:00
parent 13068232e7
commit eca8e33710
1 changed files with 17 additions and 14 deletions

View File

@ -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);
} }