1 | #ifndef OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH |
2 | #define OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH |
3 | |
4 | #include "Common.hh" |
5 | #include "SingleSubst.hh" |
6 | #include "MultipleSubst.hh" |
7 | #include "AlternateSubst.hh" |
8 | #include "LigatureSubst.hh" |
9 | #include "ContextSubst.hh" |
10 | #include "ChainContextSubst.hh" |
11 | #include "ExtensionSubst.hh" |
12 | #include "ReverseChainSingleSubst.hh" |
13 | |
14 | namespace OT { |
15 | namespace Layout { |
16 | namespace GSUB_impl { |
17 | |
18 | struct SubstLookupSubTable |
19 | { |
20 | friend struct ::OT::Lookup; |
21 | friend struct SubstLookup; |
22 | |
23 | protected: |
24 | union { |
25 | SingleSubst single; |
26 | MultipleSubst multiple; |
27 | AlternateSubst alternate; |
28 | LigatureSubst ligature; |
29 | ContextSubst context; |
30 | ChainContextSubst chainContext; |
31 | ExtensionSubst extension; |
32 | ReverseChainSingleSubst reverseChainContextSingle; |
33 | } u; |
34 | public: |
35 | DEFINE_SIZE_MIN (0); |
36 | |
37 | enum Type { |
38 | Single = 1, |
39 | Multiple = 2, |
40 | Alternate = 3, |
41 | Ligature = 4, |
42 | Context = 5, |
43 | ChainContext = 6, |
44 | Extension = 7, |
45 | ReverseChainSingle = 8 |
46 | }; |
47 | |
48 | template <typename context_t, typename ...Ts> |
49 | typename context_t::return_t dispatch (context_t *c, unsigned int lookup_type, Ts&&... ds) const |
50 | { |
51 | TRACE_DISPATCH (this, lookup_type); |
52 | switch (lookup_type) { |
53 | case Single: return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...)); |
54 | case Multiple: return_trace (u.multiple.dispatch (c, std::forward<Ts> (ds)...)); |
55 | case Alternate: return_trace (u.alternate.dispatch (c, std::forward<Ts> (ds)...)); |
56 | case Ligature: return_trace (u.ligature.dispatch (c, std::forward<Ts> (ds)...)); |
57 | case Context: return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...)); |
58 | case ChainContext: return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...)); |
59 | case Extension: return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...)); |
60 | case ReverseChainSingle: return_trace (u.reverseChainContextSingle.dispatch (c, std::forward<Ts> (ds)...)); |
61 | default: return_trace (c->default_return_value ()); |
62 | } |
63 | } |
64 | |
65 | bool intersects (const hb_set_t *glyphs, unsigned int lookup_type) const |
66 | { |
67 | hb_intersects_context_t c (glyphs); |
68 | return dispatch (&c, lookup_type); |
69 | } |
70 | }; |
71 | |
72 | |
73 | } |
74 | } |
75 | } |
76 | |
77 | #endif /* HB_OT_LAYOUT_GSUB_SUBSTLOOKUPSUBTABLE_HH */ |
78 | |