tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

LigatureSubst.hh (2359B)


      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  struct { HBUINT16 v; }		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>
     24  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
     25  {
     26    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
     27    TRACE_DISPATCH (this, u.format.v);
     28    switch (u.format.v) {
     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. */
     40  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.v))) return_trace (false);
     49    unsigned int format = 1;
     50    u.format.v = format;
     51    switch (u.format.v) {
     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 */