1 #ifndef OT_LAYOUT_GPOS_POSLOOKUPSUBTABLE_HH 2 #define OT_LAYOUT_GPOS_POSLOOKUPSUBTABLE_HH 3 4 #include "SinglePos.hh" 5 #include "PairPos.hh" 6 #include "CursivePos.hh" 7 #include "MarkBasePos.hh" 8 #include "MarkLigPos.hh" 9 #include "MarkMarkPos.hh" 10 #include "ContextPos.hh" 11 #include "ChainContextPos.hh" 12 #include "ExtensionPos.hh" 13 14 namespace OT { 15 namespace Layout { 16 namespace GPOS_impl { 17 18 struct PosLookupSubTable 19 { 20 friend struct ::OT::Lookup; 21 friend struct PosLookup; 22 23 enum Type { 24 Single = 1, 25 Pair = 2, 26 Cursive = 3, 27 MarkBase = 4, 28 MarkLig = 5, 29 MarkMark = 6, 30 Context = 7, 31 ChainContext = 8, 32 Extension = 9 33 }; 34 35 template <typename context_t, typename ...Ts> dispatchOT::Layout::GPOS_impl::PosLookupSubTable36 typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const 37 { 38 TRACE_DISPATCH (this, lookup_type); 39 switch (lookup_type) { 40 case Single: return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...)); 41 case Pair: return_trace (u.pair.dispatch (c, std::forward<Ts> (ds)...)); 42 case Cursive: return_trace (u.cursive.dispatch (c, std::forward<Ts> (ds)...)); 43 case MarkBase: return_trace (u.markBase.dispatch (c, std::forward<Ts> (ds)...)); 44 case MarkLig: return_trace (u.markLig.dispatch (c, std::forward<Ts> (ds)...)); 45 case MarkMark: return_trace (u.markMark.dispatch (c, std::forward<Ts> (ds)...)); 46 case Context: return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...)); 47 case ChainContext: return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...)); 48 case Extension: return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...)); 49 default: return_trace (c->default_return_value ()); 50 } 51 } 52 intersectsOT::Layout::GPOS_impl::PosLookupSubTable53 bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const 54 { 55 hb_intersects_context_t c (glyphs); 56 return dispatch (&c, lookup_type); 57 } 58 59 protected: 60 union { 61 SinglePos single; 62 PairPos pair; 63 CursivePos cursive; 64 MarkBasePos markBase; 65 MarkLigPos markLig; 66 MarkMarkPos markMark; 67 ContextPos context; 68 ChainContextPos chainContext; 69 ExtensionPos extension; 70 } u; 71 public: 72 DEFINE_SIZE_MIN (0); 73 }; 74 75 } 76 } 77 } 78 79 #endif /* HB_OT_LAYOUT_GPOS_POSLOOKUPSUBTABLE_HH */ 80