[gsub] Cache intersects_class results for closure

Benchmark                                                                                 Time             CPU      Time Old      Time New       CPU Old       CPU New
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/10                  +0.0246         +0.0240             0             0             0             0
BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/64                  -0.5541         -0.5544             4             2             4             2
BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/512                 -0.1120         -0.1123            43            38            43            38
BM_subset/subset_codepoints/NotoNastaliqUrdu-Regular.ttf/nohinting/1400                -0.1154         -0.1159            43            38            43            38
This commit is contained in:
Behdad Esfahbod 2022-11-30 16:42:15 -07:00
parent 20a0a46729
commit ac8b232a2d
1 changed files with 41 additions and 17 deletions

View File

@ -1002,7 +1002,7 @@ struct hb_accelerate_subtables_context_t :
};
typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data);
typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data, const void *cache);
typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs);
typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, unsigned value, const void *data);
typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data);
@ -1026,16 +1026,25 @@ struct ChainContextApplyFuncs
};
static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED)
static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED, const void *cache HB_UNUSED)
{
return glyphs->has (value);
}
static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data)
static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data, const void *cache)
{
const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data);
return class_def.intersects_class (glyphs, value);
hb_map_t *map = (hb_map_t *) cache;
hb_codepoint_t *cached_v;
if (map->has (value, &cached_v))
return *cached_v;
bool v = class_def.intersects_class (glyphs, value);
map->set (value, v);
return v;
}
static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data)
static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data, const void *cache HB_UNUSED)
{
Offset16To<Coverage> coverage;
coverage = value;
@ -1066,10 +1075,11 @@ static inline bool array_is_subset_of (const hb_set_t *glyphs,
unsigned int count,
const HBUINT values[],
intersects_func_t intersects_func,
const void *intersects_data)
const void *intersects_data,
const void *cache)
{
for (const auto &_ : + hb_iter (values, count))
if (!intersects_func (glyphs, _, intersects_data)) return false;
if (!intersects_func (glyphs, _, intersects_data, cache)) return false;
return true;
}
@ -1724,6 +1734,7 @@ struct ContextClosureLookupContext
ContextClosureFuncs funcs;
ContextFormat context_format;
const void *intersects_data;
const void *cache;
};
struct ContextCollectGlyphsLookupContext
@ -1746,7 +1757,7 @@ static inline bool context_intersects (const hb_set_t *glyphs,
{
return array_is_subset_of (glyphs,
inputCount ? inputCount - 1 : 0, input,
lookup_context.funcs.intersects, lookup_context.intersects_data);
lookup_context.funcs.intersects, lookup_context.intersects_data, lookup_context.cache);
}
template <typename HBUINT>
@ -2234,10 +2245,12 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
hb_map_t cache;
struct ContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
&class_def
&class_def,
&cache
};
hb_set_t retained_coverage_glyphs;
@ -2273,10 +2286,12 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
hb_map_t cache;
struct ContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
&class_def
&class_def,
&cache
};
+ hb_enumerate (ruleSet)
@ -2300,10 +2315,12 @@ struct ContextFormat2_5
const ClassDef &class_def = this+classDef;
hb_map_t cache;
struct ContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
&class_def
&class_def,
&cache
};
+ hb_iter (ruleSet)
@ -2673,6 +2690,7 @@ struct ChainContextClosureLookupContext
ContextClosureFuncs funcs;
ContextFormat context_format;
const void *intersects_data[3];
const void *cache[3];
};
struct ChainContextCollectGlyphsLookupContext
@ -2699,13 +2717,13 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs,
{
return array_is_subset_of (glyphs,
backtrackCount, backtrack,
lookup_context.funcs.intersects, lookup_context.intersects_data[0])
lookup_context.funcs.intersects, lookup_context.intersects_data[0], lookup_context.cache[0])
&& array_is_subset_of (glyphs,
inputCount ? inputCount - 1 : 0, input,
lookup_context.funcs.intersects, lookup_context.intersects_data[1])
lookup_context.funcs.intersects, lookup_context.intersects_data[1], lookup_context.cache[1])
&& array_is_subset_of (glyphs,
lookaheadCount, lookahead,
lookup_context.funcs.intersects, lookup_context.intersects_data[2]);
lookup_context.funcs.intersects, lookup_context.intersects_data[2], lookup_context.cache[2]);
}
template <typename HBUINT>
@ -3299,12 +3317,14 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
hb_map_t caches[3] = {};
struct ChainContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
&lookahead_class_def}
&lookahead_class_def},
{&caches[0], &caches[1], &caches[2]}
};
hb_set_t retained_coverage_glyphs;
@ -3342,12 +3362,14 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
hb_map_t caches[3] = {};
struct ChainContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
&lookahead_class_def}
&lookahead_class_def},
{&caches[0], &caches[1], &caches[2]}
};
+ hb_enumerate (ruleSet)
@ -3373,12 +3395,14 @@ struct ChainContextFormat2_5
const ClassDef &input_class_def = this+inputClassDef;
const ClassDef &lookahead_class_def = this+lookaheadClassDef;
hb_map_t caches[3] = {};
struct ChainContextClosureLookupContext lookup_context = {
{intersects_class, intersected_class_glyphs},
ContextFormat::ClassBasedContext,
{&backtrack_class_def,
&input_class_def,
&lookahead_class_def}
&lookahead_class_def},
{&caches[0], &caches[1], &caches[2]}
};
+ hb_iter (ruleSet)