Coverage Report

Created: 2026-09-28 10:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/workdir/UnpackedTarball/harfbuzz/src/hb-ot-layout-common.hh
Line
Count
Source
1
/*
2
 * Copyright © 2007,2008,2009  Red Hat, Inc.
3
 * Copyright © 2010,2012  Google, Inc.
4
 *
5
 *  This is part of HarfBuzz, a text shaping library.
6
 *
7
 * Permission is hereby granted, without written agreement and without
8
 * license or royalty fees, to use, copy, modify, and distribute this
9
 * software and its documentation for any purpose, provided that the
10
 * above copyright notice and the following two paragraphs appear in
11
 * all copies of this software.
12
 *
13
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17
 * DAMAGE.
18
 *
19
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24
 *
25
 * Red Hat Author(s): Behdad Esfahbod
26
 * Google Author(s): Behdad Esfahbod
27
 */
28
29
#ifndef HB_OT_LAYOUT_COMMON_HH
30
#define HB_OT_LAYOUT_COMMON_HH
31
32
#include "hb.hh"
33
#include "hb-ot-layout.hh"
34
#include "hb-open-type.hh"
35
#include "hb-set.hh"
36
#include "hb-bimap.hh"
37
#include "hb-cache.hh"
38
39
#include "OT/Layout/Common/Coverage.hh"
40
#include "OT/Layout/types.hh"
41
42
// TODO(garretrieger): cleanup these after migration.
43
using OT::Layout::Common::Coverage;
44
using OT::Layout::Common::RangeRecord;
45
using OT::Layout::SmallTypes;
46
using OT::Layout::MediumTypes;
47
48
49
namespace OT {
50
51
template<typename Iterator>
52
static inline bool ClassDef_serialize (hb_serialize_context_t *c,
53
               Iterator it);
54
55
static bool ClassDef_remap_and_serialize (
56
    hb_serialize_context_t *c,
57
    const hb_set_t &klasses,
58
    bool use_class_zero,
59
    hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
60
    hb_map_t *klass_map /*IN/OUT*/);
61
62
struct hb_collect_feature_substitutes_with_var_context_t
63
{
64
  const hb_map_t *axes_index_tag_map;
65
  const hb_hashmap_t<hb_tag_t, Triple> *axes_location;
66
  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *record_cond_idx_map;
67
  hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
68
  hb_set_t& catch_all_record_feature_idxes;
69
70
  // not stored in subset_plan
71
  hb_set_t *feature_indices;
72
  bool apply;
73
  bool variation_applied;
74
  bool universal;
75
  unsigned cur_record_idx;
76
  hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> *conditionset_map;
77
};
78
79
struct hb_prune_langsys_context_t
80
{
81
  hb_prune_langsys_context_t (const void         *table_,
82
                              hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map_,
83
                              const hb_map_t     *duplicate_feature_map_,
84
                              hb_set_t           *new_collected_feature_indexes_)
85
0
      :table (table_),
86
0
      script_langsys_map (script_langsys_map_),
87
0
      duplicate_feature_map (duplicate_feature_map_),
88
0
      new_feature_indexes (new_collected_feature_indexes_),
89
0
      script_count (0),langsys_feature_count (0) {}
90
91
  bool visitScript ()
92
0
  { return script_count++ < HB_MAX_SCRIPTS; }
93
94
  bool visitLangsys (unsigned feature_count)
95
0
  {
96
0
    langsys_feature_count += feature_count;
97
0
    return langsys_feature_count < HB_MAX_LANGSYS_FEATURE_COUNT;
98
0
  }
99
100
  public:
101
  const void *table;
102
  hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map;
103
  const hb_map_t     *duplicate_feature_map;
104
  hb_set_t           *new_feature_indexes;
105
106
  private:
107
  unsigned script_count;
108
  unsigned langsys_feature_count;
109
};
110
111
struct hb_subset_layout_context_t :
112
  hb_dispatch_context_t<hb_subset_layout_context_t, hb_empty_t, HB_DEBUG_SUBSET>
113
{
114
0
  const char *get_name () { return "SUBSET_LAYOUT"; }
115
0
  static return_t default_return_value () { return hb_empty_t (); }
116
117
  bool visitScript ()
118
0
  {
119
0
    return script_count++ < HB_MAX_SCRIPTS;
120
0
  }
121
122
  bool visitLangSys ()
123
0
  {
124
0
    return langsys_count++ < HB_MAX_LANGSYS;
125
0
  }
126
127
  bool visitFeatureIndex (int count)
128
0
  {
129
0
    feature_index_count += count;
130
0
    return feature_index_count < HB_MAX_FEATURE_INDICES;
131
0
  }
132
133
  bool visitLookupIndex()
134
0
  {
135
0
    lookup_index_count++;
136
0
    return lookup_index_count < HB_MAX_LOOKUP_VISIT_COUNT;
137
0
  }
138
139
  hb_subset_context_t *subset_context;
140
  const hb_tag_t table_tag;
141
  const hb_map_t *lookup_index_map;
142
  const hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map;
143
  const hb_map_t *feature_index_map;
144
  const hb_map_t *feature_map_w_duplicates;
145
  const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
146
  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map;
147
  const hb_set_t *catch_all_record_feature_idxes;
148
  const hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>> *feature_idx_tag_map;
149
150
  unsigned cur_script_index;
151
  unsigned cur_feature_var_record_idx;
152
153
  hb_subset_layout_context_t (hb_subset_context_t *c_,
154
            hb_tag_t tag_) :
155
0
        subset_context (c_),
156
0
        table_tag (tag_),
157
0
        cur_script_index (0xFFFFu),
158
0
        cur_feature_var_record_idx (0u),
159
0
        script_count (0),
160
0
        langsys_count (0),
161
0
        feature_index_count (0),
162
0
        lookup_index_count (0)
163
0
  {
164
0
    if (tag_ == HB_OT_TAG_GSUB)
165
0
    {
166
0
      lookup_index_map = &c_->plan->gsub_lookups;
167
0
      script_langsys_map = &c_->plan->gsub_langsys;
168
0
      feature_index_map = &c_->plan->gsub_features;
169
0
      feature_map_w_duplicates = &c_->plan->gsub_features_w_duplicates;
170
0
      feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
171
0
      feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
172
0
      catch_all_record_feature_idxes = &c_->plan->gsub_old_features;
173
0
      feature_idx_tag_map = &c_->plan->gsub_old_feature_idx_tag_map;
174
0
    }
175
0
    else
176
0
    {
177
0
      lookup_index_map = &c_->plan->gpos_lookups;
178
0
      script_langsys_map = &c_->plan->gpos_langsys;
179
0
      feature_index_map = &c_->plan->gpos_features;
180
0
      feature_map_w_duplicates = &c_->plan->gpos_features_w_duplicates;
181
0
      feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
182
0
      feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
183
0
      catch_all_record_feature_idxes = &c_->plan->gpos_old_features;
184
0
      feature_idx_tag_map = &c_->plan->gpos_old_feature_idx_tag_map;
185
0
    }
186
0
  }
187
188
  private:
189
  unsigned script_count;
190
  unsigned langsys_count;
191
  unsigned feature_index_count;
192
  unsigned lookup_index_count;
193
};
194
195
struct ItemVariationStore;
196
struct hb_collect_variation_indices_context_t :
197
       hb_dispatch_context_t<hb_collect_variation_indices_context_t>
198
{
199
  template <typename T>
200
0
  return_t dispatch (const T &obj) { obj.collect_variation_indices (this); return hb_empty_t (); }
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::SinglePosFormat1>(OT::Layout::GPOS_impl::SinglePosFormat1 const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::SinglePosFormat2>(OT::Layout::GPOS_impl::SinglePosFormat2 const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::PairPosFormat1_3<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::PairPosFormat1_3<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::PairPosFormat2_4<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::PairPosFormat2_4<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::CursivePosFormat1>(OT::Layout::GPOS_impl::CursivePosFormat1 const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::MarkBasePosFormat1_2<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::MarkBasePosFormat1_2<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::MarkLigPosFormat1_2<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::MarkLigPosFormat1_2<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::MarkMarkPosFormat1_2<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::MarkMarkPosFormat1_2<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ContextFormat1_4<OT::Layout::SmallTypes> >(OT::ContextFormat1_4<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ContextFormat2_5<OT::Layout::SmallTypes> >(OT::ContextFormat2_5<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ContextFormat3>(OT::ContextFormat3 const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ChainContextFormat1_4<OT::Layout::SmallTypes> >(OT::ChainContextFormat1_4<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ChainContextFormat2_5<OT::Layout::SmallTypes> >(OT::ChainContextFormat2_5<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::ChainContextFormat3>(OT::ChainContextFormat3 const&)
201
0
  static return_t default_return_value () { return hb_empty_t (); }
202
203
  hb_set_t *layout_variation_indices;
204
  const hb_set_t *glyph_set;
205
  const hb_map_t *gpos_lookups;
206
207
  hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_,
208
            const hb_set_t *glyph_set_,
209
            const hb_map_t *gpos_lookups_) :
210
0
          layout_variation_indices (layout_variation_indices_),
211
0
          glyph_set (glyph_set_),
212
0
          gpos_lookups (gpos_lookups_) {}
213
};
214
215
template<typename OutputArray>
216
struct subset_offset_array_t
217
{
218
  subset_offset_array_t (hb_subset_context_t *subset_context_,
219
       OutputArray& out_,
220
0
       const void *base_) : subset_context (subset_context_),
221
0
                out (out_), base (base_) {}
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >::subset_offset_array_t(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*)
222
223
  template <typename T>
224
  bool operator () (T&& offset)
225
0
  {
226
0
    auto snap = subset_context->serializer->snapshot ();
227
0
    auto *o = out.serialize_append (subset_context->serializer);
228
0
    if (unlikely (!o)) return false;
229
0
    bool ret = o->serialize_subset (subset_context, offset, base);
230
0
    if (!ret)
231
0
    {
232
0
      out.pop ();
233
0
      subset_context->serializer->revert (snap);
234
0
    }
235
0
    return ret;
236
0
  }
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true> const&>(OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u>, void, true> const&)
237
238
  private:
239
  hb_subset_context_t *subset_context;
240
  OutputArray &out;
241
  const void *base;
242
};
243
244
245
template<typename OutputArray, typename Arg>
246
struct subset_offset_array_arg_t
247
{
248
  subset_offset_array_arg_t (hb_subset_context_t *subset_context_,
249
           OutputArray& out_,
250
           const void *base_,
251
0
           Arg &&arg_) : subset_context (subset_context_), out (out_),
252
0
            base (base_), arg (arg_) {}
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&)
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&)
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&)
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&)
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&)
Unexecuted instantiation: OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::subset_offset_array_arg_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&)
253
254
  template <typename T>
255
  bool operator () (T&& offset)
256
0
  {
257
0
    auto snap = subset_context->serializer->snapshot ();
258
0
    auto *o = out.serialize_append (subset_context->serializer);
259
0
    if (unlikely (!o)) return false;
260
0
    bool ret = o->serialize_subset (subset_context, offset, base, arg);
261
0
    if (!ret)
262
0
    {
263
0
      out.pop ();
264
0
      subset_context->serializer->revert (snap);
265
0
    }
266
0
    return ret;
267
0
  }
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::operator()<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>::operator()<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>::operator()<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
Unexecuted instantiation: bool OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>::operator()<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&>(OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true> const&)
268
269
  private:
270
  hb_subset_context_t *subset_context;
271
  OutputArray &out;
272
  const void *base;
273
  Arg &&arg;
274
};
275
276
/*
277
 * Helper to subset an array of offsets. Subsets the thing pointed to by each offset
278
 * and discards the offset in the array if the subset operation results in an empty
279
 * thing.
280
 */
281
struct
282
{
283
  template<typename OutputArray>
284
  subset_offset_array_t<OutputArray>
285
  operator () (hb_subset_context_t *subset_context, OutputArray& out,
286
         const void *base) const
287
0
  { return subset_offset_array_t<OutputArray> (subset_context, out, base); }
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-font.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-style.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_45::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_45::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_45::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_45::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Sequence<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::AlternateSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_t<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::AttachPoint, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::CaretValue, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::LigGlyph, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 4u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*) const
288
289
  /* Variant with one extra argument passed to serialize_subset */
290
  template<typename OutputArray, typename Arg>
291
  subset_offset_array_arg_t<OutputArray, Arg>
292
  operator () (hb_subset_context_t *subset_context, OutputArray& out,
293
         const void *base, Arg &&arg) const
294
0
  { return subset_offset_array_arg_t<OutputArray, Arg> (subset_context, out, base, arg); }
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::Ligature<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::LigatureSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::RuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, hb_map_t const*&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::ChainRuleSet<OT::Layout::SmallTypes>, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, hb_map_t const*&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_offset_array_arg_t<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&> OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >, unsigned int&>(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >&, void const*, unsigned int&) const
295
}
296
HB_FUNCOBJ (subset_offset_array);
297
298
template<typename OutputArray>
299
struct subset_record_array_t
300
{
301
  subset_record_array_t (hb_subset_layout_context_t *c_, OutputArray* out_,
302
0
       const void *base_) : subset_layout_context (c_),
303
0
                out (out_), base (base_) {}
Unexecuted instantiation: OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> >::subset_record_array_t(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*)
Unexecuted instantiation: OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >::subset_record_array_t(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*)
Unexecuted instantiation: OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >::subset_record_array_t(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*)
304
305
  template <typename T>
306
  void
307
  operator () (T&& record)
308
0
  {
309
0
    auto snap = subset_layout_context->subset_context->serializer->snapshot ();
310
0
    bool ret = record.subset (subset_layout_context, base);
311
0
    if (!ret) subset_layout_context->subset_context->serializer->revert (snap);
312
0
    else out->len++;
313
0
  }
Unexecuted instantiation: void OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> >::operator()<OT::Record<OT::LangSys> const&>(OT::Record<OT::LangSys> const&)
Unexecuted instantiation: void OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::FeatureTableSubstitutionRecord const&>(OT::FeatureTableSubstitutionRecord const&)
Unexecuted instantiation: void OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >::operator()<OT::FeatureVariationRecord const&>(OT::FeatureVariationRecord const&)
314
315
  private:
316
  hb_subset_layout_context_t *subset_layout_context;
317
  OutputArray *out;
318
  const void *base;
319
};
320
321
template<typename OutputArray, typename Arg>
322
struct subset_record_array_arg_t
323
{
324
  subset_record_array_arg_t (hb_subset_layout_context_t *c_, OutputArray* out_,
325
           const void *base_,
326
0
           Arg &&arg_) : subset_layout_context (c_),
327
0
             out (out_), base (base_), arg (arg_) {}
Unexecuted instantiation: OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&>::subset_record_array_arg_t(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&)
Unexecuted instantiation: OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>::subset_record_array_arg_t(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&)
328
329
  template <typename T>
330
  void
331
  operator () (T&& record)
332
0
  {
333
0
    auto snap = subset_layout_context->subset_context->serializer->snapshot ();
334
0
    bool ret = record.subset (subset_layout_context, base, arg);
335
0
    if (!ret) subset_layout_context->subset_context->serializer->revert (snap);
336
0
    else out->len++;
337
0
  }
Unexecuted instantiation: void OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&>::operator()<OT::Record<OT::Feature> const&>(OT::Record<OT::Feature> const&)
Unexecuted instantiation: void OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>::operator()<OT::FeatureVariationRecord const&>(OT::FeatureVariationRecord const&)
338
339
  private:
340
  hb_subset_layout_context_t *subset_layout_context;
341
  OutputArray *out;
342
  const void *base;
343
  Arg &&arg;
344
};
345
346
/*
347
 * Helper to subset a RecordList/record array. Subsets each Record in the array and
348
 * discards the record if the subset operation returns false.
349
 */
350
struct
351
{
352
  template<typename OutputArray>
353
  subset_record_array_t<OutputArray>
354
  operator () (hb_subset_layout_context_t *c, OutputArray* out,
355
         const void *base) const
356
0
  { return subset_record_array_t<OutputArray> (c, out, base); }
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-face.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_39::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-font.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_36::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_36::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_36::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: VARC.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-static.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-style.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-style.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-style.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_43::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_43::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_43::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_39::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_38::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_39::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_37::operator()<OT::RecordArrayOf<OT::LangSys> >(OT::hb_subset_layout_context_t*, OT::RecordArrayOf<OT::LangSys>*, void const*) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureTableSubstitutionRecord, OT::NumType<true, unsigned short, 2u> >*, void const*) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
357
358
  /* Variant with one extra argument passed to subset */
359
  template<typename OutputArray, typename Arg>
360
  subset_record_array_arg_t<OutputArray, Arg>
361
  operator () (hb_subset_layout_context_t *c, OutputArray* out,
362
               const void *base, Arg &&arg) const
363
0
  { return subset_record_array_arg_t<OutputArray, Arg> (c, out, base, arg); }
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-aat-layout.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-aat-map.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-face.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_39::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-face.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-font.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-font.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_36::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-color.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_36::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-face.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-fetch.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-font.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: VARC.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: VARC.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-layout.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-math.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-metrics.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-shape.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-var.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-static.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-static.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-style.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-style.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_43::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_43::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_39::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-plan.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-plan-var.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-table-var.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-table-cff.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-table-color.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_38::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-table-other.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_38::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: gsubgpos-context.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-cff1.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_39::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-cff2.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_39::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_37::operator()<OT::RecordListOfFeature, OT::Feature const*&>(OT::hb_subset_layout_context_t*, OT::RecordListOfFeature*, void const*, OT::Feature const*&) const
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_arg_t<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&> OT::$_37::operator()<OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >, bool&>(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::FeatureVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*, bool&) const
364
}
365
HB_FUNCOBJ (subset_record_array);
366
367
368
template<typename OutputArray>
369
struct serialize_math_record_array_t
370
{
371
  serialize_math_record_array_t (hb_serialize_context_t *serialize_context_,
372
                         OutputArray& out_,
373
0
                         const void *base_) : serialize_context (serialize_context_),
374
0
                                              out (out_), base (base_) {}
Unexecuted instantiation: OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > >::serialize_math_record_array_t(hb_serialize_context_t*, OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> >&, void const*)
Unexecuted instantiation: OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > >::serialize_math_record_array_t(hb_serialize_context_t*, OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> >&, void const*)
375
376
  template <typename T>
377
  bool operator () (T&& record)
378
0
  {
379
0
    if (!serialize_context->copy (record, base)) return false;
380
0
    out.len++;
381
0
    return true;
382
0
  }
Unexecuted instantiation: bool OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::MathValueRecord const&>(OT::MathValueRecord const&)
Unexecuted instantiation: bool OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > >::operator()<OT::MathKernInfoRecord const&>(OT::MathKernInfoRecord const&)
383
384
  private:
385
  hb_serialize_context_t *serialize_context;
386
  OutputArray &out;
387
  const void *base;
388
};
389
390
/*
391
 * Helper to serialize an array of MATH records.
392
 */
393
struct
394
{
395
  template<typename OutputArray>
396
  serialize_math_record_array_t<OutputArray>
397
  operator () (hb_serialize_context_t *serialize_context, OutputArray& out,
398
               const void *base) const
399
0
  { return serialize_math_record_array_t<OutputArray> (serialize_context, out, base); }
Unexecuted instantiation: hb-ot-math.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-ot-math.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_41::operator()<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_43::operator()<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-plan.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_43::operator()<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_43::operator()<OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathValueRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
Unexecuted instantiation: hb-subset-table-layout.cc:OT::serialize_math_record_array_t<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > > OT::$_43::operator()<OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> > >(hb_serialize_context_t*, OT::ArrayOf<OT::MathKernInfoRecord, OT::NumType<true, unsigned short, 2u> >&, void const*) const
400
401
}
402
HB_FUNCOBJ (serialize_math_record_array);
403
404
/*
405
 *
406
 * OpenType Layout Common Table Formats
407
 *
408
 */
409
410
411
/*
412
 * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
413
 */
