#ifndef OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH #define OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH #include "Common.hh" #include "SingleSubst.hh" #include "MultipleSubst.hh" #include "AlternateSubst.hh" #include "LigatureSubst.hh" #include "ContextSubst.hh" #include "ChainContextSubst.hh" #include "ExtensionSubst.hh" #include "ReverseChainSingleSubst.hh" namespace OT { namespace Layout { namespace GSUB { struct SubstLookupSubTable { friend struct ::OT::Lookup; friend struct SubstLookup; protected: union { SingleSubst single; MultipleSubst multiple; AlternateSubst alternate; LigatureSubst ligature; ContextSubst context; ChainContextSubst chainContext; ExtensionSubst extension; ReverseChainSingleSubst reverseChainContextSingle; } u; public: DEFINE_SIZE_MIN (0); enum Type { Single = 1, Multiple = 2, Alternate = 3, Ligature = 4, Context = 5, ChainContext = 6, Extension = 7, ReverseChainSingle = 8 }; template typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const { TRACE_DISPATCH (this, lookup_type); switch (lookup_type) { case Single: return_trace (u.single.dispatch (c, std::forward (ds)...)); case Multiple: return_trace (u.multiple.dispatch (c, std::forward (ds)...)); case Alternate: return_trace (u.alternate.dispatch (c, std::forward (ds)...)); case Ligature: return_trace (u.ligature.dispatch (c, std::forward (ds)...)); case Context: return_trace (u.context.dispatch (c, std::forward (ds)...)); case ChainContext: return_trace (u.chainContext.dispatch (c, std::forward (ds)...)); case Extension: return_trace (u.extension.dispatch (c, std::forward (ds)...)); case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, std::forward (ds)...)); default: return_trace (c->default_return_value ()); } } bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const { hb_intersects_context_t c (glyphs); return dispatch (&c, lookup_type); } }; } } } #endif /* HB_OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH */