diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 4acd67b3a..389e3d087 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -37,10 +37,6 @@ namespace OT { struct SingleSubstFormat1 { - friend struct SingleSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -112,10 +108,6 @@ struct SingleSubstFormat1 struct SingleSubstFormat2 { - friend struct SingleSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -186,28 +178,13 @@ struct SingleSubstFormat2 struct SingleSubst { - friend struct SubstLookupSubTable; - friend struct SubstLookup; - - private: - - inline void closure (hb_closure_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { - TRACE_CLOSURE (); switch (u.format) { - case 1: u.format1.closure (c); break; - case 2: u.format2.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const - { - TRACE_CLOSURE (); - switch (u.format) { - case 1: u.format1.collect_glyphs (c); break; - case 2: u.format2.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + case 2: return c->process (u.format2); + default:return c->default_return_value; } } @@ -278,10 +255,6 @@ struct SingleSubst struct Sequence { - friend struct MultipleSubstFormat1; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -323,7 +296,6 @@ struct Sequence return TRACE_RETURN (true); } - public: inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (); return TRACE_RETURN (substitute.sanitize (c)); @@ -338,10 +310,6 @@ struct Sequence struct MultipleSubstFormat1 { - friend struct MultipleSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -412,25 +380,12 @@ struct MultipleSubstFormat1 struct MultipleSubst { - friend struct SubstLookupSubTable; - friend struct SubstLookup; - - private: - - inline void closure (hb_closure_context_t *c) const - { - TRACE_CLOSURE (); - switch (u.format) { - case 1: u.format1.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { switch (u.format) { - case 1: u.format1.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + default:return c->default_return_value; } } @@ -489,10 +444,6 @@ typedef ArrayOf AlternateSet; /* Array of alternate GlyphIDs--in struct AlternateSubstFormat1 { - friend struct AlternateSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -589,25 +540,12 @@ struct AlternateSubstFormat1 struct AlternateSubst { - friend struct SubstLookupSubTable; - friend struct SubstLookup; - - private: - - inline void closure (hb_closure_context_t *c) const - { - TRACE_CLOSURE (); - switch (u.format) { - case 1: u.format1.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { switch (u.format) { - case 1: u.format1.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + default:return c->default_return_value; } } @@ -663,10 +601,6 @@ struct AlternateSubst struct Ligature { - friend struct LigatureSet; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -761,10 +695,6 @@ struct Ligature struct LigatureSet { - friend struct LigatureSubstFormat1; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -824,7 +754,6 @@ struct LigatureSet return TRACE_RETURN (true); } - public: inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (); return TRACE_RETURN (ligature.sanitize (c, this)); @@ -840,10 +769,6 @@ struct LigatureSet struct LigatureSubstFormat1 { - friend struct LigatureSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -926,25 +851,12 @@ struct LigatureSubstFormat1 struct LigatureSubst { - friend struct SubstLookupSubTable; - friend struct SubstLookup; - - private: - - inline void closure (hb_closure_context_t *c) const - { - TRACE_CLOSURE (); - switch (u.format) { - case 1: u.format1.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { switch (u.format) { - case 1: u.format1.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + default:return c->default_return_value; } } @@ -1010,24 +922,13 @@ struct LigatureSubst static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index); -static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index); -static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index); struct ContextSubst : Context { - friend struct SubstLookupSubTable; - - private: - - inline void closure (hb_closure_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { - TRACE_CLOSURE (); - return Context::closure (c, closure_lookup); - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const - { - return Context::collect_glyphs (c, collect_glyphs_lookup); + return Context::process (c); } inline bool apply (hb_apply_context_t *c) const @@ -1039,19 +940,10 @@ struct ContextSubst : Context struct ChainContextSubst : ChainContext { - friend struct SubstLookupSubTable; - - private: - - inline void closure (hb_closure_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { - TRACE_CLOSURE (); - return ChainContext::closure (c, closure_lookup); - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const - { - return ChainContext::collect_glyphs (c, collect_glyphs_lookup); + return ChainContext::process (c); } inline bool apply (hb_apply_context_t *c) const @@ -1064,10 +956,6 @@ struct ChainContextSubst : ChainContext struct ExtensionSubst : Extension { - friend struct SubstLookupSubTable; - friend struct SubstLookup; - - private: inline const struct SubstLookupSubTable& get_subtable (void) const { unsigned int offset = get_offset (); @@ -1075,9 +963,8 @@ struct ExtensionSubst : Extension return StructAtOffset (this, offset); } - inline void closure (hb_closure_context_t *c) const; - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const; + template + inline typename context_t::return_t process (context_t *c) const; inline const Coverage &get_coverage (void) const; @@ -1093,10 +980,6 @@ struct ExtensionSubst : Extension struct ReverseChainSingleSubstFormat1 { - friend struct ReverseChainSingleSubst; - - private: - inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); @@ -1210,24 +1093,12 @@ struct ReverseChainSingleSubstFormat1 struct ReverseChainSingleSubst { - friend struct SubstLookupSubTable; - - private: - - inline void closure (hb_closure_context_t *c) const - { - TRACE_CLOSURE (); - switch (u.format) { - case 1: u.format1.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { switch (u.format) { - case 1: u.format1.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + default:return c->default_return_value; } } @@ -1285,36 +1156,19 @@ struct SubstLookupSubTable ReverseChainSingle = 8 }; - inline void closure (hb_closure_context_t *c, - unsigned int lookup_type) const - { - TRACE_CLOSURE (); - switch (lookup_type) { - case Single: u.single.closure (c); break; - case Multiple: u.multiple.closure (c); break; - case Alternate: u.alternate.closure (c); break; - case Ligature: u.ligature.closure (c); break; - case Context: u.context.closure (c); break; - case ChainContext: u.chainContext.closure (c); break; - case Extension: u.extension.closure (c); break; - case ReverseChainSingle: u.reverseChainContextSingle.closure (c); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c, - unsigned int lookup_type) const + template + inline typename context_t::return_t process (context_t *c, unsigned int lookup_type) const { switch (lookup_type) { - case Single: u.single.collect_glyphs (c); break; - case Multiple: u.multiple.collect_glyphs (c); break; - case Alternate: u.alternate.collect_glyphs (c); break; - case Ligature: u.ligature.collect_glyphs (c); break; - case Context: u.context.collect_glyphs (c); break; - case ChainContext: u.chainContext.collect_glyphs (c); break; - case Extension: u.extension.collect_glyphs (c); break; - case ReverseChainSingle: u.reverseChainContextSingle.collect_glyphs (c); break; - default: break; + case Single: return u.single.process (c); + case Multiple: return u.multiple.process (c); + case Alternate: return u.alternate.process (c); + case Ligature: return u.ligature.process (c); + case Context: return u.context.process (c); + case ChainContext: return u.chainContext.process (c); + case Extension: return u.extension.process (c); + case ReverseChainSingle: return u.reverseChainContextSingle.process (c); + default: return c->default_return_value; } } @@ -1427,12 +1281,15 @@ struct SubstLookup : Lookup return lookup_type_is_reverse (type); } - inline void closure (hb_closure_context_t *c) const + template + inline typename context_t::return_t process (context_t *c) const { unsigned int lookup_type = get_type (); unsigned int count = get_subtable_count (); for (unsigned int i = 0; i < count; i++) - get_subtable (i).closure (c, lookup_type); + if (c->stop_sublookup_iteration (get_subtable (i).process (c, lookup_type))) + return c->default_return_value; + return c->default_return_value; } template @@ -1449,14 +1306,6 @@ struct SubstLookup : Lookup } } - inline void collect_glyphs (hb_collect_glyphs_context_t *c) const - { - unsigned int lookup_type = get_type (); - unsigned int count = get_subtable_count (); - for (unsigned int i = 0; i < count; i++) - get_subtable (i).collect_glyphs (c, lookup_type); - } - inline bool would_apply (hb_would_apply_context_t *c, const hb_set_digest_t *digest) const { if (unlikely (!c->len)) return false; @@ -1532,11 +1381,9 @@ struct SubstLookup : Lookup return ret; } - private: inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c, unsigned int i) { return CastR > (subTable)[i].serialize (c, this); } - public: inline bool serialize_single (hb_serialize_context_t *c, uint32_t lookup_props, @@ -1634,9 +1481,25 @@ struct GSUB : GSUBGPOS static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer); static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer); - inline void closure_lookup (hb_closure_context_t *c, - unsigned int lookup_index) const - { return get_lookup (lookup_index).closure (c); } + static void_t closure_recurse_func (hb_closure_context_t *c, unsigned int lookup_index) + { + const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub); + const SubstLookup &l = gsub.get_lookup (lookup_index); + return l.process (c); + } + inline hb_closure_context_t::return_t closure_lookup (hb_face_t *face, + hb_set_t *glyphs, + unsigned int lookup_index) const + { + OT::hb_closure_context_t c (face, glyphs, closure_recurse_func); + return get_lookup (lookup_index).process (&c); + } + +#if 0 + inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c, + unsigned int lookup_index) const + { return get_lookup (lookup_index).process (c); } +#endif inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (); @@ -1672,14 +1535,10 @@ GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSE /* Out-of-class implementation for methods recursing */ -inline void ExtensionSubst::closure (hb_closure_context_t *c) const +template +inline typename context_t::return_t ExtensionSubst::process (context_t *c) const { - get_subtable ().closure (c, get_type ()); -} - -inline void ExtensionSubst::collect_glyphs (hb_collect_glyphs_context_t *c) const -{ - get_subtable ().collect_glyphs (c, get_type ()); + return get_subtable ().process (c, get_type ()); } inline const Coverage & ExtensionSubst::get_coverage (void) const @@ -1715,28 +1574,6 @@ inline bool ExtensionSubst::is_reverse (void) const return SubstLookup::lookup_type_is_reverse (type); } -static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookup_index) -{ - const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub); - const SubstLookup &l = gsub.get_lookup (lookup_index); - - if (unlikely (c->nesting_level_left == 0)) - return; - - c->nesting_level_left--; - l.closure (c); - c->nesting_level_left++; -} - -static inline void collect_glyphs_lookup (hb_collect_glyphs_context_t *c, unsigned int lookup_index) -{ - const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub); - const SubstLookup &l = gsub.get_lookup (lookup_index); - - /* XXX TODO */ - l.collect_glyphs (c); -} - static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index) { const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub); diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 42726811b..b214fbf02 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -37,6 +37,9 @@ namespace OT { +typedef struct {} void_t; /* To be used as return value when void is meant. */ + + #ifndef HB_DEBUG_CLOSURE #define HB_DEBUG_CLOSURE (HB_DEBUG+0) #endif @@ -44,20 +47,38 @@ namespace OT { #define TRACE_CLOSURE() \ hb_auto_trace_t trace (&c->debug_depth, "CLOSURE", this, HB_FUNC, ""); - struct hb_closure_context_t { + typedef void_t return_t; + typedef return_t (*recurse_func_t) (hb_closure_context_t *c, unsigned int lookup_index); + template + inline return_t process (const T &obj) { obj.closure (this); return void_t (); } + static const return_t default_return_value; + bool stop_sublookup_iteration (const return_t r) const { return false; } + return_t recurse (unsigned int lookup_index) + { + if (unlikely (nesting_level_left == 0)) + return default_return_value; + + nesting_level_left--; + recurse_func (this, lookup_index); + nesting_level_left++; + return default_return_value; + } + hb_face_t *face; hb_set_t *glyphs; + recurse_func_t recurse_func; unsigned int nesting_level_left; unsigned int debug_depth; - hb_closure_context_t (hb_face_t *face_, hb_set_t *glyphs_, + recurse_func_t recurse_func_, unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) : face (face_), glyphs (glyphs_), + recurse_func (recurse_func_), nesting_level_left (nesting_level_left_), debug_depth (0) {} }; @@ -123,6 +144,19 @@ struct hb_collect_glyphs_context_t after (glyphs_after ? *glyphs_after : *hb_set_get_empty ()), output (glyphs_output ? *glyphs_output : *hb_set_get_empty ()), debug_depth (0) {}; + + typedef void_t return_t; + template + inline return_t process (const T &obj) { obj.collect_glyphs (this); return void_t (); } + static const return_t default_return_value; + bool stop_iteration (const return_t r) const { return false; } + return_t recurse (unsigned int lookup_index) + { +#if 0 + /* XXX */ +#endif + return default_return_value; + } }; @@ -374,14 +408,11 @@ struct hb_apply_context_t typedef bool (*intersects_func_t) (hb_set_t *glyphs, const USHORT &value, const void *data); typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const USHORT &value, const void *data); -typedef void (*closure_lookup_func_t) (hb_closure_context_t *c, unsigned int lookup_index); -typedef void (*collect_glyphs_lookup_func_t) (hb_collect_glyphs_context_t *c, unsigned int lookup_index); typedef bool (*apply_lookup_func_t) (hb_apply_context_t *c, unsigned int lookup_index); struct ContextClosureFuncs { intersects_func_t intersects; - closure_lookup_func_t closure; }; struct ContextApplyFuncs { @@ -677,11 +708,10 @@ struct LookupRecord static inline void closure_lookup (hb_closure_context_t *c, unsigned int lookupCount, - const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */ - closure_lookup_func_t closure_func) + const LookupRecord lookupRecord[] /* Array of LookupRecords--in design order */) { for (unsigned int i = 0; i < lookupCount; i++) - closure_func (c, lookupRecord->lookupListIndex); + c->recurse (lookupRecord->lookupListIndex); } static inline bool apply_lookup (hb_apply_context_t *c, @@ -770,8 +800,7 @@ static inline void context_closure_lookup (hb_closure_context_t *c, inputCount ? inputCount - 1 : 0, input, lookup_context.funcs.intersects, lookup_context.intersects_data)) closure_lookup (c, - lookupCount, lookupRecord, - lookup_context.funcs.closure); + lookupCount, lookupRecord); } @@ -804,10 +833,6 @@ static inline bool context_apply_lookup (hb_apply_context_t *c, struct Rule { - friend struct RuleSet; - - private: - inline void closure (hb_closure_context_t *c, ContextClosureLookupContext &lookup_context) const { TRACE_CLOSURE (); @@ -905,18 +930,14 @@ struct RuleSet struct ContextFormat1 { - friend struct Context; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); const Coverage &cov = (this+coverage); struct ContextClosureLookupContext lookup_context = { - {intersects_glyph, closure_func}, + {intersects_glyph}, NULL }; @@ -940,6 +961,11 @@ struct ContextFormat1 return TRACE_RETURN (rule_set.would_apply (c, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + return this+coverage; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -975,11 +1001,7 @@ struct ContextFormat1 struct ContextFormat2 { - friend struct Context; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); if (!(this+coverage).intersects (c->glyphs)) @@ -988,7 +1010,7 @@ struct ContextFormat2 const ClassDef &class_def = this+classDef; struct ContextClosureLookupContext lookup_context = { - {intersects_class, closure_func}, + {intersects_class}, NULL }; @@ -1014,6 +1036,11 @@ struct ContextFormat2 return TRACE_RETURN (rule_set.would_apply (c, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + return this+coverage; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -1053,11 +1080,7 @@ struct ContextFormat2 struct ContextFormat3 { - friend struct Context; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); if (!(this+coverage[0]).intersects (c->glyphs)) @@ -1065,7 +1088,7 @@ struct ContextFormat3 const LookupRecord *lookupRecord = &StructAtOffset (coverage, coverage[0].static_size * glyphCount); struct ContextClosureLookupContext lookup_context = { - {intersects_coverage, closure_func}, + {intersects_coverage}, this }; context_closure_lookup (c, @@ -1086,6 +1109,11 @@ struct ContextFormat3 return TRACE_RETURN (context_would_apply_lookup (c, glyphCount, (const USHORT *) (coverage + 1), lookupCount, lookupRecord, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + return this+coverage[0]; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -1127,36 +1155,23 @@ struct ContextFormat3 struct Context { - protected: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + template + inline typename context_t::return_t process (context_t *c) const { - TRACE_CLOSURE (); switch (u.format) { - case 1: u.format1.closure (c, closure_func); break; - case 2: u.format2.closure (c, closure_func); break; - case 3: u.format3.closure (c, closure_func); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const - { - TRACE_CLOSURE (); - switch (u.format) { -// case 1: u.format1.collect_glyphs (c); break; -// case 2: u.format2.collect_glyphs (c); break; -// case 3: u.format2.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + case 2: return c->process (u.format2); + case 3: return c->process (u.format3); + default:return c->default_return_value; } } inline const Coverage &get_coverage (void) const { switch (u.format) { - case 1: return this + u.format1.coverage; - case 2: return this + u.format2.coverage; - case 3: return this + u.format3.coverage[0]; + case 1: return u.format1.get_coverage (); + case 2: return u.format2.get_coverage (); + case 3: return u.format3.get_coverage (); default:return Null(Coverage); } } @@ -1238,8 +1253,7 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c, lookaheadCount, lookahead, lookup_context.funcs.intersects, lookup_context.intersects_data[2])) closure_lookup (c, - lookupCount, lookupRecord, - lookup_context.funcs.closure); + lookupCount, lookupRecord); } static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c, @@ -1290,10 +1304,6 @@ static inline bool chain_context_apply_lookup (hb_apply_context_t *c, struct ChainRule { - friend struct ChainRuleSet; - - private: - inline void closure (hb_closure_context_t *c, ChainContextClosureLookupContext &lookup_context) const { TRACE_CLOSURE (); @@ -1334,7 +1344,6 @@ struct ChainRule lookup.array, lookup_context)); } - public: inline bool sanitize (hb_sanitize_context_t *c) { TRACE_SANITIZE (); if (!backtrack.sanitize (c)) return TRACE_RETURN (false); @@ -1411,17 +1420,13 @@ struct ChainRuleSet struct ChainContextFormat1 { - friend struct ChainContext; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); const Coverage &cov = (this+coverage); struct ChainContextClosureLookupContext lookup_context = { - {intersects_glyph, closure_func}, + {intersects_glyph}, {NULL, NULL, NULL} }; @@ -1445,6 +1450,11 @@ struct ChainContextFormat1 return TRACE_RETURN (rule_set.would_apply (c, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + return this+coverage; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -1478,11 +1488,7 @@ struct ChainContextFormat1 struct ChainContextFormat2 { - friend struct ChainContext; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); if (!(this+coverage).intersects (c->glyphs)) @@ -1493,7 +1499,7 @@ struct ChainContextFormat2 const ClassDef &lookahead_class_def = this+lookaheadClassDef; struct ChainContextClosureLookupContext lookup_context = { - {intersects_class, closure_func}, + {intersects_class}, {&backtrack_class_def, &input_class_def, &lookahead_class_def} @@ -1522,6 +1528,11 @@ struct ChainContextFormat2 return TRACE_RETURN (rule_set.would_apply (c, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + return this+coverage; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -1576,11 +1587,7 @@ struct ChainContextFormat2 struct ChainContextFormat3 { - friend struct ChainContext; - - private: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + inline void closure (hb_closure_context_t *c) const { TRACE_CLOSURE (); const OffsetArrayOf &input = StructAfter > (backtrack); @@ -1591,7 +1598,7 @@ struct ChainContextFormat3 const OffsetArrayOf &lookahead = StructAfter > (input); const ArrayOf &lookup = StructAfter > (lookahead); struct ChainContextClosureLookupContext lookup_context = { - {intersects_coverage, closure_func}, + {intersects_coverage}, {this, this, this} }; chain_context_closure_lookup (c, @@ -1602,12 +1609,6 @@ struct ChainContextFormat3 lookup_context); } - inline const Coverage &get_coverage (void) const - { - const OffsetArrayOf &input = StructAfter > (backtrack); - return this+input[0]; - } - inline bool would_apply (hb_would_apply_context_t *c) const { TRACE_WOULD_APPLY (); @@ -1626,6 +1627,12 @@ struct ChainContextFormat3 lookup.len, lookup.array, lookup_context)); } + inline const Coverage &get_coverage (void) const + { + const OffsetArrayOf &input = StructAfter > (backtrack); + return this+input[0]; + } + inline bool apply (hb_apply_context_t *c, apply_lookup_func_t apply_func) const { TRACE_APPLY (); @@ -1681,35 +1688,22 @@ struct ChainContextFormat3 struct ChainContext { - protected: - - inline void closure (hb_closure_context_t *c, closure_lookup_func_t closure_func) const + template + inline typename context_t::return_t process (context_t *c) const { - TRACE_CLOSURE (); switch (u.format) { - case 1: u.format1.closure (c, closure_func); break; - case 2: u.format2.closure (c, closure_func); break; - case 3: u.format3.closure (c, closure_func); break; - default: break; - } - } - - inline void collect_glyphs (hb_collect_glyphs_context_t *c, collect_glyphs_lookup_func_t closure_func) const - { - TRACE_CLOSURE (); - switch (u.format) { -// case 1: u.format1.collect_glyphs (c); break; -// case 2: u.format2.collect_glyphs (c); break; -// case 3: u.format2.collect_glyphs (c); break; - default: break; + case 1: return c->process (u.format1); + case 2: return c->process (u.format2); + case 3: return c->process (u.format3); + default:return c->default_return_value; } } inline const Coverage &get_coverage (void) const { switch (u.format) { - case 1: return this + u.format1.coverage; - case 2: return this + u.format2.coverage; + case 1: return u.format1.get_coverage (); + case 2: return u.format2.get_coverage (); case 3: return u.format3.get_coverage (); default:return Null(Coverage); } @@ -1759,9 +1753,6 @@ struct ChainContext struct ExtensionFormat1 { - friend struct Extension; - - protected: inline unsigned int get_type (void) const { return extensionLookupType; } inline unsigned int get_offset (void) const { return extensionOffset; } diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index 580f95ddd..91855846f 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -417,14 +417,13 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, switch (table_tag) { case HB_OT_TAG_GSUB: { - const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index); - l.collect_glyphs (&c); +// hb_ot_layout_from_face (face)->gsub->collect_glyphs_lookup (&c, lookup_index); return; } case HB_OT_TAG_GPOS: { - const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index); -// l.collect_glyphs (&c); +// hb_ot_layout_from_face (face)->gpos->collect_glyphs_lookup (&c, lookup_index); +// l.collect_glyphs_lookup (&c); return; } } @@ -499,8 +498,7 @@ 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); - _get_gsub (face).closure_lookup (&c, lookup_index); + _get_gsub (face).closure_lookup (face, glyphs, lookup_index); } /*