414
415
struct IndexArray : Array16Of<Index>
416
{
417
  bool intersects (const hb_map_t *indexes) const
418
0
  { return hb_any (*this, indexes); }
419
420
  template <typename Iterator,
421
      hb_requires (hb_is_iterator (Iterator))>
422
  void serialize (hb_serialize_context_t *c,
423
      hb_subset_layout_context_t *l,
424
      Iterator it)
425
0
  {
426
0
    if (!it) return;
427
0
    if (unlikely (!c->extend_min ((*this)))) return;
428
429
0
    for (const auto _ : it)
430
0
    {
431
0
      if (!l->visitLookupIndex()) break;
432
433
0
      Index i;
434
0
      i = _;
435
0
      c->copy (i);
436
0
      this->len++;
437
0
    }
438
0
  }
Unexecuted instantiation: hb-aat-layout.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-aat-map.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-face.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-font.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-color.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-face.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-fetch.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-font.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: VARC.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-layout.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-math.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-metrics.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-shape.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-var.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-static.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-style.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-cff1-table.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-cff2-table.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-shaper-arabic.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-ot-shape-fallback.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-plan-layout.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-cff1.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-cff2.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
Unexecuted instantiation: hb-subset-cff-common.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tI10hb_array_tIKNS_5IndexEERPK8hb_map_tRK3$_6LPv0EESB_L24hb_function_sortedness_t0ELSF_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSK_6item_tEEE5valueEvE4typeELSF_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESK_
439
440
  unsigned int get_indexes (unsigned int start_offset,
441
          unsigned int *_count /* IN/OUT */,
442
          unsigned int *_indexes /* OUT */) const
443
38.4k
  {
444
38.4k
    if (_count && _indexes)
445
28.1k
    {
446
28.1k
      + this->as_array ().sub_array (start_offset, _count)
447
28.1k
      | hb_sink (hb_array (_indexes, *_count))
448
28.1k
      ;
449
28.1k
    }
450
38.4k
    return this->len;
451
38.4k
  }
452
453
  void add_indexes_to (hb_set_t* output /* OUT */) const
454
0
  {
455
0
    output->add_array (as_array ());
456
0
  }
457
};
458
459
460
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
461
struct FeatureParamsSize
462
{
463
  bool sanitize (hb_sanitize_context_t *c) const
464
0
  {
465
0
    TRACE_SANITIZE (this);
466
0
    if (unlikely (!c->check_struct (this))) return_trace (false);
467
0
    hb_barrier ();
468
469
    /* This subtable has some "history", if you will.  Some earlier versions of
470
     * Adobe tools calculated the offset of the FeatureParams subtable from the
471
     * beginning of the FeatureList table!  Now, that is dealt with in the
472
     * Feature implementation.  But we still need to be able to tell junk from
473
     * real data.  Note: We don't check that the nameID actually exists.
474
     *
475
     * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk :
476
     *
477
     * Yes, it is correct that a new version of the AFDKO (version 2.0) will be
478
     * coming out soon, and that the makeotf program will build a font with a
479
     * 'size' feature that is correct by the specification.
480
     *
481
     * The specification for this feature tag is in the "OpenType Layout Tag
482
     * Registry". You can see a copy of this at:
483
     * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size
484
     *
485
     * Here is one set of rules to determine if the 'size' feature is built
486
     * correctly, or as by the older versions of MakeOTF. You may be able to do
487
     * better.
488
     *
489
     * Assume that the offset to the size feature is according to specification,
490
     * and make the following value checks. If it fails, assume the size
491
     * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
492
     * If this fails, reject the 'size' feature. The older makeOTF's calculated the
493
     * offset from the beginning of the FeatureList table, rather than from the
494
     * beginning of the 'size' Feature table.
495
     *
496
     * If "design size" == 0:
497
     *     fails check
498
     *
499
     * Else if ("subfamily identifier" == 0 and
500
     *     "range start" == 0 and
501
     *     "range end" == 0 and
502
     *     "range start" == 0 and
503
     *     "menu name ID" == 0)
504
     *     passes check: this is the format used when there is a design size
505
     * specified, but there is no recommended size range.
506
     *
507
     * Else if ("design size" <  "range start" or
508
     *     "design size" >   "range end" or
509
     *     "range end" <= "range start" or
510
     *     "menu name ID"  < 256 or
511
     *     "menu name ID"  > 32767 or
512
     *     menu name ID is not a name ID which is actually in the name table)
513
     *     fails test
514
     * Else
515
     *     passes test.
516
     */
517
518
0
    if (!designSize)
519
0
      return_trace (false);
520
0
    else if (subfamilyID == 0 &&
521
0
       subfamilyNameID == 0 &&
522
0
       rangeStart == 0 &&
523
0
       rangeEnd == 0)
524
0
      return_trace (true);
525
0
    else if (designSize < rangeStart ||
526
0
       designSize > rangeEnd ||
527
0
       subfamilyNameID < 256 ||
528
0
       subfamilyNameID > 32767)
529
0
      return_trace (false);
530
0
    else
531
0
      return_trace (true);
532
0
  }
533
534
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
535
0
  { nameids_to_retain->add (subfamilyNameID); }
536
537
  bool subset (hb_subset_context_t *c) const
538
0
  {
539
0
    TRACE_SUBSET (this);
540
0
    return_trace ((bool) c->serializer->embed (*this));
541
0
  }
542
543
  HBUINT16  designSize; /* Represents the design size in 720/inch
544
         * units (decipoints).  The design size entry
545
         * must be non-zero.  When there is a design
546
         * size but no recommended size range, the
547
         * rest of the array will consist of zeros. */
548
  HBUINT16  subfamilyID;  /* Has no independent meaning, but serves
549
         * as an identifier that associates fonts
550
         * in a subfamily. All fonts which share a
551
         * Preferred or Font Family name and which
552
         * differ only by size range shall have the
553
         * same subfamily value, and no fonts which
554
         * differ in weight or style shall have the
555
         * same subfamily value. If this value is
556
         * zero, the remaining fields in the array
557
         * will be ignored. */
558
  NameID  subfamilyNameID;/* If the preceding value is non-zero, this
559
         * value must be set in the range 256 - 32767
560
         * (inclusive). It records the value of a
561
         * field in the name table, which must
562
         * contain English-language strings encoded
563
         * in Windows Unicode and Macintosh Roman,
564
         * and may contain additional strings
565
         * localized to other scripts and languages.
566
         * Each of these strings is the name an
567
         * application should use, in combination
568
         * with the family name, to represent the
569
         * subfamily in a menu.  Applications will
570
         * choose the appropriate version based on
571
         * their selection criteria. */
572
  HBUINT16  rangeStart; /* Large end of the recommended usage range
573
         * (inclusive), stored in 720/inch units
574
         * (decipoints). */
575
  HBUINT16  rangeEnd; /* Small end of the recommended usage range
576
           (exclusive), stored in 720/inch units
577
         * (decipoints). */
578
  public:
579
  DEFINE_SIZE_STATIC (10);
580
};
581
582
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#ssxx */
583
struct FeatureParamsStylisticSet
584
{
585
  bool sanitize (hb_sanitize_context_t *c) const
586
0
  {
587
0
    TRACE_SANITIZE (this);
588
    /* Right now minorVersion is at zero.  Which means, any table supports
589
     * the uiNameID field. */
590
0
    return_trace (c->check_struct (this));
591
0
  }
592
593
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
594
0
  { nameids_to_retain->add (uiNameID); }
595
596
  bool subset (hb_subset_context_t *c) const
597
0
  {
598
0
    TRACE_SUBSET (this);
599
0
    return_trace ((bool) c->serializer->embed (*this));
600
0
  }
601
602
  HBUINT16  version;  /* (set to 0): This corresponds to a “minor”
603
         * version number. Additional data may be
604
         * added to the end of this Feature Parameters
605
         * table in the future. */
606
607
  NameID  uiNameID; /* The 'name' table name ID that specifies a
608
         * string (or strings, for multiple languages)
609
         * for a user-interface label for this
610
         * feature.  The values of uiLabelNameId and
611
         * sampleTextNameId are expected to be in the
612
         * font-specific name ID range (256-32767),
613
         * though that is not a requirement in this
614
         * Feature Parameters specification. The
615
         * user-interface label for the feature can
616
         * be provided in multiple languages. An
617
         * English string should be included as a
618
         * fallback. The string should be kept to a
619
         * minimal length to fit comfortably with
620
         * different application interfaces. */
621
  public:
622
  DEFINE_SIZE_STATIC (4);
623
};
624
625
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */
626
struct FeatureParamsCharacterVariants
627
{
628
  unsigned
629
  get_characters (unsigned start_offset, unsigned *char_count, hb_codepoint_t *chars) const
630
0
  {
631
0
    if (char_count && chars)
632
0
    {
633
0
      + characters.as_array ().sub_array (start_offset, char_count)
634
0
      | hb_sink (hb_array (chars, *char_count))
635
0
      ;
636
0
    }
637
0
    return characters.len;
638
0
  }
639
640
  size_t get_size () const
641
0
  { return hb_unsigned_mul_add_saturate (characters.len, HBUINT24::static_size, min_size); }
642
643
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
644
0
  {
645
0
    if (featUILableNameID) nameids_to_retain->add (featUILableNameID);
646
0
    if (featUITooltipTextNameID) nameids_to_retain->add (featUITooltipTextNameID);
647
0
    if (sampleTextNameID) nameids_to_retain->add (sampleTextNameID);
648
649
0
    if (!firstParamUILabelNameID || !numNamedParameters || numNamedParameters >= 0x7FFF)
650
0
      return;
651
652
0
    unsigned last_name_id = (unsigned) firstParamUILabelNameID + (unsigned) numNamedParameters - 1;
653
0
    nameids_to_retain->add_range (firstParamUILabelNameID, last_name_id);
654
0
  }
655
656
  bool subset (hb_subset_context_t *c) const
657
0
  {
658
0
    TRACE_SUBSET (this);
659
0
    return_trace ((bool) c->serializer->embed (*this));
660
0
  }
661
662
  bool sanitize (hb_sanitize_context_t *c) const
663
0
  {
664
0
    TRACE_SANITIZE (this);
665
0
    return_trace (c->check_struct (this) &&
666
0
      characters.sanitize (c));
667
0
  }
668
669
  HBUINT16  format;     /* Format number is set to 0. */
670
  NameID  featUILableNameID;  /* The ‘name’ table name ID that
671
           * specifies a string (or strings,
672
           * for multiple languages) for a
673
           * user-interface label for this
674
           * feature. (May be NULL.) */
675
  NameID  featUITooltipTextNameID;/* The ‘name’ table name ID that
676
           * specifies a string (or strings,
677
           * for multiple languages) that an
678
           * application can use for tooltip
679
           * text for this feature. (May be
680
           * nullptr.) */
681
  NameID  sampleTextNameID; /* The ‘name’ table name ID that
682
           * specifies sample text that
683
           * illustrates the effect of this
684
           * feature. (May be NULL.) */
685
  HBUINT16  numNamedParameters; /* Number of named parameters. (May
686
           * be zero.) */
687
  NameID  firstParamUILabelNameID;/* The first ‘name’ table name ID
688
           * used to specify strings for
689
           * user-interface labels for the
690
           * feature parameters. (Must be zero
691
           * if numParameters is zero.) */
692
  Array16Of<HBUINT24>
693
    characters;   /* Array of the Unicode Scalar Value
694
           * of the characters for which this
695
           * feature provides glyph variants.
696
           * (May be zero.) */
697
  public:
698
  DEFINE_SIZE_ARRAY (14, characters);
699
};
700
701
struct FeatureParams
702
{
703
  bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
704
0
  {
705
#ifdef HB_NO_LAYOUT_FEATURE_PARAMS
706
    return true;
707
#endif
708
0
    TRACE_SANITIZE (this);
709
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
710
0
      return_trace (u.size.sanitize (c));
711
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
712
0
      return_trace (u.stylisticSet.sanitize (c));
713
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
714
0
      return_trace (u.characterVariants.sanitize (c));
715
0
    return_trace (true);
716
0
  }
717
718
  void collect_name_ids (hb_tag_t tag, hb_set_t *nameids_to_retain /* OUT */) const
719
0
  {
720
#ifdef HB_NO_LAYOUT_FEATURE_PARAMS
721
    return;
722
#endif
723
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
724
0
      return (u.size.collect_name_ids (nameids_to_retain));
725
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
726
0
      return (u.stylisticSet.collect_name_ids (nameids_to_retain));
727
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
728
0
      return (u.characterVariants.collect_name_ids (nameids_to_retain));
729
0
  }
730
731
  bool subset (hb_subset_context_t *c, const Tag* tag) const
732
0
  {
733
0
    TRACE_SUBSET (this);
734
0
    if (!tag) return_trace (false);
735
0
    if (*tag == HB_TAG ('s','i','z','e') && hb_barrier ())
736
0
      return_trace (u.size.subset (c));
737
0
    if ((*tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
738
0
      return_trace (u.stylisticSet.subset (c));
739
0
    if ((*tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
740
0
      return_trace (u.characterVariants.subset (c));
741
0
    return_trace (false);
742
0
  }
743
744
#ifndef HB_NO_LAYOUT_FEATURE_PARAMS
745
  const FeatureParamsSize& get_size_params (hb_tag_t tag) const
746
0
  {
747
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
748
0
      return u.size;
749
0
    return Null (FeatureParamsSize);
750
0
  }
751
  const FeatureParamsStylisticSet& get_stylistic_set_params (hb_tag_t tag) const
752
0
  {
753
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
754
0
      return u.stylisticSet;
755
0
    return Null (FeatureParamsStylisticSet);
756
0
  }
757
  const FeatureParamsCharacterVariants& get_character_variants_params (hb_tag_t tag) const
758
0
  {
759
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
760
0
      return u.characterVariants;
761
0
    return Null (FeatureParamsCharacterVariants);
762
0
  }
763
#endif
764
765
  private:
766
  union {
767
  FeatureParamsSize     size;
768
  FeatureParamsStylisticSet   stylisticSet;
769
  FeatureParamsCharacterVariants  characterVariants;
770
  } u;
771
  public:
772
  DEFINE_SIZE_MIN (0);
773
};
774
775
struct Record_sanitize_closure_t {
776
  hb_tag_t tag;
777
  const void *list_base;
778
};
779
780
struct Feature
781
{
782
  unsigned int get_lookup_count () const
783
0
  { return lookupIndex.len; }
784
  hb_tag_t get_lookup_index (unsigned int i) const
785
0
  { return lookupIndex[i]; }
786
  unsigned int get_lookup_indexes (unsigned int start_index,
787
           unsigned int *lookup_count /* IN/OUT */,
788
           unsigned int *lookup_tags /* OUT */) const
789
14.0k
  { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
790
  void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
791
0
  { lookupIndex.add_indexes_to (lookup_indexes); }
792
793
  const FeatureParams &get_feature_params () const
794
0
  { return this+featureParams; }
795
796
  bool intersects_lookup_indexes (const hb_map_t *lookup_indexes) const
797
0
  { return lookupIndex.intersects (lookup_indexes); }
798
799
  void collect_name_ids (hb_tag_t tag, hb_set_t *nameids_to_retain /* OUT */) const
800
0
  {
801
0
    if (featureParams)
802
0
      get_feature_params ().collect_name_ids (tag, nameids_to_retain);
803
0
  }
804
805
  bool subset (hb_subset_context_t         *c,
806
         hb_subset_layout_context_t  *l,
807
         const Tag                   *tag = nullptr) const
808
0
  {
809
0
    TRACE_SUBSET (this);
810
0
    auto *out = c->serializer->start_embed (*this);
811
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
812
813
0
    out->featureParams.serialize_subset (c, featureParams, this, tag);
814
815
0
    auto it =
816
0
    + hb_iter (lookupIndex)
817
0
    | hb_filter (l->lookup_index_map)
818
0
    | hb_map (l->lookup_index_map)
819
0
    ;
820
821
0
    out->lookupIndex.serialize (c->serializer, l, it);
822
    // The decision to keep or drop this feature is already made before we get here
823
    // so always retain it.
824
0
    return_trace (true);
825
0
  }
826
827
  bool sanitize (hb_sanitize_context_t *c,
828
     const Record_sanitize_closure_t *closure = nullptr) const
829
541
  {
830
541
    TRACE_SANITIZE (this);
831
541
    return_trace (c->check_struct (this) &&
832
541
      featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE) &&
833
541
      lookupIndex.sanitize (c));
834
541
  }
835
836
  Offset16To<FeatureParams>
837
     featureParams; /* Offset to Feature Parameters table (if one
838
         * has been defined for the feature), relative
839
         * to the beginning of the Feature Table; = Null
840
         * if not required */
841
  IndexArray   lookupIndex; /* Array of LookupList indices */
842
  public:
843
  DEFINE_SIZE_ARRAY_SIZED (4, lookupIndex);
844
};
845
846
template <typename Type>
847
struct Record
848
{
849
60.0k
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
OT::Record<OT::LangSys>::cmp(unsigned int) const
Line
Count
Source
849
636
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
OT::Record<OT::Script>::cmp(unsigned int) const
Line
Count
Source
849
59.4k
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
Unexecuted instantiation: OT::Record<OT::Feature>::cmp(unsigned int) const
Unexecuted instantiation: OT::Record<OT::JstfLangSys>::cmp(unsigned int) const
Unexecuted instantiation: OT::Record<OT::JstfScript>::cmp(unsigned int) const
850
851
  bool subset (hb_subset_layout_context_t *c, const void *base, const void *f_sub = nullptr) const
852
0
  {
853
0
    TRACE_SUBSET (this);
854
0
    auto *out = c->subset_context->serializer->embed (this);
855
0
    if (unlikely (!out)) return_trace (false);
856
857
0
    if (!f_sub)
858
0
      return_trace (out->offset.serialize_subset (c->subset_context, offset, base, c, &tag));
859
860
0
    const Feature& f = *reinterpret_cast<const Feature *> (f_sub);
861
0
    auto *s = c->subset_context->serializer;
862
0
    s->push ();
863
864
0
    out->offset = 0;
865
0
    bool ret = f.subset (c->subset_context, c, &tag);
866
0
    if (ret)
867
0
      s->add_link (out->offset, s->pop_pack ());
868
0
    else
869
0
      s->pop_discard ();
870
871
0
    return_trace (ret);
872
0
  }
Unexecuted instantiation: OT::Record<OT::Feature>::subset(OT::hb_subset_layout_context_t*, void const*, void const*) const
Unexecuted instantiation: OT::Record<OT::LangSys>::subset(OT::hb_subset_layout_context_t*, void const*, void const*) const
Unexecuted instantiation: OT::Record<OT::Script>::subset(OT::hb_subset_layout_context_t*, void const*, void const*) const
873
874
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
875
1.35k
  {
876
1.35k
    TRACE_SANITIZE (this);
877
1.35k
    const Record_sanitize_closure_t closure = {tag, base};
878
1.35k
    return_trace (c->check_struct (this) &&
879
1.35k
      offset.sanitize (c, base, &closure));
880
1.35k
  }
OT::Record<OT::Script>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
875
672
  {
876
672
    TRACE_SANITIZE (this);
877
672
    const Record_sanitize_closure_t closure = {tag, base};
878
672
    return_trace (c->check_struct (this) &&
879
672
      offset.sanitize (c, base, &closure));
880
672
  }
OT::Record<OT::LangSys>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
875
144
  {
876
144
    TRACE_SANITIZE (this);
877
144
    const Record_sanitize_closure_t closure = {tag, base};
878
144
    return_trace (c->check_struct (this) &&
879
144
      offset.sanitize (c, base, &closure));
880
144
  }
OT::Record<OT::Feature>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
875
541
  {
876
541
    TRACE_SANITIZE (this);
877
541
    const Record_sanitize_closure_t closure = {tag, base};
878
541
    return_trace (c->check_struct (this) &&
879
541
      offset.sanitize (c, base, &closure));
880
541
  }
Unexecuted instantiation: OT::Record<OT::JstfLangSys>::sanitize(hb_sanitize_context_t*, void const*) const
Unexecuted instantiation: OT::Record<OT::JstfScript>::sanitize(hb_sanitize_context_t*, void const*) const
881
882
  Tag           tag;            /* 4-byte Tag identifier */
883
  Offset16To<Type>
884
                offset;         /* Offset from beginning of object holding
885
                                 * the Record */
886
  public:
887
  DEFINE_SIZE_STATIC (6);
888
};
889
890
template <typename Type>
891
struct RecordArrayOf : SortedArray16Of<Record<Type>>
892
{
893
  const Offset16To<Type>& get_offset (unsigned int i) const
894
45.6k
  { return (*this)[i].offset; }
OT::RecordArrayOf<OT::Script>::get_offset(unsigned int) const
Line
Count
Source
894
31.5k
  { return (*this)[i].offset; }
OT::RecordArrayOf<OT::Feature>::get_offset(unsigned int) const
Line
Count
Source
894
14.0k
  { return (*this)[i].offset; }
895
  Offset16To<Type>& get_offset (unsigned int i)
896
  { return (*this)[i].offset; }
897
  const Tag& get_tag (unsigned int i) const
898
16.9k
  { return (*this)[i].tag; }
Unexecuted instantiation: OT::RecordArrayOf<OT::LangSys>::get_tag(unsigned int) const
Unexecuted instantiation: OT::RecordArrayOf<OT::Script>::get_tag(unsigned int) const
OT::RecordArrayOf<OT::Feature>::get_tag(unsigned int) const
Line
Count
Source
898
16.9k
  { return (*this)[i].tag; }
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfLangSys>::get_tag(unsigned int) const
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfScript>::get_tag(unsigned int) const
899
  unsigned int get_tags (unsigned int start_offset,
900
                         unsigned int *record_count /* IN/OUT */,
901
                         hb_tag_t     *record_tags /* OUT */) const
902
0
  {
903
0
    if (record_count && record_tags)
904
0
    {
905
0
      + this->as_array ().sub_array (start_offset, record_count)
906
0
      | hb_map (&Record<Type>::tag)
907
0
      | hb_sink (hb_array (record_tags, *record_count))
908
0
      ;
909
0
    }
910
0
    return this->len;
911
0
  }
Unexecuted instantiation: OT::RecordArrayOf<OT::LangSys>::get_tags(unsigned int, unsigned int*, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::Script>::get_tags(unsigned int, unsigned int*, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::Feature>::get_tags(unsigned int, unsigned int*, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfLangSys>::get_tags(unsigned int, unsigned int*, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfScript>::get_tags(unsigned int, unsigned int*, unsigned int*) const
912
  bool find_index (hb_tag_t tag, unsigned int *index) const
913
40.6k
  {
914
40.6k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
915
40.6k
  }
OT::RecordArrayOf<OT::LangSys>::find_index(unsigned int, unsigned int*) const
Line
Count
Source
913
20.5k
  {
914
20.5k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
915
20.5k
  }
OT::RecordArrayOf<OT::Script>::find_index(unsigned int, unsigned int*) const
Line
Count
Source
913
20.0k
  {
914
20.0k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
915
20.0k
  }
Unexecuted instantiation: OT::RecordArrayOf<OT::Feature>::find_index(unsigned int, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfLangSys>::find_index(unsigned int, unsigned int*) const
Unexecuted instantiation: OT::RecordArrayOf<OT::JstfScript>::find_index(unsigned int, unsigned int*) const
916
};
917
918
template <typename Type>
919
struct RecordListOf : RecordArrayOf<Type>
920
{
921
  const Type& operator [] (unsigned int i) const
922
45.6k
  { return this+this->get_offset (i); }
OT::RecordListOf<OT::Script>::operator[](unsigned int) const
Line
Count
Source
922
31.5k
  { return this+this->get_offset (i); }
OT::RecordListOf<OT::Feature>::operator[](unsigned int) const
Line
Count
Source
922
14.0k
  { return this+this->get_offset (i); }
923
924
  bool subset (hb_subset_context_t *c,
925
               hb_subset_layout_context_t *l) const
926
  {
927
    TRACE_SUBSET (this);
928
    auto *out = c->serializer->start_embed (*this);
929
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
930
931
    + this->iter ()
932
    | hb_apply (subset_record_array (l, out, this))
933
    ;
934
    return_trace (true);
935
  }
936
937
  bool sanitize (hb_sanitize_context_t *c) const
938
192
  {
939
192
    TRACE_SANITIZE (this);
940
192
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
941
192
  }
OT::RecordListOf<OT::Script>::sanitize(hb_sanitize_context_t*) const
Line
Count
Source
938
96
  {
939
96
    TRACE_SANITIZE (this);
940
96
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
941
96
  }
OT::RecordListOf<OT::Feature>::sanitize(hb_sanitize_context_t*) const
Line
Count
Source
938
96
  {
939
96
    TRACE_SANITIZE (this);
940
96
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
941
96
  }
942
};
943
944
struct RecordListOfFeature : RecordListOf<Feature>
945
{
946
  bool subset (hb_subset_context_t *c,
947
         hb_subset_layout_context_t *l) const
948
0
  {
949
0
    TRACE_SUBSET (this);
950
0
    auto *out = c->serializer->start_embed (*this);
951
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
952
953
0
    + hb_enumerate (*this)
954
0
    | hb_filter (l->feature_index_map, hb_first)
955
0
    | hb_apply ([l, out, this] (const hb_pair_t<unsigned, const Record<Feature>&>& _)
956
0
                {
957
0
                  const Feature *f_sub = nullptr;
958
0
                  const Feature **f = nullptr;
959
0
                  if (l->feature_substitutes_map->has (_.first, &f))
960
0
                    f_sub = *f;
961
962
0
                  subset_record_array (l, out, this, f_sub) (_.second);
963
0
                })
964
0
    ;
965
966
0
    return_trace (true);
967
0
  }
968
};
969
970
typedef RecordListOf<Feature> FeatureList;
971
972
973
struct LangSys
974
{
975
  unsigned int get_feature_count () const
976
793
  { return featureIndex.len; }
977
  hb_tag_t get_feature_index (unsigned int i) const
978
262
  { return featureIndex[i]; }
979
  unsigned int get_feature_indexes (unsigned int start_offset,
980
            unsigned int *feature_count /* IN/OUT */,
981
            unsigned int *feature_indexes /* OUT */) const
982
24.3k
  { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
983
  void add_feature_indexes_to (hb_set_t *feature_indexes) const
984
0
  { featureIndex.add_indexes_to (feature_indexes); }
985
986
10.8k
  bool has_required_feature () const { return reqFeatureIndex != 0xFFFFu; }
987
  unsigned int get_required_feature_index () const
988
10.2k
  {
989
10.2k
    if (reqFeatureIndex == 0xFFFFu)
990
10.2k
      return Index::NOT_FOUND_INDEX;
991
0
   return reqFeatureIndex;
992
10.2k
  }
993
994
  LangSys* copy (hb_serialize_context_t *c) const
995
0
  {
996
0
    TRACE_SERIALIZE (this);
997
0
    return_trace (c->embed (*this));
998
0
  }
999
1000
  bool compare (const LangSys& o, const hb_map_t *feature_index_map) const
1001
0
  {
1002
0
    if (reqFeatureIndex != o.reqFeatureIndex)
1003
0
      return false;
1004
1005
0
    auto iter =
1006
0
    + hb_iter (featureIndex)
1007
0
    | hb_filter (feature_index_map)
1008
0
    | hb_map (feature_index_map)
1009
0
    ;
1010
1011
0
    auto o_iter =
1012
0
    + hb_iter (o.featureIndex)
1013
0
    | hb_filter (feature_index_map)
1014
0
    | hb_map (feature_index_map)
1015
0
    ;
1016
1017
0
    for (; iter && o_iter; iter++, o_iter++)
1018
0
    {
1019
0
      unsigned a = *iter;
1020
0
      unsigned b = *o_iter;
1021
0
      if (a != b) return false;
1022
0
    }
1023
1024
0
    if (iter || o_iter) return false;
1025
1026
0
    return true;
1027
0
  }
1028
1029
  void collect_features (hb_prune_langsys_context_t *c) const
1030
0
  {
1031
0
    if (!has_required_feature () && !get_feature_count ()) return;
1032
0
    if (has_required_feature () &&
1033
0
        c->duplicate_feature_map->has (reqFeatureIndex))
1034
0
      c->new_feature_indexes->add (get_required_feature_index ());
1035
1036
0
    + hb_iter (featureIndex)
1037
0
    | hb_filter (c->duplicate_feature_map)
1038
0
    | hb_sink (c->new_feature_indexes)
1039
0
    ;
1040
0
  }
1041
1042
  bool subset (hb_subset_context_t        *c,
1043
         hb_subset_layout_context_t *l,
1044
         const Tag                  *tag = nullptr) const
1045
0
  {
1046
0
    TRACE_SUBSET (this);
1047
0
    auto *out = c->serializer->start_embed (*this);
1048
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1049
1050
0
    const uint32_t *v;
1051
0
    out->reqFeatureIndex = l->feature_map_w_duplicates->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
1052
1053
0
    if (!l->visitFeatureIndex (featureIndex.len))
1054
0
      return_trace (false);
1055
1056
0
    auto it =
1057
0
    + hb_iter (featureIndex)
1058
0
    | hb_filter (l->feature_map_w_duplicates)
1059
0
    | hb_map (l->feature_map_w_duplicates)
1060
0
    ;
1061
1062
0
    bool ret = bool (it);
1063
0
    out->featureIndex.serialize (c->serializer, l, it);
1064
0
    return_trace (ret);
1065
0
  }
1066
1067
  bool sanitize (hb_sanitize_context_t *c,
1068
     const Record_sanitize_closure_t * = nullptr) const
1069
816
  {
1070
816
    TRACE_SANITIZE (this);
1071
816
    return_trace (c->check_struct (this) && featureIndex.sanitize (c));
1072
816
  }
1073
1074
  Offset16  lookupOrderZ; /* = Null (reserved for an offset to a
1075
         * reordering table) */
1076
  HBUINT16  reqFeatureIndex;/* Index of a feature required for this
1077
         * language system--if no required features
1078
         * = 0xFFFFu */
1079
  IndexArray  featureIndex; /* Array of indices into the FeatureList */
1080
  public:
1081
  DEFINE_SIZE_ARRAY_SIZED (6, featureIndex);
1082
};
1083
DECLARE_NULL_NAMESPACE_BYTES (OT, LangSys);
1084
1085
struct Script
1086
{
1087
  unsigned int get_lang_sys_count () const
1088
455
  { return langSys.len; }
1089
  const Tag& get_lang_sys_tag (unsigned int i) const
1090
0
  { return langSys.get_tag (i); }
1091
  unsigned int get_lang_sys_tags (unsigned int start_offset,
1092
          unsigned int *lang_sys_count /* IN/OUT */,
1093
          hb_tag_t     *lang_sys_tags /* OUT */) const
1094
0
  { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
1095
  const LangSys& get_lang_sys (unsigned int i) const
1096
20.9k
  {
1097
20.9k
    if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
1098
76
    return this+langSys[i].offset;
1099
20.9k
  }
1100
  bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
1101
20.5k
  { return langSys.find_index (tag, index); }
1102
1103
910
  bool has_default_lang_sys () const           { return defaultLangSys != 0; }
1104
21.2k
  const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
1105
1106
  void prune_langsys (hb_prune_langsys_context_t *c,
1107
                      unsigned script_index) const
1108
0
  {
1109
0
    if (!has_default_lang_sys () && !get_lang_sys_count ()) return;
1110
0
    if (!c->visitScript ()) return;
1111
1112
0
    if (!c->script_langsys_map->has (script_index))
1113
0
    {
1114
0
      if (unlikely (!c->script_langsys_map->set (script_index, hb::unique_ptr<hb_set_t> {hb_set_create ()})))
1115
0
  return;
1116
0
    }
1117
1118
0
    if (has_default_lang_sys ())
1119
0
    {
1120
      //only collect features from non-redundant langsys
1121
0
      const LangSys& d = get_default_lang_sys ();
1122
0
      if (c->visitLangsys (d.get_feature_count ())) {
1123
0
        d.collect_features (c);
1124
0
      }
1125
1126
0
      for (auto _ : + hb_enumerate (langSys))
1127
0
      {
1128
0
        const LangSys& l = this+_.second.offset;
1129
0
        if (!c->visitLangsys (l.get_feature_count ())) continue;
1130
0
        if (l.compare (d, c->duplicate_feature_map)) continue;
1131
1132
0
        l.collect_features (c);
1133
0
        c->script_langsys_map->get (script_index)->add (_.first);
1134
0
      }
1135
0
    }
1136
0
    else
1137
0
    {
1138
0
      for (auto _ : + hb_enumerate (langSys))
1139
0
      {
1140
0
        const LangSys& l = this+_.second.offset;
1141
0
        if (!c->visitLangsys (l.get_feature_count ())) continue;
1142
0
        l.collect_features (c);
1143
0
        c->script_langsys_map->get (script_index)->add (_.first);
1144
0
      }
1145
0
    }
1146
0
  }
1147
1148
  bool subset (hb_subset_context_t         *c,
1149
         hb_subset_layout_context_t  *l,
1150
         const Tag                   *tag) const
1151
0
  {
1152
0
    TRACE_SUBSET (this);
1153
0
    if (!l->visitScript ()) return_trace (false);
1154
0
    if (tag && !c->plan->layout_scripts.has (*tag))
1155
0
      return false;
1156
1157
0
    auto *out = c->serializer->start_embed (*this);
1158
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1159
1160
0
    bool defaultLang = false;
1161
0
    if (has_default_lang_sys ())
1162
0
    {
1163
0
      c->serializer->push ();
1164
0
      const LangSys& ls = this+defaultLangSys;
1165
0
      bool ret = ls.subset (c, l);
1166
0
      if (!ret && tag && *tag != HB_TAG ('D', 'F', 'L', 'T'))
1167
0
      {
1168
0
  c->serializer->pop_discard ();
1169
0
  out->defaultLangSys = 0;
1170
0
      }
1171
0
      else
1172
0
      {
1173
0
  c->serializer->add_link (out->defaultLangSys, c->serializer->pop_pack ());
1174
0
  defaultLang = true;
1175
0
      }
1176
0
    }
1177
1178
0
    const hb_set_t *active_langsys = l->script_langsys_map->get (l->cur_script_index);
1179
0
    if (active_langsys)
1180
0
    {
1181
0
      + hb_enumerate (langSys)
1182
0
      | hb_filter (active_langsys, hb_first)
1183
0
      | hb_map (hb_second)
1184
0
      | hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); })
1185
0
      | hb_apply (subset_record_array (l, &(out->langSys), this))
1186
0
      ;
1187
0
    }
1188
1189
0
    return_trace (bool (out->langSys.len) || defaultLang || l->table_tag == HB_OT_TAG_GSUB);
1190
0
  }
1191
1192
  bool sanitize (hb_sanitize_context_t *c,
1193
     const Record_sanitize_closure_t * = nullptr) const
1194
672
  {
1195
672
    TRACE_SANITIZE (this);
1196
672
    return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
1197
672
  }
1198
1199
  protected:
1200
  Offset16To<LangSys>
1201
    defaultLangSys; /* Offset to DefaultLangSys table--from
1202
         * beginning of Script table--may be Null */
1203
  RecordArrayOf<LangSys>
1204
    langSys;  /* Array of LangSysRecords--listed
1205
         * alphabetically by LangSysTag */
1206
  public:
1207
  DEFINE_SIZE_ARRAY_SIZED (4, langSys);
1208
};
1209
1210
struct RecordListOfScript : RecordListOf<Script>
1211
{
1212
  bool subset (hb_subset_context_t *c,
1213
               hb_subset_layout_context_t *l) const
1214
0
  {
1215
0
    TRACE_SUBSET (this);
1216
0
    auto *out = c->serializer->start_embed (*this);
1217
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1218
1219
0
    for (auto _ : + hb_enumerate (*this))
1220
0
    {
1221
0
      auto snap = c->serializer->snapshot ();
1222
0
      l->cur_script_index = _.first;
1223
0
      bool ret = _.second.subset (l, this);
1224
0
      if (!ret) c->serializer->revert (snap);
1225
0
      else out->len++;
1226
0
    }
1227
1228
0
    return_trace (true);
1229
0
  }
1230
};
1231
1232
typedef RecordListOfScript ScriptList;
1233
1234
1235
1236
struct LookupFlag : HBUINT16
1237
{
1238
  enum Flags {
1239
    RightToLeft   = 0x0001u,
1240
    IgnoreBaseGlyphs  = 0x0002u,
1241
    IgnoreLigatures = 0x0004u,
1242
    IgnoreMarks   = 0x0008u,
1243
    IgnoreFlags   = 0x000Eu,
1244
    UseMarkFilteringSet = 0x0010u,
1245
    Reserved    = 0x00E0u,
1246
    MarkAttachmentType  = 0xFF00u
1247
  };
1248
  public:
1249
  DEFINE_SIZE_STATIC (2);
1250
};
1251
1252
} /* namespace OT */
1253
/* This has to be outside the namespace. */
1254
HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
1255
namespace OT {
1256
1257
struct Lookup
1258
{
1259
3.53k
  unsigned int get_subtable_count () const { return subTable.len; }
1260
1261
  template <typename TSubTable>
1262
  const Array16OfOffset16To<TSubTable>& get_subtables () const
1263
3.29k
  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > const& OT::Lookup::get_subtables<OT::Layout::GSUB_impl::SubstLookupSubTable>() const
Line
Count
Source
1263
418
  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> > const& OT::Lookup::get_subtables<OT::Layout::GPOS_impl::PosLookupSubTable>() const
Line
Count
Source
1263
2.88k
  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
1264
  template <typename TSubTable>
1265
  Array16OfOffset16To<TSubTable>& get_subtables ()
1266
0
  { return reinterpret_cast<Array16OfOffset16To<TSubTable> &> (subTable); }
Unexecuted instantiation: OT::ArrayOf<OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >& OT::Lookup::get_subtables<OT::Layout::GPOS_impl::PosLookupSubTable>()
Unexecuted instantiation: OT::ArrayOf<OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true>, OT::NumType<true, unsigned short, 2u> >& OT::Lookup::get_subtables<OT::Layout::GSUB_impl::SubstLookupSubTable>()
1267
1268
  template <typename TSubTable>
1269
  const TSubTable& get_subtable (unsigned int i) const
1270
1.19k
  { return this+get_subtables<TSubTable> ()[i]; }
OT::Layout::GSUB_impl::SubstLookupSubTable const& OT::Lookup::get_subtable<OT::Layout::GSUB_impl::SubstLookupSubTable>(unsigned int) const
Line
Count
Source
1270
69
  { return this+get_subtables<TSubTable> ()[i]; }
OT::Layout::GPOS_impl::PosLookupSubTable const& OT::Lookup::get_subtable<OT::Layout::GPOS_impl::PosLookupSubTable>(unsigned int) const
Line
Count
Source
1270
1.13k
  { return this+get_subtables<TSubTable> ()[i]; }
1271
  template <typename TSubTable>
1272
  TSubTable& get_subtable (unsigned int i)
1273
  { return this+get_subtables<TSubTable> ()[i]; }
1274
1275
  size_t get_size () const
1276
0
  {
1277
0
    const HBUINT16 &markFilteringSet = StructAfter<const HBUINT16> (subTable);
1278
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1279
0
      return (const char *) &StructAfter<const char> (markFilteringSet) - (const char *) this;
1280
0
    return (const char *) &markFilteringSet - (const char *) this;
1281
0
  }
1282
1283
59.1k
  unsigned int get_type () const { return lookupType; }
1284
1285
  /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
1286
   * higher 16-bit is mark-filtering-set if the lookup uses one.
1287
   * Not to be confused with glyph_props which is very similar. */
1288
  uint32_t get_props () const
1289
3.55M
  {
1290
3.55M
    unsigned int flag = lookupFlag;
1291
3.55M
    if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
1292
0
    {
1293
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1294
0
      flag += (markFilteringSet << 16);
1295
0
    }
1296
3.55M
    return flag;
1297
3.55M
  }
1298
1299
  template <typename TSubTable, typename context_t, typename ...Ts>
1300
  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
1301
719
  {
1302
719
    unsigned int lookup_type = get_type ();
1303
719
    TRACE_DISPATCH (this, lookup_type);
1304
719
    unsigned int count = get_subtable_count ();
1305
1.91k
    for (unsigned int i = 0; i < count; i++) {
1306
1.19k
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1307
1.19k
      if (c->stop_sublookup_iteration (r))
1308
0
  return_trace (r);
1309
1.19k
    }
1310
719
    return_trace (c->default_return_value ());
1311
719
  }
Unexecuted instantiation: OT::hb_ot_apply_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_ot_apply_context_t>(OT::hb_ot_apply_context_t*) const
Unexecuted instantiation: OT::hb_intersects_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_intersects_context_t>(OT::hb_intersects_context_t*) const
Unexecuted instantiation: OT::hb_collect_glyphs_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_collect_glyphs_context_t>(OT::hb_collect_glyphs_context_t*) const
Unexecuted instantiation: OT::hb_closure_lookups_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_closure_lookups_context_t>(OT::hb_closure_lookups_context_t*) const
Unexecuted instantiation: OT::hb_collect_variation_indices_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_collect_variation_indices_context_t>(OT::hb_collect_variation_indices_context_t*) const
OT::hb_accelerate_subtables_context_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, OT::hb_accelerate_subtables_context_t>(OT::hb_accelerate_subtables_context_t*) const
Line
Count
Source
1301
650
  {
1302
650
    unsigned int lookup_type = get_type ();
1303
650
    TRACE_DISPATCH (this, lookup_type);
1304
650
    unsigned int count = get_subtable_count ();
1305
1.78k
    for (unsigned int i = 0; i < count; i++) {
1306
1.13k
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1307
1.13k
      if (c->stop_sublookup_iteration (r))
1308
0
  return_trace (r);
1309
1.13k
    }
1310
650
    return_trace (c->default_return_value ());
1311
650
  }
Unexecuted instantiation: OT::hb_have_non_1to1_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_have_non_1to1_context_t>(OT::hb_have_non_1to1_context_t*) const
Unexecuted instantiation: OT::hb_ot_apply_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_ot_apply_context_t>(OT::hb_ot_apply_context_t*) const
Unexecuted instantiation: OT::hb_intersects_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_intersects_context_t>(OT::hb_intersects_context_t*) const
Unexecuted instantiation: OT::hb_closure_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_closure_context_t>(OT::hb_closure_context_t*) const
Unexecuted instantiation: OT::hb_depend_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_depend_context_t>(OT::hb_depend_context_t*) const
Unexecuted instantiation: OT::hb_closure_lookups_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_closure_lookups_context_t>(OT::hb_closure_lookups_context_t*) const
Unexecuted instantiation: OT::hb_collect_glyphs_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_collect_glyphs_context_t>(OT::hb_collect_glyphs_context_t*) const
Unexecuted instantiation: OT::hb_would_apply_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_would_apply_context_t>(OT::hb_would_apply_context_t*) const
OT::hb_accelerate_subtables_context_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::hb_accelerate_subtables_context_t>(OT::hb_accelerate_subtables_context_t*) const
Line
Count
Source
1301
69
  {
1302
69
    unsigned int lookup_type = get_type ();
1303
69
    TRACE_DISPATCH (this, lookup_type);
1304
69
    unsigned int count = get_subtable_count ();
1305
138
    for (unsigned int i = 0; i < count; i++) {
1306
69
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1307
69
      if (c->stop_sublookup_iteration (r))
1308
0
  return_trace (r);
1309
69
    }
1310
69
    return_trace (c->default_return_value ());
1311
69
  }
Unexecuted instantiation: hb_get_glyph_alternates_dispatch_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, hb_get_glyph_alternates_dispatch_t, unsigned int&, unsigned int&, unsigned int*&, unsigned int*&>(hb_get_glyph_alternates_dispatch_t*, unsigned int&, unsigned int&, unsigned int*&, unsigned int*&) const
Unexecuted instantiation: hb_collect_glyph_alternates_dispatch_t::return_t OT::Lookup::dispatch<OT::Layout::GSUB_impl::SubstLookupSubTable, hb_collect_glyph_alternates_dispatch_t, hb_map_t*&, hb_map_t*&>(hb_collect_glyph_alternates_dispatch_t*, hb_map_t*&, hb_map_t*&) const
Unexecuted instantiation: hb_position_single_dispatch_t::return_t OT::Lookup::dispatch<OT::Layout::GPOS_impl::PosLookupSubTable, hb_position_single_dispatch_t, hb_font_t*&, hb_blob_t*&, hb_direction_t&, unsigned int&, hb_glyph_position_t&>(hb_position_single_dispatch_t*, hb_font_t*&, hb_blob_t*&, hb_direction_t&, unsigned int&, hb_glyph_position_t&) const
1312
1313
  bool serialize (hb_serialize_context_t *c,
1314
      unsigned int lookup_type,
1315
      uint32_t lookup_props,
1316
      unsigned int num_subtables)
1317
0
  {
1318
0
    TRACE_SERIALIZE (this);
1319
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1320
0
    lookupType = lookup_type;
1321
0
    lookupFlag = lookup_props & 0xFFFFu;
1322
0
    if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
1323
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1324
0
    {
1325
0
      if (unlikely (!c->extend (this))) return_trace (false);
1326
0
      HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1327
0
      markFilteringSet = lookup_props >> 16;
1328
0
    }
1329
0
    return_trace (true);
1330
0
  }
1331
1332
  template <typename TSubTable>
1333
  bool subset (hb_subset_context_t *c) const
1334
0
  {
1335
0
    TRACE_SUBSET (this);
1336
0
    auto *out = c->serializer->start_embed (*this);
1337
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1338
0
    out->lookupType = lookupType;
1339
0
    out->lookupFlag = lookupFlag;
1340
1341
0
    const hb_set_t *glyphset = c->plan->glyphset_gsub ();
1342
0
    unsigned int lookup_type = get_type ();
1343
0
    + hb_iter (get_subtables <TSubTable> ())
1344
0
    | hb_filter ([this, glyphset, lookup_type] (const Offset16To<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
Unexecuted instantiation: OT::Lookup::subset<OT::Layout::GSUB_impl::SubstLookupSubTable>(hb_subset_context_t*) const::{lambda(OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&)#1}::operator()(OT::OffsetTo<OT::Layout::GSUB_impl::SubstLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&) const
Unexecuted instantiation: OT::Lookup::subset<OT::Layout::GPOS_impl::PosLookupSubTable>(hb_subset_context_t*) const::{lambda(OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&)#1}::operator()(OT::OffsetTo<OT::Layout::GPOS_impl::PosLookupSubTable, OT::NumType<true, unsigned short, 2u>, void, true> const&) const
1345
0
    | hb_apply (subset_offset_array (c, out->get_subtables<TSubTable> (), this, lookup_type))
1346
0
    ;
1347
1348
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1349
0
    {
1350
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1351
0
      hb_codepoint_t *idx;
1352
0
      if (!c->plan->used_mark_sets_map.has (markFilteringSet, &idx))
1353
0
      {
1354
0
        unsigned new_flag = lookupFlag;
1355
0
        new_flag &= ~LookupFlag::UseMarkFilteringSet;
1356
        // https://github.com/harfbuzz/harfbuzz/issues/5499
1357
        // If we remove UseMarkFilteringSet flag because the set is now empty,
1358
        // we need to add IgnoreMarks flag, otherwise the lookup will not
1359
        // ignore any marks, which changes the behavior.
1360
0
        new_flag |= LookupFlag::IgnoreMarks;
1361
0
        out->lookupFlag = new_flag;
1362
0
      }
1363
0
      else
1364
0
      {
1365
0
        if (unlikely (!c->serializer->extend (out))) return_trace (false);
1366
0
        HBUINT16 &outMarkFilteringSet = StructAfter<HBUINT16> (out->subTable);
1367
0
        outMarkFilteringSet = *idx;
1368
0
      }
1369
0
    }
1370
1371
    // Always keep the lookup even if it's empty. The rest of layout subsetting depends on lookup
1372
    // indices being consistent with those computed during planning. So if an empty lookup is
1373
    // discarded during the subset phase it will invalidate all subsequent lookup indices.
1374
    // Generally we shouldn't end up with an empty lookup as we pre-prune them during the planning
1375
    // phase, but it can happen in rare cases such as when during closure subtable is considered
1376
    // degenerate (see: https://github.com/harfbuzz/harfbuzz/issues/3853)
1377
0
    return_trace (true);
1378
0
  }
Unexecuted instantiation: bool OT::Lookup::subset<OT::Layout::GPOS_impl::PosLookupSubTable>(hb_subset_context_t*) const
Unexecuted instantiation: bool OT::Lookup::subset<OT::Layout::GSUB_impl::SubstLookupSubTable>(hb_subset_context_t*) const
1379
1380
  template <typename TSubTable>
1381
  bool sanitize (hb_sanitize_context_t *c) const
1382
2.10k
  {
1383
2.10k
    TRACE_SANITIZE (this);
1384
2.10k
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1385
2.10k
    hb_barrier ();
1386
1387
2.10k
    unsigned subtables = get_subtable_count ();
1388
2.10k
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1389
1390
2.10k
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1391
0
    {
1392
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1393
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1394
0
    }
1395
1396
2.10k
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1397
0
      return_trace (false);
1398
1399
2.10k
    if (unlikely (get_type () == TSubTable::Extension))
1400
0
    {
1401
0
      hb_barrier ();
1402
1403
      /* The spec says all subtables of an Extension lookup should
1404
       * have the same type, which shall not be the Extension type
1405
       * itself (but we already checked for that).
1406
       * This is specially important if one has a reverse type!
1407
       */
1408
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1409
0
      for (unsigned int i = 1; i < subtables; i++)
1410
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1411
0
    return_trace (false);
1412
0
    }
1413
2.10k
    return_trace (true);
1414
2.10k
  }
bool OT::Lookup::sanitize<OT::Layout::GSUB_impl::SubstLookupSubTable>(hb_sanitize_context_t*) const
Line
Count
Source
1382
349
  {
1383
349
    TRACE_SANITIZE (this);
1384
349
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1385
349
    hb_barrier ();
1386
1387
349
    unsigned subtables = get_subtable_count ();
1388
349
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1389
1390
349
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1391
0
    {
1392
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1393
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1394
0
    }
1395
1396
349
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1397
0
      return_trace (false);
1398
1399
349
    if (unlikely (get_type () == TSubTable::Extension))
1400
0
    {
1401
0
      hb_barrier ();
1402
1403
      /* The spec says all subtables of an Extension lookup should
1404
       * have the same type, which shall not be the Extension type
1405
       * itself (but we already checked for that).
1406
       * This is specially important if one has a reverse type!
1407
       */
1408
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1409
0
      for (unsigned int i = 1; i < subtables; i++)
1410
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1411
0
    return_trace (false);
1412
0
    }
1413
349
    return_trace (true);
1414
349
  }
bool OT::Lookup::sanitize<OT::Layout::GPOS_impl::PosLookupSubTable>(hb_sanitize_context_t*) const
Line
Count
Source
1382
1.75k
  {
1383
1.75k
    TRACE_SANITIZE (this);
1384
1.75k
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1385
1.75k
    hb_barrier ();
1386
1387
1.75k
    unsigned subtables = get_subtable_count ();
1388
1.75k
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1389
1390
1.75k
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1391
0
    {
1392
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1393
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1394
0
    }
1395
1396
1.75k
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1397
0
      return_trace (false);
1398
1399
1.75k
    if (unlikely (get_type () == TSubTable::Extension))
1400
0
    {
1401
0
      hb_barrier ();
1402
1403
      /* The spec says all subtables of an Extension lookup should
1404
       * have the same type, which shall not be the Extension type
1405
       * itself (but we already checked for that).
1406
       * This is specially important if one has a reverse type!
1407
       */
1408
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1409
0
      for (unsigned int i = 1; i < subtables; i++)
1410
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1411
0
    return_trace (false);
1412
0
    }
1413
1.75k
    return_trace (true);
1414
1.75k
  }
1415
1416
  protected:
1417
  HBUINT16  lookupType;   /* Different enumerations for GSUB and GPOS */
1418
  HBUINT16  lookupFlag;   /* Lookup qualifiers */
1419
  Array16Of<Offset16>
1420
    subTable;   /* Array of SubTables */
1421
/*HBUINT16  markFilteringSetX[HB_VAR_ARRAY];*//* Index (base 0) into GDEF mark glyph sets
1422
           * structure. This field is only present if bit
1423
           * UseMarkFilteringSet of lookup flags is set. */
1424
  public:
1425
  DEFINE_SIZE_ARRAY (6, subTable);
1426
};
1427
1428
template <typename Types>
1429
using LookupList = List16OfOffsetTo<Lookup, typename Types::HBUINT>;
1430
1431
template <typename TLookup, typename OffsetType>
1432
struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType>
1433
{
1434
  bool subset (hb_subset_context_t        *c,
1435
         hb_subset_layout_context_t *l) const
1436
0
  {
1437
0
    TRACE_SUBSET (this);
1438
0
    auto *out = c->serializer->start_embed (this);
1439
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1440
1441
0
    + hb_enumerate (*this)
1442
0
    | hb_filter (l->lookup_index_map, hb_first)
1443
0
    | hb_map (hb_second)
1444
0
    | hb_apply (subset_offset_array (c, *out, this))
1445
0
    ;
1446
0
    return_trace (true);
1447
0
  }
Unexecuted instantiation: OT::LookupOffsetList<OT::Layout::GPOS_impl::PosLookup, OT::NumType<true, unsigned short, 2u> >::subset(hb_subset_context_t*, OT::hb_subset_layout_context_t*) const
Unexecuted instantiation: OT::LookupOffsetList<OT::Layout::GSUB_impl::SubstLookup, OT::NumType<true, unsigned short, 2u> >::subset(hb_subset_context_t*, OT::hb_subset_layout_context_t*) const
1448
1449
  bool sanitize (hb_sanitize_context_t *c) const
1450
  {
1451
    TRACE_SANITIZE (this);
1452
    return_trace (List16OfOffset16To<TLookup>::sanitize (c, this));
1453
  }
1454
};
1455
1456
1457
/*
1458
 * Coverage Table
1459
 */
1460
1461
1462
static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c,
1463
            const hb_set_t &klasses,
1464
                                          bool use_class_zero,
1465
                                          hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
1466
            hb_map_t *klass_map /*IN/OUT*/)
1467
0
{
1468
0
  if (!klass_map)
1469
0
    return ClassDef_serialize (c, glyph_and_klass.iter ());
1470
1471
  /* any glyph not assigned a class value falls into Class zero (0),
1472
   * if any glyph assigned to class 0, remapping must start with 0->0*/
1473
0
  if (!use_class_zero)
1474
0
    klass_map->set (0, 0);
1475
1476
0
  unsigned idx = klass_map->has (0) ? 1 : 0;
1477
0
  for (const unsigned k: klasses)
1478
0
  {
1479
0
    if (klass_map->has (k)) continue;
1480
0
    klass_map->set (k, idx);
1481
0
    idx++;
1482
0
  }
1483
1484
1485
0
  for (unsigned i = 0; i < glyph_and_klass.length; i++)
1486
0
  {
1487
0
    hb_codepoint_t klass = glyph_and_klass[i].second;
1488
0
    glyph_and_klass[i].second = klass_map->get (klass);
1489
0
  }
1490
1491
0
  c->propagate_error (glyph_and_klass, klasses);
1492
0
  return ClassDef_serialize (c, glyph_and_klass.iter ());
1493
0
}
Unexecuted instantiation: hb-aat-layout.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-aat-map.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-face.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-font.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-color.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-face.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-fetch.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-font.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: VARC.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-layout.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-math.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-metrics.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-shape.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-var.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-static.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-style.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-plan.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-plan-var.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-table-layout.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-table-var.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-table-cff.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-table-color.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-table-other.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: gsubgpos-context.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-cff1.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-cff2.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
Unexecuted instantiation: hb-subset-cff-common.cc:OT::ClassDef_remap_and_serialize(hb_serialize_context_t*, hb_set_t const&, bool, hb_vector_t<hb_pair_t<unsigned int, unsigned int>, true>&, hb_map_t*)
1494
1495
/*
1496
 * Class Definition Table
1497
 */
1498
1499
template <typename Types>
1500
struct ClassDefFormat1_3
1501
{
1502
  friend struct ClassDef;
1503
1504
  private:
1505
  unsigned int get_class (hb_codepoint_t glyph_id) const
1506
0
  {
1507
0
    return classValue[(unsigned int) (glyph_id - startGlyph)];
1508
0
  }
1509
1510
  unsigned get_population () const
1511
0
  {
1512
0
    return classValue.len;
1513
0
  }
1514
1515
  template<typename Iterator,
1516
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
1517
  bool serialize (hb_serialize_context_t *c,
1518
      Iterator it)
1519
0
  {
1520
0
    TRACE_SERIALIZE (this);
1521
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1522
1523
0
    if (unlikely (!it))
1524
0
    {
1525
0
      classFormat = 1;
1526
0
      startGlyph = 0;
1527
0
      classValue.len = 0;
1528
0
      return_trace (true);
1529
0
    }
1530
1531
0
    hb_codepoint_t glyph_min = (*it).first;
1532
0
    hb_codepoint_t glyph_max = + it
1533
0
             | hb_map (hb_first)
1534
0
             | hb_reduce (hb_max, 0u);
1535
0
    unsigned glyph_count = glyph_max - glyph_min + 1;
1536
1537
0
    startGlyph = glyph_min;
1538
0
    if (unlikely (!classValue.serialize (c, glyph_count))) return_trace (false);
1539
0
    for (const hb_pair_t<hb_codepoint_t, uint32_t> gid_klass_pair : + it)
1540
0
    {
1541
0
      unsigned idx = gid_klass_pair.first - glyph_min;
1542
0
      classValue[idx] = gid_klass_pair.second;
1543
0
    }
1544
0
    return_trace (true);
1545
0
  }
Unexecuted instantiation: hb-aat-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-aat-map.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-face.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-font.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-color.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-face.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-fetch.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-font.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: VARC.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-math.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-metrics.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shape.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-var.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-static.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-style.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-cff1-table.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-cff2-table.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shaper-arabic.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shape-fallback.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-cff1.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-cff2.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-cff-common.cc:_ZN2OT17ClassDefFormat1_3INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
1546
1547
  bool subset (hb_subset_context_t *c,
1548
         hb_map_t *klass_map = nullptr /*OUT*/,
1549
               bool keep_empty_table = true,
1550
               bool use_class_zero = true,
1551
               const Coverage* glyph_filter = nullptr) const
1552
0
  {
1553
0
    TRACE_SUBSET (this);
1554
1555
0
    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
1556
0
    hb_set_t orig_klasses;
1557
1558
0
    hb_codepoint_t start = startGlyph;
1559
0
    hb_codepoint_t end   = start + classValue.len;
1560
1561
0
    for (const hb_codepoint_t gid : + hb_range (start, end))
1562
0
    {
1563
0
      hb_codepoint_t new_gid = c->plan->map_gsub_glyph (gid);
1564
0
      if (new_gid == HB_MAP_VALUE_INVALID) continue;
1565
0
      if (glyph_filter && !glyph_filter->has(gid)) continue;
1566
1567
0
      unsigned klass = classValue[gid - start];
1568
0
      if (!klass) continue;
1569
1570
0
      glyph_and_klass.push (hb_pair (new_gid, klass));
1571
0
      orig_klasses.add (klass);
1572
0
    }
1573
1574
0
    if (use_class_zero)
1575
0
    {
1576
0
      const hb_set_t& glyphset = *c->plan->glyphset_gsub ();
1577
0
      unsigned glyph_count = glyph_filter
1578
0
           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
1579
0
           : glyphset.get_population ();
1580
0
      use_class_zero = glyph_count <= glyph_and_klass.length;
1581
0
    }
1582
0
    if (!ClassDef_remap_and_serialize (c->serializer,
1583
0
                                       orig_klasses,
1584
0
                                       use_class_zero,
1585
0
                                       glyph_and_klass,
1586
0
                                       klass_map))
1587
0
      return_trace (false);
1588
0
    return_trace (keep_empty_table || (bool) glyph_and_klass);
1589
0
  }
1590
1591
  bool sanitize (hb_sanitize_context_t *c) const
1592
0
  {
1593
0
    TRACE_SANITIZE (this);
1594
0
    return_trace (c->check_struct (this) && classValue.sanitize (c));
1595
0
  }
1596
1597
0
  unsigned cost () const { return 1; }
1598
1599
  template <typename set_t>
1600
  bool collect_coverage (set_t *glyphs) const
1601
0
  {
1602
0
    unsigned int start = 0;
1603
0
    unsigned int count = classValue.len;
1604
0
    for (unsigned int i = 0; i < count; i++)
1605
0
    {
1606
0
      if (classValue[i])
1607
0
  continue;
1608
1609
0
      if (start != i)
1610
0
  if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
1611
0
    return false;
1612
1613
0
      start = i + 1;
1614
0
    }
1615
0
    if (start != count)
1616
0
      if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
1617
0
  return false;
1618
1619
0
    return true;
1620
0
  }
1621
1622
  template <typename set_t>
1623
  bool collect_class (set_t *glyphs, unsigned klass) const
1624
0
  {
1625
0
    unsigned int count = classValue.len;
1626
0
    for (unsigned int i = 0; i < count; i++)
1627
0
      if (classValue[i] == klass) glyphs->add (startGlyph + i);
1628
0
    return true;
1629
0
  }
Unexecuted instantiation: bool OT::ClassDefFormat1_3<OT::Layout::SmallTypes>::collect_class<hb_set_t>(hb_set_t*, unsigned int) const
Unexecuted instantiation: bool OT::ClassDefFormat1_3<OT::Layout::SmallTypes>::collect_class<hb_set_digest_t>(hb_set_digest_t*, unsigned int) const
1630
1631
  bool intersects (const hb_set_t *glyphs) const
1632
0
  {
1633
0
    hb_codepoint_t start = startGlyph;
1634
0
    hb_codepoint_t end = startGlyph + classValue.len;
1635
0
    for (hb_codepoint_t iter = startGlyph - 1;
1636
0
   glyphs->next (&iter) && iter < end;)
1637
0
      if (classValue[iter - start]) return true;
1638
0
    return false;
1639
0
  }
1640
  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
1641
0
  {
1642
0
    unsigned int count = classValue.len;
1643
0
    if (klass == 0)
1644
0
    {
1645
      /* Match if there's any glyph that is not listed! */
1646
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1647
0
      if (!glyphs->next (&g)) return false;
1648
0
      if (g < startGlyph) return true;
1649
0
      g = startGlyph + count - 1;
1650
0
      if (glyphs->next (&g)) return true;
1651
      /* Fall through. */
1652
0
    }
1653
    /* TODO Speed up, using set overlap first? */
1654
    /* TODO(iter) Rewrite as dagger. */
1655
0
    const HBUINT16 *arr = classValue.arrayZ;
1656
0
    for (unsigned int i = 0; i < count; i++)
1657
0
      if (arr[i] == klass && glyphs->has (startGlyph + i))
1658
0
  return true;
1659
0
    return false;
1660
0
  }
1661
1662
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
1663
0
  {
1664
0
    unsigned count = classValue.len;
1665
0
    if (klass == 0)
1666
0
    {
1667
0
      unsigned start_glyph = startGlyph;
1668
0
      for (uint32_t g = HB_SET_VALUE_INVALID;
1669
0
     glyphs->next (&g) && g < start_glyph;)
1670
0
  intersect_glyphs->add (g);
1671
1672
0
      for (uint32_t g = startGlyph + count - 1;
1673
0
     glyphs-> next (&g);)
1674
0
  intersect_glyphs->add (g);
1675
1676
0
      return;
1677
0
    }
1678
1679
0
    for (unsigned i = 0; i < count; i++)
1680
0
      if (classValue[i] == klass && glyphs->has (startGlyph + i))
1681
0
  intersect_glyphs->add (startGlyph + i);
1682
1683
#if 0
1684
    /* The following implementation is faster asymptotically, but slower
1685
     * in practice. */
1686
    unsigned start_glyph = startGlyph;
1687
    unsigned end_glyph = start_glyph + count;
1688
    for (unsigned g = startGlyph - 1;
1689
   glyphs->next (&g) && g < end_glyph;)
1690
      if (classValue.arrayZ[g - start_glyph] == klass)
1691
        intersect_glyphs->add (g);
1692
#endif
1693
0
  }
1694
1695
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
1696
0
  {
1697
0
    if (glyphs->is_empty ()) return;
1698
1699
    /* An empty ClassDef assigns class zero to every glyph, so every glyph in
1700
     * `glyphs` intersects class zero.  Handle it up front: `end_glyph` below
1701
     * underflows when startGlyph is zero, and neither comparison can then be
1702
     * true. */
1703
0
    if (!classValue.len)
1704
0
    {
1705
0
      intersect_classes->add (0);
1706
0
      return;
1707
0
    }
1708
1709
0
    hb_codepoint_t end_glyph = startGlyph + classValue.len - 1;
1710
0
    if (glyphs->get_min () < startGlyph ||
1711
0
        glyphs->get_max () > end_glyph)
1712
0
      intersect_classes->add (0);
1713
1714
0
    for (const auto& _ : + hb_enumerate (classValue))
1715
0
    {
1716
0
      hb_codepoint_t g = startGlyph + _.first;
1717
0
      if (glyphs->has (g))
1718
0
        intersect_classes->add (_.second);
1719
0
    }
1720
0
  }
1721
1722
  protected:
1723
  HBUINT16  classFormat;  /* Format identifier--format = 1 */
1724
  typename Types::HBGlyphID
1725
     startGlyph;  /* First GlyphID of the classValueArray */
1726
  typename Types::template ArrayOf<HBUINT16>
1727
    classValue; /* Array of Class Values--one per GlyphID */
1728
  public:
1729
  DEFINE_SIZE_ARRAY (2 + 2 * Types::size, classValue);
1730
};
1731
1732
template <typename Types>
1733
struct ClassDefFormat2_4
1734
{
1735
  friend struct ClassDef;
1736
1737
  private:
1738
  unsigned int get_class (hb_codepoint_t glyph_id) const
1739
772k
  {
1740
772k
    return rangeRecord.bsearch (glyph_id).value;
1741
772k
  }
1742
1743
  unsigned get_population () const
1744
0
  {
1745
0
    typename Types::large_int ret = 0;
1746
0
    for (const auto &r : rangeRecord)
1747
0
      ret += r.get_population ();
1748
0
    return ret > UINT_MAX ? UINT_MAX : (unsigned) ret;
1749
0
  }
1750
1751
  template<typename Iterator,
1752
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
1753
  bool serialize (hb_serialize_context_t *c,
1754
      Iterator it)
1755
0
  {
1756
0
    TRACE_SERIALIZE (this);
1757
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1758
1759
0
    if (unlikely (!it))
1760
0
    {
1761
0
      classFormat = 2;
1762
0
      rangeRecord.len = 0;
1763
0
      return_trace (true);
1764
0
    }
1765
1766
0
    unsigned unsorted = false;
1767
0
    unsigned num_ranges = 1;
1768
0
    hb_codepoint_t prev_gid = (*it).first;
1769
0
    unsigned prev_klass = (*it).second;
1770
1771
0
    RangeRecord<Types> range_rec;
1772
0
    range_rec.first = prev_gid;
1773
0
    range_rec.last = prev_gid;
1774
0
    range_rec.value = prev_klass;
1775
1776
0
    auto *record = c->copy (range_rec);
1777
0
    if (unlikely (!record)) return_trace (false);
1778
1779
0
    for (const auto gid_klass_pair : + (++it))
1780
0
    {
1781
0
      hb_codepoint_t cur_gid = gid_klass_pair.first;
1782
0
      unsigned cur_klass = gid_klass_pair.second;
1783
1784
0
      if (cur_gid != prev_gid + 1 ||
1785
0
    cur_klass != prev_klass)
1786
0
      {
1787
1788
0
  if (unlikely (cur_gid < prev_gid))
1789
0
    unsorted = true;
1790
1791
0
  if (unlikely (!record)) break;
1792
0
  record->last = prev_gid;
1793
0
  num_ranges++;
1794
1795
0
  range_rec.first = cur_gid;
1796
0
  range_rec.last = cur_gid;
1797
0
  range_rec.value = cur_klass;
1798
1799
0
  record = c->copy (range_rec);
1800
0
      }
1801
1802
0
      prev_klass = cur_klass;
1803
0
      prev_gid = cur_gid;
1804
0
    }
1805
1806
0
    if (unlikely (c->in_error ())) return_trace (false);
1807
1808
0
    if (likely (record)) record->last = prev_gid;
1809
0
    rangeRecord.len = num_ranges;
1810
1811
0
    if (unlikely (unsorted))
1812
0
      rangeRecord.as_array ().qsort (RangeRecord<Types>::cmp_range);
1813
1814
0
    return_trace (true);
1815
0
  }
Unexecuted instantiation: hb-aat-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-aat-map.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-face.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-font.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-color.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-face.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-fetch.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-font.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: VARC.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-math.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-metrics.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shape.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-var.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-static.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-style.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-cff1-table.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-cff2-table.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shaper-arabic.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-ot-shape-fallback.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_8RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI13hb_map_iter_tIS5_IS6_INS1_6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNSB_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKSB_11clone_rangeESD_jjEUljE0_RK3$_8LSG_0EEZNKSB_11clone_rangeESD_jjEUl9hb_pair_tIjjEE_LSF_1ELSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSW_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSW_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tIS5_I13hb_map_iter_tINS1_6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNSB_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNSB_6shrinkESD_jEUljE0_RK3$_8LSG_0EESL_RK3$_6LSG_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSS_18is_sorted_iteratorEvE4typeELSG_0EEEbP22hb_serialize_context_tSS_
Unexecuted instantiation: hb-subset-cff1.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-cff2.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
Unexecuted instantiation: hb-subset-cff-common.cc:_ZN2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9serializeI16hb_filter_iter_tI17hb_sorted_array_tIK9hb_pair_tIjjEERK3$_7RK3$_6LPv0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSK_18is_sorted_iteratorEvE4typeELSH_0EEEbP22hb_serialize_context_tSK_
1816
1817
  bool subset (hb_subset_context_t *c,
1818
         hb_map_t *klass_map = nullptr /*OUT*/,
1819
               bool keep_empty_table = true,
1820
               bool use_class_zero = true,
1821
               const Coverage* glyph_filter = nullptr) const
1822
0
  {
1823
0
    TRACE_SUBSET (this);
1824
0
    const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
1825
1826
0
    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
1827
0
    hb_set_t orig_klasses;
1828
1829
0
    if (glyph_set.get_population () * hb_bit_storage ((unsigned) rangeRecord.len)
1830
0
  < get_population ())
1831
0
    {
1832
0
      for (hb_codepoint_t g : glyph_set)
1833
0
      {
1834
0
  unsigned klass = get_class (g);
1835
0
  if (!klass) continue;
1836
0
  hb_codepoint_t new_gid = c->plan->map_gsub_glyph (g);
1837
0
  if (new_gid == HB_MAP_VALUE_INVALID) continue;
1838
0
  if (glyph_filter && !glyph_filter->has (g)) continue;
1839
0
  glyph_and_klass.push (hb_pair (new_gid, klass));
1840
0
  orig_klasses.add (klass);
1841
0
      }
1842
0
    }
1843
0
    else
1844
0
    {
1845
0
      unsigned num_source_glyphs = c->plan->source->get_num_glyphs ();
1846
0
      for (auto &range : rangeRecord)
1847
0
      {
1848
0
  unsigned klass = range.value;
1849
0
  if (!klass) continue;
1850
0
  hb_codepoint_t start = range.first;
1851
0
  hb_codepoint_t end   = hb_min (range.last + 1, num_source_glyphs);
1852
0
  for (hb_codepoint_t g = start; g < end; g++)
1853
0
  {
1854
0
    hb_codepoint_t new_gid = c->plan->map_gsub_glyph (g);
1855
0
    if (new_gid == HB_MAP_VALUE_INVALID) continue;
1856
0
    if (glyph_filter && !glyph_filter->has (g)) continue;
1857
1858
0
    glyph_and_klass.push (hb_pair (new_gid, klass));
1859
0
    orig_klasses.add (klass);
1860
0
  }
1861
0
      }
1862
0
    }
1863
1864
0
    const hb_set_t& glyphset = *c->plan->glyphset_gsub ();
1865
0
    unsigned glyph_count = glyph_filter
1866
0
                           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
1867
0
                           : glyphset.get_population ();
1868
0
    use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length;
1869
0
    if (!ClassDef_remap_and_serialize (c->serializer,
1870
0
                                       orig_klasses,
1871
0
                                       use_class_zero,
1872
0
                                       glyph_and_klass,
1873
0
                                       klass_map))
1874
0
      return_trace (false);
1875
0
    return_trace (keep_empty_table || (bool) glyph_and_klass);
1876
0
  }
1877
1878
  bool sanitize (hb_sanitize_context_t *c) const
1879
96
  {
1880
96
    TRACE_SANITIZE (this);
1881
96
    return_trace (rangeRecord.sanitize (c));
1882
96
  }
1883
1884
0
  unsigned cost () const { return hb_bit_storage ((unsigned) rangeRecord.len); /* bsearch cost */ }
1885
1886
  template <typename set_t>
1887
  bool collect_coverage (set_t *glyphs) const
1888
0
  {
1889
0
    for (auto &range : rangeRecord)
1890
0
      if (range.value)
1891
0
  if (unlikely (!range.collect_coverage (glyphs)))
1892
0
    return false;
1893
0
    return true;
1894
0
  }
1895
1896
  template <typename set_t>
1897
  bool collect_class (set_t *glyphs, unsigned int klass) const
1898
0
  {
1899
0
    for (auto &range : rangeRecord)
1900
0
    {
1901
0
      if (range.value == klass)
1902
0
  if (unlikely (!range.collect_coverage (glyphs)))
1903
0
    return false;
1904
0
    }
1905
0
    return true;
1906
0
  }
Unexecuted instantiation: bool OT::ClassDefFormat2_4<OT::Layout::SmallTypes>::collect_class<hb_set_t>(hb_set_t*, unsigned int) const
Unexecuted instantiation: bool OT::ClassDefFormat2_4<OT::Layout::SmallTypes>::collect_class<hb_set_digest_t>(hb_set_digest_t*, unsigned int) const
1907
1908
  bool intersects (const hb_set_t *glyphs) const
1909
0
  {
1910
0
    if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len))
1911
0
    {
1912
0
      for (auto g : *glyphs)
1913
0
        if (get_class (g))
1914
0
    return true;
1915
0
      return false;
1916
0
    }
1917
1918
0
    return hb_any (+ hb_iter (rangeRecord)
1919
0
                   | hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs) && range.value; }));
1920
0
  }
1921
  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
1922
0
  {
1923
0
    if (klass == 0)
1924
0
    {
1925
      /* An empty ClassDef assigns class zero to every glyph, so it intersects
1926
       * class zero as long as there is any glyph at all.  The loop below is a
1927
       * no-op when there are no ranges, and the `g != HB_SET_VALUE_INVALID`
1928
       * guard after it would then wrongly report no intersection. */
1929
0
      if (!rangeRecord.len)
1930
0
        return !glyphs->is_empty ();
1931
1932
      /* Match if there's any glyph that is not listed! */
1933
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1934
0
      hb_codepoint_t last = HB_SET_VALUE_INVALID;
1935
0
      auto it = hb_iter (rangeRecord);
1936
0
      for (auto &range : it)
1937
0
      {
1938
0
        if (it->first == last + 1)
1939
0
  {
1940
0
    it++;
1941
0
    continue;
1942
0
  }
1943
1944
0
  if (!glyphs->next (&g))
1945
0
    break;
1946
0
  if (g < range.first)
1947
0
    return true;
1948
0
  g = range.last;
1949
0
  last = g;
1950
0
      }
1951
0
      if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
1952
0
  return true;
1953
      /* Fall through. */
1954
0
    }
1955
0
    for (const auto &range : rangeRecord)
1956
0
      if (range.value == klass && range.intersects (*glyphs))
1957
0
  return true;
1958
0
    return false;
1959
0
  }
1960
1961
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
1962
0
  {
1963
0
    if (klass == 0)
1964
0
    {
1965
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1966
0
      for (auto &range : rangeRecord)
1967
0
      {
1968
0
  if (!glyphs->next (&g))
1969
0
    goto done;
1970
0
  while (g < range.first)
1971
0
  {
1972
0
    intersect_glyphs->add (g);
1973
0
    if (!glyphs->next (&g))
1974
0
      goto done;
1975
0
        }
1976
0
        g = range.last;
1977
0
      }
1978
0
      while (glyphs->next (&g))
1979
0
  intersect_glyphs->add (g);
1980
0
      done:
1981
1982
0
      return;
1983
0
    }
1984
1985
0
    unsigned count = rangeRecord.len;
1986
0
    if (count > glyphs->get_population () * hb_bit_storage (count))
1987
0
    {
1988
0
      for (auto g : *glyphs)
1989
0
      {
1990
0
        unsigned i;
1991
0
        if (rangeRecord.as_array ().bfind (g, &i) &&
1992
0
      rangeRecord.arrayZ[i].value == klass)
1993
0
    intersect_glyphs->add (g);
1994
0
      }
1995
0
      return;
1996
0
    }
1997
1998
0
    for (auto &range : rangeRecord)
1999
0
    {
2000
0
      if (range.value != klass) continue;
2001
2002
0
      unsigned end = range.last + 1;
2003
0
      for (hb_codepoint_t g = range.first - 1;
2004
0
     glyphs->next (&g) && g < end;)
2005
0
  intersect_glyphs->add (g);
2006
0
    }
2007
0
  }
2008
2009
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
2010
0
  {
2011
0
    if (glyphs->is_empty ()) return;
2012
2013
    /* An empty ClassDef assigns class zero to every glyph, so every glyph in
2014
     * `glyphs` intersects class zero.  Handle it up front: the loops below are
2015
     * no-ops when there are no ranges, and the `g != HB_SET_VALUE_INVALID`
2016
     * guard would then wrongly skip adding class zero. */
2017
0
    if (!rangeRecord.len)
2018
0
    {
2019
0
      intersect_classes->add (0);
2020
0
      return;
2021
0
    }
2022
2023
0
    hb_codepoint_t g = HB_SET_VALUE_INVALID;
2024
0
    for (auto &range : rangeRecord)
2025
0
    {
2026
0
      if (!glyphs->next (&g))
2027
0
        break;
2028
0
      if (g < range.first)
2029
0
      {
2030
0
        intersect_classes->add (0);
2031
0
        break;
2032
0
      }
2033
0
      g = range.last;
2034
0
    }
2035
0
    if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
2036
0
      intersect_classes->add (0);
2037
2038
0
    for (const auto& range : rangeRecord)
2039
0
      if (range.intersects (*glyphs))
2040
0
        intersect_classes->add (range.value);
2041
0
  }
2042
2043
  protected:
2044
  HBUINT16  classFormat;  /* Format identifier--format = 2 */
2045
  typename Types::template SortedArrayOf<RangeRecord<Types>>
2046
    rangeRecord;  /* Array of glyph ranges--ordered by
2047
         * Start GlyphID */
2048
  public:
2049
  DEFINE_SIZE_ARRAY (2 + Types::size, rangeRecord);
2050
};
2051
2052
struct ClassDef
2053
{
2054
  /* Has interface. */
2055
0
  unsigned operator [] (hb_codepoint_t k) const { return get (k); }
2056
0
  bool has (hb_codepoint_t k) const { return (*this)[k]; }
2057
  /* Projection. */
2058
0
  hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); }
2059
2060
0
  unsigned int get (hb_codepoint_t k) const { return get_class (k); }
2061
  unsigned int get_class (hb_codepoint_t glyph_id) const
2062
772k
  {
2063
772k
    switch (u.format.v) {
2064
0
    case 1: hb_barrier (); return u.format1.get_class (glyph_id);
2065
772k
    case 2: hb_barrier (); return u.format2.get_class (glyph_id);
2066
#ifndef HB_NO_BEYOND_64K
2067
    case 3: hb_barrier (); return u.format3.get_class (glyph_id);
2068
    case 4: hb_barrier (); return u.format4.get_class (glyph_id);
2069
#endif
2070
0
    default:return 0;
2071
772k
    }
2072
772k
  }
2073
  unsigned int get_class (hb_codepoint_t glyph_id,
2074
        hb_ot_layout_mapping_cache_t *cache) const
2075
0
  {
2076
0
    unsigned klass;
2077
0
    if (cache && cache->get (glyph_id, &klass)) return klass;
2078
0
    klass = get_class (glyph_id);
2079
0
    if (cache) cache->set (glyph_id, klass);
2080
0
    return klass;
2081
0
  }
2082
2083
  unsigned get_population () const
2084
0
  {
2085
0
    switch (u.format.v) {
2086
0
    case 1: hb_barrier (); return u.format1.get_population ();
2087
0
    case 2: hb_barrier (); return u.format2.get_population ();
2088
0
#ifndef HB_NO_BEYOND_64K
2089
0
    case 3: hb_barrier (); return u.format3.get_population ();
2090
0
    case 4: hb_barrier (); return u.format4.get_population ();
2091
0
#endif
2092
0
    default:return NOT_COVERED;
2093
0
    }
2094
0
  }
2095
2096
  template<typename Iterator,
2097
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
2098
  bool serialize (hb_serialize_context_t *c, Iterator it_with_class_zero)
2099
0
  {
2100
0
    TRACE_SERIALIZE (this);
2101
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2102
2103
0
    auto it = + it_with_class_zero | hb_filter (hb_second);
2104
2105
0
    unsigned format = 2;
2106
0
    hb_codepoint_t glyph_max = 0;
2107
0
    if (likely (it))
2108
0
    {
2109
0
      hb_codepoint_t glyph_min = (*it).first;
2110
0
      glyph_max = glyph_min;
2111
2112
0
      unsigned num_glyphs = 0;
2113
0
      unsigned num_ranges = 1;
2114
0
      hb_codepoint_t prev_gid = glyph_min;
2115
0
      unsigned prev_klass = (*it).second;
2116
2117
0
      for (const auto gid_klass_pair : it)
2118
0
      {
2119
0
  hb_codepoint_t cur_gid = gid_klass_pair.first;
2120
0
  unsigned cur_klass = gid_klass_pair.second;
2121
0
        num_glyphs++;
2122
0
  if (cur_gid == glyph_min) continue;
2123
0
        if (cur_gid > glyph_max) glyph_max = cur_gid;
2124
0
  if (cur_gid != prev_gid + 1 ||
2125
0
      cur_klass != prev_klass)
2126
0
    num_ranges++;
2127
2128
0
  prev_gid = cur_gid;
2129
0
  prev_klass = cur_klass;
2130
0
      }
2131
2132
0
      if (num_glyphs && 1 + (glyph_max - glyph_min + 1) <= num_ranges * 3)
2133
0
  format = 1;
2134
0
    }
2135
2136
#ifndef HB_NO_BEYOND_64K
2137
    if (glyph_max > 0xFFFFu)
2138
      u.format.v += 2;
2139
    if (unlikely (glyph_max > 0xFFFFFFu))
2140
#else
2141
0
    if (unlikely (glyph_max > 0xFFFFu))
2142
0
#endif
2143
0
    {
2144
0
      c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW);
2145
0
      return_trace (false);
2146
0
    }
2147
2148
0
    u.format.v = format;
2149
2150
0
    switch (u.format.v)
2151
0
    {
2152
0
    case 1: hb_barrier (); return_trace (u.format1.serialize (c, it));
2153
0
    case 2: hb_barrier (); return_trace (u.format2.serialize (c, it));
2154
#ifndef HB_NO_BEYOND_64K
2155
    case 3: hb_barrier (); return_trace (u.format3.serialize (c, it));
2156
    case 4: hb_barrier (); return_trace (u.format4.serialize (c, it));
2157
#endif
2158
0
    default:return_trace (false);
2159
0
    }
2160
0
  }
Unexecuted instantiation: _ZN2OT8ClassDef9serializeI17hb_sorted_array_tIK9hb_pair_tIjjEETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrS8_18is_sorted_iteratorEvE4typeELPv0EEEbP22hb_serialize_context_tS8_
Unexecuted instantiation: hb-subset.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset-table-layout.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset-table-var.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset-table-cff.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset-table-color.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: hb-subset-table-other.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT8ClassDef9serializeI13hb_map_iter_tI16hb_filter_iter_tIS2_INS_6Layout6Common8Coverage6iter_tEZNK5graph14PairPosFormat211clone_rangeERNS9_15split_context_tEjjEUljE_L24hb_function_sortedness_t1ELPv0EEZNKS9_11clone_rangeESB_jjEUljE0_RK3$_8LSE_0EEZNKS9_11clone_rangeESB_jjEUl9hb_pair_tIjjEE_LSD_1ELSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSQ_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSQ_
Unexecuted instantiation: gsubgpos-context.cc:_ZN2OT8ClassDef9serializeI16hb_filter_iter_tI13hb_map_iter_tINS_6Layout6Common8Coverage6iter_tEZN5graph14PairPosFormat26shrinkERNS9_15split_context_tEjEUljE_L24hb_function_sortedness_t1ELPv0EEZNS9_6shrinkESB_jEUljE0_RK3$_8LSE_0EETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrSM_18is_sorted_iteratorEvE4typeELSE_0EEEbP22hb_serialize_context_tSM_
2161
2162
  bool subset (hb_subset_context_t *c,
2163
         hb_map_t *klass_map = nullptr /*OUT*/,
2164
               bool keep_empty_table = true,
2165
               bool use_class_zero = true,
2166
               const Coverage* glyph_filter = nullptr) const
2167
0
  {
2168
0
    TRACE_SUBSET (this);
2169
0
    switch (u.format.v) {
2170
0
    case 1: hb_barrier (); return_trace (u.format1.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2171
0
    case 2: hb_barrier (); return_trace (u.format2.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2172
#ifndef HB_NO_BEYOND_64K
2173
    case 3: hb_barrier (); return_trace (u.format3.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2174
    case 4: hb_barrier (); return_trace (u.format4.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2175
#endif
2176
0
    default:return_trace (false);
2177
0
    }
2178
0
  }
2179
2180
  bool sanitize (hb_sanitize_context_t *c) const
2181
96
  {
2182
96
    TRACE_SANITIZE (this);
2183
96
    if (!u.format.v.sanitize (c)) return_trace (false);
2184
96
    hb_barrier ();
2185
96
    switch (u.format.v) {
2186
0
    case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
2187
96
    case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
2188
#ifndef HB_NO_BEYOND_64K
2189
    case 3: hb_barrier (); return_trace (u.format3.sanitize (c));
2190
    case 4: hb_barrier (); return_trace (u.format4.sanitize (c));
2191
#endif
2192
0
    default:return_trace (true);
2193
96
    }
2194
96
  }
2195
2196
  unsigned cost () const
2197
0
  {
2198
0
    switch (u.format.v) {
2199
0
    case 1: hb_barrier (); return u.format1.cost ();
2200
0
    case 2: hb_barrier (); return u.format2.cost ();
2201
#ifndef HB_NO_BEYOND_64K
2202
    case 3: hb_barrier (); return u.format3.cost ();
2203
    case 4: hb_barrier (); return u.format4.cost ();
2204
#endif
2205
0
    default:return 0u;
2206
0
    }
2207
0
  }
2208
2209
  /* Might return false if array looks unsorted.
2210
   * Used for faster rejection of corrupt data. */
2211
  template <typename set_t>
2212
  bool collect_coverage (set_t *glyphs) const
2213
0
  {
2214
0
    switch (u.format.v) {
2215
0
    case 1: hb_barrier (); return u.format1.collect_coverage (glyphs);
2216
0
    case 2: hb_barrier (); return u.format2.collect_coverage (glyphs);
2217
#ifndef HB_NO_BEYOND_64K
2218
    case 3: hb_barrier (); return u.format3.collect_coverage (glyphs);
2219
    case 4: hb_barrier (); return u.format4.collect_coverage (glyphs);
2220
#endif
2221
0
    default:return false;
2222
0
    }
2223
0
  }
2224
2225
  /* Might return false if array looks unsorted.
2226
   * Used for faster rejection of corrupt data. */
2227
  template <typename set_t>
2228
  bool collect_class (set_t *glyphs, unsigned int klass) const
2229
0
  {
2230
0
    switch (u.format.v) {
2231
0
    case 1: hb_barrier (); return u.format1.collect_class (glyphs, klass);
2232
0
    case 2: hb_barrier (); return u.format2.collect_class (glyphs, klass);
2233
#ifndef HB_NO_BEYOND_64K
2234
    case 3: hb_barrier (); return u.format3.collect_class (glyphs, klass);
2235
    case 4: hb_barrier (); return u.format4.collect_class (glyphs, klass);
2236
#endif
2237
0
    default:return false;
2238
0
    }
2239
0
  }
Unexecuted instantiation: bool OT::ClassDef::collect_class<hb_set_t>(hb_set_t*, unsigned int) const
Unexecuted instantiation: bool OT::ClassDef::collect_class<hb_set_digest_t>(hb_set_digest_t*, unsigned int) const
2240
2241
  bool intersects (const hb_set_t *glyphs) const
2242
0
  {
2243
0
    switch (u.format.v) {
2244
0
    case 1: hb_barrier (); return u.format1.intersects (glyphs);
2245
0
    case 2: hb_barrier (); return u.format2.intersects (glyphs);
2246
#ifndef HB_NO_BEYOND_64K
2247
    case 3: hb_barrier (); return u.format3.intersects (glyphs);
2248
    case 4: hb_barrier (); return u.format4.intersects (glyphs);
2249
#endif
2250
0
    default:return false;
2251
0
    }
2252
0
  }
2253
  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
2254
0
  {
2255
0
    switch (u.format.v) {
2256
0
    case 1: hb_barrier (); return u.format1.intersects_class (glyphs, klass);
2257
0
    case 2: hb_barrier (); return u.format2.intersects_class (glyphs, klass);
2258
#ifndef HB_NO_BEYOND_64K
2259
    case 3: hb_barrier (); return u.format3.intersects_class (glyphs, klass);
2260
    case 4: hb_barrier (); return u.format4.intersects_class (glyphs, klass);
2261
#endif
2262
0
    default:return false;
2263
0
    }
2264
0
  }
2265
2266
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
2267
0
  {
2268
0
    switch (u.format.v) {
2269
0
    case 1: hb_barrier (); return u.format1.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2270
0
    case 2: hb_barrier (); return u.format2.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2271
#ifndef HB_NO_BEYOND_64K
2272
    case 3: hb_barrier (); return u.format3.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2273
    case 4: hb_barrier (); return u.format4.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2274
#endif
2275
0
    default:return;
2276
0
    }
2277
0
  }
2278
2279
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
2280
0
  {
2281
0
    switch (u.format.v) {
2282
0
    case 1: hb_barrier (); return u.format1.intersected_classes (glyphs, intersect_classes);
2283
0
    case 2: hb_barrier (); return u.format2.intersected_classes (glyphs, intersect_classes);
2284
#ifndef HB_NO_BEYOND_64K
2285
    case 3: hb_barrier (); return u.format3.intersected_classes (glyphs, intersect_classes);
2286
    case 4: hb_barrier (); return u.format4.intersected_classes (glyphs, intersect_classes);
2287
#endif
2288
0
    default:return;
2289
0
    }
2290
0
  }
2291
2292
2293
  protected:
2294
  union {
2295
  struct { HBUINT16 v; }  format;   /* Format identifier */
2296
  ClassDefFormat1_3<SmallTypes> format1;
2297
  ClassDefFormat2_4<SmallTypes> format2;
2298
#ifndef HB_NO_BEYOND_64K
2299
  ClassDefFormat1_3<MediumTypes>format3;
2300
  ClassDefFormat2_4<MediumTypes>format4;
2301
#endif
2302
  } u;
2303
  public:
2304
  DEFINE_SIZE_UNION (2, format.v);
2305
};
2306
2307
template<typename Iterator>
2308
static inline bool ClassDef_serialize (hb_serialize_context_t *c,
2309
               Iterator it)
2310
0
{ return (c->start_embed<ClassDef> ()->serialize (c, it)); }
Unexecuted instantiation: hb-aat-layout.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-aat-map.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-face.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-font.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-color.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-face.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-fetch.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-font.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: VARC.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-layout.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-math.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-metrics.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-shape.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-var.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-static.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-style.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-cff1-table.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-cff2-table.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-ot-shape-fallback.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-plan.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-plan-layout.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-plan-var.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-table-layout.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-table-layout.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-layout.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-var.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-var.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-var.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-table-cff.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-cff.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-cff.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-table-color.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-color.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-color.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-table-other.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-other.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-table-other.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: gsubgpos-context.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: gsubgpos-context.cc:bool OT::ClassDef_serialize<hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_map_iter_t<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>, graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(hb_pair_t<unsigned int, unsigned int>)#1}, (graph::PairPosFormat2::clone_range(graph::PairPosFormat2::split_context_t&, unsigned int, unsigned int) const::{lambda(unsigned int)#1})1, (hb_function_sortedness_t)0>)
Unexecuted instantiation: gsubgpos-context.cc:bool OT::ClassDef_serialize<hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0> >(hb_serialize_context_t*, hb_filter_iter_t<hb_map_iter_t<OT::Layout::Common::Coverage::iter_t, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#1}, (hb_function_sortedness_t)1, (void*)0>, graph::PairPosFormat2::shrink(graph::PairPosFormat2::split_context_t&, unsigned int)::{lambda(unsigned int)#2}, $_8 const&, (hb_function_sortedness_t)0>)
Unexecuted instantiation: hb-subset-cff1.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-cff2.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
Unexecuted instantiation: hb-subset-cff-common.cc:bool OT::ClassDef_serialize<hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const> >(hb_serialize_context_t*, hb_sorted_array_t<hb_pair_t<unsigned int, unsigned int> const>)
2311
2312
2313
/*
2314
 * Item Variation Store
2315
 */
2316
2317
/* ported from fonttools (class _Encoding) */
2318
struct delta_row_encoding_t
2319
{
2320
  /* each byte represents a region, value is one of 0/1/2/4, which means bytes
2321
   * needed for this region */
2322
  struct chars_t : hb_vector_t<uint8_t>
2323
  {
2324
    int cmp (const chars_t& other) const
2325
0
    {
2326
0
      return as_array ().cmp (other.as_array ());
2327
0
    }
2328
2329
    hb_pair_t<unsigned, unsigned> get_width ()
2330
0
    {
2331
0
      unsigned width = 0;
2332
0
      unsigned columns = 0;
2333
0
      for (unsigned i = 0; i < length; i++)
2334
0
      {
2335
0
  unsigned v = arrayZ[i];
2336
0
  width += v;
2337
0
  columns += (v != 0);
2338
0
      }
2339
0
      return hb_pair (width, columns);
2340
0
    }
2341
2342
    HB_HOT
2343
    hb_pair_t<unsigned, unsigned> combine_width (const chars_t& other) const
2344
0
    {
2345
0
      unsigned combined_width = 0;
2346
0
      unsigned combined_columns = 0;
2347
0
      for (unsigned i = 0; i < length; i++)
2348
0
      {
2349
0
        unsigned v = hb_max (arrayZ[i], other.arrayZ[i]);
2350
0
  combined_width += v;
2351
0
  combined_columns += (v != 0);
2352
0
      }
2353
0
      return hb_pair (combined_width, combined_columns);
2354
0
    }
2355
  };
2356
2357
0
  hb_pair_t<unsigned, unsigned> combine_width (const delta_row_encoding_t& other_encoding) const { return chars.combine_width (other_encoding.chars); }
2358
2359
  // Actual data
2360
2361
  chars_t chars;
2362
  unsigned width = 0;
2363
  unsigned overhead = 0;
2364
  hb_vector_t<const hb_vector_t<int>*> items;
2365
2366
0
  delta_row_encoding_t () = default;
2367
  delta_row_encoding_t (hb_vector_t<const hb_vector_t<int>*> &&rows, unsigned num_cols)
2368
0
  {
2369
0
    assert (rows);
2370
2371
0
    items = std::move (rows);
2372
2373
0
    if (unlikely (!chars.resize (num_cols)))
2374
0
      return;
2375
2376
0
    calculate_chars ();
2377
0
  }
2378
2379
  void merge (const delta_row_encoding_t& other)
2380
0
  {
2381
0
    items.alloc (items.length + other.items.length);
2382
0
    for (auto &row : other.items)
2383
0
      add_row (row);
2384
2385
    // Merge chars
2386
0
    assert (chars.length == other.chars.length);
2387
0
    for (unsigned i = 0; i < chars.length; i++)
2388
0
      chars.arrayZ[i] = hb_max (chars.arrayZ[i], other.chars.arrayZ[i]);
2389
0
    chars_changed ();
2390
0
  }
2391
2392
  void chars_changed ()
2393
0
  {
2394
0
    auto _ = chars.get_width ();
2395
0
    width = _.first;
2396
0
    overhead = get_chars_overhead (_.second);
2397
0
  }
2398
2399
  void calculate_chars ()
2400
0
  {
2401
0
    assert (items);
2402
2403
0
    bool long_words = false;
2404
2405
0
    for (auto &row : items)
2406
0
    {
2407
0
      assert (row->length == chars.length);
2408
2409
      /* 0/1/2 byte encoding */
2410
0
      for (unsigned i = 0; i < row->length; i++)
2411
0
      {
2412
0
  int v =  row->arrayZ[i];
2413
0
  if (v == 0)
2414
0
    continue;
2415
0
  else if (v > 32767 || v < -32768)
2416
0
  {
2417
0
    long_words = true;
2418
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 4);
2419
0
  }
2420
0
  else if (v > 127 || v < -128)
2421
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 2);
2422
0
  else
2423
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 1);
2424
0
      }
2425
0
    }
2426
2427
0
    if (long_words)
2428
0
    {
2429
      // Convert 1s to 2s
2430
0
      for (auto &v : chars)
2431
0
  if (v == 1)
2432
0
    v = 2;
2433
0
    }
2434
2435
0
    chars_changed ();
2436
0
  }
2437
2438
  bool is_empty () const
2439
0
  { return !items; }
2440
2441
  static inline unsigned get_chars_overhead (unsigned num_columns)
2442
0
  {
2443
0
    unsigned c = 4 + 6; // 4 bytes for LOffset, 6 bytes for VarData header
2444
0
    return c + num_columns * 2;
2445
0
  }
2446
2447
  unsigned get_gain (unsigned additional_bytes_per_rows = 1) const
2448
0
  {
2449
0
    int count = items.length;
2450
0
    return hb_max (0, (int) overhead - count * (int) additional_bytes_per_rows);
2451
0
  }
2452
2453
  int gain_from_merging (const delta_row_encoding_t& other_encoding) const
2454
0
  {
2455
    // Back of the envelope calculations to reject early.
2456
0
    signed additional_bytes_per_rows = other_encoding.width - width;
2457
0
    if (additional_bytes_per_rows > 0)
2458
0
    {
2459
0
      if (get_gain (additional_bytes_per_rows) == 0)
2460
0
        return 0;
2461
0
    }
2462
0
    else
2463
0
    {
2464
0
      if (other_encoding.get_gain (-additional_bytes_per_rows) == 0)
2465
0
  return 0;
2466
0
    }
2467
2468
0
    auto pair = combine_width (other_encoding);
2469
0
    unsigned combined_width = pair.first;
2470
0
    unsigned combined_columns = pair.second;
2471
2472
0
    int combined_gain = (int) overhead + (int) other_encoding.overhead;
2473
0
    combined_gain -= (combined_width - (int) width) * items.length;
2474
0
    combined_gain -= (combined_width - (int) other_encoding.width) * other_encoding.items.length;
2475
0
    combined_gain -= get_chars_overhead (combined_columns);
2476
2477
0
    return combined_gain;
2478
0
  }
2479
2480
  bool add_row (const hb_vector_t<int>* row)
2481
0
  { return items.push (row); }
2482
2483
  static int cmp (const void *pa, const void *pb)
2484
0
  {
2485
0
    const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
2486
0
    const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
2487
2488
0
    if (a->width != b->width)
2489
0
      return (int) a->width - (int) b->width;
2490
2491
0
    return b->chars.cmp (a->chars);
2492
0
  }
2493
};
2494
2495
struct VarRegionAxis
2496
{
2497
  float evaluate (int coord) const
2498
0
  {
2499
0
    int peak = peakCoord.to_int ();
2500
0
    if (peak == 0 || coord == peak)
2501
0
      return 1.f;
2502
0
    else if (coord == 0) // Faster
2503
0
      return 0.f;
2504
2505
0
    int start = startCoord.to_int (), end = endCoord.to_int ();
2506
2507
    /* TODO Move these to sanitize(). */
2508
0
    if (unlikely (start > peak || peak > end))
2509
0
      return 1.f;
2510
0
    if (unlikely (start < 0 && end > 0))
2511
0
      return 1.f;
2512
2513
0
    if (coord <= start || end <= coord)
2514
0
      return 0.f;
2515
2516
    /* Interpolate */
2517
0
    if (coord < peak)
2518
0
      return float (coord - start) / (peak - start);
2519
0
    else
2520
0
      return float (end - coord) / (end - peak);
2521
0
  }
2522
2523
  bool sanitize (hb_sanitize_context_t *c) const
2524
0
  {
2525
0
    TRACE_SANITIZE (this);
2526
0
    return_trace (c->check_struct (this));
2527
0
  }
2528
2529
  bool serialize (hb_serialize_context_t *c) const
2530
0
  {
2531
0
    TRACE_SERIALIZE (this);
2532
0
    return_trace (c->embed (this));
2533
0
  }
2534
2535
  public:
2536
  F2DOT14 startCoord;
2537
  F2DOT14 peakCoord;
2538
  F2DOT14 endCoord;
2539
  public:
2540
  DEFINE_SIZE_STATIC (6);
2541
};
2542
struct SparseVarRegionAxis
2543
{
2544
  float evaluate (const int *coords, unsigned int coord_len) const
2545
0
  {
2546
0
    unsigned i = axisIndex;
2547
0
    int coord = i < coord_len ? coords[i] : 0;
2548
0
    return axis.evaluate (coord);
2549
0
  }
2550
2551
  bool sanitize (hb_sanitize_context_t *c) const
2552
0
  {
2553
0
    TRACE_SANITIZE (this);
2554
0
    return_trace (c->check_struct (this));
2555
0
  }
2556
2557
  bool serialize (hb_serialize_context_t *c) const
2558
0
  {
2559
0
    TRACE_SERIALIZE (this);
2560
0
    return_trace (c->embed (this));
2561
0
  }
2562
2563
  public:
2564
  HBUINT16 axisIndex;
2565
  VarRegionAxis axis;
2566
  public:
2567
  DEFINE_SIZE_STATIC (8);
2568
};
2569
2570
struct hb_scalar_cache_t
2571
{
2572
  private:
2573
  static constexpr unsigned STATIC_LENGTH = 128;
2574
  static constexpr int INVALID = INT_MIN;
2575
  static constexpr float MULTIPLIER = 1 << ((sizeof (int) * 8) - 2);
2576
  static constexpr float DIVISOR = 1.f / MULTIPLIER;
2577
2578
  public:
2579
0
  hb_scalar_cache_t () {}
2580
2581
  hb_scalar_cache_t (const hb_scalar_cache_t&) = delete;
2582
  hb_scalar_cache_t (hb_scalar_cache_t&&) = delete;
2583
  hb_scalar_cache_t& operator= (const hb_scalar_cache_t&) = delete;
2584
  hb_scalar_cache_t& operator= (hb_scalar_cache_t&&) = delete;
2585
2586
  static hb_scalar_cache_t *create (unsigned int count,
2587
            hb_scalar_cache_t *scratch_cache = nullptr)
2588
150k
  {
2589
150k
    if (!count) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
2590
2591
0
    if (scratch_cache && count <= STATIC_LENGTH)
2592
0
    {
2593
0
      scratch_cache->length = count;
2594
0
      scratch_cache->clear ();
2595
0
      return scratch_cache;
2596
0
    }
2597
2598
0
    auto *cache = (hb_scalar_cache_t *) hb_malloc (sizeof (hb_scalar_cache_t) - sizeof (static_values) + sizeof (static_values[0]) * count);
2599
0
    if (unlikely (!cache)) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
2600
2601
0
    cache->length = count;
2602
0
    cache->clear ();
2603
2604
0
    return cache;
2605
0
  }
2606
2607
  static void destroy (hb_scalar_cache_t *cache,
2608
           hb_scalar_cache_t *scratch_cache = nullptr)
2609
149k
  {
2610
149k
    if (cache != &Null(hb_scalar_cache_t) && cache != scratch_cache)
2611
0
      hb_free (cache);
2612
149k
  }
2613
2614
  void clear ()
2615
0
  {
2616
0
    auto *values = &static_values[0];
2617
0
    unsigned i = 0;
2618
0
#ifndef HB_OPTIMIZE_SIZE
2619
0
    for (; i + 3 < length; i += 4)
2620
0
    {
2621
0
      values[i + 0] = INVALID;
2622
0
      values[i + 1] = INVALID;
2623
0
      values[i + 2] = INVALID;
2624
0
      values[i + 3] = INVALID;
2625
0
    }
2626
0
#endif
2627
0
    for (; i < length; i++)
2628
0
      values[i] = INVALID;
2629
0
  }
2630
2631
  HB_ALWAYS_INLINE
2632
  bool get (unsigned i, float *value) const
2633
0
  {
2634
0
    if (unlikely (i >= length))
2635
0
    {
2636
0
      *value = 0.f;
2637
0
      return true;
2638
0
    }
2639
0
    auto *values = &static_values[0];
2640
0
    auto *cached_value = &values[i];
2641
    // Super hot. Most common path is that we have a cached value of 0.
2642
0
    int v = *cached_value;
2643
0
    if (likely (!v))
2644
0
    {
2645
0
      *value = 0.f;
2646
0
      return true;
2647
0
    }
2648
0
    if (v == INVALID)
2649
0
      return false;
2650
0
    *value = v * DIVISOR;
2651
0
    return true;
2652
0
  }
2653
2654
  HB_ALWAYS_INLINE
2655
  void set (unsigned i, float value)
2656
0
  {
2657
0
    if (unlikely (i >= length)) return;
2658
0
    auto *values = &static_values[0];
2659
0
    auto *cached_value = &values[i];
2660
0
    *cached_value = roundf(value * MULTIPLIER);
2661
0
  }
2662
2663
  public:
2664
  unsigned length;
2665
  private:
2666
  mutable hb_atomic_t<int> static_values[STATIC_LENGTH];
2667
};
2668
2669
struct VarRegionList
2670
{
2671
  private:
2672
  float evaluate_impl (unsigned int region_index,
2673
           const int *coords, unsigned int coord_len) const
2674
0
  {
2675
0
    const VarRegionAxis *axes = axesZ.arrayZ + (region_index * axisCount);
2676
0
    float v = 1.f;
2677
2678
0
    unsigned int count = axisCount;
2679
0
    for (unsigned int i = 0; i < count; i++)
2680
0
    {
2681
0
      int coord = i < coord_len ? coords[i] : 0;
2682
0
      float factor = axes[i].evaluate (coord);
2683
0
      if (factor == 0.f)
2684
0
      {
2685
0
  v = 0.f;
2686
0
  break;
2687
0
      }
2688
0
      v *= factor;
2689
0
    }
2690
2691
0
    return v;
2692
0
  }
2693
2694
  public:
2695
  HB_ALWAYS_INLINE
2696
  float evaluate (unsigned int region_index,
2697
      const int *coords, unsigned int coord_len,
2698
      hb_scalar_cache_t *cache = nullptr) const
2699
0
  {
2700
0
    if (unlikely (region_index >= regionCount))
2701
0
      return 0.;
2702
2703
0
    float v;
2704
0
    if (cache && cache->get (region_index, &v))
2705
0
      return v;
2706
2707
0
    v = evaluate_impl (region_index, coords, coord_len);
2708
2709
0
    if (cache)
2710
0
      cache->set (region_index, v);
2711
0
    return v;
2712
0
  }
2713
2714
  bool sanitize (hb_sanitize_context_t *c) const
2715
0
  {
2716
0
    TRACE_SANITIZE (this);
2717
0
    return_trace (c->check_struct (this) &&
2718
0
      hb_barrier () &&
2719
0
      axesZ.sanitize (c, axisCount * regionCount));
2720
0
  }
2721
2722
  bool serialize (hb_serialize_context_t *c,
2723
                  const hb_vector_t<hb_tag_t>& axis_tags,
2724
                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& regions)
2725
0
  {
2726
0
    TRACE_SERIALIZE (this);
2727
0
    unsigned axis_count = axis_tags.length;
2728
0
    unsigned region_count = regions.length;
2729
0
    if (!axis_count || !region_count) return_trace (false);
2730
0
    if (unlikely (hb_unsigned_mul_overflows (axis_count * region_count,
2731
0
                                             VarRegionAxis::static_size))) return_trace (false);
2732
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2733
0
    axisCount = axis_count;
2734
0
    regionCount = region_count;
2735
2736
0
    for (unsigned r = 0; r < region_count; r++)
2737
0
    {
2738
0
      const auto& region = regions[r];
2739
0
      for (unsigned i = 0; i < axis_count; i++)
2740
0
      {
2741
0
        hb_tag_t tag = axis_tags.arrayZ[i];
2742
0
        VarRegionAxis var_region_rec;
2743
0
        Triple *coords;
2744
0
        if (region->has (tag, &coords))
2745
0
        {
2746
0
          var_region_rec.startCoord.set_float (coords->minimum);
2747
0
          var_region_rec.peakCoord.set_float (coords->middle);
2748
0
          var_region_rec.endCoord.set_float (coords->maximum);
2749
0
        }
2750
0
        else
2751
0
        {
2752
0
          var_region_rec.startCoord.set_int (0);
2753
0
          var_region_rec.peakCoord.set_int (0);
2754
0
          var_region_rec.endCoord.set_int (0);
2755
0
        }
2756
0
        if (!var_region_rec.serialize (c))
2757
0
          return_trace (false);
2758
0
      }
2759
0
    }
2760
0
    return_trace (true);
2761
0
  }
2762
2763
  bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_inc_bimap_t &region_map)
2764
0
  {
2765
0
    TRACE_SERIALIZE (this);
2766
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2767
0
    axisCount = src->axisCount;
2768
0
    regionCount = region_map.get_population ();
2769
0
    if (unlikely (hb_unsigned_mul_overflows (axisCount * regionCount,
2770
0
               VarRegionAxis::static_size))) return_trace (false);
2771
0
    if (unlikely (!c->extend (this))) return_trace (false);
2772
0
    unsigned int region_count = src->regionCount;
2773
0
    for (unsigned int r = 0; r < regionCount; r++)
2774
0
    {
2775
0
      unsigned int backward = region_map.backward (r);
2776
0
      if (backward >= region_count) return_trace (false);
2777
0
      hb_memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount);
2778
0
    }
2779
2780
0
    return_trace (true);
2781
0
  }
2782
2783
  bool get_var_region (unsigned region_index,
2784
                       const hb_map_t& axes_old_index_tag_map,
2785
                       hb_hashmap_t<hb_tag_t, Triple>& axis_tuples /* OUT */) const
2786
0
  {
2787
0
    if (region_index >= regionCount) return false;
2788
0
    const VarRegionAxis* axis_region = axesZ.arrayZ + (region_index * axisCount);
2789
0
    for (unsigned i = 0; i < axisCount; i++)
2790
0
    {
2791
0
      hb_tag_t *axis_tag;
2792
0
      if (!axes_old_index_tag_map.has (i, &axis_tag))
2793
0
        return false;
2794
2795
0
      float min_val = axis_region->startCoord.to_float ();
2796
0
      float def_val = axis_region->peakCoord.to_float ();
2797
0
      float max_val = axis_region->endCoord.to_float ();
2798
2799
0
      if (def_val != 0.f)
2800
0
        axis_tuples.set (*axis_tag, Triple ((double) min_val, (double) def_val, (double) max_val));
2801
0
      axis_region++;
2802
0
    }
2803
0
    return !axis_tuples.in_error ();
2804
0
  }
2805
2806
  bool get_var_regions (const hb_map_t& axes_old_index_tag_map,
2807
                        hb_vector_t<hb_hashmap_t<hb_tag_t, Triple>>& regions /* OUT */) const
2808
0
  {
2809
0
    if (!regions.alloc (regionCount))
2810
0
      return false;
2811
2812
0
    for (unsigned i = 0; i < regionCount; i++)
2813
0
    {
2814
0
      hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
2815
0
      if (!get_var_region (i, axes_old_index_tag_map, axis_tuples))
2816
0
        return false;
2817
0
      regions.push (std::move (axis_tuples));
2818
0
    }
2819
0
    return !regions.in_error ();
2820
0
  }
2821
2822
  size_t get_size () const
2823
0
  { return hb_unsigned_add_saturate (min_size,
2824
0
             hb_unsigned_mul_saturate (VarRegionAxis::static_size,
2825
0
                     axisCount, regionCount)); }
2826
2827
  public:
2828
  HBUINT16  axisCount;
2829
  HBUINT15  regionCount;
2830
  protected:
2831
  UnsizedArrayOf<VarRegionAxis>
2832
    axesZ;
2833
  public:
2834
  DEFINE_SIZE_ARRAY (4, axesZ);
2835
};
2836
2837
/* Whether a variation region is unreachable given per-axis reachable
2838
 * final-coordinate ranges, in F2Dot14 units (avar2 partial-instancing
2839
 * culling; see hb_subset_plan_t::avar2_reachable_ranges). A region is dead
2840
 * if some axis's tent evaluates to zero over the axis's entire reachable
2841
 * range. Mirrors the runtime evaluation: invalid tents evaluate as
2842
 * constant 1 and never kill a region. */
2843
static inline bool
2844
_hb_avar2_region_is_dead (const hb_hashmap_t<hb_tag_t, Triple> &axis_tuples,
2845
        const hb_hashmap_t<hb_tag_t, Triple> &reachable_ranges)
2846
0
{
2847
0
  for (auto _ : axis_tuples)
2848
0
  {
2849
0
    Triple *range;
2850
0
    if (!reachable_ranges.has (_.first, &range)) continue;
2851
0
    const Triple &tent = _.second;
2852
0
    int start = (int) roundf ((float) tent.minimum * 16384.f);
2853
0
    int peak  = (int) roundf ((float) tent.middle * 16384.f);
2854
0
    int end   = (int) roundf ((float) tent.maximum * 16384.f);
2855
0
    if (!peak) continue;
2856
0
    if (start > peak || peak > end) continue;
2857
0
    if (start < 0 && end > 0) continue;
2858
0
    int lo = (int) roundf ((float) range->minimum * 16384.f);
2859
0
    int hi = (int) roundf ((float) range->maximum * 16384.f);
2860
    /* Strict comparisons: the scalar is 1 (not 0) at v == peak, so a tent
2861
     * whose peak sits exactly on the range boundary is still live there.
2862
     * (Reachable ranges are padded by one F2Dot14 unit at their producer,
2863
     * which already covers this; strictness keeps the predicate correct on
2864
     * its own terms.) */
2865
0
    if (hi < start || lo > end)
2866
0
      return true;
2867
0
  }
2868
0
  return false;
2869
0
}
Unexecuted instantiation: hb-aat-layout.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-aat-map.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-face.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-font.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-color.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-face.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-fetch.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-font.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: VARC.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-layout.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-math.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-metrics.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-shape.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-var.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-static.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-style.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-cff1-table.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-cff2-table.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-ot-shape-fallback.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-plan.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-plan-layout.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-plan-var.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-table-layout.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-table-var.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-table-cff.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-table-color.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-table-other.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: gsubgpos-context.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-cff1.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-cff2.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
Unexecuted instantiation: hb-subset-cff-common.cc:OT::_hb_avar2_region_is_dead(hb_hashmap_t<unsigned int, Triple, false> const&, hb_hashmap_t<unsigned int, Triple, false> const&)
2870
2871
struct SparseVariationRegion : Array16Of<SparseVarRegionAxis>
2872
{
2873
  float evaluate (const int *coords, unsigned int coord_len) const
2874
0
  {
2875
0
    float v = 1.f;
2876
0
    unsigned int count = len;
2877
0
    for (unsigned int i = 0; i < count; i++)
2878
0
    {
2879
0
      float factor = arrayZ[i].evaluate (coords, coord_len);
2880
0
      if (factor == 0.f)
2881
0
  return 0.;
2882
0
      v *= factor;
2883
0
    }
2884
0
    return v;
2885
0
  }
2886
2887
  bool serialize (hb_serialize_context_t *c,
2888
      const SparseVariationRegion *src)
2889
0
  { return bool (src->copy (c)); }
2890
};
2891
2892
struct SparseVarRegionList
2893
{
2894
  HB_ALWAYS_INLINE
2895
  float evaluate (unsigned int region_index,
2896
      const int *coords, unsigned int coord_len,
2897
      hb_scalar_cache_t *cache = nullptr) const
2898
0
  {
2899
0
    if (unlikely (region_index >= regions.len))
2900
0
      return 0.;
2901
2902
0
    float v;
2903
0
    if (cache && cache->get (region_index, &v))
2904
0
      return v;
2905
2906
0
    const SparseVariationRegion &region = this+regions[region_index];
2907
2908
0
    v = region.evaluate (coords, coord_len);
2909
0
    if (cache)
2910
0
      cache->set (region_index, v);
2911
2912
0
    return v;
2913
0
  }
2914
2915
  bool sanitize (hb_sanitize_context_t *c) const
2916
0
  {
2917
0
    TRACE_SANITIZE (this);
2918
0
    return_trace (regions.sanitize (c, this));
2919
0
  }
2920
2921
  bool serialize (hb_serialize_context_t *c,
2922
      const SparseVarRegionList *src,
2923
      const hb_inc_bimap_t &region_map)
2924
0
  {
2925
0
    TRACE_SERIALIZE (this);
2926
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2927
0
    regions.len = region_map.get_population ();
2928
0
    if (unlikely (!c->extend (regions))) return_trace (false);
2929
2930
0
    for (unsigned i = 0; i < regions.len; i++)
2931
0
    {
2932
0
      unsigned old_index = region_map.backward (i);
2933
0
      if (unlikely (old_index >= src->regions.len ||
2934
0
        !regions[i].serialize_serialize (c,
2935
0
               &(src+src->regions[old_index]))))
2936
0
  return_trace (false);
2937
0
    }
2938
0
    return_trace (true);
2939
0
  }
2940
2941
  public:
2942
  Array16Of<Offset32To<SparseVariationRegion>>
2943
    regions;
2944
  public:
2945
  DEFINE_SIZE_ARRAY (2, regions);
2946
};
2947
2948
2949
struct VarData
2950
{
2951
  unsigned int get_item_count () const
2952
0
  { return itemCount; }
2953
2954
  unsigned int get_region_index_count () const
2955
0
  { return regionIndices.len; }
2956
2957
  unsigned get_region_index (unsigned i) const
2958
0
  { return i >= regionIndices.len ? -1 : regionIndices[i]; }
2959
2960
  size_t get_row_size () const
2961
0
  { return (wordCount () + regionIndices.len) * (longWords () ? 2 : 1); }
2962
2963
  size_t get_size () const
2964
0
  { return hb_unsigned_add_saturate (min_size - regionIndices.min_size,
2965
0
             regionIndices.get_size (),
2966
0
             hb_unsigned_mul_saturate (itemCount, get_row_size ())); }
2967
2968
  float _get_delta (unsigned int inner,
2969
        const int *coords, unsigned int coord_count,
2970
        const VarRegionList &regions,
2971
        hb_scalar_cache_t *cache = nullptr) const
2972
0
  {
2973
0
    if (unlikely (inner >= itemCount))
2974
0
      return 0.;
2975
0
    bool is_long = longWords ();
2976
0
    unsigned int count = regionIndices.len;
2977
0
    unsigned word_count = wordCount ();
2978
0
    unsigned int scount = is_long ? count : word_count;
2979
0
    unsigned int lcount = is_long ? word_count : 0;
2980
2981
0
    const HBUINT8 *bytes = get_delta_bytes ();
2982
0
    const HBUINT8 *row = bytes + inner * get_row_size ();
2983
2984
0
    float delta = 0.;
2985
0
    unsigned int i = 0;
2986
2987
0
    const HBINT32 *lcursor = reinterpret_cast<const HBINT32 *> (row);
2988
0
    for (; i < lcount; i++)
2989
0
    {
2990
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
2991
0
      if (scalar)
2992
0
        delta += scalar * *lcursor;
2993
0
      lcursor++;
2994
0
    }
2995
0
    const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (lcursor);
2996
0
    for (; i < scount; i++)
2997
0
    {
2998
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
2999
0
      if (scalar)
3000
0
       delta += scalar * *scursor;
3001
0
      scursor++;
3002
0
    }
3003
0
    const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
3004
0
    for (; i < count; i++)
3005
0
    {
3006
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
3007
0
      if (scalar)
3008
0
        delta += scalar * *bcursor;
3009
0
      bcursor++;
3010
0
    }
3011
3012
0
    return delta;
3013
0
  }
3014
3015
  HB_ALWAYS_INLINE
3016
  float get_delta (unsigned int inner,
3017
       const int *coords, unsigned int coord_count,
3018
       const VarRegionList &regions,
3019
       hb_scalar_cache_t *cache = nullptr) const
3020
0
  {
3021
0
    unsigned int count = regionIndices.len;
3022
0
    if (!count) return 0.f; // This is quite common, so optimize it.
3023
0
    return _get_delta (inner, coords, coord_count, regions, cache);
3024
0
  }
3025
3026
  void get_region_scalars (const int *coords, unsigned int coord_count,
3027
         const VarRegionList &regions,
3028
         float *scalars /*OUT */,
3029
         unsigned int num_scalars) const
3030
0
  {
3031
0
    unsigned count = hb_min (num_scalars, regionIndices.len);
3032
0
    for (unsigned int i = 0; i < count; i++)
3033
0
      scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
3034
0
    for (unsigned int i = count; i < num_scalars; i++)
3035
0
      scalars[i] = 0.f;
3036
0
  }
3037
3038
  bool sanitize (hb_sanitize_context_t *c) const
3039
0
  {
3040
0
    TRACE_SANITIZE (this);
3041
0
    return_trace (c->check_struct (this) &&
3042
0
      regionIndices.sanitize (c) &&
3043
0
      hb_barrier () &&
3044
0
      wordCount () <= regionIndices.len &&
3045
0
      c->check_range (get_delta_bytes (),
3046
0
          itemCount,
3047
0
          get_row_size ()));
3048
0
  }
3049
3050
  bool serialize (hb_serialize_context_t *c,
3051
                  bool has_long,
3052
                  const hb_vector_t<const hb_vector_t<int>*>& rows)
3053
0
  {
3054
0
    TRACE_SERIALIZE (this);
3055
0
    unsigned row_count = rows.length;
3056
0
    if (!row_count) {
3057
      // Nothing to serialize, will be empty.
3058
0
      return false;
3059
0
    }
3060
3061
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3062
0
    if (unlikely (!c->check_assign (itemCount, row_count,
3063
0
                                    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
3064
0
      return_trace (false);
3065
3066
0
    int min_threshold = has_long ? -65536 : -128;
3067
0
    int max_threshold = has_long ? +65535 : +127;
3068
0
    enum delta_size_t { kZero=0, kNonWord, kWord };
3069
0
    hb_vector_t<delta_size_t> delta_sz;
3070
0
    unsigned num_regions = rows[0]->length;
3071
0
    if (!delta_sz.resize (num_regions))
3072
0
      return_trace (false);
3073
3074
0
    unsigned word_count = 0;
3075
0
    for (unsigned r = 0; r < num_regions; r++)
3076
0
    {
3077
0
      for (unsigned i = 0; i < row_count; i++)
3078
0
      {
3079
0
        int delta = rows[i]->arrayZ[r];
3080
0
        if (delta < min_threshold || delta > max_threshold)
3081
0
        {
3082
0
          delta_sz[r] = kWord;
3083
0
          word_count++;
3084
0
          break;
3085
0
        }
3086
0
        else if (delta != 0)
3087
0
        {
3088
0
          delta_sz[r] = kNonWord;
3089
0
        }
3090
0
      }
3091
0
    }
3092
3093
    /* reorder regions: words and then non-words*/
3094
0
    unsigned word_index = 0;
3095
0
    unsigned non_word_index = word_count;
3096
0
    hb_map_t ri_map;
3097
0
    for (unsigned r = 0; r < num_regions; r++)
3098
0
    {
3099
0
      if (!delta_sz[r]) continue;
3100
0
      unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
3101
0
      if (!ri_map.set (new_r, r))
3102
0
        return_trace (false);
3103
0
    }
3104
3105
0
    wordSizeCount = word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0);
3106
3107
0
    unsigned ri_count = ri_map.get_population ();
3108
0
    regionIndices.len = ri_count;
3109
0
    if (unlikely (!c->extend (this))) return_trace (false);
3110
3111
0
    for (unsigned r = 0; r < ri_count; r++)
3112
0
    {
3113
0
      hb_codepoint_t *idx;
3114
0
      if (!ri_map.has (r, &idx))
3115
0
        return_trace (false);
3116
0
      regionIndices[r] = *idx;
3117
0
    }
3118
3119
0
    HBUINT8 *delta_bytes = get_delta_bytes ();
3120
0
    unsigned row_size = get_row_size ();
3121
0
    for (unsigned int i = 0; i < row_count; i++)
3122
0
    {
3123
0
      for (unsigned int r = 0; r < ri_count; r++)
3124
0
      {
3125
0
        int delta = rows[i]->arrayZ[ri_map[r]];
3126
0
        set_item_delta_fast (i, r, delta, delta_bytes, row_size);
3127
0
      }
3128
0
    }
3129
0
    return_trace (true);
3130
0
  }
3131
3132
  bool serialize (hb_serialize_context_t *c,
3133
      const VarData *src,
3134
      const hb_inc_bimap_t &inner_map,
3135
      const hb_inc_bimap_t &region_map,
3136
      const hb_set_t *culled_regions = nullptr)
3137
0
  {
3138
0
    TRACE_SERIALIZE (this);
3139
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3140
0
    itemCount = inner_map.get_next_value ();
3141
3142
    /* Optimize word count */
3143
0
    unsigned ri_count = src->regionIndices.len;
3144
0
    enum delta_size_t { kZero=0, kNonWord, kWord };
3145
0
    hb_vector_t<delta_size_t> delta_sz;
3146
0
    hb_vector_t<unsigned int> ri_map; /* maps new index to old index */
3147
0
    delta_sz.resize (ri_count);
3148
0
    ri_map.resize (ri_count);
3149
0
    unsigned int new_word_count = 0;
3150
0
    unsigned int r;
3151
3152
0
    const HBUINT8 *src_delta_bytes = src->get_delta_bytes ();
3153
0
    unsigned src_row_size = src->get_row_size ();
3154
0
    unsigned src_word_count = src->wordCount ();
3155
0
    bool     src_long_words = src->longWords ();
3156
3157
0
    bool has_long = false;
3158
0
    if (src_long_words)
3159
0
    {
3160
0
      for (r = 0; r < src_word_count; r++)
3161
0
      {
3162
0
        for (unsigned old_gid : inner_map.keys())
3163
0
  {
3164
0
    int32_t delta = src->get_item_delta_fast (old_gid, r, src_delta_bytes, src_row_size);
3165
0
    if (delta < -65536 || 65535 < delta)
3166
0
    {
3167
0
      has_long = true;
3168
0
      break;
3169
0
    }
3170
0
        }
3171
0
      }
3172
0
    }
3173
3174
0
    signed min_threshold = has_long ? -65536 : -128;
3175
0
    signed max_threshold = has_long ? +65535 : +127;
3176
0
    for (r = 0; r < ri_count; r++)
3177
0
    {
3178
0
      bool short_circuit = src_long_words == has_long && src_word_count <= r;
3179
3180
0
      delta_sz[r] = kZero;
3181
0
      if (culled_regions && culled_regions->has (src->regionIndices[r]))
3182
0
  continue; /* unreachable region: drop its column */
3183
0
      for (unsigned old_gid : inner_map.keys())
3184
0
      {
3185
0
  int32_t delta = src->get_item_delta_fast (old_gid, r, src_delta_bytes, src_row_size);
3186
0
  if (delta < min_threshold || max_threshold < delta)
3187
0
  {
3188
0
    delta_sz[r] = kWord;
3189
0
    new_word_count++;
3190
0
    break;
3191
0
  }
3192
0
  else if (delta != 0)
3193
0
  {
3194
0
    delta_sz[r] = kNonWord;
3195
0
    if (short_circuit)
3196
0
      break;
3197
0
  }
3198
0
      }
3199
0
    }
3200
3201
0
    unsigned int word_index = 0;
3202
0
    unsigned int non_word_index = new_word_count;
3203
0
    unsigned int new_ri_count = 0;
3204
0
    for (r = 0; r < ri_count; r++)
3205
0
      if (delta_sz[r])
3206
0
      {
3207
0
  unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
3208
0
  ri_map[new_r] = r;
3209
0
  new_ri_count++;
3210
0
      }
3211
3212
0
    wordSizeCount = new_word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0);
3213
3214
0
    regionIndices.len = new_ri_count;
3215
3216
0
    if (unlikely (!c->extend (this))) return_trace (false);
3217
3218
0
    for (r = 0; r < new_ri_count; r++)
3219
0
      regionIndices[r] = region_map[src->regionIndices[ri_map[r]]];
3220
3221
0
    HBUINT8 *delta_bytes = get_delta_bytes ();
3222
0
    unsigned row_size = get_row_size ();
3223
0
    unsigned count = itemCount;
3224
0
    for (unsigned int i = 0; i < count; i++)
3225
0
    {
3226
0
      unsigned int old = inner_map.backward (i);
3227
0
      for (unsigned int r = 0; r < new_ri_count; r++)
3228
0
  set_item_delta_fast (i, r,
3229
0
           src->get_item_delta_fast (old, ri_map[r],
3230
0
                   src_delta_bytes, src_row_size),
3231
0
           delta_bytes, row_size);
3232
0
    }
3233
3234
0
    return_trace (true);
3235
0
  }
3236
3237
  void collect_region_refs (hb_set_t &region_indices, const hb_inc_bimap_t &inner_map) const
3238
0
  {
3239
0
    const HBUINT8 *delta_bytes = get_delta_bytes ();
3240
0
    unsigned row_size = get_row_size ();
3241
3242
0
    for (unsigned int r = 0; r < regionIndices.len; r++)
3243
0
    {
3244
0
      unsigned int region = regionIndices.arrayZ[r];
3245
0
      if (region_indices.has (region)) continue;
3246
0
      for (hb_codepoint_t old_gid : inner_map.keys())
3247
0
  if (get_item_delta_fast (old_gid, r, delta_bytes, row_size) != 0)
3248
0
  {
3249
0
    region_indices.add (region);
3250
0
    break;
3251
0
  }
3252
0
    }
3253
0
  }
3254
3255
  public:
3256
  const HBUINT8 *get_delta_bytes () const
3257
0
  { return &StructAfter<HBUINT8> (regionIndices); }
3258
3259
  protected:
3260
  HBUINT8 *get_delta_bytes ()
3261
0
  { return &StructAfter<HBUINT8> (regionIndices); }
3262
3263
  public:
3264
  int32_t get_item_delta_fast (unsigned int item, unsigned int region,
3265
             const HBUINT8 *delta_bytes, unsigned row_size) const
3266
0
  {
3267
0
    if (unlikely (item >= itemCount || region >= regionIndices.len)) return 0;
3268
3269
0
    const HBINT8 *p = (const HBINT8 *) delta_bytes + item * row_size;
3270
0
    unsigned word_count = wordCount ();
3271
0
    bool is_long = longWords ();
3272
0
    if (is_long)
3273
0
    {
3274
0
      if (region < word_count)
3275
0
  return ((const HBINT32 *) p)[region];
3276
0
      else
3277
0
  return ((const HBINT16 *)(p + HBINT32::static_size * word_count))[region - word_count];
3278
0
    }
3279
0
    else
3280
0
    {
3281
0
      if (region < word_count)
3282
0
  return ((const HBINT16 *) p)[region];
3283
0
      else
3284
0
  return (p + HBINT16::static_size * word_count)[region - word_count];
3285
0
    }
3286
0
  }
3287
  int32_t get_item_delta (unsigned int item, unsigned int region) const
3288
0
  {
3289
0
     return get_item_delta_fast (item, region,
3290
0
         get_delta_bytes (),
3291
0
         get_row_size ());
3292
0
  }
3293
3294
  protected:
3295
  void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta,
3296
          HBUINT8 *delta_bytes, unsigned row_size)
3297
0
  {
3298
0
    HBINT8 *p = (HBINT8 *) delta_bytes + item * row_size;
3299
0
    unsigned word_count = wordCount ();
3300
0
    bool is_long = longWords ();
3301
0
    if (is_long)
3302
0
    {
3303
0
      if (region < word_count)
3304
0
  ((HBINT32 *) p)[region] = delta;
3305
0
      else
3306
0
  ((HBINT16 *)(p + HBINT32::static_size * word_count))[region - word_count] = delta;
3307
0
    }
3308
0
    else
3309
0
    {
3310
0
      if (region < word_count)
3311
0
  ((HBINT16 *) p)[region] = delta;
3312
0
      else
3313
0
  (p + HBINT16::static_size * word_count)[region - word_count] = delta;
3314
0
    }
3315
0
  }
3316
  void set_item_delta (unsigned int item, unsigned int region, int32_t delta)
3317
0
  {
3318
0
    set_item_delta_fast (item, region, delta,
3319
0
       get_delta_bytes (),
3320
0
       get_row_size ());
3321
0
  }
3322
3323
0
  bool longWords () const { return wordSizeCount & 0x8000u /* LONG_WORDS */; }
3324
0
  unsigned wordCount () const { return wordSizeCount & 0x7FFFu /* WORD_DELTA_COUNT_MASK */; }
3325
3326
  protected:
3327
  HBUINT16    itemCount;
3328
  HBUINT16    wordSizeCount;
3329
  Array16Of<HBUINT16> regionIndices;
3330
/*UnsizedArrayOf<HBUINT8>bytesX;*/
3331
  public:
3332
  DEFINE_SIZE_ARRAY (6, regionIndices);
3333
};
3334
3335
struct MultiVarData
3336
{
3337
  size_t get_size () const
3338
0
  { return hb_unsigned_add_saturate (min_size - regionIndices.min_size,
3339
0
             regionIndices.get_size (),
3340
0
             StructAfter<CFF2Index> (regionIndices).get_size ()); }
3341
3342
  void get_delta (unsigned int inner,
3343
      const int *coords, unsigned int coord_count,
3344
      const SparseVarRegionList &regions,
3345
      hb_array_t<float> out,
3346
      hb_scalar_cache_t *cache = nullptr) const
3347
0
  {
3348
0
    auto &deltaSets = StructAfter<decltype (deltaSetsX)> (regionIndices);
3349
3350
0
    auto values_iter = deltaSets.fetcher (inner);
3351
0
    unsigned regionCount = regionIndices.len;
3352
0
    unsigned skip = 0;
3353
0
    for (unsigned regionIndex = 0; regionIndex < regionCount; regionIndex++)
3354
0
    {
3355
0
      float scalar = regions.evaluate (regionIndices.arrayZ[regionIndex],
3356
0
               coords, coord_count,
3357
0
               cache);
3358
      // We skip lazily. Helps with the tail end.
3359
0
      if (scalar == 0.0f)
3360
0
        skip += out.length;
3361
0
      else
3362
0
      {
3363
0
        if (skip)
3364
0
  {
3365
0
    values_iter.skip (skip);
3366
0
    skip = 0;
3367
0
  }
3368
0
  values_iter.add_to (out, scalar);
3369
0
      }
3370
0
    }
3371
0
  }
3372
3373
  bool sanitize (hb_sanitize_context_t *c) const
3374
0
  {
3375
0
    TRACE_SANITIZE (this);
3376
0
    return_trace (format.sanitize (c) &&
3377
0
      hb_barrier () &&
3378
0
      format == 1 &&
3379
0
      regionIndices.sanitize (c) &&
3380
0
      hb_barrier () &&
3381
0
      StructAfter<decltype (deltaSetsX)> (regionIndices).sanitize (c));
3382
0
  }
3383
3384
  unsigned get_item_count () const
3385
0
  { return StructAfter<decltype (deltaSetsX)> (regionIndices).count; }
3386
3387
  void collect_region_refs (hb_set_t &region_indices) const
3388
0
  {
3389
0
    for (unsigned region : regionIndices)
3390
0
      region_indices.add (region);
3391
0
  }
3392
3393
  bool serialize (hb_serialize_context_t *c,
3394
      const MultiVarData *src,
3395
      const hb_inc_bimap_t &inner_map,
3396
      const hb_inc_bimap_t &region_map)
3397
0
  {
3398
0
    TRACE_SERIALIZE (this);
3399
0
    unsigned region_count = src->regionIndices.len;
3400
0
    unsigned header_size = HBUINT8::static_size +
3401
0
         Array16Of<HBUINT16>::min_size +
3402
0
         region_count * HBUINT16::static_size;
3403
0
    if (unlikely (!c->extend_size (this, header_size, false)))
3404
0
      return_trace (false);
3405
0
    format = 1;
3406
0
    regionIndices.len = region_count;
3407
0
    for (unsigned i = 0; i < regionIndices.len; i++)
3408
0
    {
3409
0
      unsigned old_region = src->regionIndices[i];
3410
0
      if (unlikely (!region_map.has (old_region)))
3411
0
  return_trace (false);
3412
0
      regionIndices[i] = region_map.get (old_region);
3413
0
    }
3414
3415
0
    const auto &src_delta_sets = StructAfter<decltype (deltaSetsX)> (src->regionIndices);
3416
0
    hb_vector_t<hb_ubytes_t> delta_sets;
3417
0
    unsigned data_size = 0;
3418
0
    if (unlikely (!delta_sets.alloc_exact (inner_map.get_population ())))
3419
0
      return_trace (false);
3420
0
    for (unsigned i = 0; i < inner_map.get_population (); i++)
3421
0
    {
3422
0
      unsigned old_inner = inner_map.backward (i);
3423
0
      if (unlikely (old_inner >= src_delta_sets.count)) return_trace (false);
3424
0
      hb_ubytes_t bytes = static_cast<const CFF2Index &> (src_delta_sets)[old_inner];
3425
0
      data_size = hb_unsigned_add_saturate (data_size, bytes.length);
3426
0
      delta_sets.push (bytes);
3427
0
    }
3428
0
    if (unlikely (data_size == UINT_MAX || delta_sets.in_error ()))
3429
0
      return_trace (false);
3430
3431
0
    auto &out_delta_sets = StructAfter<decltype (deltaSetsX)> (regionIndices);
3432
0
    return_trace (out_delta_sets.serialize (c, delta_sets.iter (), &data_size));
3433
0
  }
3434
3435
  protected:
3436
  HBUINT8       format; // 1
3437
  Array16Of<HBUINT16> regionIndices;
3438
  TupleList       deltaSetsX;
3439
  public:
3440
  DEFINE_SIZE_MIN (8);
3441
};
3442
3443
struct ItemVariationStore
3444
{
3445
  friend struct item_variations_t;
3446
3447
  hb_scalar_cache_t *create_cache () const
3448
150k
  {
3449
#ifdef HB_NO_VAR
3450
    return hb_scalar_cache_t::create (0);
3451
#endif
3452
150k
    return hb_scalar_cache_t::create ((this+regions).regionCount);
3453
150k
  }
3454
3455
  static void destroy_cache (hb_scalar_cache_t *cache)
3456
149k
  {
3457
149k
    hb_scalar_cache_t::destroy (cache);
3458
149k
  }
3459
3460
  private:
3461
  float get_delta (unsigned int outer, unsigned int inner,
3462
       const int *coords, unsigned int coord_count,
3463
       hb_scalar_cache_t *cache = nullptr) const
3464
0
  {
3465
#ifdef HB_NO_VAR
3466
    return 0.f;
3467
#endif
3468
3469
0
    if (unlikely (outer >= dataSets.len))
3470
0
      return 0.f;
3471
3472
0
    return (this+dataSets[outer]).get_delta (inner,
3473
0
               coords, coord_count,
3474
0
               this+regions,
3475
0
               cache);
3476
0
  }
3477
3478
  public:
3479
  bool has_delta_set (unsigned int index) const
3480
0
  {
3481
#ifdef HB_NO_VAR
3482
    return false;
3483
#endif
3484
3485
0
    unsigned int outer = index >> 16;
3486
0
    unsigned int inner = index & 0xFFFF;
3487
0
    return outer < dataSets.len &&
3488
0
     inner < (this+dataSets[outer]).get_item_count ();
3489
0
  }
3490
3491
  float get_delta (unsigned int index,
3492
       const int *coords, unsigned int coord_count,
3493
       hb_scalar_cache_t *cache = nullptr) const
3494
0
  {
3495
0
    unsigned int outer = index >> 16;
3496
0
    unsigned int inner = index & 0xFFFF;
3497
0
    return get_delta (outer, inner, coords, coord_count, cache);
3498
0
  }
3499
  float get_delta (unsigned int index,
3500
       hb_array_t<const int> coords,
3501
       hb_scalar_cache_t *cache = nullptr) const
3502
0
  {
3503
0
    return get_delta (index,
3504
0
          coords.arrayZ, coords.length,
3505
0
          cache);
3506
0
  }
3507
3508
  bool sanitize (hb_sanitize_context_t *c) const
3509
0
  {
3510
#ifdef HB_NO_VAR
3511
    return true;
3512
#endif
3513
3514
0
    TRACE_SANITIZE (this);
3515
0
    return_trace (c->check_struct (this) &&
3516
0
      hb_barrier () &&
3517
0
      format == 1 &&
3518
0
      regions.sanitize (c, this) &&
3519
0
      dataSets.sanitize (c, this));
3520
0
  }
3521
3522
  bool serialize (hb_serialize_context_t *c,
3523
                  bool has_long,
3524
                  const hb_vector_t<hb_tag_t>& axis_tags,
3525
                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& region_list,
3526
                  const hb_vector_t<delta_row_encoding_t>& vardata_encodings)
3527
0
  {
3528
0
    TRACE_SERIALIZE (this);
3529
#ifdef HB_NO_VAR
3530
    return_trace (false);
3531
#endif
3532
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3533
3534
0
    format = 1;
3535
0
    if (!regions.serialize_serialize (c, axis_tags, region_list))
3536
0
      return_trace (false);
3537
3538
0
    unsigned num_var_data = vardata_encodings.length;
3539
0
    if (!num_var_data) return_trace (false);
3540
0
    if (unlikely (!c->check_assign (dataSets.len, num_var_data,
3541
0
                                    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
3542
0
      return_trace (false);
3543
3544
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3545
0
    for (unsigned i = 0; i < num_var_data; i++)
3546
0
      if (!dataSets[i].serialize_serialize (c, has_long, vardata_encodings[i].items))
3547
0
        return_trace (false);
3548
3549
0
    return_trace (true);
3550
0
  }
3551
3552
  bool serialize (hb_serialize_context_t *c,
3553
      const ItemVariationStore *src,
3554
      const hb_array_t <const hb_inc_bimap_t> &inner_maps,
3555
      const hb_set_t *culled_regions = nullptr)
3556
0
  {
3557
0
    TRACE_SERIALIZE (this);
3558
#ifdef HB_NO_VAR
3559
    return_trace (false);
3560
#endif
3561
3562
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3563
3564
0
    unsigned int set_count = 0;
3565
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3566
0
      if (inner_maps[i].get_population ())
3567
0
  set_count++;
3568
3569
0
    format = 1;
3570
3571
0
    const auto &src_regions = src+src->regions;
3572
3573
0
    hb_set_t region_indices;
3574
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3575
0
      (src+src->dataSets[i]).collect_region_refs (region_indices, inner_maps[i]);
3576
3577
0
    if (region_indices.in_error ())
3578
0
      return_trace (false);
3579
3580
0
    region_indices.del_range ((src_regions).regionCount, hb_set_t::INVALID);
3581
3582
0
    if (culled_regions)
3583
0
      region_indices.subtract (*culled_regions);
3584
3585
    /* TODO use constructor when our data-structures support that. */
3586
0
    hb_inc_bimap_t region_map;
3587
0
    + hb_iter (region_indices)
3588
0
    | hb_apply ([&region_map] (unsigned _) { region_map.add(_); })
3589
0
    ;
3590
0
    if (region_map.in_error())
3591
0
      return_trace (false);
3592
3593
0
    if (unlikely (!regions.serialize_serialize (c, &src_regions, region_map)))
3594
0
      return_trace (false);
3595
3596
0
    dataSets.len = set_count;
3597
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3598
3599
    /* TODO: The following code could be simplified when
3600
     * List16OfOffset16To::subset () can take a custom param to be passed to VarData::serialize () */
3601
0
    unsigned int set_index = 0;
3602
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3603
0
    {
3604
0
      if (!inner_maps[i].get_population ()) continue;
3605
0
      if (unlikely (!dataSets[set_index++]
3606
0
         .serialize_serialize (c, &(src+src->dataSets[i]), inner_maps[i], region_map,
3607
0
             culled_regions)))
3608
0
  return_trace (false);
3609
0
    }
3610
3611
0
    return_trace (true);
3612
0
  }
3613
3614
  ItemVariationStore *copy (hb_serialize_context_t *c) const
3615
0
  {
3616
0
    TRACE_SERIALIZE (this);
3617
0
    auto *out = c->start_embed (this);
3618
0
    if (unlikely (!out)) return_trace (nullptr);
3619
0
3620
0
    hb_vector_t <hb_inc_bimap_t> inner_maps;
3621
0
    unsigned count = dataSets.len;
3622
0
    for (unsigned i = 0; i < count; i++)
3623
0
    {
3624
0
      hb_inc_bimap_t *map = inner_maps.push ();
3625
0
      if (unlikely (!c->propagate_error(inner_maps)))
3626
0
        return_trace(nullptr);
3627
0
      auto &data = this+dataSets[i];
3628
0
3629
0
      unsigned itemCount = data.get_item_count ();
3630
0
      for (unsigned j = 0; j < itemCount; j++)
3631
0
  map->add (j);
3632
0
    }
3633
0
3634
0
    if (unlikely (!out->serialize (c, this, inner_maps))) return_trace (nullptr);
3635
0
3636
0
    return_trace (out);
3637
0
  }
3638
3639
  /* Collect regions that a partial avar2 instance can never reach, per the
3640
   * plan's reachable final-coordinate ranges. */
3641
  bool collect_dead_regions (const hb_map_t &axes_old_index_tag_map,
3642
           const hb_hashmap_t<hb_tag_t, Triple> &reachable_ranges,
3643
           hb_set_t &dead_regions /* OUT */) const
3644
0
  {
3645
0
#ifndef HB_NO_VAR
3646
0
    if (!reachable_ranges.get_population ()) return true;
3647
0
    const VarRegionList &region_list = this+regions;
3648
0
    unsigned count = region_list.regionCount;
3649
0
    for (unsigned i = 0; i < count; i++)
3650
0
    {
3651
0
      hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
3652
0
      if (!region_list.get_var_region (i, axes_old_index_tag_map, axis_tuples))
3653
0
  return false;
3654
0
      if (_hb_avar2_region_is_dead (axis_tuples, reachable_ranges))
3655
0
  dead_regions.add (i);
3656
0
    }
3657
0
    return !dead_regions.in_error ();
3658
#else
3659
    return true;
3660
#endif
3661
0
  }
3662
3663
  bool subset (hb_subset_context_t *c, const hb_array_t<const hb_inc_bimap_t> &inner_maps) const
3664
0
  {
3665
0
    TRACE_SUBSET (this);
3666
#ifdef HB_NO_VAR
3667
    return_trace (false);
3668
#endif
3669
3670
0
    ItemVariationStore *varstore_prime = c->serializer->start_embed<ItemVariationStore> ();
3671
0
    if (unlikely (!varstore_prime)) return_trace (false);
3672
3673
    /* avar2 partial instancing: cull unreachable regions. */
3674
0
    hb_set_t dead_regions;
3675
0
    if (c->plan->has_avar2)
3676
0
      if (!collect_dead_regions (c->plan->axes_old_index_tag_map,
3677
0
         c->plan->avar2_reachable_ranges,
3678
0
         dead_regions))
3679
0
  return_trace (false);
3680
3681
0
    varstore_prime->serialize (c->serializer, this, inner_maps,
3682
0
             dead_regions.get_population () ? &dead_regions : nullptr);
3683
3684
0
    return_trace (
3685
0
        !c->serializer->in_error()
3686
0
        && varstore_prime->dataSets);
3687
0
  }
3688
3689
  unsigned int get_region_index_count (unsigned int major) const
3690
0
  {
3691
#ifdef HB_NO_VAR
3692
    return 0;
3693
#endif
3694
0
    return (this+dataSets[major]).get_region_index_count ();
3695
0
  }
3696
3697
  void get_region_scalars (unsigned int major,
3698
         const int *coords, unsigned int coord_count,
3699
         float *scalars /*OUT*/,
3700
         unsigned int num_scalars) const
3701
0
  {
3702
#ifdef HB_NO_VAR
3703
    for (unsigned i = 0; i < num_scalars; i++)
3704
      scalars[i] = 0.f;
3705
    return;
3706
#endif
3707
3708
0
    (this+dataSets[major]).get_region_scalars (coords, coord_count,
3709
0
                 this+regions,
3710
0
                 &scalars[0], num_scalars);
3711
0
  }
3712
3713
  unsigned int get_sub_table_count () const
3714
0
   {
3715
#ifdef HB_NO_VAR
3716
     return 0;
3717
#endif
3718
0
     return dataSets.len;
3719
0
   }
3720
3721
  const VarData& get_sub_table (unsigned i) const
3722
0
  {
3723
#ifdef HB_NO_VAR
3724
     return Null (VarData);
3725
#endif
3726
0
     return this+dataSets[i];
3727
0
  }
3728
3729
  const VarRegionList& get_region_list () const
3730
0
  {
3731
#ifdef HB_NO_VAR
3732
     return Null (VarRegionList);
3733
#endif
3734
0
     return this+regions;
3735
0
  }
3736
3737
  protected:
3738
  HBUINT16        format;
3739
  Offset32To<VarRegionList>   regions;
3740
  Array16OfOffset32To<VarData>    dataSets;
3741
  public:
3742
  DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
3743
};
3744
3745
struct MultiItemVariationStore
3746
{
3747
  hb_scalar_cache_t *create_cache (hb_scalar_cache_t *static_cache = nullptr) const
3748
0
  {
3749
#ifdef HB_NO_VAR
3750
    return hb_scalar_cache_t::create (0);
3751
#endif
3752
0
    auto &r = this+regions;
3753
0
    unsigned count = r.regions.len;
3754
3755
0
    return hb_scalar_cache_t::create (count, static_cache);
3756
0
  }
3757
3758
  static void destroy_cache (hb_scalar_cache_t *cache,
3759
           hb_scalar_cache_t *static_cache = nullptr)
3760
0
  {
3761
0
    hb_scalar_cache_t::destroy (cache, static_cache);
3762
0
  }
3763
3764
  private:
3765
  void get_delta (unsigned int outer, unsigned int inner,
3766
      const int *coords, unsigned int coord_count,
3767
      hb_array_t<float> out,
3768
      hb_scalar_cache_t *cache = nullptr) const
3769
0
  {
3770
#ifdef HB_NO_VAR
3771
    return;
3772
#endif
3773
3774
0
    if (unlikely (outer >= dataSets.len))
3775
0
      return;
3776
3777
0
    return (this+dataSets[outer]).get_delta (inner,
3778
0
               coords, coord_count,
3779
0
               this+regions,
3780
0
               out,
3781
0
               cache);
3782
0
  }
3783
3784
  public:
3785
  void get_delta (unsigned int index,
3786
      const int *coords, unsigned int coord_count,
3787
      hb_array_t<float> out,
3788
      hb_scalar_cache_t *cache = nullptr) const
3789
0
  {
3790
0
    unsigned int outer = index >> 16;
3791
0
    unsigned int inner = index & 0xFFFF;
3792
0
    get_delta (outer, inner, coords, coord_count, out, cache);
3793
0
  }
3794
  void get_delta (unsigned int index,
3795
      hb_array_t<const int> coords,
3796
      hb_array_t<float> out,
3797
      hb_scalar_cache_t *cache = nullptr) const
3798
0
  {
3799
0
    return get_delta (index,
3800
0
          coords.arrayZ, coords.length,
3801
0
          out,
3802
0
          cache);
3803
0
  }
3804
3805
  bool sanitize (hb_sanitize_context_t *c) const
3806
0
  {
3807
#ifdef HB_NO_VAR
3808
    return true;
3809
#endif
3810
3811
0
    TRACE_SANITIZE (this);
3812
0
    return_trace (c->check_struct (this) &&
3813
0
      hb_barrier () &&
3814
0
      format == 1 &&
3815
0
      regions.sanitize (c, this) &&
3816
0
      dataSets.sanitize (c, this));
3817
0
  }
3818
3819
  bool create_subset_plan (const hb_set_t &var_indices,
3820
         hb_vector_t<hb_inc_bimap_t> *inner_maps,
3821
         hb_map_t *varidx_map) const
3822
0
  {
3823
0
    if (unlikely (!inner_maps->resize (dataSets.len))) return false;
3824
0
    for (hb_codepoint_t var_idx : var_indices)
3825
0
    {
3826
0
      unsigned outer = var_idx >> 16;
3827
0
      unsigned inner = var_idx & 0xFFFFu;
3828
0
      if (unlikely (outer >= dataSets.len ||
3829
0
        inner >= (this+dataSets[outer]).get_item_count ()))
3830
0
  return false;
3831
0
      (*inner_maps)[outer].add (inner);
3832
0
    }
3833
3834
0
    unsigned new_outer = 0;
3835
0
    for (unsigned outer = 0; outer < inner_maps->length; outer++)
3836
0
    {
3837
0
      const hb_inc_bimap_t &inner_map = (*inner_maps)[outer];
3838
0
      if (!inner_map.get_population ()) continue;
3839
0
      if (unlikely (inner_map.in_error ())) return false;
3840
0
      for (unsigned new_inner = 0;
3841
0
     new_inner < inner_map.get_population ();
3842
0
     new_inner++)
3843
0
      {
3844
0
  unsigned old_inner = inner_map.backward (new_inner);
3845
0
  varidx_map->set ((outer << 16) | old_inner,
3846
0
      (new_outer << 16) | new_inner);
3847
0
      }
3848
0
      new_outer++;
3849
0
    }
3850
0
    return !inner_maps->in_error () && !varidx_map->in_error ();
3851
0
  }
3852
3853
  bool serialize (hb_serialize_context_t *c,
3854
      const MultiItemVariationStore *src,
3855
      const hb_array_t<const hb_inc_bimap_t> &inner_maps)
3856
0
  {
3857
0
    TRACE_SERIALIZE (this);
3858
0
    if (unlikely (!c->extend_min (this) ||
3859
0
      inner_maps.length < src->dataSets.len))
3860
0
      return_trace (false);
3861
0
    format = 1;
3862
3863
0
    const auto &src_regions = src+src->regions;
3864
0
    hb_set_t region_indices;
3865
0
    unsigned set_count = 0;
3866
0
    for (unsigned i = 0; i < src->dataSets.len; i++)
3867
0
    {
3868
0
      if (!inner_maps[i].get_population ()) continue;
3869
0
      set_count++;
3870
0
      (src+src->dataSets[i]).collect_region_refs (region_indices);
3871
0
    }
3872
0
    region_indices.del_range (src_regions.regions.len, hb_set_t::INVALID);
3873
0
    hb_inc_bimap_t region_map;
3874
0
    region_map.add_set (&region_indices);
3875
0
    if (unlikely (region_indices.in_error () || region_map.in_error () ||
3876
0
      !regions.serialize_serialize (c, &src_regions, region_map)))
3877
0
      return_trace (false);
3878
3879
0
    dataSets.len = set_count;
3880
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3881
0
    unsigned set_index = 0;
3882
0
    for (unsigned i = 0; i < src->dataSets.len; i++)
3883
0
    {
3884
0
      if (!inner_maps[i].get_population ()) continue;
3885
0
      if (unlikely (!dataSets[set_index++].serialize_serialize (
3886
0
          c, &(src+src->dataSets[i]), inner_maps[i], region_map)))
3887
0
  return_trace (false);
3888
0
    }
3889
0
    return_trace (true);
3890
0
  }
3891
3892
  protected:
3893
  HBUINT16        format; // 1
3894
  Offset32To<SparseVarRegionList> regions;
3895
  Array16OfOffset32To<MultiVarData> dataSets;
3896
  public:
3897
  DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
3898
};
3899
3900
template <typename MapCountT>
3901
struct DeltaSetIndexMapFormat01
3902
{
3903
  friend struct DeltaSetIndexMap;
3904
3905
  size_t get_size () const
3906
0
  { return hb_unsigned_mul_add_saturate (mapCount, get_width (), min_size); }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::get_size() const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::get_size() const
3907
3908
  private:
3909
  DeltaSetIndexMapFormat01* copy (hb_serialize_context_t *c) const
3910
0
  {
3911
0
    TRACE_SERIALIZE (this);
3912
0
    return_trace (c->embed (this));
3913
0
  }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::copy(hb_serialize_context_t*) const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::copy(hb_serialize_context_t*) const
3914
3915
  template <typename T>
3916
  bool serialize (hb_serialize_context_t *c, const T &plan)
3917
0
  {
3918
0
    unsigned int width = plan.get_width ();
3919
0
    unsigned int inner_bit_count = plan.get_inner_bit_count ();
3920
0
    const hb_array_t<const uint32_t> output_map = plan.get_output_map ();
3921
3922
0
    TRACE_SERIALIZE (this);
3923
0
    if (unlikely (output_map.length && ((((inner_bit_count-1)&~0xF)!=0) || (((width-1)&~0x3)!=0))))
3924
0
      return_trace (false);
3925
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3926
3927
0
    entryFormat = ((width-1)<<4)|(inner_bit_count-1);
3928
0
    mapCount = output_map.length;
3929
0
    HBUINT8 *p = c->allocate_size<HBUINT8> (width * output_map.length);
3930
0
    if (unlikely (!p)) return_trace (false);
3931
0
    for (unsigned int i = 0; i < output_map.length; i++)
3932
0
    {
3933
0
      unsigned int v = output_map.arrayZ[i];
3934
0
      if (v)
3935
0
      {
3936
0
  unsigned int outer = v >> 16;
3937
0
  unsigned int inner = v & 0xFFFF;
3938
0
  unsigned int u = (outer << inner_bit_count) | inner;
3939
0
  for (unsigned int w = width; w > 0;)
3940
0
  {
3941
0
    p[--w] = u;
3942
0
    u >>= 8;
3943
0
  }
3944
0
      }
3945
0
      p += width;
3946
0
    }
3947
0
    return_trace (true);
3948
0
  }
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::serialize<OT::avar::avar2_index_map_plan_t>(hb_serialize_context_t*, OT::avar::avar2_index_map_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::serialize<OT::avar::avar2_index_map_plan_t>(hb_serialize_context_t*, OT::avar::avar2_index_map_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::serialize<OT::delta_set_index_map_subset_plan_t>(hb_serialize_context_t*, OT::delta_set_index_map_subset_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::serialize<OT::delta_set_index_map_subset_plan_t>(hb_serialize_context_t*, OT::delta_set_index_map_subset_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::serialize<OT::index_map_subset_plan_t>(hb_serialize_context_t*, OT::index_map_subset_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::serialize<OT::index_map_subset_plan_t>(hb_serialize_context_t*, OT::index_map_subset_plan_t const&)
3949
3950
  HB_ALWAYS_INLINE
3951
  uint32_t map (unsigned int v) const /* Returns 16.16 outer.inner. */
3952
0
  {
3953
    /* If count is zero, pass value unchanged.  This takes
3954
     * care of direct mapping for advance map. */
3955
0
    if (!mapCount)
3956
0
      return v;
3957
0
    return _map (v);
3958
0
  }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::map(unsigned int) const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::map(unsigned int) const
3959
3960
  HB_HOT
3961
  uint32_t _map (unsigned int v) const /* Returns 16.16 outer.inner. */
3962
0
  {
3963
0
    if (v >= mapCount)
3964
0
      v = mapCount - 1;
3965
3966
0
    unsigned int u = 0;
3967
0
    { /* Fetch it. */
3968
0
      unsigned int w = get_width ();
3969
0
      const HBUINT8 *p = mapDataZ.arrayZ + w * v;
3970
0
      for (; w; w--)
3971
0
        u = (u << 8) + *p++;
3972
0
    }
3973
3974
0
    { /* Repack it. */
3975
0
      unsigned int n = get_inner_bit_count ();
3976
0
      unsigned int outer = u >> n;
3977
0
      unsigned int inner = u & ((1 << n) - 1);
3978
0
      u = (outer<<16) | inner;
3979
0
    }
3980
3981
0
    return u;
3982
0
  }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::_map(unsigned int) const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::_map(unsigned int) const
3983
3984
0
  unsigned get_map_count () const       { return mapCount; }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::get_map_count() const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::get_map_count() const
3985
0
  unsigned get_width () const           { return ((entryFormat >> 4) & 3) + 1; }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::get_width() const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::get_width() const
3986
0
  unsigned get_inner_bit_count () const { return (entryFormat & 0xF) + 1; }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::get_inner_bit_count() const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::get_inner_bit_count() const
3987
3988
3989
  bool sanitize (hb_sanitize_context_t *c) const
3990
0
  {
3991
0
    TRACE_SANITIZE (this);
3992
0
    return_trace (c->check_struct (this) &&
3993
0
      hb_barrier () &&
3994
0
                  c->check_range (mapDataZ.arrayZ,
3995
0
                                  mapCount,
3996
0
                                  get_width ()));
3997
0
  }
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned short, 2u> >::sanitize(hb_sanitize_context_t*) const
Unexecuted instantiation: OT::DeltaSetIndexMapFormat01<OT::NumType<true, unsigned int, 4u> >::sanitize(hb_sanitize_context_t*) const
3998
3999
  protected:
4000
  HBUINT8       format;         /* Format identifier--format = 0 */
4001
  HBUINT8       entryFormat;    /* A packed field that describes the compressed
4002
                                 * representation of delta-set indices. */
4003
  MapCountT     mapCount;       /* The number of mapping entries. */
4004
  UnsizedArrayOf<HBUINT8>
4005
                mapDataZ;       /* The delta-set index mapping data. */
4006
4007
  public:
4008
  DEFINE_SIZE_ARRAY (2+MapCountT::static_size, mapDataZ);
4009
};
4010
4011
struct DeltaSetIndexMap
4012
{
4013
  template <typename T>
4014
  bool serialize (hb_serialize_context_t *c, const T &plan)
4015
0
  {
4016
0
    TRACE_SERIALIZE (this);
4017
0
    unsigned length = plan.get_output_map ().length;
4018
0
    u.format.v = length <= 0xFFFF ? 0 : 1;
4019
0
    switch (u.format.v) {
4020
0
    case 0: hb_barrier (); return_trace (u.format0.serialize (c, plan));
4021
0
    case 1: hb_barrier (); return_trace (u.format1.serialize (c, plan));
4022
0
    default:return_trace (false);
4023
0
    }
4024
0
  }
Unexecuted instantiation: bool OT::DeltaSetIndexMap::serialize<OT::avar::avar2_index_map_plan_t>(hb_serialize_context_t*, OT::avar::avar2_index_map_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMap::serialize<OT::delta_set_index_map_subset_plan_t>(hb_serialize_context_t*, OT::delta_set_index_map_subset_plan_t const&)
Unexecuted instantiation: bool OT::DeltaSetIndexMap::serialize<OT::index_map_subset_plan_t>(hb_serialize_context_t*, OT::index_map_subset_plan_t const&)
4025
4026
  uint32_t map (unsigned v) const
4027
0
  {
4028
0
    switch (u.format.v) {
4029
0
    case 0: hb_barrier (); return (u.format0.map (v));
4030
0
    case 1: hb_barrier (); return (u.format1.map (v));
4031
0
    default:return v;
4032
0
    }
4033
0
  }
4034
4035
  unsigned get_map_count () const
4036
0
  {
4037
0
    switch (u.format.v) {
4038
0
    case 0: hb_barrier (); return u.format0.get_map_count ();
4039
0
    case 1: hb_barrier (); return u.format1.get_map_count ();
4040
0
    default:return 0;
4041
0
    }
4042
0
  }
4043
4044
  unsigned get_width () const
4045
0
  {
4046
0
    switch (u.format.v) {
4047
0
    case 0: hb_barrier (); return u.format0.get_width ();
4048
0
    case 1: hb_barrier (); return u.format1.get_width ();
4049
0
    default:return 0;
4050
0
    }
4051
0
  }
4052
4053
  unsigned get_inner_bit_count () const
4054
0
  {
4055
0
    switch (u.format.v) {
4056
0
    case 0: hb_barrier (); return u.format0.get_inner_bit_count ();
4057
0
    case 1: hb_barrier (); return u.format1.get_inner_bit_count ();
4058
0
    default:return 0;
4059
0
    }
4060
0
  }
4061
4062
  bool sanitize (hb_sanitize_context_t *c) const
4063
0
  {
4064
0
    TRACE_SANITIZE (this);
4065
0
    if (!u.format.v.sanitize (c)) return_trace (false);
4066
0
    hb_barrier ();
4067
0
    switch (u.format.v) {
4068
0
    case 0: hb_barrier (); return_trace (u.format0.sanitize (c));
4069
0
    case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
4070
0
    default:return_trace (true);
4071
0
    }
4072
0
  }
4073
4074
  DeltaSetIndexMap* copy (hb_serialize_context_t *c) const
4075
0
  {
4076
0
    TRACE_SERIALIZE (this);
4077
0
    switch (u.format.v) {
4078
0
    case 0: hb_barrier (); return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format0.copy (c)));
4079
0
    case 1: hb_barrier (); return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format1.copy (c)));
4080
0
    default:return_trace (nullptr);
4081
0
    }
4082
0
  }
4083
4084
  protected:
4085
  union {
4086
  struct { HBUINT8 v; }             format;         /* Format identifier */
4087
  DeltaSetIndexMapFormat01<HBUINT16> format0;
4088
  DeltaSetIndexMapFormat01<HBUINT32> format1;
4089
  } u;
4090
  public:
4091
  DEFINE_SIZE_UNION (1, format.v);
4092
};
4093
4094
4095
struct ItemVarStoreInstancer
4096
{
4097
  ItemVarStoreInstancer (const ItemVariationStore *varStore_,
4098
       const DeltaSetIndexMap *varIdxMap,
4099
       hb_array_t<const int> coords,
4100
       hb_scalar_cache_t *cache = nullptr) :
4101
27.9M
    varStore (varStore_), varIdxMap (varIdxMap), coords (coords), cache (cache)
4102
27.9M
  {
4103
27.9M
    if (!varStore)
4104
0
      varStore = &Null(ItemVariationStore);
4105
27.9M
  }
4106
4107
0
  operator bool () const { return varStore && bool (coords); }
4108
4109
  float operator[] (uint32_t varIdx) const
4110
0
  { return (*this) (varIdx); }
4111
4112
  float operator() (uint32_t varIdx, unsigned short offset = 0) const
4113
0
  {
4114
0
   if (!coords || varIdx == VarIdx::NO_VARIATION)
4115
0
     return 0.f;
4116
4117
0
    varIdx += offset;
4118
0
    if (varIdxMap)
4119
0
      varIdx = varIdxMap->map (varIdx);
4120
0
    return varStore->get_delta (varIdx, coords, cache);
4121
0
  }
4122
4123
  const ItemVariationStore *varStore;
4124
  const DeltaSetIndexMap *varIdxMap;
4125
  hb_array_t<const int> coords;
4126
  hb_scalar_cache_t *cache;
4127
};
4128
4129
struct MultiItemVarStoreInstancer
4130
{
4131
  MultiItemVarStoreInstancer (const MultiItemVariationStore *varStore,
4132
            const DeltaSetIndexMap *varIdxMap,
4133
            hb_array_t<const int> coords,
4134
            hb_scalar_cache_t *cache = nullptr) :
4135
0
    varStore (varStore), varIdxMap (varIdxMap), coords (coords), cache (cache)
4136
0
  {
4137
0
    if (!varStore)
4138
0
      varStore = &Null(MultiItemVariationStore);
4139
0
  }
4140
4141
0
  operator bool () const { return varStore && bool (coords); }
4142
4143
  float operator[] (uint32_t varIdx) const
4144
0
  {
4145
0
    float v = 0;
4146
0
    (*this) (hb_array (&v, 1), varIdx);
4147
0
    return v;
4148
0
  }
4149
4150
  void operator() (hb_array_t<float> out, uint32_t varIdx, unsigned short offset = 0) const
4151
0
  {
4152
0
    if (coords && varIdx != VarIdx::NO_VARIATION)
4153
0
    {
4154
0
      varIdx += offset;
4155
0
      if (varIdxMap)
4156
0
  varIdx = varIdxMap->map (varIdx);
4157
0
      varStore->get_delta (varIdx, coords, out, cache);
4158
0
    }
4159
0
    else
4160
0
      for (unsigned i = 0; i < out.length; i++)
4161
0
        out.arrayZ[i] = 0.f;
4162
0
  }
4163
4164
  const MultiItemVariationStore *varStore;
4165
  const DeltaSetIndexMap *varIdxMap;
4166
  hb_array_t<const int> coords;
4167
  hb_scalar_cache_t *cache;
4168
};
4169
4170
4171
/*
4172
 * Feature Variations
4173
 */
4174
enum Cond_with_Var_flag_t
4175
{
4176
  KEEP_COND_WITH_VAR = 0,
4177
  KEEP_RECORD_WITH_VAR = 1,
4178
  DROP_COND_WITH_VAR = 2,
4179
  DROP_RECORD_WITH_VAR = 3,
4180
};
4181
4182
struct Condition;
4183
4184
template <typename Instancer>
4185
static bool
4186
_hb_recurse_condition_evaluate (const struct Condition &condition,
4187
        const int *coords,
4188
        unsigned int coord_len,
4189
        Instancer *instancer);
4190
4191
struct ConditionAxisRange
4192
{
4193
  friend struct Condition;
4194
4195
  bool subset (hb_subset_context_t *c) const
4196
0
  {
4197
0
    TRACE_SUBSET (this);
4198
0
    auto *out = c->serializer->embed (this);
4199
0
    if (unlikely (!out)) return_trace (false);
4200
4201
0
    const hb_map_t *index_map = &c->plan->axes_index_map;
4202
0
    if (index_map->is_empty ()) return_trace (true);
4203
4204
0
    const hb_map_t& axes_old_index_tag_map = c->plan->axes_old_index_tag_map;
4205
0
    hb_codepoint_t *axis_tag;
4206
0
    if (!axes_old_index_tag_map.has (axisIndex, &axis_tag) ||
4207
0
        !index_map->has (axisIndex))
4208
0
      return_trace (false);
4209
4210
0
    const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location = c->plan->axes_location;
4211
0
    Triple axis_limit{-1.0, 0.0, 1.0};
4212
0
    Triple *normalized_limit;
4213
0
    if (normalized_axes_location.has (*axis_tag, &normalized_limit))
4214
0
      axis_limit = *normalized_limit;
4215
4216
0
    const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances = c->plan->axes_triple_distances;
4217
0
    TripleDistances axis_triple_distances{1.0, 1.0};
4218
0
    TripleDistances *triple_dists;
4219
0
    if (axes_triple_distances.has (*axis_tag, &triple_dists))
4220
0
      axis_triple_distances = *triple_dists;
4221
4222
0
    float normalized_min = renormalizeValue ((double) filterRangeMinValue.to_float (), axis_limit, axis_triple_distances, false);
4223
0
    float normalized_max = renormalizeValue ((double) filterRangeMaxValue.to_float (), axis_limit, axis_triple_distances, false);
4224
0
    out->filterRangeMinValue.set_float (normalized_min);
4225
0
    out->filterRangeMaxValue.set_float (normalized_max);
4226
4227
0
    return_trace (c->serializer->check_assign (out->axisIndex, index_map->get (axisIndex),
4228
0
                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
4229
0
  }
4230
4231
  private:
4232
  Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
4233
                                             hb_map_t *condition_map /* OUT */) const
4234
0
  {
4235
    //invalid axis index, drop the entire record
4236
0
    if (!c->axes_index_tag_map->has (axisIndex))
4237
0
      return DROP_RECORD_WITH_VAR;
4238
4239
0
    hb_tag_t axis_tag = c->axes_index_tag_map->get (axisIndex);
4240
4241
0
    Triple axis_range (-1.0, 0.0, 1.0);
4242
0
    Triple *axis_limit;
4243
0
    bool axis_set_by_user = false;
4244
0
    if (c->axes_location->has (axis_tag, &axis_limit))
4245
0
    {
4246
0
      axis_range = *axis_limit;
4247
0
      axis_set_by_user = true;
4248
0
    }
4249
4250
0
    float axis_min_val = axis_range.minimum;
4251
0
    float axis_default_val = axis_range.middle;
4252
0
    float axis_max_val = axis_range.maximum;
4253
4254
0
    float filter_min_val = filterRangeMinValue.to_float ();
4255
0
    float filter_max_val = filterRangeMaxValue.to_float ();
4256
4257
0
    if (axis_default_val < filter_min_val ||
4258
0
        axis_default_val > filter_max_val)
4259
0
      c->apply = false;
4260
4261
    //condition not met, drop the entire record
4262
0
    if (axis_min_val > filter_max_val || axis_max_val < filter_min_val ||
4263
0
        filter_min_val > filter_max_val)
4264
0
      return DROP_RECORD_WITH_VAR;
4265
4266
    //condition met and axis pinned, drop the condition
4267
0
    if (axis_set_by_user && axis_range.is_point ())
4268
0
      return DROP_COND_WITH_VAR;
4269
4270
0
    if (filter_max_val != axis_max_val || filter_min_val != axis_min_val)
4271
0
    {
4272
      // add axisIndex->value into the hashmap so we can check if the record is
4273
      // unique with variations
4274
0
      uint16_t int_filter_max_val = (uint16_t) filterRangeMaxValue.to_int ();
4275
0
      uint16_t int_filter_min_val = (uint16_t) filterRangeMinValue.to_int ();
4276
0
      hb_codepoint_t val = (int_filter_max_val << 16) + int_filter_min_val;
4277
4278
0
      condition_map->set (axisIndex, val);
4279
0
      return KEEP_COND_WITH_VAR;
4280
0
    }
4281
0
    return KEEP_RECORD_WITH_VAR;
4282
0
  }
4283
4284
  template <typename Instancer>
4285
  bool evaluate (const int *coords, unsigned int coord_len,
4286
     Instancer *instancer HB_UNUSED) const
4287
0
  {
4288
0
    int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
4289
0
    return filterRangeMinValue.to_int () <= coord && coord <= filterRangeMaxValue.to_int ();
4290
0
  }
Unexecuted instantiation: bool OT::ConditionAxisRange::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::ConditionAxisRange::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4291
4292
  public:
4293
  bool sanitize (hb_sanitize_context_t *c) const
4294
0
  {
4295
0
    TRACE_SANITIZE (this);
4296
0
    return_trace (c->check_struct (this));
4297
0
  }
4298
4299
  protected:
4300
  HBUINT16  format;   /* Format identifier--format = 1 */
4301
  HBUINT16  axisIndex;
4302
  F2DOT14 filterRangeMinValue;
4303
  F2DOT14 filterRangeMaxValue;
4304
  public:
4305
  DEFINE_SIZE_STATIC (8);
4306
};
4307
4308
struct ConditionValue
4309
{
4310
  friend struct Condition;
4311
4312
  bool subset (hb_subset_context_t *c) const
4313
0
  {
4314
0
    TRACE_SUBSET (this);
4315
    // TODO(subset)
4316
0
    return_trace (false);
4317
0
  }
4318
4319
  private:
4320
  template <typename Instancer>
4321
  bool evaluate (const int *coords, unsigned int coord_len,
4322
     Instancer *instancer) const
4323
0
  {
4324
0
    float value = defaultValue;
4325
0
    value += (*instancer)[varIdx];
4326
0
    return value > 0;
4327
0
  }
Unexecuted instantiation: bool OT::ConditionValue::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::ConditionValue::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4328
4329
  bool subset (hb_subset_context_t *c,
4330
               hb_subset_layout_context_t *l,
4331
               bool insert_catch_all) const
4332
0
  {
4333
0
    TRACE_SUBSET (this);
4334
0
    // TODO(subset)
4335
0
    return_trace (false);
4336
0
  }
4337
4338
  public:
4339
  bool sanitize (hb_sanitize_context_t *c) const
4340
0
  {
4341
0
    TRACE_SANITIZE (this);
4342
0
    return_trace (c->check_struct (this));
4343
0
  }
4344
4345
  protected:
4346
  HBUINT16  format;   /* Format identifier--format = 2 */
4347
  HBINT16 defaultValue;   /* Value at default instance. */
4348
  VarIdx  varIdx;   /* Variation index */
4349
  public:
4350
  DEFINE_SIZE_STATIC (8);
4351
};
4352
4353
struct ConditionAnd
4354
{
4355
  friend struct Condition;
4356
4357
  bool subset (hb_subset_context_t *c) const
4358
0
  {
4359
0
    TRACE_SUBSET (this);
4360
    // TODO(subset)
4361
0
    return_trace (false);
4362
0
  }
4363
4364
  private:
4365
  template <typename Instancer>
4366
  bool evaluate (const int *coords, unsigned int coord_len,
4367
     Instancer *instancer) const
4368
0
  {
4369
0
    unsigned int count = conditions.len;
4370
0
    for (unsigned int i = 0; i < count; i++)
4371
0
      if (!_hb_recurse_condition_evaluate (this+conditions.arrayZ[i],
4372
0
             coords, coord_len,
4373
0
             instancer))
4374
0
  return false;
4375
0
    return true;
4376
0
  }
Unexecuted instantiation: bool OT::ConditionAnd::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::ConditionAnd::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4377
4378
  bool subset (hb_subset_context_t *c,
4379
               hb_subset_layout_context_t *l,
4380
               bool insert_catch_all) const
4381
0
  {
4382
0
    TRACE_SUBSET (this);
4383
0
    // TODO(subset)
4384
0
    return_trace (false);
4385
0
  }
4386
4387
  public:
4388
  bool sanitize (hb_sanitize_context_t *c) const
4389
0
  {
4390
0
    TRACE_SANITIZE (this);
4391
0
    return_trace (conditions.sanitize (c, this));
4392
0
  }
4393
4394
  protected:
4395
  HBUINT16  format;   /* Format identifier--format = 3 */
4396
  Array8OfOffset24To<struct Condition>  conditions;
4397
  public:
4398
  DEFINE_SIZE_ARRAY (3, conditions);
4399
};
4400
4401
struct ConditionOr
4402
{
4403
  friend struct Condition;
4404
4405
  bool subset (hb_subset_context_t *c) const
4406
0
  {
4407
0
    TRACE_SUBSET (this);
4408
    // TODO(subset)
4409
0
    return_trace (false);
4410
0
  }
4411
4412
  private:
4413
  template <typename Instancer>
4414
  bool evaluate (const int *coords, unsigned int coord_len,
4415
     Instancer *instancer) const
4416
0
  {
4417
0
    unsigned int count = conditions.len;
4418
0
    for (unsigned int i = 0; i < count; i++)
4419
0
      if (_hb_recurse_condition_evaluate (this+conditions.arrayZ[i],
4420
0
            coords, coord_len,
4421
0
            instancer))
4422
0
  return true;
4423
0
    return false;
4424
0
  }
Unexecuted instantiation: bool OT::ConditionOr::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::ConditionOr::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4425
4426
  bool subset (hb_subset_context_t *c,
4427
               hb_subset_layout_context_t *l,
4428
               bool insert_catch_all) const
4429
0
  {
4430
0
    TRACE_SUBSET (this);
4431
0
    // TODO(subset)
4432
0
    return_trace (false);
4433
0
  }
4434
4435
  public:
4436
  bool sanitize (hb_sanitize_context_t *c) const
4437
0
  {
4438
0
    TRACE_SANITIZE (this);
4439
0
    return_trace (conditions.sanitize (c, this));
4440
0
  }
4441
4442
  protected:
4443
  HBUINT16  format;   /* Format identifier--format = 4 */
4444
  Array8OfOffset24To<struct Condition>  conditions;
4445
  public:
4446
  DEFINE_SIZE_ARRAY (3, conditions);
4447
};
4448
4449
struct ConditionNegate
4450
{
4451
  friend struct Condition;
4452
4453
  bool subset (hb_subset_context_t *c) const
4454
0
  {
4455
0
    TRACE_SUBSET (this);
4456
    // TODO(subset)
4457
0
    return_trace (false);
4458
0
  }
4459
4460
  private:
4461
  template <typename Instancer>
4462
  bool evaluate (const int *coords, unsigned int coord_len,
4463
     Instancer *instancer) const
4464
0
  {
4465
0
    return !_hb_recurse_condition_evaluate (this+condition,
4466
0
              coords, coord_len,
4467
0
              instancer);
4468
0
  }
Unexecuted instantiation: bool OT::ConditionNegate::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::ConditionNegate::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4469
4470
  bool subset (hb_subset_context_t *c,
4471
               hb_subset_layout_context_t *l,
4472
               bool insert_catch_all) const
4473
0
  {
4474
0
    TRACE_SUBSET (this);
4475
0
    // TODO(subset)
4476
0
    return_trace (false);
4477
0
  }
4478
4479
  public:
4480
  bool sanitize (hb_sanitize_context_t *c) const
4481
0
  {
4482
0
    TRACE_SANITIZE (this);
4483
0
    return_trace (condition.sanitize (c, this));
4484
0
  }
4485
4486
  protected:
4487
  HBUINT16  format;   /* Format identifier--format = 5 */
4488
  Offset24To<struct Condition>  condition;
4489
  public:
4490
  DEFINE_SIZE_STATIC (5);
4491
};
4492
4493
struct Condition
4494
{
4495
  template <typename Instancer>
4496
  bool evaluate (const int *coords, unsigned int coord_len,
4497
     Instancer *instancer) const
4498
0
  {
4499
0
    switch (u.format.v) {
4500
0
    case 1: hb_barrier (); return u.format1.evaluate (coords, coord_len, instancer);
4501
0
    case 2: hb_barrier (); return u.format2.evaluate (coords, coord_len, instancer);
4502
0
    case 3: hb_barrier (); return u.format3.evaluate (coords, coord_len, instancer);
4503
0
    case 4: hb_barrier (); return u.format4.evaluate (coords, coord_len, instancer);
4504
0
    case 5: hb_barrier (); return u.format5.evaluate (coords, coord_len, instancer);
4505
0
    default:return false;
4506
0
    }
4507
0
  }
Unexecuted instantiation: bool OT::Condition::evaluate<OT::ItemVarStoreInstancer>(int const*, unsigned int, OT::ItemVarStoreInstancer*) const
Unexecuted instantiation: bool OT::Condition::evaluate<OT::MultiItemVarStoreInstancer>(int const*, unsigned int, OT::MultiItemVarStoreInstancer*) const
4508
4509
  Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
4510
                                             hb_map_t *condition_map /* OUT */) const
4511
0
  {
4512
0
    switch (u.format.v) {
4513
0
    case 1: hb_barrier (); return u.format1.keep_with_variations (c, condition_map);
4514
    // TODO(subset)
4515
0
    default: c->apply = false; return KEEP_COND_WITH_VAR;
4516
0
    }
4517
0
  }
4518
4519
  template <typename context_t, typename ...Ts>
4520
  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
4521
0
  {
4522
0
    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
4523
0
    TRACE_DISPATCH (this, u.format.v);
4524
0
    switch (u.format.v) {
4525
0
    case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
4526
0
    case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
4527
0
    case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
4528
0
    case 4: hb_barrier (); return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
4529
0
    case 5: hb_barrier (); return_trace (c->dispatch (u.format5, std::forward<Ts> (ds)...));
4530
0
    default:return_trace (c->default_return_value ());
4531
0
    }
4532
0
  }
Unexecuted instantiation: hb_sanitize_context_t::return_t OT::Condition::dispatch<hb_sanitize_context_t>(hb_sanitize_context_t*) const
Unexecuted instantiation: hb_subset_context_t::return_t OT::Condition::dispatch<hb_subset_context_t>(hb_subset_context_t*) const
4533
4534
  bool sanitize (hb_sanitize_context_t *c) const
4535
0
  {
4536
0
    TRACE_SANITIZE (this);
4537
4538
0
    if (unlikely (!c->check_start_recursion (HB_MAX_NESTING_LEVEL)))
4539
0
      return_trace (c->no_dispatch_return_value ());
4540
4541
0
    return_trace (c->end_recursion (this->dispatch (c)));
4542
0
  }
4543
4544
  bool collect_var_indices (hb_set_t *var_indices,
4545
          unsigned depth = HB_MAX_NESTING_LEVEL) const;
4546
4547
  bool serialize (hb_serialize_context_t *c,
4548
      const Condition *src,
4549
      const hb_map_t &varidx_map);
4550
4551
  protected:
4552
  union {
4553
  struct { HBUINT16 v; }  format;   /* Format identifier */
4554
  ConditionAxisRange  format1;
4555
  ConditionValue  format2;
4556
  ConditionAnd    format3;
4557
  ConditionOr   format4;
4558
  ConditionNegate format5;
4559
  } u;
4560
  public:
4561
  DEFINE_SIZE_UNION (2, format.v);
4562
};
4563
4564
template <typename Instancer>
4565
bool
4566
_hb_recurse_condition_evaluate (const struct Condition &condition,
4567
        const int *coords,
4568
        unsigned int coord_len,
4569
        Instancer *instancer)
4570
0
{
4571
0
  return condition.evaluate (coords, coord_len, instancer);
4572
0
}
Unexecuted instantiation: hb-aat-layout.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-aat-map.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-face.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-font.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-color.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-face.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-fetch.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-font.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: VARC.cc:bool OT::_hb_recurse_condition_evaluate<OT::MultiItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::MultiItemVarStoreInstancer*)
Unexecuted instantiation: VARC.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-layout.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-math.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-metrics.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-shape.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-var.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-static.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-style.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-cff1-table.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-cff2-table.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-shaper-arabic.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-ot-shape-fallback.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-plan.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-plan-layout.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-plan-var.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-table-layout.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-table-var.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-table-cff.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-table-color.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-table-other.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: gsubgpos-context.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-cff1.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-cff2.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
Unexecuted instantiation: hb-subset-cff-common.cc:bool OT::_hb_recurse_condition_evaluate<OT::ItemVarStoreInstancer>(OT::Condition const&, int const*, unsigned int, OT::ItemVarStoreInstancer*)
4573
4574
struct ConditionList
4575
{
4576
  const Condition& operator[] (unsigned i) const
4577
0
  { return this+conditions[i]; }
4578
4579
0
  unsigned get_count () const { return conditions.len; }
4580
4581
  bool serialize (hb_serialize_context_t *c,
4582
      const ConditionList *src,
4583
      const hb_inc_bimap_t &condition_map,
4584
      const hb_map_t &varidx_map)
4585
0
  {
4586
0
    TRACE_SERIALIZE (this);
4587
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
4588
0
    conditions.len = condition_map.get_population ();
4589
0
    if (unlikely (!c->extend (conditions))) return_trace (false);
4590
0
    for (unsigned i = 0; i < conditions.len; i++)
4591
0
    {
4592
0
      unsigned old_index = condition_map.backward (i);
4593
0
      if (unlikely (old_index >= src->conditions.len ||
4594
0
        !conditions[i].serialize_serialize (
4595
0
      c, &(src+src->conditions[old_index]), varidx_map)))
4596
0
  return_trace (false);
4597
0
    }
4598
0
    return_trace (true);
4599
0
  }
4600
4601
  bool sanitize (hb_sanitize_context_t *c) const
4602
0
  {
4603
0
    TRACE_SANITIZE (this);
4604
0
    return_trace (conditions.sanitize (c, this));
4605
0
  }
4606
4607
  protected:
4608
  Array32OfOffset32To<Condition> conditions;
4609
  public:
4610
  DEFINE_SIZE_ARRAY (4, conditions);
4611
};
4612
4613
inline bool
4614
Condition::collect_var_indices (hb_set_t *var_indices, unsigned depth) const
4615
0
{
4616
0
  if (unlikely (!depth)) return false;
4617
0
  switch (u.format.v)
4618
0
  {
4619
0
    case 1:
4620
0
      return true;
4621
0
    case 2:
4622
0
      if (u.format2.varIdx != VarIdx::NO_VARIATION)
4623
0
  var_indices->add (u.format2.varIdx);
4624
0
      return !var_indices->in_error ();
4625
0
    case 3:
4626
0
      for (const auto &offset : u.format3.conditions)
4627
0
  if (unlikely (!(&u.format3+offset).collect_var_indices (var_indices,
4628
0
                   depth - 1)))
4629
0
    return false;
4630
0
      return true;
4631
0
    case 4:
4632
0
      for (const auto &offset : u.format4.conditions)
4633
0
  if (unlikely (!(&u.format4+offset).collect_var_indices (var_indices,
4634
0
                   depth - 1)))
4635
0
    return false;
4636
0
      return true;
4637
0
    case 5:
4638
0
      return (&u.format5+u.format5.condition).collect_var_indices (var_indices,
4639
0
                  depth - 1);
4640
0
    default:
4641
0
      return false;
4642
0
  }
4643
0
}
4644
4645
inline bool
4646
Condition::serialize (hb_serialize_context_t *c,
4647
          const Condition *src,
4648
          const hb_map_t &varidx_map)
4649
0
{
4650
0
  TRACE_SERIALIZE (this);
4651
0
  switch (src->u.format.v)
4652
0
  {
4653
0
    case 1:
4654
0
      return_trace (bool (c->embed (&src->u.format1)));
4655
0
    case 2:
4656
0
    {
4657
0
      auto *out = c->embed (&src->u.format2);
4658
0
      if (unlikely (!out ||
4659
0
        (src->u.format2.varIdx != VarIdx::NO_VARIATION &&
4660
0
         !varidx_map.has (src->u.format2.varIdx))))
4661
0
  return_trace (false);
4662
0
      out->varIdx = src->u.format2.varIdx == VarIdx::NO_VARIATION ?
4663
0
        src->u.format2.varIdx : varidx_map.get (src->u.format2.varIdx);
4664
0
      return_trace (true);
4665
0
    }
4666
0
    case 3:
4667
0
    {
4668
0
      auto *out = c->start_embed<ConditionAnd> ();
4669
0
      if (unlikely (!c->extend_min (out))) return_trace (false);
4670
0
      out->format = 3;
4671
0
      out->conditions.len = src->u.format3.conditions.len;
4672
0
      if (unlikely (!c->extend (out->conditions))) return_trace (false);
4673
0
      for (unsigned i = 0; i < out->conditions.len; i++)
4674
0
  if (unlikely (!out->conditions[i].serialize_serialize (
4675
0
      c, &(&src->u.format3+src->u.format3.conditions[i]),
4676
0
      varidx_map)))
4677
0
    return_trace (false);
4678
0
      return_trace (true);
4679
0
    }
4680
0
    case 4:
4681
0
    {
4682
0
      auto *out = c->start_embed<ConditionOr> ();
4683
0
      if (unlikely (!c->extend_min (out))) return_trace (false);
4684
0
      out->format = 4;
4685
0
      out->conditions.len = src->u.format4.conditions.len;
4686
0
      if (unlikely (!c->extend (out->conditions))) return_trace (false);
4687
0
      for (unsigned i = 0; i < out->conditions.len; i++)
4688
0
  if (unlikely (!out->conditions[i].serialize_serialize (
4689
0
      c, &(&src->u.format4+src->u.format4.conditions[i]),
4690
0
      varidx_map)))
4691
0
    return_trace (false);
4692
0
      return_trace (true);
4693
0
    }
4694
0
    case 5:
4695
0
    {
4696
0
      auto *out = c->embed (&src->u.format5);
4697
0
      if (unlikely (!out ||
4698
0
        !out->condition.serialize_serialize (
4699
0
      c, &(&src->u.format5+src->u.format5.condition),
4700
0
      varidx_map)))
4701
0
  return_trace (false);
4702
0
      return_trace (true);
4703
0
    }
4704
0
    default:
4705
0
      return_trace (false);
4706
0
  }
4707
0
}
4708
4709
struct ConditionSet
4710
{
4711
  bool evaluate (const int *coords, unsigned int coord_len,
4712
     ItemVarStoreInstancer *instancer) const
4713
0
  {
4714
0
    unsigned int count = conditions.len;
4715
0
    for (unsigned int i = 0; i < count; i++)
4716
0
      if (!(this+conditions.arrayZ[i]).evaluate (coords, coord_len, instancer))
4717
0
  return false;
4718
0
    return true;
4719
0
  }
4720
4721
  void keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
4722
0
  {
4723
0
    hb_map_t *condition_map = hb_map_create ();
4724
0
    if (unlikely (!condition_map)) return;
4725
0
    hb::shared_ptr<hb_map_t> p {condition_map};
4726
4727
0
    hb_set_t *cond_set = hb_set_create ();
4728
0
    if (unlikely (!cond_set)) return;
4729
0
    hb::shared_ptr<hb_set_t> s {cond_set};
4730
4731
0
    c->apply = true;
4732
0
    bool should_keep = false;
4733
0
    unsigned num_kept_cond = 0, cond_idx = 0;
4734
0
    for (const auto& offset : conditions)
4735
0
    {
4736
0
      Cond_with_Var_flag_t ret = (this+offset).keep_with_variations (c, condition_map);
4737
      // condition is not met or condition out of range, drop the entire record
4738
0
      if (ret == DROP_RECORD_WITH_VAR)
4739
0
        return;
4740
4741
0
      if (ret == KEEP_COND_WITH_VAR)
4742
0
      {
4743
0
        should_keep = true;
4744
0
        cond_set->add (cond_idx);
4745
0
        num_kept_cond++;
4746
0
      }
4747
4748
0
      if (ret == KEEP_RECORD_WITH_VAR)
4749
0
        should_keep = true;
4750
4751
0
      cond_idx++;
4752
0
    }
4753
4754
0
    if (!should_keep) return;
4755
4756
    //check if condition_set is unique with variations
4757
0
    if (c->conditionset_map->has (p))
4758
      //duplicate found, drop the entire record
4759
0
      return;
4760
4761
0
    c->conditionset_map->set (p, 1);
4762
0
    c->record_cond_idx_map->set (c->cur_record_idx, s);
4763
0
    if (should_keep && num_kept_cond == 0)
4764
0
      c->universal = true;
4765
0
  }
4766
4767
  bool subset (hb_subset_context_t *c,
4768
               hb_subset_layout_context_t *l,
4769
               bool insert_catch_all) const
4770
0
  {
4771
0
    TRACE_SUBSET (this);
4772
0
    auto *out = c->serializer->start_embed (this);
4773
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
4774
4775
0
    if (insert_catch_all) return_trace (true);
4776
4777
0
    hb_set_t *retained_cond_set = nullptr;
4778
0
    if (l->feature_record_cond_idx_map != nullptr)
4779
0
      retained_cond_set = l->feature_record_cond_idx_map->get (l->cur_feature_var_record_idx);
4780
4781
0
    unsigned int count = conditions.len;
4782
0
    for (unsigned int i = 0; i < count; i++)
4783
0
    {
4784
0
      if (retained_cond_set != nullptr && !retained_cond_set->has (i))
4785
0
        continue;
4786
0
      subset_offset_array (c, out->conditions, this) (conditions[i]);
4787
0
    }
4788
4789
0
    return_trace (bool (out->conditions));
4790
0
  }
4791
4792
  bool sanitize (hb_sanitize_context_t *c) const
4793
0
  {
4794
0
    TRACE_SANITIZE (this);
4795
0
    return_trace (conditions.sanitize (c, this));
4796
0
  }
4797
4798
  protected:
4799
  Array16OfOffset32To<Condition>  conditions;
4800
  public:
4801
  DEFINE_SIZE_ARRAY (2, conditions);
4802
};
4803
4804
struct FeatureTableSubstitutionRecord
4805
{
4806
  friend struct FeatureTableSubstitution;
4807
4808
  void collect_lookups (const void *base, hb_set_t *lookup_indexes /* OUT */) const
4809
0
  {
4810
0
    return (base+feature).add_lookup_indexes_to (lookup_indexes);
4811
0
  }
4812
4813
  void closure_features (const void *base,
4814
       const hb_map_t *lookup_indexes,
4815
       hb_set_t       *feature_indexes /* OUT */) const
4816
0
  {
4817
0
    if ((base+feature).intersects_lookup_indexes (lookup_indexes))
4818
0
      feature_indexes->add (featureIndex);
4819
0
  }
4820
4821
  void collect_feature_substitutes_with_variations (hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
4822
                                                    hb_set_t& catch_all_record_feature_idxes,
4823
                                                    const hb_set_t *feature_indices,
4824
                                                    const void *base) const
4825
0
  {
4826
0
    if (feature_indices->has (featureIndex))
4827
0
    {
4828
0
      feature_substitutes_map->set (featureIndex, &(base+feature));
4829
0
      catch_all_record_feature_idxes.add (featureIndex);
4830
0
    }
4831
0
  }
4832
4833
  bool serialize (hb_subset_layout_context_t *c,
4834
                  unsigned feature_index,
4835
                  const Feature *f, const Tag *tag)
4836
0
  {
4837
0
    TRACE_SERIALIZE (this);
4838
0
    hb_serialize_context_t *s = c->subset_context->serializer;
4839
0
    if (unlikely (!s->extend_min (this))) return_trace (false);
4840
4841
0
    uint32_t *new_feature_idx;
4842
0
    if (!c->feature_map_w_duplicates->has (feature_index, &new_feature_idx))
4843
0
      return_trace (false);
4844
4845
0
    if (!s->check_assign (featureIndex, *new_feature_idx, HB_SERIALIZE_ERROR_INT_OVERFLOW))
4846
0
      return_trace (false);
4847
4848
0
    s->push ();
4849
0
    bool ret = f->subset (c->subset_context, c, tag);
4850
0
    if (ret) s->add_link (feature, s->pop_pack ());
4851
0
    else s->pop_discard ();
4852
4853
0
    return_trace (ret);
4854
0
  }
4855
4856
  bool subset (hb_subset_layout_context_t *c, const void *base) const
4857
0
  {
4858
0
    TRACE_SUBSET (this);
4859
0
    uint32_t *new_feature_index;
4860
0
    if (!c->feature_map_w_duplicates->has (featureIndex, &new_feature_index))
4861
0
      return_trace (false);
4862
4863
0
    auto *out = c->subset_context->serializer->embed (this);
4864
0
    if (unlikely (!out)) return_trace (false);
4865
4866
0
    out->featureIndex = *new_feature_index;
4867
0
    return_trace (out->feature.serialize_subset (c->subset_context, feature, base, c));
4868
0
  }
4869
4870
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
4871
0
  {
4872
0
    TRACE_SANITIZE (this);
4873
0
    return_trace (c->check_struct (this) && feature.sanitize (c, base));
4874
0
  }
4875
4876
  protected:
4877
  HBUINT16    featureIndex;
4878
  Offset32To<Feature> feature;
4879
  public:
4880
  DEFINE_SIZE_STATIC (6);
4881
};
4882
4883
struct FeatureTableSubstitution
4884
{
4885
  const Feature *find_substitute (unsigned int feature_index) const
4886
0
  {
4887
0
    unsigned int count = substitutions.len;
4888
0
    for (unsigned int i = 0; i < count; i++)
4889
0
    {
4890
0
      const FeatureTableSubstitutionRecord &record = substitutions.arrayZ[i];
4891
0
      if (record.featureIndex == feature_index)
4892
0
  return &(this+record.feature);
4893
0
    }
4894
0
    return nullptr;
4895
0
  }
4896
4897
  void collect_lookups (const hb_set_t *feature_indexes,
4898
      hb_set_t       *lookup_indexes /* OUT */) const
4899
0
  {
4900
0
    + hb_iter (substitutions)
4901
0
    | hb_filter (feature_indexes, &FeatureTableSubstitutionRecord::featureIndex)
4902
0
    | hb_apply ([this, lookup_indexes] (const FeatureTableSubstitutionRecord& r)
4903
0
    { r.collect_lookups (this, lookup_indexes); })
4904
0
    ;
4905
0
  }
4906
4907
  void closure_features (const hb_map_t *lookup_indexes,
4908
       hb_set_t       *feature_indexes /* OUT */) const
4909
0
  {
4910
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
4911
0
      record.closure_features (this, lookup_indexes, feature_indexes);
4912
0
  }
4913
4914
  bool intersects_features (const hb_map_t *feature_index_map) const
4915
0
  {
4916
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
4917
0
    {
4918
0
      if (feature_index_map->has (record.featureIndex)) return true;
4919
0
    }
4920
0
    return false;
4921
0
  }
4922
4923
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
4924
0
  {
4925
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
4926
0
      record.collect_feature_substitutes_with_variations (c->feature_substitutes_map,
4927
0
                                                          c->catch_all_record_feature_idxes,
4928
0
                                                          c->feature_indices, this);
4929
0
  }
4930
4931
  bool subset (hb_subset_context_t        *c,
4932
         hb_subset_layout_context_t *l,
4933
               bool insert_catch_all) const
4934
0
  {
4935
0
    TRACE_SUBSET (this);
4936
0
    auto *out = c->serializer->start_embed (*this);
4937
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
4938
4939
0
    out->version.major = version.major;
4940
0
    out->version.minor = version.minor;
4941
4942
0
    if (insert_catch_all)
4943
0
    {
4944
0
      for (unsigned feature_index : *(l->catch_all_record_feature_idxes))
4945
0
      {
4946
0
        hb_pair_t<const void*, const void*> *p;
4947
0
        if (!l->feature_idx_tag_map->has (feature_index, &p))
4948
0
          return_trace (false);
4949
0
        auto *o = out->substitutions.serialize_append (c->serializer);
4950
0
        if (!o->serialize (l, feature_index,
4951
0
                           reinterpret_cast<const Feature*> (p->first),
4952
0
                           reinterpret_cast<const Tag*> (p->second)))
4953
0
          return_trace (false);
4954
0
      }
4955
0
      return_trace (true);
4956
0
    }
4957
4958
0
    + substitutions.iter ()
4959
0
    | hb_apply (subset_record_array (l, &(out->substitutions), this))
4960
0
    ;
4961
4962
0
    return_trace (bool (out->substitutions));
4963
0
  }
4964
4965
  bool sanitize (hb_sanitize_context_t *c) const
4966
0
  {
4967
0
    TRACE_SANITIZE (this);
4968
0
    return_trace (version.sanitize (c) &&
4969
0
      hb_barrier () &&
4970
0
      likely (version.major == 1) &&
4971
0
      substitutions.sanitize (c, this));
4972
0
  }
4973
4974
  protected:
4975
  FixedVersion<>  version;  /* Version--0x00010000u */
4976
  Array16Of<FeatureTableSubstitutionRecord>
4977
      substitutions;
4978
  public:
4979
  DEFINE_SIZE_ARRAY (6, substitutions);
4980
};
4981
4982
struct FeatureVariationRecord
4983
{
4984
  friend struct FeatureVariations;
4985
4986
  void collect_lookups (const void     *base,
4987
      const hb_set_t *feature_indexes,
4988
      hb_set_t       *lookup_indexes /* OUT */) const
4989
0
  {
4990
0
    return (base+substitutions).collect_lookups (feature_indexes, lookup_indexes);
4991
0
  }
4992
4993
  void closure_features (const void     *base,
4994
       const hb_map_t *lookup_indexes,
4995
       hb_set_t       *feature_indexes /* OUT */) const
4996
0
  {
4997
0
    (base+substitutions).closure_features (lookup_indexes, feature_indexes);
4998
0
  }
4999
5000
  bool intersects_features (const void *base, const hb_map_t *feature_index_map) const
5001
0
  {
5002
0
    return (base+substitutions).intersects_features (feature_index_map);
5003
0
  }
5004
5005
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
5006
                                                    const void *base) const
5007
0
  {
5008
0
    (base+conditions).keep_with_variations (c);
5009
0
    if (c->apply && !c->variation_applied)
5010
0
    {
5011
0
      (base+substitutions).collect_feature_substitutes_with_variations (c);
5012
0
      c->variation_applied = true; // set variations only once
5013
0
    }
5014
0
  }
5015
5016
  bool subset (hb_subset_layout_context_t *c, const void *base,
5017
               bool insert_catch_all = false) const
5018
0
  {
5019
0
    TRACE_SUBSET (this);
5020
0
    auto *out = c->subset_context->serializer->embed (this);
5021
0
    if (unlikely (!out)) return_trace (false);
5022
5023
0
    out->conditions.serialize_subset (c->subset_context, conditions, base, c, insert_catch_all);
5024
0
    out->substitutions.serialize_subset (c->subset_context, substitutions, base, c, insert_catch_all);
5025
5026
0
    return_trace (true);
5027
0
  }
5028
5029
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
5030
0
  {
5031
0
    TRACE_SANITIZE (this);
5032
0
    return_trace (conditions.sanitize (c, base) &&
5033
0
      substitutions.sanitize (c, base));
5034
0
  }
5035
5036
  protected:
5037
  Offset32To<ConditionSet>
5038
      conditions;
5039
  Offset32To<FeatureTableSubstitution>
5040
      substitutions;
5041
  public:
5042
  DEFINE_SIZE_STATIC (8);
5043
};
5044
5045
struct FeatureVariations
5046
{
5047
  static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFFFFFu;
5048
5049
  unsigned record_count () const
5050
0
  {
5051
0
    return varRecords.len;
5052
0
  }
5053
5054
  bool find_index (const int *coords, unsigned int coord_len,
5055
       unsigned int *index,
5056
       ItemVarStoreInstancer *instancer) const
5057
27.9M
  {
5058
27.9M
    unsigned int count = varRecords.len;
5059
27.9M
    for (unsigned int i = 0; i < count; i++)
5060
0
    {
5061
0
      const FeatureVariationRecord &record = varRecords.arrayZ[i];
5062
0
      if ((this+record.conditions).evaluate (coords, coord_len, instancer))
5063
0
      {
5064
0
  *index = i;
5065
0
  return true;
5066
0
      }
5067
0
    }
5068
27.9M
    *index = NOT_FOUND_INDEX;
5069
27.9M
    return false;
5070
27.9M
  }
5071
5072
  const Feature *find_substitute (unsigned int variations_index,
5073
          unsigned int feature_index) const
5074
0
  {
5075
0
    const FeatureVariationRecord &record = varRecords[variations_index];
5076
0
    return (this+record.substitutions).find_substitute (feature_index);
5077
0
  }
5078
5079
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
5080
0
  {
5081
0
    unsigned int count = varRecords.len;
5082
0
    for (unsigned int i = 0; i < count; i++)
5083
0
    {
5084
0
      c->cur_record_idx = i;
5085
0
      varRecords[i].collect_feature_substitutes_with_variations (c, this);
5086
0
      if (c->universal)
5087
0
        break;
5088
0
    }
5089
0
    if (c->universal || c->record_cond_idx_map->is_empty ())
5090
0
      c->catch_all_record_feature_idxes.reset ();
5091
0
  }
5092
5093
  FeatureVariations* copy (hb_serialize_context_t *c) const
5094
0
  {
5095
0
    TRACE_SERIALIZE (this);
5096
0
    return_trace (c->embed (*this));
5097
0
  }
5098
5099
  void collect_lookups (const hb_set_t *feature_indexes,
5100
      const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
5101
      hb_set_t       *lookup_indexes /* OUT */) const
5102
65
  {
5103
65
    unsigned count = varRecords.len;
5104
65
    for (unsigned int i = 0; i < count; i++)
5105
0
    {
5106
0
      if (feature_record_cond_idx_map &&
5107
0
          !feature_record_cond_idx_map->has (i))
5108
0
        continue;
5109
0
      varRecords[i].collect_lookups (this, feature_indexes, lookup_indexes);
5110
0
    }
5111
65
  }
5112
5113
  void closure_features (const hb_map_t *lookup_indexes,
5114
       const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
5115
       hb_set_t       *feature_indexes /* OUT */) const
5116
0
  {
5117
0
    unsigned int count = varRecords.len;
5118
0
    for (unsigned int i = 0; i < count; i++)
5119
0
    {
5120
0
      if (feature_record_cond_idx_map != nullptr &&
5121
0
          !feature_record_cond_idx_map->has (i))
5122
0
        continue;
5123
0
      varRecords[i].closure_features (this, lookup_indexes, feature_indexes);
5124
0
    }
5125
0
  }
5126
5127
  bool subset (hb_subset_context_t *c,
5128
         hb_subset_layout_context_t *l) const
5129
0
  {
5130
0
    TRACE_SUBSET (this);
5131
0
    auto *out = c->serializer->start_embed (*this);
5132
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
5133
5134
0
    out->version.major = version.major;
5135
0
    out->version.minor = version.minor;
5136
5137
0
    int keep_up_to = -1;
5138
0
    for (int i = varRecords.len - 1; i >= 0; i--) {
5139
0
      if (varRecords[i].intersects_features (this, l->feature_map_w_duplicates)) {
5140
0
        keep_up_to = i;
5141
0
        break;
5142
0
      }
5143
0
    }
5144
5145
0
    unsigned count = (unsigned) (keep_up_to + 1);
5146
0
    for (unsigned i = 0; i < count; i++)
5147
0
    {
5148
0
      if (l->feature_record_cond_idx_map != nullptr &&
5149
0
          !l->feature_record_cond_idx_map->has (i))
5150
0
        continue;
5151
5152
0
      l->cur_feature_var_record_idx = i;
5153
0
      subset_record_array (l, &(out->varRecords), this) (varRecords[i]);
5154
0
    }
5155
5156
0
    if (out->varRecords.len && !l->catch_all_record_feature_idxes->is_empty ())
5157
0
    {
5158
0
      bool insert_catch_all_record = true;
5159
0
      subset_record_array (l, &(out->varRecords), this, insert_catch_all_record) (varRecords[0]);
5160
0
    }
5161
5162
0
    return_trace (bool (out->varRecords));
5163
0
  }
5164
5165
  bool sanitize (hb_sanitize_context_t *c) const
5166
0
  {
5167
0
    TRACE_SANITIZE (this);
5168
0
    return_trace (version.sanitize (c) &&
5169
0
      hb_barrier () &&
5170
0
      likely (version.major == 1) &&
5171
0
      varRecords.sanitize (c, this));
5172
0
  }
5173
5174
  protected:
5175
  FixedVersion<>  version;  /* Version--0x00010000u */
5176
  Array32Of<FeatureVariationRecord>
5177
      varRecords;
5178
  public:
5179
  DEFINE_SIZE_ARRAY_SIZED (8, varRecords);
5180
};
5181
5182
5183
/*
5184
 * Device Tables
5185
 */
5186
5187
struct HintingDevice
5188
{
5189
  friend struct Device;
5190
5191
  private:
5192
5193
  hb_position_t get_x_delta (hb_font_t *font) const
5194
0
  { return get_delta (font->x_ppem, font->x_scale); }
5195
5196
  hb_position_t get_y_delta (hb_font_t *font) const
5197
0
  { return get_delta (font->y_ppem, font->y_scale); }
5198
5199
  public:
5200
5201
  size_t get_size () const
5202
0
  {
5203
0
    unsigned int f = deltaFormat;
5204
0
    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
5205
0
    return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
5206
0
  }
5207
5208
  bool sanitize (hb_sanitize_context_t *c) const
5209
0
  {
5210
0
    TRACE_SANITIZE (this);
5211
0
    return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
5212
0
  }
5213
5214
  HintingDevice* copy (hb_serialize_context_t *c) const
5215
0
  {
5216
0
    TRACE_SERIALIZE (this);
5217
0
    return_trace (c->embed<HintingDevice> (this));
5218
0
  }
5219
5220
  private:
5221
5222
  int get_delta (unsigned int ppem, int scale) const
5223
0
  {
5224
0
    if (!ppem) return 0;
5225
5226
0
    int pixels = get_delta_pixels (ppem);
5227
5228
0
    if (!pixels) return 0;
5229
5230
0
    return (int) (pixels * (int64_t) scale / ppem);
5231
0
  }
5232
  int get_delta_pixels (unsigned int ppem_size) const
5233
0
  {
5234
0
    unsigned int f = deltaFormat;
5235
0
    if (unlikely (f < 1 || f > 3))
5236
0
      return 0;
5237
5238
0
    if (ppem_size < startSize || ppem_size > endSize)
5239
0
      return 0;
5240
5241
0
    unsigned int s = ppem_size - startSize;
5242
5243
0
    unsigned int byte = deltaValueZ[s >> (4 - f)];
5244
0
    unsigned int bits = (byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f)));
5245
0
    unsigned int mask = (0xFFFFu >> (16 - (1 << f)));
5246
5247
0
    int delta = bits & mask;
5248
5249
0
    if ((unsigned int) delta >= ((mask + 1) >> 1))
5250
0
      delta -= mask + 1;
5251
5252
0
    return delta;
5253
0
  }
5254
5255
  protected:
5256
  HBUINT16  startSize;    /* Smallest size to correct--in ppem */
5257
  HBUINT16  endSize;    /* Largest size to correct--in ppem */
5258
  HBUINT16  deltaFormat;    /* Format of DeltaValue array data: 1, 2, or 3
5259
           * 1  Signed 2-bit value, 8 values per uint16
5260
           * 2  Signed 4-bit value, 4 values per uint16
5261
           * 3  Signed 8-bit value, 2 values per uint16
5262
           */
5263
  UnsizedArrayOf<HBUINT16>
5264
    deltaValueZ;    /* Array of compressed data */
5265
  public:
5266
  DEFINE_SIZE_ARRAY (6, deltaValueZ);
5267
};
5268
5269
struct VariationDevice
5270
{
5271
  friend struct Device;
5272
5273
  private:
5274
5275
  hb_position_t get_x_delta (hb_font_t *font,
5276
           const ItemVariationStore &store,
5277
           hb_scalar_cache_t *store_cache = nullptr) const
5278
0
  { return !font->has_nonzero_coords ? 0 : font->em_scalef_x (get_delta (font, store, store_cache)); }
5279
5280
  hb_position_t get_y_delta (hb_font_t *font,
5281
           const ItemVariationStore &store,
5282
           hb_scalar_cache_t *store_cache = nullptr) const
5283
0
  { return !font->has_nonzero_coords ? 0 : font->em_scalef_y (get_delta (font, store, store_cache)); }
5284
5285
  VariationDevice* copy (hb_serialize_context_t *c,
5286
                         const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const
5287
0
  {
5288
0
    TRACE_SERIALIZE (this);
5289
0
    if (!layout_variation_idx_delta_map) return_trace (nullptr);
5290
5291
0
    hb_pair_t<unsigned, int> *v;
5292
0
    if (!layout_variation_idx_delta_map->has (varIdx, &v))
5293
0
      return_trace (nullptr);
5294
5295
0
    c->start_zerocopy (this->static_size);
5296
0
    auto *out = c->embed (this);
5297
0
    if (unlikely (!out)) return_trace (nullptr);
5298
5299
0
    if (!c->check_assign (out->varIdx, hb_first (*v), HB_SERIALIZE_ERROR_INT_OVERFLOW))
5300
0
      return_trace (nullptr);
5301
0
    return_trace (out);
5302
0
  }
5303
5304
  void collect_variation_index (hb_collect_variation_indices_context_t *c) const
5305
0
  { c->layout_variation_indices->add (varIdx); }
5306
5307
  bool sanitize (hb_sanitize_context_t *c) const
5308
0
  {
5309
0
    TRACE_SANITIZE (this);
5310
0
    return_trace (c->check_struct (this));
5311
0
  }
5312
5313
  private:
5314
5315
  float get_delta (hb_font_t *font,
5316
       const ItemVariationStore &store,
5317
       hb_scalar_cache_t *store_cache = nullptr) const
5318
0
  {
5319
0
    return store.get_delta (varIdx, font->coords, font->num_coords, store_cache);
5320
0
  }
5321
5322
  protected:
5323
  VarIdx  varIdx;   /* Variation index */
5324
  HBUINT16  deltaFormat;  /* Format identifier for this table: 0x0x8000 */
5325
  public:
5326
  DEFINE_SIZE_STATIC (6);
5327
};
5328
5329
struct DeviceHeader
5330
{
5331
  protected:
5332
  HBUINT16    reserved1;
5333
  HBUINT16    reserved2;
5334
  public:
5335
  HBUINT16    format;   /* Format identifier */
5336
  public:
5337
  DEFINE_SIZE_STATIC (6);
5338
};
5339
5340
struct Device
5341
{
5342
  hb_position_t get_x_delta (hb_font_t *font,
5343
           const ItemVariationStore &store=Null (ItemVariationStore),
5344
           hb_scalar_cache_t *store_cache = nullptr) const
5345
0
  {
5346
0
    switch (u.b.format)
5347
0
    {
5348
0
#ifndef HB_NO_HINTING
5349
0
    case 1: case 2: case 3:
5350
0
      hb_barrier ();
5351
0
      return u.hinting.get_x_delta (font);
5352
0
#endif
5353
0
#ifndef HB_NO_VAR
5354
0
    case 0x8000:
5355
0
      hb_barrier ();
5356
0
      return u.variation.get_x_delta (font, store, store_cache);
5357
0
#endif
5358
0
    default:
5359
0
      return 0;
5360
0
    }
5361
0
  }
5362
  hb_position_t get_y_delta (hb_font_t *font,
5363
           const ItemVariationStore &store=Null (ItemVariationStore),
5364
           hb_scalar_cache_t *store_cache = nullptr) const
5365
0
  {
5366
0
    switch (u.b.format)
5367
0
    {
5368
0
    case 1: case 2: case 3:
5369
0
#ifndef HB_NO_HINTING
5370
0
      hb_barrier ();
5371
0
      return u.hinting.get_y_delta (font);
5372
0
#endif
5373
0
#ifndef HB_NO_VAR
5374
0
    case 0x8000:
5375
0
      hb_barrier ();
5376
0
      return u.variation.get_y_delta (font, store, store_cache);
5377
0
#endif
5378
0
    default:
5379
0
      return 0;
5380
0
    }
5381
0
  }
5382
5383
  bool sanitize (hb_sanitize_context_t *c) const
5384
0
  {
5385
0
    TRACE_SANITIZE (this);
5386
0
    if (!u.b.format.sanitize (c)) return_trace (false);
5387
0
    switch (u.b.format) {
5388
0
#ifndef HB_NO_HINTING
5389
0
    case 1: case 2: case 3:
5390
0
      hb_barrier ();
5391
0
      return_trace (u.hinting.sanitize (c));
5392
0
#endif
5393
0
#ifndef HB_NO_VAR
5394
0
    case 0x8000:
5395
0
      hb_barrier ();
5396
0
      return_trace (u.variation.sanitize (c));
5397
0
#endif
5398
0
    default:
5399
0
      return_trace (true);
5400
0
    }
5401
0
  }
5402
5403
  Device* copy (hb_serialize_context_t *c,
5404
                const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map=nullptr) const
5405
0
  {
5406
0
    TRACE_SERIALIZE (this);
5407
0
    switch (u.b.format) {
5408
0
#ifndef HB_NO_HINTING
5409
0
    case 1:
5410
0
    case 2:
5411
0
    case 3:
5412
0
      hb_barrier ();
5413
0
      return_trace (reinterpret_cast<Device *> (u.hinting.copy (c)));
5414
0
#endif
5415
0
#ifndef HB_NO_VAR
5416
0
    case 0x8000:
5417
0
      hb_barrier ();
5418
0
      return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_delta_map)));
5419
0
#endif
5420
0
    default:
5421
0
      return_trace (nullptr);
5422
0
    }
5423
0
  }
5424
5425
  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
5426
0
  {
5427
0
    switch (u.b.format) {
5428
0
#ifndef HB_NO_HINTING
5429
0
    case 1:
5430
0
    case 2:
5431
0
    case 3:
5432
0
      return;
5433
0
#endif
5434
0
#ifndef HB_NO_VAR
5435
0
    case 0x8000:
5436
0
      hb_barrier ();
5437
0
      u.variation.collect_variation_index (c);
5438
0
      return;
5439
0
#endif
5440
0
    default:
5441
0
      return;
5442
0
    }
5443
0
  }
5444
5445
  unsigned get_variation_index () const
5446
0
  {
5447
0
    switch (u.b.format) {
5448
0
#ifndef HB_NO_VAR
5449
0
    case 0x8000:
5450
0
      hb_barrier ();
5451
0
      return u.variation.varIdx;
5452
0
#endif
5453
0
    default:
5454
0
      return HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
5455
0
    }
5456
0
  }
5457
5458
  bool is_variation_device () const
5459
0
  {
5460
0
    switch (u.b.format) {
5461
0
#ifndef HB_NO_VAR
5462
0
    case 0x8000:
5463
0
      return true;
5464
0
#endif
5465
0
    default:
5466
0
      return false;
5467
0
    }
5468
0
  }
5469
5470
  protected:
5471
  union {
5472
  DeviceHeader    b;
5473
  HintingDevice   hinting;
5474
#ifndef HB_NO_VAR
5475
  VariationDevice variation;
5476
#endif
5477
  } u;
5478
  public:
5479
  DEFINE_SIZE_UNION (6, b);
5480
};
5481
5482
5483
} /* namespace OT */
5484
5485
5486
#endif /* HB_OT_LAYOUT_COMMON_HH */