1 #ifndef OT_LAYOUT_GSUB_LIGATURESUBST_HH 2 #define OT_LAYOUT_GSUB_LIGATURESUBST_HH 3 4 #include "Common.hh" 5 #include "LigatureSubstFormat1.hh" 6 7 namespace OT { 8 namespace Layout { 9 namespace GSUB_impl { 10 11 struct LigatureSubst 12 { 13 protected: 14 union { 15 HBUINT16 format; /* Format identifier */ 16 LigatureSubstFormat1_2<SmallTypes> format1; 17 #ifndef HB_NO_BEYOND_64K 18 LigatureSubstFormat1_2<MediumTypes> format2; 19 #endif 20 } u; 21 22 public: 23 template <typename context_t, typename ...Ts> dispatchOT::Layout::GSUB_impl::LigatureSubst24 typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const 25 { 26 if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value (); 27 TRACE_DISPATCH (this, u.format); 28 switch (u.format) { 29 case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); 30 #ifndef HB_NO_BEYOND_64K 31 case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); 32 #endif 33 default:return_trace (c->default_return_value ()); 34 } 35 } 36 37 /* TODO This function is only used by small GIDs, and not updated to 24bit GIDs. Should 38 * be done by using iterators. While at it perhaps using iterator of arrays of hb_codepoint_t 39 * instead. */ serializeOT::Layout::GSUB_impl::LigatureSubst40 bool serialize (hb_serialize_context_t *c, 41 hb_sorted_array_t<const HBGlyphID16> first_glyphs, 42 hb_array_t<const unsigned int> ligature_per_first_glyph_count_list, 43 hb_array_t<const HBGlyphID16> ligatures_list, 44 hb_array_t<const unsigned int> component_count_list, 45 hb_array_t<const HBGlyphID16> component_list /* Starting from second for each ligature */) 46 { 47 TRACE_SERIALIZE (this); 48 if (unlikely (!c->extend_min (u.format))) return_trace (false); 49 unsigned int format = 1; 50 u.format = format; 51 switch (u.format) { 52 case 1: return_trace (u.format1.serialize (c, 53 first_glyphs, 54 ligature_per_first_glyph_count_list, 55 ligatures_list, 56 component_count_list, 57 component_list)); 58 default:return_trace (false); 59 } 60 } 61 62 /* TODO subset() should choose format. */ 63 64 }; 65 66 67 } 68 } 69 } 70 71 #endif /* OT_LAYOUT_GSUB_LIGATURESUBST_HH */ 72