SinglePos.hh (2984B)
1 #ifndef OT_LAYOUT_GPOS_SINGLEPOS_HH 2 #define OT_LAYOUT_GPOS_SINGLEPOS_HH 3 4 #include "SinglePosFormat1.hh" 5 #include "SinglePosFormat2.hh" 6 7 namespace OT { 8 namespace Layout { 9 namespace GPOS_impl { 10 11 struct SinglePos 12 { 13 protected: 14 union { 15 struct { HBUINT16 v; } format; /* Format identifier */ 16 SinglePosFormat1 format1; 17 SinglePosFormat2 format2; 18 } u; 19 20 public: 21 template<typename Iterator, 22 hb_requires (hb_is_iterator (Iterator))> 23 unsigned get_format (Iterator glyph_val_iter_pairs) 24 { 25 hb_array_t<const Value> first_val_iter = hb_second (*glyph_val_iter_pairs); 26 27 for (const auto iter : glyph_val_iter_pairs) 28 for (const auto _ : hb_zip (iter.second, first_val_iter)) 29 if (_.first != _.second) 30 return 2; 31 32 return 1; 33 } 34 35 template<typename Iterator, 36 typename SrcLookup, 37 hb_requires (hb_is_iterator (Iterator))> 38 void serialize (hb_serialize_context_t *c, 39 const SrcLookup* src, 40 Iterator glyph_val_iter_pairs, 41 const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, 42 unsigned newFormat) 43 { 44 if (unlikely (!c->extend_min (u.format.v))) return; 45 unsigned format = 2; 46 ValueFormat new_format; 47 new_format = newFormat; 48 49 if (glyph_val_iter_pairs) 50 format = get_format (glyph_val_iter_pairs); 51 52 u.format.v = format; 53 switch (u.format.v) { 54 case 1: u.format1.serialize (c, 55 src, 56 glyph_val_iter_pairs, 57 new_format, 58 layout_variation_idx_delta_map); 59 return; 60 case 2: u.format2.serialize (c, 61 src, 62 glyph_val_iter_pairs, 63 new_format, 64 layout_variation_idx_delta_map); 65 return; 66 default:return; 67 } 68 } 69 70 template <typename context_t, typename ...Ts> 71 typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const 72 { 73 if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value (); 74 TRACE_DISPATCH (this, u.format.v); 75 switch (u.format.v) { 76 case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); 77 case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); 78 default:return_trace (c->default_return_value ()); 79 } 80 } 81 }; 82 83 84 template<typename Iterator, typename SrcLookup> 85 static void 86 SinglePos_serialize (hb_serialize_context_t *c, 87 const SrcLookup *src, 88 Iterator it, 89 const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map, 90 unsigned new_format) 91 { c->start_embed<SinglePos> ()->serialize (c, src, it, layout_variation_idx_delta_map, new_format); } 92 93 94 } 95 } 96 } 97 98 #endif /* OT_LAYOUT_GPOS_SINGLEPOS_HH */