Coverage Report

Created: 2026-10-14 09:33

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
#include "hb-ot-dual.hh"
39
40
using hb_ot_layout_mapping_cache_t = hb_cache_t<16, 8, 8>;
41
static_assert (sizeof (hb_ot_layout_mapping_cache_t) == 512, "");
42
43
using hb_ot_layout_binary_cache_t = hb_cache_t<14, 1, 8>;
44
static_assert (sizeof (hb_ot_layout_binary_cache_t) == 256, "");
45
46
#include "OT/Layout/Common/Coverage.hh"
47
48
// TODO(garretrieger): cleanup these after migration.
49
using OT::Layout::Common::Coverage;
50
using OT::Layout::Common::RangeRecord;
51
using OT::Layout::SmallTypes;
52
using OT::Layout::MediumTypes;
53
54
55
namespace OT {
56
57
template<typename Iterator>
58
static inline bool ClassDef_serialize (hb_serialize_context_t *c,
59
               Iterator it);
60
61
static bool ClassDef_remap_and_serialize (
62
    hb_serialize_context_t *c,
63
    const hb_set_t &klasses,
64
    bool use_class_zero,
65
    hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
66
    hb_map_t *klass_map /*IN/OUT*/);
67
68
struct ItemVarStoreInstancer;
69
70
struct hb_collect_feature_substitutes_with_var_context_t
71
{
72
  const hb_map_t *axes_index_tag_map;
73
  const hb_hashmap_t<hb_tag_t, Triple> *axes_location;
74
  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *record_cond_idx_map;
75
  hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
76
  hb_set_t& catch_all_record_feature_idxes;
77
78
  // not stored in subset_plan
79
  hb_set_t *feature_indices;
80
  bool apply;
81
  bool variation_applied;
82
  bool universal;
83
  unsigned cur_record_idx;
84
  hb_hashmap_t<hb::shared_ptr<hb_map_t>, unsigned> *conditionset_map;
85
  ItemVarStoreInstancer *instancer;
86
  bool all_axes_pinned;
87
};
88
89
struct hb_prune_langsys_context_t
90
{
91
  hb_prune_langsys_context_t (const void         *table_,
92
                              hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map_,
93
                              const hb_map_t     *duplicate_feature_map_,
94
                              hb_set_t           *new_collected_feature_indexes_)
95
0
      :table (table_),
96
0
      script_langsys_map (script_langsys_map_),
97
0
      duplicate_feature_map (duplicate_feature_map_),
98
0
      new_feature_indexes (new_collected_feature_indexes_),
99
0
      script_count (0),langsys_feature_count (0) {}
100
101
  bool visitScript ()
102
0
  { return script_count++ < HB_MAX_SCRIPTS; }
103
104
  bool visitLangsys (unsigned feature_count)
105
0
  {
106
0
    langsys_feature_count += feature_count;
107
0
    return langsys_feature_count < HB_MAX_LANGSYS_FEATURE_COUNT;
108
0
  }
109
110
  public:
111
  const void *table;
112
  hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map;
113
  const hb_map_t     *duplicate_feature_map;
114
  hb_set_t           *new_feature_indexes;
115
116
  private:
117
  unsigned script_count;
118
  unsigned langsys_feature_count;
119
};
120
121
struct hb_subset_layout_context_t :
122
  hb_dispatch_context_t<hb_subset_layout_context_t, hb_empty_t, HB_DEBUG_SUBSET>
123
{
124
0
  const char *get_name () { return "SUBSET_LAYOUT"; }
125
0
  static return_t default_return_value () { return hb_empty_t (); }
126
127
  bool visitScript ()
128
0
  {
129
0
    return script_count++ < HB_MAX_SCRIPTS;
130
0
  }
131
132
  bool visitLangSys ()
133
0
  {
134
0
    return langsys_count++ < HB_MAX_LANGSYS;
135
0
  }
136
137
  bool visitFeatureIndex (int count)
138
0
  {
139
0
    feature_index_count += count;
140
0
    return feature_index_count < HB_MAX_FEATURE_INDICES;
141
0
  }
142
143
  bool visitLookupIndex()
144
0
  {
145
0
    lookup_index_count++;
146
0
    return lookup_index_count < HB_MAX_LOOKUP_VISIT_COUNT;
147
0
  }
148
149
  hb_subset_context_t *subset_context;
150
  const hb_tag_t table_tag;
151
  const hb_map_t *lookup_index_map;
152
  const hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *script_langsys_map;
153
  const hb_map_t *feature_index_map;
154
  const hb_map_t *feature_map_w_duplicates;
155
  const hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map;
156
  const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *lookup_variations;
157
  hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map;
158
  const hb_set_t *catch_all_record_feature_idxes;
159
  const hb_hashmap_t<unsigned, hb_pair_t<const void*, const void*>> *feature_idx_tag_map;
160
161
  unsigned cur_script_index;
162
  unsigned cur_feature_index;
163
  unsigned cur_feature_var_record_idx;
164
165
  hb_subset_layout_context_t (hb_subset_context_t *c_,
166
            hb_tag_t tag_) :
167
0
        subset_context (c_),
168
0
        table_tag (tag_),
169
0
        cur_script_index (0xFFFFu),
170
0
        cur_feature_index (Index::NOT_FOUND_INDEX),
171
0
        cur_feature_var_record_idx (0u),
172
0
        script_count (0),
173
0
        langsys_count (0),
174
0
        feature_index_count (0),
175
0
        lookup_index_count (0)
176
0
  {
177
0
    if (tag_ == HB_OT_TAG_GSUB)
178
0
    {
179
0
      lookup_index_map = &c_->plan->gsub_lookups;
180
0
      script_langsys_map = &c_->plan->gsub_langsys;
181
0
      feature_index_map = &c_->plan->gsub_features;
182
0
      feature_map_w_duplicates = &c_->plan->gsub_features_w_duplicates;
183
0
      feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
184
0
      lookup_variations = &c_->plan->gsub_lookup_variations;
185
0
      feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
186
0
      catch_all_record_feature_idxes = &c_->plan->gsub_old_features;
187
0
      feature_idx_tag_map = &c_->plan->gsub_old_feature_idx_tag_map;
188
0
    }
189
0
    else
190
0
    {
191
0
      lookup_index_map = &c_->plan->gpos_lookups;
192
0
      script_langsys_map = &c_->plan->gpos_langsys;
193
0
      feature_index_map = &c_->plan->gpos_features;
194
0
      feature_map_w_duplicates = &c_->plan->gpos_features_w_duplicates;
195
0
      feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
196
0
      lookup_variations = &c_->plan->gpos_lookup_variations;
197
0
      feature_record_cond_idx_map = c_->plan->user_axes_location.is_empty () ? nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
198
0
      catch_all_record_feature_idxes = &c_->plan->gpos_old_features;
199
0
      feature_idx_tag_map = &c_->plan->gpos_old_feature_idx_tag_map;
200
0
    }
201
0
  }
202
203
  private:
204
  unsigned script_count;
205
  unsigned langsys_count;
206
  unsigned feature_index_count;
207
  unsigned lookup_index_count;
208
};
209
210
struct ItemVariationStore;
211
struct hb_collect_variation_indices_context_t :
212
       hb_dispatch_context_t<hb_collect_variation_indices_context_t>
213
{
214
  template <typename T>
215
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_3<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::SinglePosFormat1_3<OT::Layout::SmallTypes> const&)
Unexecuted instantiation: hb_empty_t OT::hb_collect_variation_indices_context_t::dispatch<OT::Layout::GPOS_impl::SinglePosFormat2_4<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::SinglePosFormat2_4<OT::Layout::SmallTypes> 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_2<OT::Layout::SmallTypes> >(OT::Layout::GPOS_impl::CursivePosFormat1_2<OT::Layout::SmallTypes> 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_6<OT::Layout::SmallTypes> >(OT::ContextFormat3_6<OT::Layout::SmallTypes> 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::Layout::SmallTypes> >(OT::ChainContextFormat3<OT::Layout::SmallTypes> const&)
216
0
  static return_t default_return_value () { return hb_empty_t (); }
217
218
  hb_set_t *layout_variation_indices;
219
  const hb_set_t *glyph_set;
220
  const hb_map_t *gpos_lookups;
221
222
  hb_collect_variation_indices_context_t (hb_set_t *layout_variation_indices_,
223
            const hb_set_t *glyph_set_,
224
            const hb_map_t *gpos_lookups_) :
225
0
          layout_variation_indices (layout_variation_indices_),
226
0
          glyph_set (glyph_set_),
227
0
          gpos_lookups (gpos_lookups_) {}
228
};
229
230
template<typename OutputArray>
231
struct subset_offset_array_t
232
{
233
  subset_offset_array_t (hb_subset_context_t *subset_context_,
234
       OutputArray& out_,
235
0
       const void *base_) : subset_context (subset_context_),
236
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::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >::subset_offset_array_t(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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*)
237
238
  template <typename T>
239
  bool operator () (T&& offset)
240
0
  {
241
0
    auto snap = subset_context->serializer->snapshot ();
242
0
    auto *o = out.serialize_append (subset_context->serializer);
243
0
    if (unlikely (!o)) return false;
244
0
    bool ret = o->serialize_subset (subset_context, offset, base);
245
0
    if (!ret)
246
0
    {
247
0
      out.pop ();
248
0
      subset_context->serializer->revert (snap);
249
0
    }
250
0
    return ret;
251
0
  }
Unexecuted instantiation: bool OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >::operator()<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true> const&>(OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true> const&)
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&)
252
253
  private:
254
  hb_subset_context_t *subset_context;
255
  OutputArray &out;
256
  const void *base;
257
};
258
259
260
template<typename OutputArray, typename Arg>
261
struct subset_offset_array_arg_t
262
{
263
  subset_offset_array_arg_t (hb_subset_context_t *subset_context_,
264
           OutputArray& out_,
265
           const void *base_,
266
0
           Arg &&arg_) : subset_context (subset_context_), out (out_),
267
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&)
268
269
  template <typename T>
270
  bool operator () (T&& offset)
271
0
  {
272
0
    auto snap = subset_context->serializer->snapshot ();
273
0
    auto *o = out.serialize_append (subset_context->serializer);
274
0
    if (unlikely (!o)) return false;
275
0
    bool ret = o->serialize_subset (subset_context, offset, base, arg);
276
0
    if (!ret)
277
0
    {
278
0
      out.pop ();
279
0
      subset_context->serializer->revert (snap);
280
0
    }
281
0
    return ret;
282
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&)
283
284
  private:
285
  hb_subset_context_t *subset_context;
286
  OutputArray &out;
287
  const void *base;
288
  Arg &&arg;
289
};
290
291
/*
292
 * Helper to subset an array of offsets. Subsets the thing pointed to by each offset
293
 * and discards the offset in the array if the subset operation results in an empty
294
 * thing.
295
 */
296
struct
297
{
298
  template<typename OutputArray>
299
  subset_offset_array_t<OutputArray>
300
  operator () (hb_subset_context_t *subset_context, OutputArray& out,
301
         const void *base) const
302
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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, void const*) const
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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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-font.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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-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::$_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-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::$_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-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::$_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-face.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-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::$_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-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::$_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-face.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-fetch.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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-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::$_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-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::$_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-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::$_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-style.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_44::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_44::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::$_44::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::$_44::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::$_44::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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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::$_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-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::$_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-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::$_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-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::$_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: gsubgpos-context.cc:OT::subset_offset_array_t<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_40::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_41::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > > OT::$_39::operator()<OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> > >(hb_subset_context_t*, OT::ArrayOf<OT::OffsetTo<OT::Condition, OT::NumType<true, unsigned int, 3u>, void, true>, OT::NumType<true, unsigned char, 1u> >&, 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
303
304
  /* Variant with one extra argument passed to serialize_subset */
305
  template<typename OutputArray, typename Arg>
306
  subset_offset_array_arg_t<OutputArray, Arg>
307
  operator () (hb_subset_context_t *subset_context, OutputArray& out,
308
         const void *base, Arg &&arg) const
309
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::$_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-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::$_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-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::$_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-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::$_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-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::$_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-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::$_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-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
310
}
311
HB_FUNCOBJ (subset_offset_array);
312
313
template<typename OutputArray>
314
struct subset_record_array_t
315
{
316
  subset_record_array_t (hb_subset_layout_context_t *c_, OutputArray* out_,
317
0
       const void *base_) : subset_layout_context (c_),
318
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*)
Unexecuted instantiation: OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >::subset_record_array_t(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*)
319
320
  template <typename T>
321
  void
322
  operator () (T&& record)
323
0
  {
324
0
    auto snap = subset_layout_context->subset_context->serializer->snapshot ();
325
0
    bool ret = record.subset (subset_layout_context, base);
326
0
    if (!ret) subset_layout_context->subset_context->serializer->revert (snap);
327
0
    else out->len++;
328
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&)
Unexecuted instantiation: void OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >::operator()<OT::LookupVariationRecord const&>(OT::LookupVariationRecord const&)
329
330
  private:
331
  hb_subset_layout_context_t *subset_layout_context;
332
  OutputArray *out;
333
  const void *base;
334
};
335
336
template<typename OutputArray, typename Arg>
337
struct subset_record_array_arg_t
338
{
339
  subset_record_array_arg_t (hb_subset_layout_context_t *c_, OutputArray* out_,
340
           const void *base_,
341
0
           Arg &&arg_) : subset_layout_context (c_),
342
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&)
343
344
  template <typename T>
345
  void
346
  operator () (T&& record)
347
0
  {
348
0
    auto snap = subset_layout_context->subset_context->serializer->snapshot ();
349
0
    bool ret = record.subset (subset_layout_context, base, arg);
350
0
    if (!ret) subset_layout_context->subset_context->serializer->revert (snap);
351
0
    else out->len++;
352
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&)
353
354
  private:
355
  hb_subset_layout_context_t *subset_layout_context;
356
  OutputArray *out;
357
  const void *base;
358
  Arg &&arg;
359
};
360
361
/*
362
 * Helper to subset a RecordList/record array. Subsets each Record in the array and
363
 * discards the record if the subset operation returns false.
364
 */
365
struct
366
{
367
  template<typename OutputArray>
368
  subset_record_array_t<OutputArray>
369
  operator () (hb_subset_layout_context_t *c, OutputArray* out,
370
         const void *base) const
371
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::$_38::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::$_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-layout.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-aat-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-aat-map.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-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-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-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-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_36::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_37::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::$_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-face.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-face.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-fetch.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_37::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::$_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-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-font.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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: VARC.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_38::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::$_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-layout.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::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-math.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-metrics.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-shape.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-ot-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-static.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-static.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-static.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::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-style.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-cff1-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-cff2-table.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-shaper-arabic.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_38::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::$_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-fallback.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::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
Unexecuted instantiation: hb-subset.cc:OT::subset_record_array_t<OT::RecordArrayOf<OT::LangSys> > OT::$_42::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::$_42::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::$_42::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::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_42::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_38::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::$_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-plan.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-plan.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_38::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::$_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-plan-layout.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-plan-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-plan-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-layout.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, 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-var.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_38::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-cff.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-color.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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::$_37::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::$_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-other.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::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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: gsubgpos-context.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-cff1.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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-cff2.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_39::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, 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
Unexecuted instantiation: hb-subset-cff-common.cc:OT::subset_record_array_t<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > > OT::$_37::operator()<OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> > >(OT::hb_subset_layout_context_t*, OT::ArrayOf<OT::LookupVariationRecord, OT::NumType<true, unsigned int, 4u> >*, void const*) const
372
373
  /* Variant with one extra argument passed to subset */
374
  template<typename OutputArray, typename Arg>
375
  subset_record_array_arg_t<OutputArray, Arg>
376
  operator () (hb_subset_layout_context_t *c, OutputArray* out,
377
               const void *base, Arg &&arg) const
378
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::$_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-layout.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-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::$_38::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::$_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-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::$_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-face.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-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::$_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-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: 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::$_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-layout.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-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::$_37::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::$_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-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::$_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-fallback.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.cc:OT::subset_record_array_arg_t<OT::RecordListOfFeature, OT::Feature const*&> OT::$_42::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::$_42::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::$_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-plan.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-plan-layout.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-plan-layout.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-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::$_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-other.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: 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
379
}
380
HB_FUNCOBJ (subset_record_array);
381
382
383
template<typename OutputArray>
384
struct serialize_math_record_array_t
385
{
386
  serialize_math_record_array_t (hb_serialize_context_t *serialize_context_,
387
                         OutputArray& out_,
388
0
                         const void *base_) : serialize_context (serialize_context_),
389
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*)
390
391
  template <typename T>
392
  bool operator () (T&& record)
393
0
  {
394
0
    if (!serialize_context->copy (record, base)) return false;
395
0
    out.len++;
396
0
    return true;
397
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&)
398
399
  private:
400
  hb_serialize_context_t *serialize_context;
401
  OutputArray &out;
402
  const void *base;
403
};
404
405
/*
406
 * Helper to serialize an array of MATH records.
407
 */
408
struct
409
{
410
  template<typename OutputArray>
411
  serialize_math_record_array_t<OutputArray>
412
  operator () (hb_serialize_context_t *serialize_context, OutputArray& out,
413
               const void *base) const
414
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
415
416
}
417
HB_FUNCOBJ (serialize_math_record_array);
418
419
/*
420
 *
421
 * OpenType Layout Common Table Formats
422
 *
423
 */
424
425
426
/*
427
 * Script, ScriptList, LangSys, Feature, FeatureList, Lookup, LookupList
428
 */
429
430
struct IndexArray : Array16Of<Index>
431
{
432
  bool intersects (const hb_map_t *indexes) const
433
0
  { return hb_any (*this, indexes); }
434
435
  template <typename Iterator,
436
      hb_requires (hb_is_iterator (Iterator))>
437
  void serialize (hb_serialize_context_t *c,
438
      hb_subset_layout_context_t *l,
439
      Iterator it)
440
0
  {
441
0
    if (!it) return;
442
0
    if (unlikely (!c->extend_min ((*this)))) return;
443
444
0
    for (const auto _ : it)
445
0
    {
446
0
      if (!l->visitLookupIndex()) break;
447
448
0
      Index i;
449
0
      i = _;
450
0
      c->copy (i);
451
0
      this->len++;
452
0
    }
453
0
  }
Unexecuted instantiation: hb-aat-layout.cc:_ZN2OT10IndexArray9serializeI13hb_map_iter_tI16hb_filter_iter_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_tIN23hb_bit_set_invertible_t6iter_tERPK8hb_map_tRK3$_6LPv0EES9_L24hb_function_sortedness_t0ELSD_0EETnPN12hb_enable_ifIXsr17hb_is_iterator_ofIT_NSI_6item_tEEE5valueEvE4typeELSD_0EEEvP22hb_serialize_context_tPNS_26hb_subset_layout_context_tESI_
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_
454
455
  unsigned int get_indexes (unsigned int start_offset,
456
          unsigned int *_count /* IN/OUT */,
457
          unsigned int *_indexes /* OUT */) const
458
45.1k
  {
459
45.1k
    if (_count && _indexes)
460
33.4k
    {
461
33.4k
      + this->as_array ().sub_array (start_offset, _count)
462
33.4k
      | hb_sink (hb_array (_indexes, *_count))
463
33.4k
      ;
464
33.4k
    }
465
45.1k
    return this->len;
466
45.1k
  }
467
468
  void add_indexes_to (hb_set_t* output /* OUT */) const
469
0
  {
470
0
    output->add_array (as_array ());
471
0
  }
472
};
473
474
475
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
476
struct FeatureParamsSize
477
{
478
  bool sanitize (hb_sanitize_context_t *c) const
479
0
  {
480
0
    TRACE_SANITIZE (this);
481
0
    if (unlikely (!c->check_struct (this))) return_trace (false);
482
0
    hb_barrier ();
483
484
    /* This subtable has some "history", if you will.  Some earlier versions of
485
     * Adobe tools calculated the offset of the FeatureParams subtable from the
486
     * beginning of the FeatureList table!  Now, that is dealt with in the
487
     * Feature implementation.  But we still need to be able to tell junk from
488
     * real data.  Note: We don't check that the nameID actually exists.
489
     *
490
     * Read Roberts wrote on 9/15/06 on opentype-list@indx.co.uk :
491
     *
492
     * Yes, it is correct that a new version of the AFDKO (version 2.0) will be
493
     * coming out soon, and that the makeotf program will build a font with a
494
     * 'size' feature that is correct by the specification.
495
     *
496
     * The specification for this feature tag is in the "OpenType Layout Tag
497
     * Registry". You can see a copy of this at:
498
     * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size
499
     *
500
     * Here is one set of rules to determine if the 'size' feature is built
501
     * correctly, or as by the older versions of MakeOTF. You may be able to do
502
     * better.
503
     *
504
     * Assume that the offset to the size feature is according to specification,
505
     * and make the following value checks. If it fails, assume the size
506
     * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
507
     * If this fails, reject the 'size' feature. The older makeOTF's calculated the
508
     * offset from the beginning of the FeatureList table, rather than from the
509
     * beginning of the 'size' Feature table.
510
     *
511
     * If "design size" == 0:
512
     *     fails check
513
     *
514
     * Else if ("subfamily identifier" == 0 and
515
     *     "range start" == 0 and
516
     *     "range end" == 0 and
517
     *     "range start" == 0 and
518
     *     "menu name ID" == 0)
519
     *     passes check: this is the format used when there is a design size
520
     * specified, but there is no recommended size range.
521
     *
522
     * Else if ("design size" <  "range start" or
523
     *     "design size" >   "range end" or
524
     *     "range end" <= "range start" or
525
     *     "menu name ID"  < 256 or
526
     *     "menu name ID"  > 32767 or
527
     *     menu name ID is not a name ID which is actually in the name table)
528
     *     fails test
529
     * Else
530
     *     passes test.
531
     */
532
533
0
    if (!designSize)
534
0
      return_trace (false);
535
0
    else if (subfamilyID == 0 &&
536
0
       subfamilyNameID == 0 &&
537
0
       rangeStart == 0 &&
538
0
       rangeEnd == 0)
539
0
      return_trace (true);
540
0
    else if (designSize < rangeStart ||
541
0
       designSize > rangeEnd ||
542
0
       subfamilyNameID < 256 ||
543
0
       subfamilyNameID > 32767)
544
0
      return_trace (false);
545
0
    else
546
0
      return_trace (true);
547
0
  }
548
549
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
550
0
  { nameids_to_retain->add (subfamilyNameID); }
551
552
  bool subset (hb_subset_context_t *c) const
553
0
  {
554
0
    TRACE_SUBSET (this);
555
0
    return_trace ((bool) c->serializer->embed (*this));
556
0
  }
557
558
  HBUINT16  designSize; /* Represents the design size in 720/inch
559
         * units (decipoints).  The design size entry
560
         * must be non-zero.  When there is a design
561
         * size but no recommended size range, the
562
         * rest of the array will consist of zeros. */
563
  HBUINT16  subfamilyID;  /* Has no independent meaning, but serves
564
         * as an identifier that associates fonts
565
         * in a subfamily. All fonts which share a
566
         * Preferred or Font Family name and which
567
         * differ only by size range shall have the
568
         * same subfamily value, and no fonts which
569
         * differ in weight or style shall have the
570
         * same subfamily value. If this value is
571
         * zero, the remaining fields in the array
572
         * will be ignored. */
573
  NameID  subfamilyNameID;/* If the preceding value is non-zero, this
574
         * value must be set in the range 256 - 32767
575
         * (inclusive). It records the value of a
576
         * field in the name table, which must
577
         * contain English-language strings encoded
578
         * in Windows Unicode and Macintosh Roman,
579
         * and may contain additional strings
580
         * localized to other scripts and languages.
581
         * Each of these strings is the name an
582
         * application should use, in combination
583
         * with the family name, to represent the
584
         * subfamily in a menu.  Applications will
585
         * choose the appropriate version based on
586
         * their selection criteria. */
587
  HBUINT16  rangeStart; /* Large end of the recommended usage range
588
         * (inclusive), stored in 720/inch units
589
         * (decipoints). */
590
  HBUINT16  rangeEnd; /* Small end of the recommended usage range
591
           (exclusive), stored in 720/inch units
592
         * (decipoints). */
593
  public:
594
  DEFINE_SIZE_STATIC (10);
595
};
596
597
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#ssxx */
598
struct FeatureParamsStylisticSet
599
{
600
  bool sanitize (hb_sanitize_context_t *c) const
601
0
  {
602
0
    TRACE_SANITIZE (this);
603
    /* Right now minorVersion is at zero.  Which means, any table supports
604
     * the uiNameID field. */
605
0
    return_trace (c->check_struct (this));
606
0
  }
607
608
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
609
0
  { nameids_to_retain->add (uiNameID); }
610
611
  bool subset (hb_subset_context_t *c) const
612
0
  {
613
0
    TRACE_SUBSET (this);
614
0
    return_trace ((bool) c->serializer->embed (*this));
615
0
  }
616
617
  HBUINT16  version;  /* (set to 0): This corresponds to a “minor”
618
         * version number. Additional data may be
619
         * added to the end of this Feature Parameters
620
         * table in the future. */
621
622
  NameID  uiNameID; /* The 'name' table name ID that specifies a
623
         * string (or strings, for multiple languages)
624
         * for a user-interface label for this
625
         * feature.  The values of uiLabelNameId and
626
         * sampleTextNameId are expected to be in the
627
         * font-specific name ID range (256-32767),
628
         * though that is not a requirement in this
629
         * Feature Parameters specification. The
630
         * user-interface label for the feature can
631
         * be provided in multiple languages. An
632
         * English string should be included as a
633
         * fallback. The string should be kept to a
634
         * minimal length to fit comfortably with
635
         * different application interfaces. */
636
  public:
637
  DEFINE_SIZE_STATIC (4);
638
};
639
640
/* https://docs.microsoft.com/en-us/typography/opentype/spec/features_ae#cv01-cv99 */
641
struct FeatureParamsCharacterVariants
642
{
643
  unsigned
644
  get_characters (unsigned start_offset, unsigned *char_count, hb_codepoint_t *chars) const
645
0
  {
646
0
    if (char_count && chars)
647
0
    {
648
0
      + characters.as_array ().sub_array (start_offset, char_count)
649
0
      | hb_sink (hb_array (chars, *char_count))
650
0
      ;
651
0
    }
652
0
    return characters.len;
653
0
  }
654
655
  size_t get_size () const
656
0
  { return hb_unsigned_mul_add_saturate (characters.len, HBUINT24::static_size, min_size); }
657
658
  void collect_name_ids (hb_set_t *nameids_to_retain /* OUT */) const
659
0
  {
660
0
    if (featUILableNameID) nameids_to_retain->add (featUILableNameID);
661
0
    if (featUITooltipTextNameID) nameids_to_retain->add (featUITooltipTextNameID);
662
0
    if (sampleTextNameID) nameids_to_retain->add (sampleTextNameID);
663
664
0
    if (!firstParamUILabelNameID || !numNamedParameters || numNamedParameters >= 0x7FFF)
665
0
      return;
666
667
0
    unsigned last_name_id = (unsigned) firstParamUILabelNameID + (unsigned) numNamedParameters - 1;
668
0
    nameids_to_retain->add_range (firstParamUILabelNameID, last_name_id);
669
0
  }
670
671
  bool subset (hb_subset_context_t *c) const
672
0
  {
673
0
    TRACE_SUBSET (this);
674
0
    return_trace ((bool) c->serializer->embed (*this));
675
0
  }
676
677
  bool sanitize (hb_sanitize_context_t *c) const
678
0
  {
679
0
    TRACE_SANITIZE (this);
680
0
    return_trace (c->check_struct (this) &&
681
0
      characters.sanitize (c));
682
0
  }
683
684
  HBUINT16  format;     /* Format number is set to 0. */
685
  NameID  featUILableNameID;  /* The ‘name’ table name ID that
686
           * specifies a string (or strings,
687
           * for multiple languages) for a
688
           * user-interface label for this
689
           * feature. (May be NULL.) */
690
  NameID  featUITooltipTextNameID;/* The ‘name’ table name ID that
691
           * specifies a string (or strings,
692
           * for multiple languages) that an
693
           * application can use for tooltip
694
           * text for this feature. (May be
695
           * nullptr.) */
696
  NameID  sampleTextNameID; /* The ‘name’ table name ID that
697
           * specifies sample text that
698
           * illustrates the effect of this
699
           * feature. (May be NULL.) */
700
  HBUINT16  numNamedParameters; /* Number of named parameters. (May
701
           * be zero.) */
702
  NameID  firstParamUILabelNameID;/* The first ‘name’ table name ID
703
           * used to specify strings for
704
           * user-interface labels for the
705
           * feature parameters. (Must be zero
706
           * if numParameters is zero.) */
707
  Array16Of<HBUINT24>
708
    characters;   /* Array of the Unicode Scalar Value
709
           * of the characters for which this
710
           * feature provides glyph variants.
711
           * (May be zero.) */
712
  public:
713
  DEFINE_SIZE_ARRAY (14, characters);
714
};
715
716
struct FeatureParams
717
{
718
  bool sanitize (hb_sanitize_context_t *c, hb_tag_t tag) const
719
0
  {
720
#ifdef HB_NO_LAYOUT_FEATURE_PARAMS
721
    return true;
722
#endif
723
0
    TRACE_SANITIZE (this);
724
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
725
0
      return_trace (u.size.sanitize (c));
726
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
727
0
      return_trace (u.stylisticSet.sanitize (c));
728
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
729
0
      return_trace (u.characterVariants.sanitize (c));
730
0
    return_trace (true);
731
0
  }
732
733
  void collect_name_ids (hb_tag_t tag, hb_set_t *nameids_to_retain /* OUT */) const
734
0
  {
735
#ifdef HB_NO_LAYOUT_FEATURE_PARAMS
736
    return;
737
#endif
738
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
739
0
      return (u.size.collect_name_ids (nameids_to_retain));
740
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
741
0
      return (u.stylisticSet.collect_name_ids (nameids_to_retain));
742
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
743
0
      return (u.characterVariants.collect_name_ids (nameids_to_retain));
744
0
  }
745
746
  bool subset (hb_subset_context_t *c, const Tag* tag) const
747
0
  {
748
0
    TRACE_SUBSET (this);
749
0
    if (!tag) return_trace (false);
750
0
    if (*tag == HB_TAG ('s','i','z','e') && hb_barrier ())
751
0
      return_trace (u.size.subset (c));
752
0
    if ((*tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
753
0
      return_trace (u.stylisticSet.subset (c));
754
0
    if ((*tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
755
0
      return_trace (u.characterVariants.subset (c));
756
0
    return_trace (false);
757
0
  }
758
759
#ifndef HB_NO_LAYOUT_FEATURE_PARAMS
760
  const FeatureParamsSize& get_size_params (hb_tag_t tag) const
761
0
  {
762
0
    if (tag == HB_TAG ('s','i','z','e') && hb_barrier ())
763
0
      return u.size;
764
0
    return Null (FeatureParamsSize);
765
0
  }
766
  const FeatureParamsStylisticSet& get_stylistic_set_params (hb_tag_t tag) const
767
0
  {
768
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('s','s','\0','\0')) /* ssXX */
769
0
      return u.stylisticSet;
770
0
    return Null (FeatureParamsStylisticSet);
771
0
  }
772
  const FeatureParamsCharacterVariants& get_character_variants_params (hb_tag_t tag) const
773
0
  {
774
0
    if ((tag & 0xFFFF0000u) == HB_TAG ('c','v','\0','\0')) /* cvXX */
775
0
      return u.characterVariants;
776
0
    return Null (FeatureParamsCharacterVariants);
777
0
  }
778
#endif
779
780
  private:
781
  union {
782
  FeatureParamsSize     size;
783
  FeatureParamsStylisticSet   stylisticSet;
784
  FeatureParamsCharacterVariants  characterVariants;
785
  } u;
786
  public:
787
  DEFINE_SIZE_MIN (0);
788
};
789
790
struct Record_sanitize_closure_t {
791
  hb_tag_t tag;
792
  const void *list_base;
793
};
794
795
struct Feature
796
{
797
  unsigned int get_lookup_count () const
798
0
  { return lookupIndex.len; }
799
  hb_tag_t get_lookup_index (unsigned int i) const
800
0
  { return lookupIndex[i]; }
801
  unsigned int get_lookup_indexes (unsigned int start_index,
802
           unsigned int *lookup_count /* IN/OUT */,
803
           unsigned int *lookup_tags /* OUT */) const
804
16.9k
  { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
805
  void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
806
0
  { lookupIndex.add_indexes_to (lookup_indexes); }
807
808
  const FeatureParams &get_feature_params () const
809
0
  { return this+featureParams; }
810
811
  bool intersects_lookup_indexes (const hb_map_t *lookup_indexes) const
812
0
  { return lookupIndex.intersects (lookup_indexes); }
813
814
  void collect_name_ids (hb_tag_t tag, hb_set_t *nameids_to_retain /* OUT */) const
815
0
  {
816
0
    if (featureParams)
817
0
      get_feature_params ().collect_name_ids (tag, nameids_to_retain);
818
0
  }
819
820
  bool subset (hb_subset_context_t         *c,
821
         hb_subset_layout_context_t  *l,
822
         const Tag                   *tag = nullptr) const
823
0
  {
824
0
    TRACE_SUBSET (this);
825
0
    auto *out = c->serializer->start_embed (*this);
826
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
827
828
0
    out->featureParams.serialize_subset (c, featureParams, this, tag);
829
830
0
    hb::shared_ptr<hb_set_t> *lookup_variations;
831
0
    if (l->cur_feature_index != Index::NOT_FOUND_INDEX &&
832
0
  l->lookup_variations->has (l->cur_feature_index, &lookup_variations))
833
0
    {
834
0
      auto it =
835
0
      + hb_iter (**lookup_variations)
836
0
      | hb_filter (l->lookup_index_map)
837
0
      | hb_map (l->lookup_index_map)
838
0
      ;
839
0
      out->lookupIndex.serialize (c->serializer, l, it);
840
0
    }
841
0
    else
842
0
    {
843
0
      auto it =
844
0
      + hb_iter (lookupIndex)
845
0
      | hb_filter (l->lookup_index_map)
846
0
      | hb_map (l->lookup_index_map)
847
0
      ;
848
0
      out->lookupIndex.serialize (c->serializer, l, it);
849
0
    }
850
    // The decision to keep or drop this feature is already made before we get here
851
    // so always retain it.
852
0
    return_trace (true);
853
0
  }
854
855
  bool sanitize (hb_sanitize_context_t *c,
856
     const Record_sanitize_closure_t *closure = nullptr) const
857
563
  {
858
563
    TRACE_SANITIZE (this);
859
563
    return_trace (c->check_struct (this) &&
860
563
      featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE) &&
861
563
      lookupIndex.sanitize (c));
862
563
  }
863
864
  Offset16To<FeatureParams>
865
     featureParams; /* Offset to Feature Parameters table (if one
866
         * has been defined for the feature), relative
867
         * to the beginning of the Feature Table; = Null
868
         * if not required */
869
  IndexArray   lookupIndex; /* Array of LookupList indices */
870
  public:
871
  DEFINE_SIZE_ARRAY_SIZED (4, lookupIndex);
872
};
873
874
template <typename Type>
875
struct Record
876
{
877
67.3k
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
OT::Record<OT::LangSys>::cmp(unsigned int) const
Line
Count
Source
877
660
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
OT::Record<OT::Script>::cmp(unsigned int) const
Line
Count
Source
877
66.6k
  int cmp (hb_tag_t a) const { return tag.cmp (a); }
Unexecuted instantiation: OT::Record<OT::Feature>::cmp(unsigned int) const
878
879
  bool subset (hb_subset_layout_context_t *c, const void *base, const void *f_sub = nullptr) const
880
0
  {
881
0
    TRACE_SUBSET (this);
882
0
    auto *out = c->subset_context->serializer->embed (this);
883
0
    if (unlikely (!out)) return_trace (false);
884
885
0
    if (!f_sub)
886
0
      return_trace (out->offset.serialize_subset (c->subset_context, offset, base, c, &tag));
887
888
0
    const Feature& f = *reinterpret_cast<const Feature *> (f_sub);
889
0
    auto *s = c->subset_context->serializer;
890
0
    s->push ();
891
892
0
    out->offset = 0;
893
0
    bool ret = f.subset (c->subset_context, c, &tag);
894
0
    if (ret)
895
0
      s->add_link (out->offset, s->pop_pack ());
896
0
    else
897
0
      s->pop_discard ();
898
899
0
    return_trace (ret);
900
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
901
902
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
903
1.41k
  {
904
1.41k
    TRACE_SANITIZE (this);
905
1.41k
    const Record_sanitize_closure_t closure = {tag, base};
906
1.41k
    return_trace (c->check_struct (this) &&
907
1.41k
      offset.sanitize (c, base, &closure));
908
1.41k
  }
OT::Record<OT::Script>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
903
700
  {
904
700
    TRACE_SANITIZE (this);
905
700
    const Record_sanitize_closure_t closure = {tag, base};
906
700
    return_trace (c->check_struct (this) &&
907
700
      offset.sanitize (c, base, &closure));
908
700
  }
OT::Record<OT::LangSys>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
903
152
  {
904
152
    TRACE_SANITIZE (this);
905
152
    const Record_sanitize_closure_t closure = {tag, base};
906
152
    return_trace (c->check_struct (this) &&
907
152
      offset.sanitize (c, base, &closure));
908
152
  }
OT::Record<OT::Feature>::sanitize(hb_sanitize_context_t*, void const*) const
Line
Count
Source
903
563
  {
904
563
    TRACE_SANITIZE (this);
905
563
    const Record_sanitize_closure_t closure = {tag, base};
906
563
    return_trace (c->check_struct (this) &&
907
563
      offset.sanitize (c, base, &closure));
908
563
  }
Unexecuted instantiation: OT::Record<OT::JstfLangSys>::sanitize(hb_sanitize_context_t*, void const*) const
909
910
  Tag           tag;            /* 4-byte Tag identifier */
911
  Offset16To<Type>
912
                offset;         /* Offset from beginning of object holding
913
                                 * the Record */
914
  public:
915
  DEFINE_SIZE_STATIC (6);
916
};
917
918
template <typename Type>
919
struct RecordArrayOf : SortedArray16Of<Record<Type>>
920
{
921
  const Offset16To<Type>& get_offset (unsigned int i) const
922
53.0k
  { return (*this)[i].offset; }
OT::RecordArrayOf<OT::Script>::get_offset(unsigned int) const
Line
Count
Source
922
36.0k
  { return (*this)[i].offset; }
OT::RecordArrayOf<OT::Feature>::get_offset(unsigned int) const
Line
Count
Source
922
16.9k
  { return (*this)[i].offset; }
923
  Offset16To<Type>& get_offset (unsigned int i)
924
  { return (*this)[i].offset; }
925
  const Tag& get_tag (unsigned int i) const
926
19.5k
  { 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
926
19.5k
  { return (*this)[i].tag; }
927
  unsigned int get_tags (unsigned int start_offset,
928
                         unsigned int *record_count /* IN/OUT */,
929
                         hb_tag_t     *record_tags /* OUT */) const
930
0
  {
931
0
    if (record_count && record_tags)
932
0
    {
933
0
      + this->as_array ().sub_array (start_offset, record_count)
934
0
      | hb_map (&Record<Type>::tag)
935
0
      | hb_sink (hb_array (record_tags, *record_count))
936
0
      ;
937
0
    }
938
0
    return this->len;
939
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
940
  bool find_index (hb_tag_t tag, unsigned int *index) const
941
45.8k
  {
942
45.8k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
943
45.8k
  }
OT::RecordArrayOf<OT::LangSys>::find_index(unsigned int, unsigned int*) const
Line
Count
Source
941
23.4k
  {
942
23.4k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
943
23.4k
  }
OT::RecordArrayOf<OT::Script>::find_index(unsigned int, unsigned int*) const
Line
Count
Source
941
22.4k
  {
942
22.4k
    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
943
22.4k
  }
Unexecuted instantiation: OT::RecordArrayOf<OT::Feature>::find_index(unsigned int, unsigned int*) const
944
};
945
946
template <typename Type>
947
struct RecordListOf : RecordArrayOf<Type>
948
{
949
  const Type& operator [] (unsigned int i) const
950
53.0k
  { return this+this->get_offset (i); }
OT::RecordListOf<OT::Script>::operator[](unsigned int) const
Line
Count
Source
950
36.0k
  { return this+this->get_offset (i); }
OT::RecordListOf<OT::Feature>::operator[](unsigned int) const
Line
Count
Source
950
16.9k
  { return this+this->get_offset (i); }
951
952
  bool subset (hb_subset_context_t *c,
953
               hb_subset_layout_context_t *l) const
954
  {
955
    TRACE_SUBSET (this);
956
    auto *out = c->serializer->start_embed (*this);
957
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
958
959
    + this->iter ()
960
    | hb_apply (subset_record_array (l, out, this))
961
    ;
962
    return_trace (true);
963
  }
964
965
  bool sanitize (hb_sanitize_context_t *c) const
966
200
  {
967
200
    TRACE_SANITIZE (this);
968
200
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
969
200
  }
OT::RecordListOf<OT::Script>::sanitize(hb_sanitize_context_t*) const
Line
Count
Source
966
100
  {
967
100
    TRACE_SANITIZE (this);
968
100
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
969
100
  }
OT::RecordListOf<OT::Feature>::sanitize(hb_sanitize_context_t*) const
Line
Count
Source
966
100
  {
967
100
    TRACE_SANITIZE (this);
968
100
    return_trace (RecordArrayOf<Type>::sanitize (c, this));
969
100
  }
970
};
971
972
struct RecordListOfFeature : RecordListOf<Feature>
973
{
974
  bool subset (hb_subset_context_t *c,
975
         hb_subset_layout_context_t *l) const
976
0
  {
977
0
    TRACE_SUBSET (this);
978
0
    auto *out = c->serializer->start_embed (*this);
979
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
980
981
0
    + hb_enumerate (*this)
982
0
    | hb_filter (l->feature_index_map, hb_first)
983
0
    | hb_apply ([l, out, this] (const hb_pair_t<unsigned, const Record<Feature>&>& _)
984
0
                {
985
0
                  const Feature *f_sub = nullptr;
986
0
                  const Feature **f = nullptr;
987
0
                  if (l->feature_substitutes_map->has (_.first, &f))
988
0
                    f_sub = *f;
989
990
0
                  l->cur_feature_index = _.first;
991
0
                  subset_record_array (l, out, this, f_sub) (_.second);
992
0
                  l->cur_feature_index = Index::NOT_FOUND_INDEX;
993
0
                })
994
0
    ;
995
996
0
    return_trace (true);
997
0
  }
998
};
999
1000
typedef RecordListOf<Feature> FeatureList;
1001
1002
1003
struct LangSys
1004
{
1005
  unsigned int get_feature_count () const
1006
1.04k
  { return featureIndex.len; }
1007
  hb_tag_t get_feature_index (unsigned int i) const
1008
290
  { return featureIndex[i]; }
1009
  unsigned int get_feature_indexes (unsigned int start_offset,
1010
            unsigned int *feature_count /* IN/OUT */,
1011
            unsigned int *feature_indexes /* OUT */) const
1012
28.1k
  { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
1013
  void add_feature_indexes_to (hb_set_t *feature_indexes) const
1014
0
  { featureIndex.add_indexes_to (feature_indexes); }
1015
1016
12.4k
  bool has_required_feature () const { return reqFeatureIndex != 0xFFFFu; }
1017
  unsigned int get_required_feature_index () const
1018
11.7k
  {
1019
11.7k
    if (reqFeatureIndex == 0xFFFFu)
1020
11.7k
      return Index::NOT_FOUND_INDEX;
1021
0
   return reqFeatureIndex;
1022
11.7k
  }
1023
1024
  LangSys* copy (hb_serialize_context_t *c) const
1025
0
  {
1026
0
    TRACE_SERIALIZE (this);
1027
0
    return_trace (c->embed (*this));
1028
0
  }
1029
1030
  bool compare (const LangSys& o, const hb_map_t *feature_index_map) const
1031
0
  {
1032
0
    if (reqFeatureIndex != o.reqFeatureIndex)
1033
0
      return false;
1034
1035
0
    auto iter =
1036
0
    + hb_iter (featureIndex)
1037
0
    | hb_filter (feature_index_map)
1038
0
    | hb_map (feature_index_map)
1039
0
    ;
1040
1041
0
    auto o_iter =
1042
0
    + hb_iter (o.featureIndex)
1043
0
    | hb_filter (feature_index_map)
1044
0
    | hb_map (feature_index_map)
1045
0
    ;
1046
1047
0
    for (; iter && o_iter; iter++, o_iter++)
1048
0
    {
1049
0
      unsigned a = *iter;
1050
0
      unsigned b = *o_iter;
1051
0
      if (a != b) return false;
1052
0
    }
1053
1054
0
    if (iter || o_iter) return false;
1055
1056
0
    return true;
1057
0
  }
1058
1059
  void collect_features (hb_prune_langsys_context_t *c) const
1060
0
  {
1061
0
    if (!has_required_feature () && !get_feature_count ()) return;
1062
0
    if (has_required_feature () &&
1063
0
        c->duplicate_feature_map->has (reqFeatureIndex))
1064
0
      c->new_feature_indexes->add (get_required_feature_index ());
1065
1066
0
    + hb_iter (featureIndex)
1067
0
    | hb_filter (c->duplicate_feature_map)
1068
0
    | hb_sink (c->new_feature_indexes)
1069
0
    ;
1070
0
  }
1071
1072
  bool subset (hb_subset_context_t        *c,
1073
         hb_subset_layout_context_t *l,
1074
         const Tag                  *tag = nullptr) const
1075
0
  {
1076
0
    TRACE_SUBSET (this);
1077
0
    auto *out = c->serializer->start_embed (*this);
1078
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1079
1080
0
    const uint32_t *v;
1081
0
    out->reqFeatureIndex = l->feature_map_w_duplicates->has (reqFeatureIndex, &v) ? *v : 0xFFFFu;
1082
1083
0
    if (!l->visitFeatureIndex (featureIndex.len))
1084
0
      return_trace (false);
1085
1086
0
    auto it =
1087
0
    + hb_iter (featureIndex)
1088
0
    | hb_filter (l->feature_map_w_duplicates)
1089
0
    | hb_map (l->feature_map_w_duplicates)
1090
0
    ;
1091
1092
0
    bool ret = bool (it);
1093
0
    out->featureIndex.serialize (c->serializer, l, it);
1094
0
    return_trace (ret);
1095
0
  }
1096
1097
  bool sanitize (hb_sanitize_context_t *c,
1098
     const Record_sanitize_closure_t * = nullptr) const
1099
852
  {
1100
852
    TRACE_SANITIZE (this);
1101
852
    return_trace (c->check_struct (this) && featureIndex.sanitize (c));
1102
852
  }
1103
1104
  Offset16  lookupOrderZ; /* = Null (reserved for an offset to a
1105
         * reordering table) */
1106
  HBUINT16  reqFeatureIndex;/* Index of a feature required for this
1107
         * language system--if no required features
1108
         * = 0xFFFFu */
1109
  IndexArray  featureIndex; /* Array of indices into the FeatureList */
1110
  public:
1111
  DEFINE_SIZE_ARRAY_SIZED (6, featureIndex);
1112
};
1113
DECLARE_NULL_NAMESPACE_BYTES (OT, LangSys);
1114
1115
struct Script
1116
{
1117
  unsigned int get_lang_sys_count () const
1118
630
  { return langSys.len; }
1119
  const Tag& get_lang_sys_tag (unsigned int i) const
1120
0
  { return langSys.get_tag (i); }
1121
  unsigned int get_lang_sys_tags (unsigned int start_offset,
1122
          unsigned int *lang_sys_count /* IN/OUT */,
1123
          hb_tag_t     *lang_sys_tags /* OUT */) const
1124
0
  { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
1125
  const LangSys& get_lang_sys (unsigned int i) const
1126
23.8k
  {
1127
23.8k
    if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
1128
126
    return this+langSys[i].offset;
1129
23.8k
  }
1130
  bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
1131
23.4k
  { return langSys.find_index (tag, index); }
1132
1133
1.26k
  bool has_default_lang_sys () const           { return defaultLangSys != 0; }
1134
24.3k
  const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
1135
1136
  void prune_langsys (hb_prune_langsys_context_t *c,
1137
                      unsigned script_index) const
1138
0
  {
1139
0
    if (!has_default_lang_sys () && !get_lang_sys_count ()) return;
1140
0
    if (!c->visitScript ()) return;
1141
1142
0
    if (!c->script_langsys_map->has (script_index))
1143
0
    {
1144
0
      if (unlikely (!c->script_langsys_map->set (script_index, hb::unique_ptr<hb_set_t> {hb_set_create ()})))
1145
0
  return;
1146
0
    }
1147
1148
0
    if (has_default_lang_sys ())
1149
0
    {
1150
      //only collect features from non-redundant langsys
1151
0
      const LangSys& d = get_default_lang_sys ();
1152
0
      if (c->visitLangsys (d.get_feature_count ())) {
1153
0
        d.collect_features (c);
1154
0
      }
1155
1156
0
      for (auto _ : + hb_enumerate (langSys))
1157
0
      {
1158
0
        const LangSys& l = this+_.second.offset;
1159
0
        if (!c->visitLangsys (l.get_feature_count ())) continue;
1160
0
        if (l.compare (d, c->duplicate_feature_map)) continue;
1161
1162
0
        l.collect_features (c);
1163
0
        c->script_langsys_map->get (script_index)->add (_.first);
1164
0
      }
1165
0
    }
1166
0
    else
1167
0
    {
1168
0
      for (auto _ : + hb_enumerate (langSys))
1169
0
      {
1170
0
        const LangSys& l = this+_.second.offset;
1171
0
        if (!c->visitLangsys (l.get_feature_count ())) continue;
1172
0
        l.collect_features (c);
1173
0
        c->script_langsys_map->get (script_index)->add (_.first);
1174
0
      }
1175
0
    }
1176
0
  }
1177
1178
  bool subset (hb_subset_context_t         *c,
1179
         hb_subset_layout_context_t  *l,
1180
         const Tag                   *tag) const
1181
0
  {
1182
0
    TRACE_SUBSET (this);
1183
0
    if (!l->visitScript ()) return_trace (false);
1184
0
    if (tag && !c->plan->layout_scripts.has (*tag))
1185
0
      return false;
1186
1187
0
    auto *out = c->serializer->start_embed (*this);
1188
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1189
1190
0
    bool defaultLang = false;
1191
0
    if (has_default_lang_sys ())
1192
0
    {
1193
0
      c->serializer->push ();
1194
0
      const LangSys& ls = this+defaultLangSys;
1195
0
      bool ret = ls.subset (c, l);
1196
0
      if (!ret && tag && *tag != HB_TAG ('D', 'F', 'L', 'T'))
1197
0
      {
1198
0
  c->serializer->pop_discard ();
1199
0
  out->defaultLangSys = 0;
1200
0
      }
1201
0
      else
1202
0
      {
1203
0
  c->serializer->add_link (out->defaultLangSys, c->serializer->pop_pack ());
1204
0
  defaultLang = true;
1205
0
      }
1206
0
    }
1207
1208
0
    const hb_set_t *active_langsys = l->script_langsys_map->get (l->cur_script_index);
1209
0
    if (active_langsys)
1210
0
    {
1211
0
      + hb_enumerate (langSys)
1212
0
      | hb_filter (active_langsys, hb_first)
1213
0
      | hb_map (hb_second)
1214
0
      | hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); })
1215
0
      | hb_apply (subset_record_array (l, &(out->langSys), this))
1216
0
      ;
1217
0
    }
1218
1219
0
    return_trace (bool (out->langSys.len) || defaultLang || l->table_tag == HB_OT_TAG_GSUB);
1220
0
  }
1221
1222
  bool sanitize (hb_sanitize_context_t *c,
1223
     const Record_sanitize_closure_t * = nullptr) const
1224
700
  {
1225
700
    TRACE_SANITIZE (this);
1226
700
    return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
1227
700
  }
1228
1229
  protected:
1230
  Offset16To<LangSys>
1231
    defaultLangSys; /* Offset to DefaultLangSys table--from
1232
         * beginning of Script table--may be Null */
1233
  RecordArrayOf<LangSys>
1234
    langSys;  /* Array of LangSysRecords--listed
1235
         * alphabetically by LangSysTag */
1236
  public:
1237
  DEFINE_SIZE_ARRAY_SIZED (4, langSys);
1238
};
1239
1240
struct RecordListOfScript : RecordListOf<Script>
1241
{
1242
  bool subset (hb_subset_context_t *c,
1243
               hb_subset_layout_context_t *l) const
1244
0
  {
1245
0
    TRACE_SUBSET (this);
1246
0
    auto *out = c->serializer->start_embed (*this);
1247
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1248
1249
0
    for (auto _ : + hb_enumerate (*this))
1250
0
    {
1251
0
      auto snap = c->serializer->snapshot ();
1252
0
      l->cur_script_index = _.first;
1253
0
      bool ret = _.second.subset (l, this);
1254
0
      if (!ret) c->serializer->revert (snap);
1255
0
      else out->len++;
1256
0
    }
1257
1258
0
    return_trace (true);
1259
0
  }
1260
};
1261
1262
typedef RecordListOfScript ScriptList;
1263
1264
1265
1266
struct LookupFlag : HBUINT16
1267
{
1268
  enum Flags {
1269
    RightToLeft   = 0x0001u,
1270
    IgnoreBaseGlyphs  = 0x0002u,
1271
    IgnoreLigatures = 0x0004u,
1272
    IgnoreMarks   = 0x0008u,
1273
    IgnoreFlags   = 0x000Eu,
1274
    UseMarkFilteringSet = 0x0010u,
1275
    Reserved    = 0x00E0u,
1276
    MarkAttachmentType  = 0xFF00u
1277
  };
1278
  public:
1279
  DEFINE_SIZE_STATIC (2);
1280
};
1281
1282
} /* namespace OT */
1283
/* This has to be outside the namespace. */
1284
HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags);
1285
namespace OT {
1286
1287
struct Lookup
1288
{
1289
3.80k
  unsigned int get_subtable_count () const { return subTable.len; }
1290
1291
  template <typename TSubTable>
1292
  const Array16OfOffset16To<TSubTable>& get_subtables () const
1293
3.60k
  { 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
1293
442
  { 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
1293
3.16k
  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
1294
  template <typename TSubTable>
1295
  Array16OfOffset16To<TSubTable>& get_subtables ()
1296
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>()
1297
1298
  template <typename TSubTable>
1299
  const TSubTable& get_subtable (unsigned int i) const
1300
1.41k
  { 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
1300
79
  { 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
1300
1.33k
  { return this+get_subtables<TSubTable> ()[i]; }
1301
  template <typename TSubTable>
1302
  TSubTable& get_subtable (unsigned int i)
1303
  { return this+get_subtables<TSubTable> ()[i]; }
1304
1305
  size_t get_size () const
1306
0
  {
1307
0
    const HBUINT16 &markFilteringSet = StructAfter<const HBUINT16> (subTable);
1308
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1309
0
      return (const char *) &StructAfter<const char> (markFilteringSet) - (const char *) this;
1310
0
    return (const char *) &markFilteringSet - (const char *) this;
1311
0
  }
1312
1313
295k
  unsigned int get_type () const { return lookupType; }
1314
1315
  /* lookup_props is a 32-bit integer where the lower 16-bit is LookupFlag and
1316
   * higher 16-bit is mark-filtering-set if the lookup uses one.
1317
   * Not to be confused with glyph_props which is very similar. */
1318
  uint32_t get_props () const
1319
5.43M
  {
1320
5.43M
    unsigned int flag = lookupFlag;
1321
5.43M
    if (unlikely (flag & LookupFlag::UseMarkFilteringSet))
1322
0
    {
1323
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1324
0
      flag += (markFilteringSet << 16);
1325
0
    }
1326
5.43M
    return flag;
1327
5.43M
  }
1328
1329
  template <typename TSubTable, typename context_t, typename ...Ts>
1330
  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
1331
808
  {
1332
808
    unsigned int lookup_type = get_type ();
1333
808
    TRACE_DISPATCH (this, lookup_type);
1334
808
    unsigned int count = get_subtable_count ();
1335
2.22k
    for (unsigned int i = 0; i < count; i++) {
1336
1.41k
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1337
1.41k
      if (c->stop_sublookup_iteration (r))
1338
0
  return_trace (r);
1339
1.41k
    }
1340
808
    return_trace (c->default_return_value ());
1341
808
  }
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
1331
729
  {
1332
729
    unsigned int lookup_type = get_type ();
1333
729
    TRACE_DISPATCH (this, lookup_type);
1334
729
    unsigned int count = get_subtable_count ();
1335
2.06k
    for (unsigned int i = 0; i < count; i++) {
1336
1.33k
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1337
1.33k
      if (c->stop_sublookup_iteration (r))
1338
0
  return_trace (r);
1339
1.33k
    }
1340
729
    return_trace (c->default_return_value ());
1341
729
  }
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
1331
79
  {
1332
79
    unsigned int lookup_type = get_type ();
1333
79
    TRACE_DISPATCH (this, lookup_type);
1334
79
    unsigned int count = get_subtable_count ();
1335
158
    for (unsigned int i = 0; i < count; i++) {
1336
79
      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, ds...);
1337
79
      if (c->stop_sublookup_iteration (r))
1338
0
  return_trace (r);
1339
79
    }
1340
79
    return_trace (c->default_return_value ());
1341
79
  }
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
1342
1343
  bool serialize (hb_serialize_context_t *c,
1344
      unsigned int lookup_type,
1345
      uint32_t lookup_props,
1346
      unsigned int num_subtables)
1347
0
  {
1348
0
    TRACE_SERIALIZE (this);
1349
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1350
0
    lookupType = lookup_type;
1351
0
    lookupFlag = lookup_props & 0xFFFFu;
1352
0
    if (unlikely (!subTable.serialize (c, num_subtables))) return_trace (false);
1353
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1354
0
    {
1355
0
      if (unlikely (!c->extend (this))) return_trace (false);
1356
0
      HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1357
0
      markFilteringSet = lookup_props >> 16;
1358
0
    }
1359
0
    return_trace (true);
1360
0
  }
1361
1362
  template <typename TSubTable>
1363
  bool subset (hb_subset_context_t *c) const
1364
0
  {
1365
0
    TRACE_SUBSET (this);
1366
0
    auto *out = c->serializer->start_embed (*this);
1367
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1368
0
    out->lookupType = lookupType;
1369
0
    out->lookupFlag = lookupFlag;
1370
1371
0
    const hb_set_t *glyphset = c->plan->glyphset_gsub ();
1372
0
    unsigned int lookup_type = get_type ();
1373
0
    + hb_iter (get_subtables <TSubTable> ())
1374
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
1375
0
    | hb_apply (subset_offset_array (c, out->get_subtables<TSubTable> (), this, lookup_type))
1376
0
    ;
1377
1378
0
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1379
0
    {
1380
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1381
0
      hb_codepoint_t *idx;
1382
0
      if (!c->plan->used_mark_sets_map.has (markFilteringSet, &idx))
1383
0
      {
1384
0
        unsigned new_flag = lookupFlag;
1385
0
        new_flag &= ~LookupFlag::UseMarkFilteringSet;
1386
        // https://github.com/harfbuzz/harfbuzz/issues/5499
1387
        // If we remove UseMarkFilteringSet flag because the set is now empty,
1388
        // we need to add IgnoreMarks flag, otherwise the lookup will not
1389
        // ignore any marks, which changes the behavior.
1390
0
        new_flag |= LookupFlag::IgnoreMarks;
1391
0
        out->lookupFlag = new_flag;
1392
0
      }
1393
0
      else
1394
0
      {
1395
0
        if (unlikely (!c->serializer->extend (out))) return_trace (false);
1396
0
        HBUINT16 &outMarkFilteringSet = StructAfter<HBUINT16> (out->subTable);
1397
0
        outMarkFilteringSet = *idx;
1398
0
      }
1399
0
    }
1400
1401
    // Always keep the lookup even if it's empty. The rest of layout subsetting depends on lookup
1402
    // indices being consistent with those computed during planning. So if an empty lookup is
1403
    // discarded during the subset phase it will invalidate all subsequent lookup indices.
1404
    // Generally we shouldn't end up with an empty lookup as we pre-prune them during the planning
1405
    // phase, but it can happen in rare cases such as when during closure subtable is considered
1406
    // degenerate (see: https://github.com/harfbuzz/harfbuzz/issues/3853)
1407
0
    return_trace (true);
1408
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
1409
1410
  template <typename TSubTable>
1411
  bool sanitize (hb_sanitize_context_t *c) const
1412
2.18k
  {
1413
2.18k
    TRACE_SANITIZE (this);
1414
2.18k
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1415
2.18k
    hb_barrier ();
1416
1417
2.18k
    unsigned subtables = get_subtable_count ();
1418
2.18k
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1419
1420
2.18k
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1421
0
    {
1422
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1423
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1424
0
    }
1425
1426
2.18k
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1427
0
      return_trace (false);
1428
1429
2.18k
    if (unlikely (get_type () == TSubTable::Extension))
1430
0
    {
1431
0
      hb_barrier ();
1432
1433
      /* The spec says all subtables of an Extension lookup should
1434
       * have the same type, which shall not be the Extension type
1435
       * itself (but we already checked for that).
1436
       * This is specially important if one has a reverse type!
1437
       */
1438
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1439
0
      for (unsigned int i = 1; i < subtables; i++)
1440
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1441
0
    return_trace (false);
1442
0
    }
1443
2.18k
    return_trace (true);
1444
2.18k
  }
bool OT::Lookup::sanitize<OT::Layout::GSUB_impl::SubstLookupSubTable>(hb_sanitize_context_t*) const
Line
Count
Source
1412
363
  {
1413
363
    TRACE_SANITIZE (this);
1414
363
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1415
363
    hb_barrier ();
1416
1417
363
    unsigned subtables = get_subtable_count ();
1418
363
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1419
1420
363
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1421
0
    {
1422
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1423
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1424
0
    }
1425
1426
363
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1427
0
      return_trace (false);
1428
1429
363
    if (unlikely (get_type () == TSubTable::Extension))
1430
0
    {
1431
0
      hb_barrier ();
1432
1433
      /* The spec says all subtables of an Extension lookup should
1434
       * have the same type, which shall not be the Extension type
1435
       * itself (but we already checked for that).
1436
       * This is specially important if one has a reverse type!
1437
       */
1438
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1439
0
      for (unsigned int i = 1; i < subtables; i++)
1440
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1441
0
    return_trace (false);
1442
0
    }
1443
363
    return_trace (true);
1444
363
  }
bool OT::Lookup::sanitize<OT::Layout::GPOS_impl::PosLookupSubTable>(hb_sanitize_context_t*) const
Line
Count
Source
1412
1.82k
  {
1413
1.82k
    TRACE_SANITIZE (this);
1414
1.82k
    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
1415
1.82k
    hb_barrier ();
1416
1417
1.82k
    unsigned subtables = get_subtable_count ();
1418
1.82k
    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
1419
1420
1.82k
    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
1421
0
    {
1422
0
      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
1423
0
      if (!markFilteringSet.sanitize (c)) return_trace (false);
1424
0
    }
1425
1426
1.82k
    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
1427
0
      return_trace (false);
1428
1429
1.82k
    if (unlikely (get_type () == TSubTable::Extension))
1430
0
    {
1431
0
      hb_barrier ();
1432
1433
      /* The spec says all subtables of an Extension lookup should
1434
       * have the same type, which shall not be the Extension type
1435
       * itself (but we already checked for that).
1436
       * This is specially important if one has a reverse type!
1437
       */
1438
0
      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
1439
0
      for (unsigned int i = 1; i < subtables; i++)
1440
0
  if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
1441
0
    return_trace (false);
1442
0
    }
1443
1.82k
    return_trace (true);
1444
1.82k
  }
1445
1446
  protected:
1447
  HBUINT16  lookupType;   /* Different enumerations for GSUB and GPOS */
1448
  HBUINT16  lookupFlag;   /* Lookup qualifiers */
1449
  Array16Of<Offset16>
1450
    subTable;   /* Array of SubTables */
1451
/*HBUINT16  markFilteringSetX[HB_VAR_ARRAY];*//* Index (base 0) into GDEF mark glyph sets
1452
           * structure. This field is only present if bit
1453
           * UseMarkFilteringSet of lookup flags is set. */
1454
  public:
1455
  DEFINE_SIZE_ARRAY (6, subTable);
1456
};
1457
1458
template <typename Types>
1459
using LookupList = List16OfOffsetTo<Lookup, typename Types::HBLUINT>;
1460
1461
template <typename TLookup, typename OffsetType>
1462
struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType>
1463
{
1464
  bool subset (hb_subset_context_t        *c,
1465
         hb_subset_layout_context_t *l) const
1466
0
  {
1467
0
    TRACE_SUBSET (this);
1468
0
    auto *out = c->serializer->start_embed (this);
1469
0
    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
1470
1471
0
    + hb_enumerate (*this)
1472
0
    | hb_filter (l->lookup_index_map, hb_first)
1473
0
    | hb_map (hb_second)
1474
0
    | hb_apply (subset_offset_array (c, *out, this))
1475
0
    ;
1476
0
    return_trace (true);
1477
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
1478
1479
  bool sanitize (hb_sanitize_context_t *c) const
1480
  {
1481
    TRACE_SANITIZE (this);
1482
    return_trace ((List16OfOffsetTo<TLookup, OffsetType>::sanitize (c, this)));
1483
  }
1484
};
1485
1486
1487
/*
1488
 * Coverage Table
1489
 */
1490
1491
1492
static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c,
1493
            const hb_set_t &klasses,
1494
                                          bool use_class_zero,
1495
                                          hb_sorted_vector_t<hb_codepoint_pair_t> &glyph_and_klass, /* IN/OUT */
1496
            hb_map_t *klass_map /*IN/OUT*/)
1497
0
{
1498
0
  if (!klass_map)
1499
0
    return ClassDef_serialize (c, glyph_and_klass.iter ());
1500
1501
  /* any glyph not assigned a class value falls into Class zero (0),
1502
   * if any glyph assigned to class 0, remapping must start with 0->0*/
1503
0
  if (!use_class_zero)
1504
0
    klass_map->set (0, 0);
1505
1506
0
  unsigned idx = klass_map->has (0) ? 1 : 0;
1507
0
  for (const unsigned k: klasses)
1508
0
  {
1509
0
    if (klass_map->has (k)) continue;
1510
0
    klass_map->set (k, idx);
1511
0
    idx++;
1512
0
  }
1513
1514
1515
0
  for (unsigned i = 0; i < glyph_and_klass.length; i++)
1516
0
  {
1517
0
    hb_codepoint_t klass = glyph_and_klass[i].second;
1518
0
    glyph_and_klass[i].second = klass_map->get (klass);
1519
0
  }
1520
1521
0
  c->propagate_error (glyph_and_klass, klasses);
1522
0
  return ClassDef_serialize (c, glyph_and_klass.iter ());
1523
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*)
1524
1525
/*
1526
 * Class Definition Table
1527
 */
1528
1529
template <typename Types>
1530
struct ClassDefFormat1_3
1531
{
1532
  friend struct ClassDef;
1533
1534
  private:
1535
  unsigned int get_class (hb_codepoint_t glyph_id) const
1536
0
  {
1537
0
    return classValue[(unsigned int) (glyph_id - startGlyph)];
1538
0
  }
1539
1540
  unsigned get_population () const
1541
0
  {
1542
0
    return classValue.len;
1543
0
  }
1544
1545
  template<typename Iterator,
1546
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
1547
  bool serialize (hb_serialize_context_t *c,
1548
      Iterator it)
1549
0
  {
1550
0
    TRACE_SERIALIZE (this);
1551
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1552
1553
0
    if (unlikely (!it))
1554
0
    {
1555
0
      classFormat = Types::size == 2 ? 1 : 3;
1556
0
      startGlyph = 0;
1557
0
      classValue.len = 0;
1558
0
      return_trace (true);
1559
0
    }
1560
1561
0
    hb_codepoint_t glyph_min = (*it).first;
1562
0
    hb_codepoint_t glyph_max = + it
1563
0
             | hb_map (hb_first)
1564
0
             | hb_reduce (hb_max, 0u);
1565
0
    unsigned glyph_count = glyph_max - glyph_min + 1;
1566
1567
0
    startGlyph = glyph_min;
1568
0
    if (unlikely (!classValue.serialize (c, glyph_count))) return_trace (false);
1569
0
    for (const hb_pair_t<hb_codepoint_t, uint32_t> gid_klass_pair : + it)
1570
0
    {
1571
0
      unsigned idx = gid_klass_pair.first - glyph_min;
1572
0
      classValue[idx] = gid_klass_pair.second;
1573
0
    }
1574
0
    return_trace (true);
1575
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_
1576
1577
  bool subset (hb_subset_context_t *c,
1578
         hb_map_t *klass_map = nullptr /*OUT*/,
1579
               bool keep_empty_table = true,
1580
               bool use_class_zero = true,
1581
               const Coverage* glyph_filter = nullptr) const
1582
0
  {
1583
0
    TRACE_SUBSET (this);
1584
1585
0
    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
1586
0
    hb_set_t orig_klasses;
1587
1588
0
    hb_codepoint_t start = startGlyph;
1589
0
    hb_codepoint_t end   = start + classValue.len;
1590
1591
0
    for (const hb_codepoint_t gid : + hb_range (start, end))
1592
0
    {
1593
0
      hb_codepoint_t new_gid = c->plan->map_gsub_glyph (gid);
1594
0
      if (new_gid == HB_MAP_VALUE_INVALID) continue;
1595
0
      if (glyph_filter && !glyph_filter->has(gid)) continue;
1596
1597
0
      unsigned klass = classValue[gid - start];
1598
0
      if (!klass) continue;
1599
1600
0
      glyph_and_klass.push (hb_pair (new_gid, klass));
1601
0
      orig_klasses.add (klass);
1602
0
    }
1603
1604
0
    if (use_class_zero)
1605
0
    {
1606
0
      const hb_set_t& glyphset = *c->plan->glyphset_gsub ();
1607
0
      unsigned glyph_count = glyph_filter
1608
0
           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
1609
0
           : glyphset.get_population ();
1610
0
      use_class_zero = glyph_count <= glyph_and_klass.length;
1611
0
    }
1612
0
    if (!ClassDef_remap_and_serialize (c->serializer,
1613
0
                                       orig_klasses,
1614
0
                                       use_class_zero,
1615
0
                                       glyph_and_klass,
1616
0
                                       klass_map))
1617
0
      return_trace (false);
1618
0
    return_trace (keep_empty_table || (bool) glyph_and_klass);
1619
0
  }
1620
1621
  bool sanitize (hb_sanitize_context_t *c) const
1622
0
  {
1623
0
    TRACE_SANITIZE (this);
1624
0
    return_trace (c->check_struct (this) && classValue.sanitize (c));
1625
0
  }
1626
1627
0
  unsigned cost () const { return 1; }
1628
1629
  template <typename set_t>
1630
  bool collect_coverage (set_t *glyphs) const
1631
0
  {
1632
0
    unsigned int start = 0;
1633
0
    unsigned int count = classValue.len;
1634
0
    for (unsigned int i = 0; i < count; i++)
1635
0
    {
1636
0
      if (classValue[i])
1637
0
  continue;
1638
1639
0
      if (start != i)
1640
0
  if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + i)))
1641
0
    return false;
1642
1643
0
      start = i + 1;
1644
0
    }
1645
0
    if (start != count)
1646
0
      if (unlikely (!glyphs->add_range (startGlyph + start, startGlyph + count)))
1647
0
  return false;
1648
1649
0
    return true;
1650
0
  }
1651
1652
  template <typename set_t>
1653
  bool collect_class (set_t *glyphs, unsigned klass) const
1654
0
  {
1655
0
    unsigned int count = classValue.len;
1656
0
    for (unsigned int i = 0; i < count; i++)
1657
0
      if (classValue[i] == klass) glyphs->add (startGlyph + i);
1658
0
    return true;
1659
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
1660
1661
  bool intersects (const hb_set_t *glyphs) const
1662
0
  {
1663
0
    hb_codepoint_t start = startGlyph;
1664
0
    hb_codepoint_t end = startGlyph + classValue.len;
1665
0
    for (hb_codepoint_t iter = startGlyph - 1;
1666
0
   glyphs->next (&iter) && iter < end;)
1667
0
      if (classValue[iter - start]) return true;
1668
0
    return false;
1669
0
  }
1670
  bool intersects_class (const hb_set_t *glyphs, unsigned klass) const
1671
0
  {
1672
0
    unsigned int count = classValue.len;
1673
0
    if (klass == 0)
1674
0
    {
1675
      /* Match if there's any glyph that is not listed! */
1676
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1677
0
      if (!glyphs->next (&g)) return false;
1678
0
      if (g < startGlyph) return true;
1679
0
      g = startGlyph + count - 1;
1680
0
      if (glyphs->next (&g)) return true;
1681
      /* Fall through. */
1682
0
    }
1683
    /* TODO Speed up, using set overlap first? */
1684
    /* TODO(iter) Rewrite as dagger. */
1685
0
    const typename Types::HBUINT *arr = classValue.arrayZ;
1686
0
    for (unsigned int i = 0; i < count; i++)
1687
0
      if (arr[i] == klass && glyphs->has (startGlyph + i))
1688
0
  return true;
1689
0
    return false;
1690
0
  }
1691
1692
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
1693
0
  {
1694
0
    unsigned count = classValue.len;
1695
0
    if (klass == 0)
1696
0
    {
1697
0
      unsigned start_glyph = startGlyph;
1698
0
      for (uint32_t g = HB_SET_VALUE_INVALID;
1699
0
     glyphs->next (&g) && g < start_glyph;)
1700
0
  intersect_glyphs->add (g);
1701
1702
0
      for (uint32_t g = startGlyph + count - 1;
1703
0
     glyphs-> next (&g);)
1704
0
  intersect_glyphs->add (g);
1705
1706
0
      return;
1707
0
    }
1708
1709
0
    for (unsigned i = 0; i < count; i++)
1710
0
      if (classValue[i] == klass && glyphs->has (startGlyph + i))
1711
0
  intersect_glyphs->add (startGlyph + i);
1712
1713
#if 0
1714
    /* The following implementation is faster asymptotically, but slower
1715
     * in practice. */
1716
    unsigned start_glyph = startGlyph;
1717
    unsigned end_glyph = start_glyph + count;
1718
    for (unsigned g = startGlyph - 1;
1719
   glyphs->next (&g) && g < end_glyph;)
1720
      if (classValue.arrayZ[g - start_glyph] == klass)
1721
        intersect_glyphs->add (g);
1722
#endif
1723
0
  }
1724
1725
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
1726
0
  {
1727
0
    if (glyphs->is_empty ()) return;
1728
1729
    /* An empty ClassDef assigns class zero to every glyph, so every glyph in
1730
     * `glyphs` intersects class zero.  Handle it up front: `end_glyph` below
1731
     * underflows when startGlyph is zero, and neither comparison can then be
1732
     * true. */
1733
0
    if (!classValue.len)
1734
0
    {
1735
0
      intersect_classes->add (0);
1736
0
      return;
1737
0
    }
1738
1739
0
    hb_codepoint_t end_glyph = startGlyph + classValue.len - 1;
1740
0
    if (glyphs->get_min () < startGlyph ||
1741
0
        glyphs->get_max () > end_glyph)
1742
0
      intersect_classes->add (0);
1743
1744
0
    for (const auto& _ : + hb_enumerate (classValue))
1745
0
    {
1746
0
      hb_codepoint_t g = startGlyph + _.first;
1747
0
      if (glyphs->has (g))
1748
0
        intersect_classes->add (_.second);
1749
0
    }
1750
0
  }
1751
1752
  protected:
1753
  HBUINT16  classFormat;  /* Format identifier--format = 1 */
1754
  typename Types::HBGlyphID
1755
     startGlyph;  /* First GlyphID of the classValueArray */
1756
  typename Types::template ArrayOf<typename Types::HBUINT>
1757
    classValue; /* Array of Class Values--one per GlyphID */
1758
  public:
1759
  DEFINE_SIZE_ARRAY (2 + 2 * Types::size, classValue);
1760
};
1761
1762
template <typename Types>
1763
struct ClassDefFormat2_4
1764
{
1765
  friend struct ClassDef;
1766
1767
  private:
1768
  unsigned int get_class (hb_codepoint_t glyph_id) const
1769
2.18M
  {
1770
2.18M
    return rangeRecord.bsearch (glyph_id).value;
1771
2.18M
  }
1772
1773
  unsigned get_population () const
1774
0
  {
1775
0
    typename Types::large_int ret = 0;
1776
0
    for (const auto &r : rangeRecord)
1777
0
      ret += r.get_population ();
1778
0
    return ret > UINT_MAX ? UINT_MAX : (unsigned) ret;
1779
0
  }
1780
1781
  template<typename Iterator,
1782
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
1783
  bool serialize (hb_serialize_context_t *c,
1784
      Iterator it)
1785
0
  {
1786
0
    TRACE_SERIALIZE (this);
1787
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
1788
1789
0
    if (unlikely (!it))
1790
0
    {
1791
0
      classFormat = Types::size == 2 ? 2 : 4;
1792
0
      rangeRecord.len = 0;
1793
0
      return_trace (true);
1794
0
    }
1795
1796
0
    unsigned unsorted = false;
1797
0
    unsigned num_ranges = 1;
1798
0
    hb_codepoint_t prev_gid = (*it).first;
1799
0
    unsigned prev_klass = (*it).second;
1800
1801
0
    RangeRecord<Types> range_rec;
1802
0
    range_rec.first = prev_gid;
1803
0
    range_rec.last = prev_gid;
1804
0
    range_rec.value = prev_klass;
1805
1806
0
    auto *record = c->copy (range_rec);
1807
0
    if (unlikely (!record)) return_trace (false);
1808
1809
0
    for (const auto gid_klass_pair : + (++it))
1810
0
    {
1811
0
      hb_codepoint_t cur_gid = gid_klass_pair.first;
1812
0
      unsigned cur_klass = gid_klass_pair.second;
1813
1814
0
      if (cur_gid != prev_gid + 1 ||
1815
0
    cur_klass != prev_klass)
1816
0
      {
1817
1818
0
  if (unlikely (cur_gid < prev_gid))
1819
0
    unsorted = true;
1820
1821
0
  if (unlikely (!record)) break;
1822
0
  record->last = prev_gid;
1823
0
  num_ranges++;
1824
1825
0
  range_rec.first = cur_gid;
1826
0
  range_rec.last = cur_gid;
1827
0
  range_rec.value = cur_klass;
1828
1829
0
  record = c->copy (range_rec);
1830
0
      }
1831
1832
0
      prev_klass = cur_klass;
1833
0
      prev_gid = cur_gid;
1834
0
    }
1835
1836
0
    if (unlikely (c->in_error ())) return_trace (false);
1837
1838
0
    if (likely (record)) record->last = prev_gid;
1839
0
    rangeRecord.len = num_ranges;
1840
1841
0
    if (unlikely (unsorted))
1842
0
      rangeRecord.as_array ().qsort (RangeRecord<Types>::cmp_range);
1843
1844
0
    return_trace (true);
1845
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_
1846
1847
  bool subset (hb_subset_context_t *c,
1848
         hb_map_t *klass_map = nullptr /*OUT*/,
1849
               bool keep_empty_table = true,
1850
               bool use_class_zero = true,
1851
               const Coverage* glyph_filter = nullptr) const
1852
0
  {
1853
0
    TRACE_SUBSET (this);
1854
0
    const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
1855
1856
0
    hb_sorted_vector_t<hb_codepoint_pair_t> glyph_and_klass;
1857
0
    hb_set_t orig_klasses;
1858
1859
0
    if (glyph_set.get_population () * hb_bit_storage ((unsigned) rangeRecord.len)
1860
0
  < get_population ())
1861
0
    {
1862
0
      for (hb_codepoint_t g : glyph_set)
1863
0
      {
1864
0
  unsigned klass = get_class (g);
1865
0
  if (!klass) continue;
1866
0
  hb_codepoint_t new_gid = c->plan->map_gsub_glyph (g);
1867
0
  if (new_gid == HB_MAP_VALUE_INVALID) continue;
1868
0
  if (glyph_filter && !glyph_filter->has (g)) continue;
1869
0
  glyph_and_klass.push (hb_pair (new_gid, klass));
1870
0
  orig_klasses.add (klass);
1871
0
      }
1872
0
    }
1873
0
    else
1874
0
    {
1875
0
      unsigned num_source_glyphs = c->plan->source->get_num_glyphs ();
1876
0
      for (auto &range : rangeRecord)
1877
0
      {
1878
0
  unsigned klass = range.value;
1879
0
  if (!klass) continue;
1880
0
  hb_codepoint_t start = range.first;
1881
0
  hb_codepoint_t end   = hb_min (range.last + 1, num_source_glyphs);
1882
0
  for (hb_codepoint_t g = start; g < end; g++)
1883
0
  {
1884
0
    hb_codepoint_t new_gid = c->plan->map_gsub_glyph (g);
1885
0
    if (new_gid == HB_MAP_VALUE_INVALID) continue;
1886
0
    if (glyph_filter && !glyph_filter->has (g)) continue;
1887
1888
0
    glyph_and_klass.push (hb_pair (new_gid, klass));
1889
0
    orig_klasses.add (klass);
1890
0
  }
1891
0
      }
1892
0
    }
1893
1894
0
    const hb_set_t& glyphset = *c->plan->glyphset_gsub ();
1895
0
    unsigned glyph_count = glyph_filter
1896
0
                           ? hb_len (hb_iter (glyphset) | hb_filter (glyph_filter))
1897
0
                           : glyphset.get_population ();
1898
0
    use_class_zero = use_class_zero && glyph_count <= glyph_and_klass.length;
1899
0
    if (!ClassDef_remap_and_serialize (c->serializer,
1900
0
                                       orig_klasses,
1901
0
                                       use_class_zero,
1902
0
                                       glyph_and_klass,
1903
0
                                       klass_map))
1904
0
      return_trace (false);
1905
0
    return_trace (keep_empty_table || (bool) glyph_and_klass);
1906
0
  }
1907
1908
  bool sanitize (hb_sanitize_context_t *c) const
1909
100
  {
1910
100
    TRACE_SANITIZE (this);
1911
100
    return_trace (rangeRecord.sanitize (c));
1912
100
  }
1913
1914
0
  unsigned cost () const { return hb_bit_storage ((unsigned) rangeRecord.len); /* bsearch cost */ }
1915
1916
  template <typename set_t>
1917
  bool collect_coverage (set_t *glyphs) const
1918
0
  {
1919
0
    for (auto &range : rangeRecord)
1920
0
      if (range.value)
1921
0
  if (unlikely (!range.collect_coverage (glyphs)))
1922
0
    return false;
1923
0
    return true;
1924
0
  }
1925
1926
  template <typename set_t>
1927
  bool collect_class (set_t *glyphs, unsigned int klass) const
1928
0
  {
1929
0
    for (auto &range : rangeRecord)
1930
0
    {
1931
0
      if (range.value == klass)
1932
0
  if (unlikely (!range.collect_coverage (glyphs)))
1933
0
    return false;
1934
0
    }
1935
0
    return true;
1936
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
1937
1938
  bool intersects (const hb_set_t *glyphs) const
1939
0
  {
1940
0
    if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len))
1941
0
    {
1942
0
      for (auto g : *glyphs)
1943
0
        if (get_class (g))
1944
0
    return true;
1945
0
      return false;
1946
0
    }
1947
1948
0
    return hb_any (+ hb_iter (rangeRecord)
1949
0
                   | hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs) && range.value; }));
1950
0
  }
1951
  bool intersects_class (const hb_set_t *glyphs, unsigned klass) const
1952
0
  {
1953
0
    if (klass == 0)
1954
0
    {
1955
      /* An empty ClassDef assigns class zero to every glyph, so it intersects
1956
       * class zero as long as there is any glyph at all.  The loop below is a
1957
       * no-op when there are no ranges, and the `g != HB_SET_VALUE_INVALID`
1958
       * guard after it would then wrongly report no intersection. */
1959
0
      if (!rangeRecord.len)
1960
0
        return !glyphs->is_empty ();
1961
1962
      /* Match if there's any glyph that is not listed! */
1963
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1964
0
      hb_codepoint_t last = HB_SET_VALUE_INVALID;
1965
0
      auto it = hb_iter (rangeRecord);
1966
0
      for (auto &range : it)
1967
0
      {
1968
0
        if (it->first == last + 1)
1969
0
  {
1970
0
    it++;
1971
0
    continue;
1972
0
  }
1973
1974
0
  if (!glyphs->next (&g))
1975
0
    break;
1976
0
  if (g < range.first)
1977
0
    return true;
1978
0
  g = range.last;
1979
0
  last = g;
1980
0
      }
1981
0
      if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
1982
0
  return true;
1983
      /* Fall through. */
1984
0
    }
1985
0
    for (const auto &range : rangeRecord)
1986
0
      if (range.value == klass && range.intersects (*glyphs))
1987
0
  return true;
1988
0
    return false;
1989
0
  }
1990
1991
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
1992
0
  {
1993
0
    if (klass == 0)
1994
0
    {
1995
0
      hb_codepoint_t g = HB_SET_VALUE_INVALID;
1996
0
      for (auto &range : rangeRecord)
1997
0
      {
1998
0
  if (!glyphs->next (&g))
1999
0
    goto done;
2000
0
  while (g < range.first)
2001
0
  {
2002
0
    intersect_glyphs->add (g);
2003
0
    if (!glyphs->next (&g))
2004
0
      goto done;
2005
0
        }
2006
0
        g = range.last;
2007
0
      }
2008
0
      while (glyphs->next (&g))
2009
0
  intersect_glyphs->add (g);
2010
0
      done:
2011
2012
0
      return;
2013
0
    }
2014
2015
0
    unsigned count = rangeRecord.len;
2016
0
    if (count > glyphs->get_population () * hb_bit_storage (count))
2017
0
    {
2018
0
      for (auto g : *glyphs)
2019
0
      {
2020
0
        unsigned i;
2021
0
        if (rangeRecord.as_array ().bfind (g, &i) &&
2022
0
      rangeRecord.arrayZ[i].value == klass)
2023
0
    intersect_glyphs->add (g);
2024
0
      }
2025
0
      return;
2026
0
    }
2027
2028
0
    for (auto &range : rangeRecord)
2029
0
    {
2030
0
      if (range.value != klass) continue;
2031
2032
0
      unsigned end = range.last + 1;
2033
0
      for (hb_codepoint_t g = range.first - 1;
2034
0
     glyphs->next (&g) && g < end;)
2035
0
  intersect_glyphs->add (g);
2036
0
    }
2037
0
  }
2038
2039
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
2040
0
  {
2041
0
    if (glyphs->is_empty ()) return;
2042
2043
    /* An empty ClassDef assigns class zero to every glyph, so every glyph in
2044
     * `glyphs` intersects class zero.  Handle it up front: the loops below are
2045
     * no-ops when there are no ranges, and the `g != HB_SET_VALUE_INVALID`
2046
     * guard would then wrongly skip adding class zero. */
2047
0
    if (!rangeRecord.len)
2048
0
    {
2049
0
      intersect_classes->add (0);
2050
0
      return;
2051
0
    }
2052
2053
0
    hb_codepoint_t g = HB_SET_VALUE_INVALID;
2054
0
    for (auto &range : rangeRecord)
2055
0
    {
2056
0
      if (!glyphs->next (&g))
2057
0
        break;
2058
0
      if (g < range.first)
2059
0
      {
2060
0
        intersect_classes->add (0);
2061
0
        break;
2062
0
      }
2063
0
      g = range.last;
2064
0
    }
2065
0
    if (g != HB_SET_VALUE_INVALID && glyphs->next (&g))
2066
0
      intersect_classes->add (0);
2067
2068
0
    for (const auto& range : rangeRecord)
2069
0
      if (range.intersects (*glyphs))
2070
0
        intersect_classes->add (range.value);
2071
0
  }
2072
2073
  protected:
2074
  HBUINT16  classFormat;  /* Format identifier--format = 2 */
2075
  typename Types::template SortedArrayOf<RangeRecord<Types>>
2076
    rangeRecord;  /* Array of glyph ranges--ordered by
2077
         * Start GlyphID */
2078
  public:
2079
  DEFINE_SIZE_ARRAY (2 + Types::size, rangeRecord);
2080
};
2081
2082
struct ClassDef
2083
{
2084
  /* Has interface. */
2085
0
  unsigned operator [] (hb_codepoint_t k) const { return get (k); }
2086
0
  bool has (hb_codepoint_t k) const { return (*this)[k]; }
2087
  /* Projection. */
2088
0
  hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); }
2089
2090
0
  unsigned int get (hb_codepoint_t k) const { return get_class (k); }
2091
  unsigned int get_class (hb_codepoint_t glyph_id) const
2092
2.18M
  {
2093
2.18M
    switch (u.format.v) {
2094
0
    case 1: hb_barrier (); return u.format1.get_class (glyph_id);
2095
2.18M
    case 2: hb_barrier (); return u.format2.get_class (glyph_id);
2096
#ifndef HB_NO_BEYOND_64K
2097
    case 3: hb_barrier (); return u.format3.get_class (glyph_id);
2098
    case 4: hb_barrier (); return u.format4.get_class (glyph_id);
2099
#endif
2100
0
    default:return 0;
2101
2.18M
    }
2102
2.18M
  }
2103
  unsigned int get_class (hb_codepoint_t glyph_id,
2104
        hb_ot_layout_mapping_cache_t *cache) const
2105
0
  {
2106
0
    unsigned klass;
2107
0
    if (cache && cache->get (glyph_id, &klass)) return klass;
2108
0
    klass = get_class (glyph_id);
2109
0
    if (cache) cache->set (glyph_id, klass);
2110
0
    return klass;
2111
0
  }
2112
2113
  unsigned get_population () const
2114
0
  {
2115
0
    switch (u.format.v) {
2116
0
    case 1: hb_barrier (); return u.format1.get_population ();
2117
0
    case 2: hb_barrier (); return u.format2.get_population ();
2118
0
#ifndef HB_NO_BEYOND_64K
2119
0
    case 3: hb_barrier (); return u.format3.get_population ();
2120
0
    case 4: hb_barrier (); return u.format4.get_population ();
2121
0
#endif
2122
0
    default:return NOT_COVERED;
2123
0
    }
2124
0
  }
2125
2126
  template<typename Iterator,
2127
     hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))>
2128
  bool serialize (hb_serialize_context_t *c, Iterator it_with_class_zero)
2129
0
  {
2130
0
    TRACE_SERIALIZE (this);
2131
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2132
2133
0
    auto glyphs = + it_with_class_zero | hb_filter (hb_second);
2134
2135
0
    unsigned format = 2;
2136
0
    hb_codepoint_t glyph_max = 0;
2137
0
    unsigned class_max = 0;
2138
0
    if (likely (glyphs))
2139
0
    {
2140
0
      hb_codepoint_t glyph_min = (*glyphs).first;
2141
0
      glyph_max = glyph_min;
2142
2143
0
      unsigned num_ranges = 1;
2144
0
      hb_codepoint_t prev_gid = glyph_min;
2145
0
      unsigned prev_klass = (*glyphs).second;
2146
2147
0
      for (const auto gid_klass_pair : + glyphs)
2148
0
      {
2149
0
  hb_codepoint_t cur_gid = gid_klass_pair.first;
2150
0
  unsigned cur_klass = gid_klass_pair.second;
2151
0
  if (cur_klass > class_max) class_max = cur_klass;
2152
0
  if (cur_gid == glyph_min) continue;
2153
0
        if (cur_gid > glyph_max) glyph_max = cur_gid;
2154
0
  if (cur_gid != prev_gid + 1 ||
2155
0
      cur_klass != prev_klass)
2156
0
    num_ranges++;
2157
2158
0
  prev_gid = cur_gid;
2159
0
  prev_klass = cur_klass;
2160
0
      }
2161
2162
0
      uint64_t best_size = UINT64_MAX;
2163
0
      unsigned glyph_span = glyph_max - glyph_min + 1;
2164
0
      auto consider = [&] (unsigned candidate, uint64_t size)
2165
0
      {
2166
0
  if (size >= best_size) return;
2167
0
  best_size = size;
2168
0
  format = candidate;
2169
0
      };
Unexecuted instantiation: hb-subset.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
Unexecuted instantiation: _ZZN2OT8ClassDef9serializeI17hb_sorted_array_tIK9hb_pair_tIjjEETnPN12hb_enable_ifIXaasr15hb_is_source_ofIT_jEE5valuesrS8_18is_sorted_iteratorEvE4typeELPv0EEEbP22hb_serialize_context_tS8_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-layout.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-layout.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-var.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-var.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-cff.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-cff.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-color.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-color.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-other.cc:_ZZN2OT8ClassDef9serializeI13hb_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_ENKUljmE_clEjm
Unexecuted instantiation: hb-subset-table-other.cc:_ZZN2OT8ClassDef9serializeI16hb_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_ENKUljmE_clEjm
2170
2171
0
      if (glyph_max <= 0xFFFFu && glyph_span <= 0xFFFFu && class_max <= 0xFFFFu)
2172
0
  consider (1, 6 + (uint64_t) HBUINT16::static_size * glyph_span);
2173
0
      if (glyph_max <= 0xFFFFu && num_ranges <= 0xFFFFu && class_max <= 0xFFFFu)
2174
0
  consider (2, 4 + (uint64_t) num_ranges *
2175
0
         (2 * HBGlyphID16::static_size + HBUINT16::static_size));
2176
#ifndef HB_NO_BEYOND_64K
2177
      if (glyph_max <= 0xFFFFFFu && glyph_span <= 0xFFFFFFu && class_max <= 0xFFFFFFu)
2178
  consider (3, 8 + (uint64_t) HBUINT24::static_size * glyph_span);
2179
      if (glyph_max <= 0xFFFFFFu && num_ranges <= 0xFFFFFFu && class_max <= 0xFFFFu)
2180
  consider (4, 5 + (uint64_t) num_ranges *
2181
         (2 * HBGlyphID24::static_size + HBUINT16::static_size));
2182
#endif
2183
0
      if (unlikely (best_size == UINT64_MAX))
2184
0
      {
2185
0
  c->check_success (false, HB_SERIALIZE_ERROR_INT_OVERFLOW);
2186
0
  return_trace (false);
2187
0
      }
2188
0
    }
2189
2190
0
    u.format.v = format;
2191
2192
0
    switch (u.format.v)
2193
0
    {
2194
0
    case 1: hb_barrier (); return_trace (u.format1.serialize (c, + it_with_class_zero | hb_filter (hb_second)));
2195
0
    case 2: hb_barrier (); return_trace (u.format2.serialize (c, + it_with_class_zero | hb_filter (hb_second)));
2196
#ifndef HB_NO_BEYOND_64K
2197
    case 3: hb_barrier (); return_trace (u.format3.serialize (c, + it_with_class_zero | hb_filter (hb_second)));
2198
    case 4: hb_barrier (); return_trace (u.format4.serialize (c, + it_with_class_zero | hb_filter (hb_second)));
2199
#endif
2200
0
    default:return_trace (false);
2201
0
    }
2202
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_
2203
2204
  bool subset (hb_subset_context_t *c,
2205
         hb_map_t *klass_map = nullptr /*OUT*/,
2206
               bool keep_empty_table = true,
2207
               bool use_class_zero = true,
2208
               const Coverage* glyph_filter = nullptr) const
2209
0
  {
2210
0
    TRACE_SUBSET (this);
2211
0
    switch (u.format.v) {
2212
0
    case 1: hb_barrier (); return_trace (u.format1.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2213
0
    case 2: hb_barrier (); return_trace (u.format2.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2214
#ifndef HB_NO_BEYOND_64K
2215
    case 3: hb_barrier (); return_trace (u.format3.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2216
    case 4: hb_barrier (); return_trace (u.format4.subset (c, klass_map, keep_empty_table, use_class_zero, glyph_filter));
2217
#endif
2218
0
    default:return_trace (false);
2219
0
    }
2220
0
  }
2221
2222
  bool sanitize (hb_sanitize_context_t *c) const
2223
100
  {
2224
100
    TRACE_SANITIZE (this);
2225
100
    if (!u.format.v.sanitize (c)) return_trace (false);
2226
100
    hb_barrier ();
2227
100
    switch (u.format.v) {
2228
0
    case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
2229
100
    case 2: hb_barrier (); return_trace (u.format2.sanitize (c));
2230
#ifndef HB_NO_BEYOND_64K
2231
    case 3: hb_barrier (); return_trace (u.format3.sanitize (c));
2232
    case 4: hb_barrier (); return_trace (u.format4.sanitize (c));
2233
#endif
2234
0
    default:return_trace (true);
2235
100
    }
2236
100
  }
2237
2238
  unsigned cost () const
2239
0
  {
2240
0
    switch (u.format.v) {
2241
0
    case 1: hb_barrier (); return u.format1.cost ();
2242
0
    case 2: hb_barrier (); return u.format2.cost ();
2243
#ifndef HB_NO_BEYOND_64K
2244
    case 3: hb_barrier (); return u.format3.cost ();
2245
    case 4: hb_barrier (); return u.format4.cost ();
2246
#endif
2247
0
    default:return 0u;
2248
0
    }
2249
0
  }
2250
2251
  /* Might return false if array looks unsorted.
2252
   * Used for faster rejection of corrupt data. */
2253
  template <typename set_t>
2254
  bool collect_coverage (set_t *glyphs) const
2255
0
  {
2256
0
    switch (u.format.v) {
2257
0
    case 1: hb_barrier (); return u.format1.collect_coverage (glyphs);
2258
0
    case 2: hb_barrier (); return u.format2.collect_coverage (glyphs);
2259
#ifndef HB_NO_BEYOND_64K
2260
    case 3: hb_barrier (); return u.format3.collect_coverage (glyphs);
2261
    case 4: hb_barrier (); return u.format4.collect_coverage (glyphs);
2262
#endif
2263
0
    default:return false;
2264
0
    }
2265
0
  }
2266
2267
  /* Might return false if array looks unsorted.
2268
   * Used for faster rejection of corrupt data. */
2269
  template <typename set_t>
2270
  bool collect_class (set_t *glyphs, unsigned int klass) const
2271
0
  {
2272
0
    switch (u.format.v) {
2273
0
    case 1: hb_barrier (); return u.format1.collect_class (glyphs, klass);
2274
0
    case 2: hb_barrier (); return u.format2.collect_class (glyphs, klass);
2275
#ifndef HB_NO_BEYOND_64K
2276
    case 3: hb_barrier (); return u.format3.collect_class (glyphs, klass);
2277
    case 4: hb_barrier (); return u.format4.collect_class (glyphs, klass);
2278
#endif
2279
0
    default:return false;
2280
0
    }
2281
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
2282
2283
  bool intersects (const hb_set_t *glyphs) const
2284
0
  {
2285
0
    switch (u.format.v) {
2286
0
    case 1: hb_barrier (); return u.format1.intersects (glyphs);
2287
0
    case 2: hb_barrier (); return u.format2.intersects (glyphs);
2288
#ifndef HB_NO_BEYOND_64K
2289
    case 3: hb_barrier (); return u.format3.intersects (glyphs);
2290
    case 4: hb_barrier (); return u.format4.intersects (glyphs);
2291
#endif
2292
0
    default:return false;
2293
0
    }
2294
0
  }
2295
  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
2296
0
  {
2297
0
    switch (u.format.v) {
2298
0
    case 1: hb_barrier (); return u.format1.intersects_class (glyphs, klass);
2299
0
    case 2: hb_barrier (); return u.format2.intersects_class (glyphs, klass);
2300
#ifndef HB_NO_BEYOND_64K
2301
    case 3: hb_barrier (); return u.format3.intersects_class (glyphs, klass);
2302
    case 4: hb_barrier (); return u.format4.intersects_class (glyphs, klass);
2303
#endif
2304
0
    default:return false;
2305
0
    }
2306
0
  }
2307
2308
  void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
2309
0
  {
2310
0
    switch (u.format.v) {
2311
0
    case 1: hb_barrier (); return u.format1.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2312
0
    case 2: hb_barrier (); return u.format2.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2313
#ifndef HB_NO_BEYOND_64K
2314
    case 3: hb_barrier (); return u.format3.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2315
    case 4: hb_barrier (); return u.format4.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
2316
#endif
2317
0
    default:return;
2318
0
    }
2319
0
  }
2320
2321
  void intersected_classes (const hb_set_t *glyphs, hb_set_t *intersect_classes) const
2322
0
  {
2323
0
    switch (u.format.v) {
2324
0
    case 1: hb_barrier (); return u.format1.intersected_classes (glyphs, intersect_classes);
2325
0
    case 2: hb_barrier (); return u.format2.intersected_classes (glyphs, intersect_classes);
2326
#ifndef HB_NO_BEYOND_64K
2327
    case 3: hb_barrier (); return u.format3.intersected_classes (glyphs, intersect_classes);
2328
    case 4: hb_barrier (); return u.format4.intersected_classes (glyphs, intersect_classes);
2329
#endif
2330
0
    default:return;
2331
0
    }
2332
0
  }
2333
2334
2335
  protected:
2336
  union {
2337
  struct { HBUINT16 v; }  format;   /* Format identifier */
2338
  ClassDefFormat1_3<SmallTypes> format1;
2339
  ClassDefFormat2_4<SmallTypes> format2;
2340
#ifndef HB_NO_BEYOND_64K
2341
  ClassDefFormat1_3<MediumTypes>format3;
2342
  ClassDefFormat2_4<MediumTypes>format4;
2343
#endif
2344
  } u;
2345
  public:
2346
  DEFINE_SIZE_UNION (2, format.v);
2347
};
2348
2349
template<typename Iterator>
2350
static inline bool ClassDef_serialize (hb_serialize_context_t *c,
2351
               Iterator it)
2352
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>)
2353
2354
2355
/*
2356
 * Item Variation Store
2357
 */
2358
2359
/* ported from fonttools (class _Encoding) */
2360
struct delta_row_encoding_t
2361
{
2362
  /* each byte represents a region, value is one of 0/1/2/4, which means bytes
2363
   * needed for this region */
2364
  struct chars_t : hb_vector_t<uint8_t>
2365
  {
2366
    int cmp (const chars_t& other) const
2367
0
    {
2368
0
      return as_array ().cmp (other.as_array ());
2369
0
    }
2370
2371
    hb_pair_t<unsigned, unsigned> get_width ()
2372
0
    {
2373
0
      unsigned width = 0;
2374
0
      unsigned columns = 0;
2375
0
      for (unsigned i = 0; i < length; i++)
2376
0
      {
2377
0
  unsigned v = arrayZ[i];
2378
0
  width += v;
2379
0
  columns += (v != 0);
2380
0
      }
2381
0
      return hb_pair (width, columns);
2382
0
    }
2383
2384
    HB_HOT
2385
    hb_pair_t<unsigned, unsigned> combine_width (const chars_t& other) const
2386
0
    {
2387
0
      unsigned combined_width = 0;
2388
0
      unsigned combined_columns = 0;
2389
0
      for (unsigned i = 0; i < length; i++)
2390
0
      {
2391
0
        unsigned v = hb_max (arrayZ[i], other.arrayZ[i]);
2392
0
  combined_width += v;
2393
0
  combined_columns += (v != 0);
2394
0
      }
2395
0
      return hb_pair (combined_width, combined_columns);
2396
0
    }
2397
  };
2398
2399
0
  hb_pair_t<unsigned, unsigned> combine_width (const delta_row_encoding_t& other_encoding) const { return chars.combine_width (other_encoding.chars); }
2400
2401
  // Actual data
2402
2403
  chars_t chars;
2404
  unsigned width = 0;
2405
  unsigned overhead = 0;
2406
  hb_vector_t<const hb_vector_t<int>*> items;
2407
2408
0
  delta_row_encoding_t () = default;
2409
  delta_row_encoding_t (hb_vector_t<const hb_vector_t<int>*> &&rows, unsigned num_cols)
2410
0
  {
2411
0
    assert (rows);
2412
2413
0
    items = std::move (rows);
2414
2415
0
    if (unlikely (!chars.resize (num_cols)))
2416
0
      return;
2417
2418
0
    calculate_chars ();
2419
0
  }
2420
2421
  void merge (const delta_row_encoding_t& other)
2422
0
  {
2423
0
    items.alloc (items.length + other.items.length);
2424
0
    for (auto &row : other.items)
2425
0
      add_row (row);
2426
2427
    // Merge chars
2428
0
    assert (chars.length == other.chars.length);
2429
0
    for (unsigned i = 0; i < chars.length; i++)
2430
0
      chars.arrayZ[i] = hb_max (chars.arrayZ[i], other.chars.arrayZ[i]);
2431
0
    chars_changed ();
2432
0
  }
2433
2434
  void chars_changed ()
2435
0
  {
2436
0
    auto _ = chars.get_width ();
2437
0
    width = _.first;
2438
0
    overhead = get_chars_overhead (_.second);
2439
0
  }
2440
2441
  void calculate_chars ()
2442
0
  {
2443
0
    assert (items);
2444
2445
0
    bool long_words = false;
2446
2447
0
    for (auto &row : items)
2448
0
    {
2449
0
      assert (row->length == chars.length);
2450
2451
      /* 0/1/2 byte encoding */
2452
0
      for (unsigned i = 0; i < row->length; i++)
2453
0
      {
2454
0
  int v =  row->arrayZ[i];
2455
0
  if (v == 0)
2456
0
    continue;
2457
0
  else if (v > 32767 || v < -32768)
2458
0
  {
2459
0
    long_words = true;
2460
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 4);
2461
0
  }
2462
0
  else if (v > 127 || v < -128)
2463
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 2);
2464
0
  else
2465
0
    chars.arrayZ[i] = hb_max (chars.arrayZ[i], 1);
2466
0
      }
2467
0
    }
2468
2469
0
    if (long_words)
2470
0
    {
2471
      // Convert 1s to 2s
2472
0
      for (auto &v : chars)
2473
0
  if (v == 1)
2474
0
    v = 2;
2475
0
    }
2476
2477
0
    chars_changed ();
2478
0
  }
2479
2480
  bool is_empty () const
2481
0
  { return !items; }
2482
2483
  static inline unsigned get_chars_overhead (unsigned num_columns)
2484
0
  {
2485
0
    unsigned c = 4 + 6; // 4 bytes for LOffset, 6 bytes for VarData header
2486
0
    return c + num_columns * 2;
2487
0
  }
2488
2489
  unsigned get_gain (unsigned additional_bytes_per_rows = 1) const
2490
0
  {
2491
0
    int count = items.length;
2492
0
    return hb_max (0, (int) overhead - count * (int) additional_bytes_per_rows);
2493
0
  }
2494
2495
  int gain_from_merging (const delta_row_encoding_t& other_encoding) const
2496
0
  {
2497
    // Back of the envelope calculations to reject early.
2498
0
    signed additional_bytes_per_rows = other_encoding.width - width;
2499
0
    if (additional_bytes_per_rows > 0)
2500
0
    {
2501
0
      if (get_gain (additional_bytes_per_rows) == 0)
2502
0
        return 0;
2503
0
    }
2504
0
    else
2505
0
    {
2506
0
      if (other_encoding.get_gain (-additional_bytes_per_rows) == 0)
2507
0
  return 0;
2508
0
    }
2509
2510
0
    auto pair = combine_width (other_encoding);
2511
0
    unsigned combined_width = pair.first;
2512
0
    unsigned combined_columns = pair.second;
2513
2514
0
    int combined_gain = (int) overhead + (int) other_encoding.overhead;
2515
0
    combined_gain -= (combined_width - (int) width) * items.length;
2516
0
    combined_gain -= (combined_width - (int) other_encoding.width) * other_encoding.items.length;
2517
0
    combined_gain -= get_chars_overhead (combined_columns);
2518
2519
0
    return combined_gain;
2520
0
  }
2521
2522
  bool add_row (const hb_vector_t<int>* row)
2523
0
  { return items.push (row); }
2524
2525
  static int cmp (const void *pa, const void *pb)
2526
0
  {
2527
0
    const delta_row_encoding_t *a = (const delta_row_encoding_t *)pa;
2528
0
    const delta_row_encoding_t *b = (const delta_row_encoding_t *)pb;
2529
2530
0
    if (a->width != b->width)
2531
0
      return (int) a->width - (int) b->width;
2532
2533
0
    return b->chars.cmp (a->chars);
2534
0
  }
2535
};
2536
2537
struct VarRegionAxis
2538
{
2539
  float evaluate (int coord) const
2540
0
  {
2541
0
    int peak = peakCoord.to_int ();
2542
0
    if (peak == 0 || coord == peak)
2543
0
      return 1.f;
2544
0
    else if (coord == 0) // Faster
2545
0
      return 0.f;
2546
2547
0
    int start = startCoord.to_int (), end = endCoord.to_int ();
2548
2549
    /* TODO Move these to sanitize(). */
2550
0
    if (unlikely (start > peak || peak > end))
2551
0
      return 1.f;
2552
0
    if (unlikely (start < 0 && end > 0))
2553
0
      return 1.f;
2554
2555
0
    if (coord <= start || end <= coord)
2556
0
      return 0.f;
2557
2558
    /* Interpolate */
2559
0
    if (coord < peak)
2560
0
      return float (coord - start) / (peak - start);
2561
0
    else
2562
0
      return float (end - coord) / (end - peak);
2563
0
  }
2564
2565
  bool sanitize (hb_sanitize_context_t *c) const
2566
0
  {
2567
0
    TRACE_SANITIZE (this);
2568
0
    return_trace (c->check_struct (this));
2569
0
  }
2570
2571
  bool serialize (hb_serialize_context_t *c) const
2572
0
  {
2573
0
    TRACE_SERIALIZE (this);
2574
0
    return_trace (c->embed (this));
2575
0
  }
2576
2577
  public:
2578
  F2DOT14 startCoord;
2579
  F2DOT14 peakCoord;
2580
  F2DOT14 endCoord;
2581
  public:
2582
  DEFINE_SIZE_STATIC (6);
2583
};
2584
struct SparseVarRegionAxis
2585
{
2586
  float evaluate (const int *coords, unsigned int coord_len) const
2587
0
  {
2588
0
    unsigned i = axisIndex;
2589
0
    int coord = i < coord_len ? coords[i] : 0;
2590
0
    return axis.evaluate (coord);
2591
0
  }
2592
2593
  bool sanitize (hb_sanitize_context_t *c) const
2594
0
  {
2595
0
    TRACE_SANITIZE (this);
2596
0
    return_trace (c->check_struct (this));
2597
0
  }
2598
2599
  bool serialize (hb_serialize_context_t *c) const
2600
0
  {
2601
0
    TRACE_SERIALIZE (this);
2602
0
    return_trace (c->embed (this));
2603
0
  }
2604
2605
  public:
2606
  HBUINT16 axisIndex;
2607
  VarRegionAxis axis;
2608
  public:
2609
  DEFINE_SIZE_STATIC (8);
2610
};
2611
2612
struct hb_scalar_cache_t
2613
{
2614
  private:
2615
  static constexpr unsigned STATIC_LENGTH = 128;
2616
  static constexpr int INVALID = INT_MIN;
2617
  static constexpr float MULTIPLIER = 1 << ((sizeof (int) * 8) - 2);
2618
  static constexpr float DIVISOR = 1.f / MULTIPLIER;
2619
2620
  public:
2621
0
  hb_scalar_cache_t () {}
2622
2623
  hb_scalar_cache_t (const hb_scalar_cache_t&) = delete;
2624
  hb_scalar_cache_t (hb_scalar_cache_t&&) = delete;
2625
  hb_scalar_cache_t& operator= (const hb_scalar_cache_t&) = delete;
2626
  hb_scalar_cache_t& operator= (hb_scalar_cache_t&&) = delete;
2627
2628
  static hb_scalar_cache_t *create (unsigned int count,
2629
            hb_scalar_cache_t *scratch_cache = nullptr)
2630
161k
  {
2631
161k
    if (!count) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
2632
2633
0
    if (scratch_cache && count <= STATIC_LENGTH)
2634
0
    {
2635
0
      scratch_cache->length = count;
2636
0
      scratch_cache->clear ();
2637
0
      return scratch_cache;
2638
0
    }
2639
2640
0
    auto *cache = (hb_scalar_cache_t *) hb_malloc (sizeof (hb_scalar_cache_t) - sizeof (static_values) + sizeof (static_values[0]) * count);
2641
0
    if (unlikely (!cache)) return (hb_scalar_cache_t *) &Null(hb_scalar_cache_t);
2642
2643
0
    cache->length = count;
2644
0
    cache->clear ();
2645
2646
0
    return cache;
2647
0
  }
2648
2649
  static void destroy (hb_scalar_cache_t *cache,
2650
           hb_scalar_cache_t *scratch_cache = nullptr)
2651
161k
  {
2652
161k
    if (cache != &Null(hb_scalar_cache_t) && cache != scratch_cache)
2653
0
      hb_free (cache);
2654
161k
  }
2655
2656
  void clear ()
2657
0
  {
2658
0
    auto *values = &static_values[0];
2659
0
    unsigned i = 0;
2660
0
#ifndef HB_OPTIMIZE_SIZE
2661
0
    for (; i + 3 < length; i += 4)
2662
0
    {
2663
0
      values[i + 0] = INVALID;
2664
0
      values[i + 1] = INVALID;
2665
0
      values[i + 2] = INVALID;
2666
0
      values[i + 3] = INVALID;
2667
0
    }
2668
0
#endif
2669
0
    for (; i < length; i++)
2670
0
      values[i] = INVALID;
2671
0
  }
2672
2673
  HB_ALWAYS_INLINE
2674
  bool get (unsigned i, float *value) const
2675
0
  {
2676
0
    if (unlikely (i >= length))
2677
0
    {
2678
0
      *value = 0.f;
2679
0
      return true;
2680
0
    }
2681
0
    auto *values = &static_values[0];
2682
0
    auto *cached_value = &values[i];
2683
    // Super hot. Most common path is that we have a cached value of 0.
2684
0
    int v = *cached_value;
2685
0
    if (likely (!v))
2686
0
    {
2687
0
      *value = 0.f;
2688
0
      return true;
2689
0
    }
2690
0
    if (v == INVALID)
2691
0
      return false;
2692
0
    *value = v * DIVISOR;
2693
0
    return true;
2694
0
  }
2695
2696
  HB_ALWAYS_INLINE
2697
  void set (unsigned i, float value)
2698
0
  {
2699
0
    if (unlikely (i >= length)) return;
2700
0
    auto *values = &static_values[0];
2701
0
    auto *cached_value = &values[i];
2702
0
    *cached_value = roundf(value * MULTIPLIER);
2703
0
  }
2704
2705
  public:
2706
  unsigned length;
2707
  private:
2708
  mutable hb_atomic_t<int> static_values[STATIC_LENGTH];
2709
};
2710
2711
struct VarRegionList
2712
{
2713
  private:
2714
  float evaluate_impl (unsigned int region_index,
2715
           const int *coords, unsigned int coord_len) const
2716
0
  {
2717
0
    const VarRegionAxis *axes = axesZ.arrayZ + (region_index * axisCount);
2718
0
    float v = 1.f;
2719
2720
0
    unsigned int count = axisCount;
2721
0
    for (unsigned int i = 0; i < count; i++)
2722
0
    {
2723
0
      int coord = i < coord_len ? coords[i] : 0;
2724
0
      float factor = axes[i].evaluate (coord);
2725
0
      if (factor == 0.f)
2726
0
      {
2727
0
  v = 0.f;
2728
0
  break;
2729
0
      }
2730
0
      v *= factor;
2731
0
    }
2732
2733
0
    return v;
2734
0
  }
2735
2736
  public:
2737
  HB_ALWAYS_INLINE
2738
  float evaluate (unsigned int region_index,
2739
      const int *coords, unsigned int coord_len,
2740
      hb_scalar_cache_t *cache = nullptr) const
2741
0
  {
2742
0
    if (unlikely (region_index >= regionCount))
2743
0
      return 0.;
2744
2745
0
    float v;
2746
0
    if (cache && cache->get (region_index, &v))
2747
0
      return v;
2748
2749
0
    v = evaluate_impl (region_index, coords, coord_len);
2750
2751
0
    if (cache)
2752
0
      cache->set (region_index, v);
2753
0
    return v;
2754
0
  }
2755
2756
  bool sanitize (hb_sanitize_context_t *c) const
2757
0
  {
2758
0
    TRACE_SANITIZE (this);
2759
0
    return_trace (c->check_struct (this) &&
2760
0
      hb_barrier () &&
2761
0
      axesZ.sanitize (c, axisCount * regionCount));
2762
0
  }
2763
2764
  bool serialize (hb_serialize_context_t *c,
2765
                  const hb_vector_t<hb_tag_t>& axis_tags,
2766
                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& regions)
2767
0
  {
2768
0
    TRACE_SERIALIZE (this);
2769
0
    unsigned axis_count = axis_tags.length;
2770
0
    unsigned region_count = regions.length;
2771
0
    if (!axis_count || !region_count) return_trace (false);
2772
0
    if (unlikely (hb_unsigned_mul_overflows (axis_count * region_count,
2773
0
                                             VarRegionAxis::static_size))) return_trace (false);
2774
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2775
0
    axisCount = axis_count;
2776
0
    regionCount = region_count;
2777
2778
0
    for (unsigned r = 0; r < region_count; r++)
2779
0
    {
2780
0
      const auto& region = regions[r];
2781
0
      for (unsigned i = 0; i < axis_count; i++)
2782
0
      {
2783
0
        hb_tag_t tag = axis_tags.arrayZ[i];
2784
0
        VarRegionAxis var_region_rec;
2785
0
        Triple *coords;
2786
0
        if (region->has (tag, &coords))
2787
0
        {
2788
0
          var_region_rec.startCoord.set_float (coords->minimum);
2789
0
          var_region_rec.peakCoord.set_float (coords->middle);
2790
0
          var_region_rec.endCoord.set_float (coords->maximum);
2791
0
        }
2792
0
        else
2793
0
        {
2794
0
          var_region_rec.startCoord.set_int (0);
2795
0
          var_region_rec.peakCoord.set_int (0);
2796
0
          var_region_rec.endCoord.set_int (0);
2797
0
        }
2798
0
        if (!var_region_rec.serialize (c))
2799
0
          return_trace (false);
2800
0
      }
2801
0
    }
2802
0
    return_trace (true);
2803
0
  }
2804
2805
  bool serialize (hb_serialize_context_t *c, const VarRegionList *src, const hb_inc_bimap_t &region_map)
2806
0
  {
2807
0
    TRACE_SERIALIZE (this);
2808
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2809
0
    axisCount = src->axisCount;
2810
0
    regionCount = region_map.get_population ();
2811
0
    if (unlikely (hb_unsigned_mul_overflows (axisCount * regionCount,
2812
0
               VarRegionAxis::static_size))) return_trace (false);
2813
0
    if (unlikely (!c->extend (this))) return_trace (false);
2814
0
    unsigned int region_count = src->regionCount;
2815
0
    for (unsigned int r = 0; r < regionCount; r++)
2816
0
    {
2817
0
      unsigned int backward = region_map.backward (r);
2818
0
      if (backward >= region_count) return_trace (false);
2819
0
      hb_memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount);
2820
0
    }
2821
2822
0
    return_trace (true);
2823
0
  }
2824
2825
  bool get_var_region (unsigned region_index,
2826
                       const hb_map_t& axes_old_index_tag_map,
2827
                       hb_hashmap_t<hb_tag_t, Triple>& axis_tuples /* OUT */) const
2828
0
  {
2829
0
    if (region_index >= regionCount) return false;
2830
0
    const VarRegionAxis* axis_region = axesZ.arrayZ + (region_index * axisCount);
2831
0
    for (unsigned i = 0; i < axisCount; i++)
2832
0
    {
2833
0
      hb_tag_t *axis_tag;
2834
0
      if (!axes_old_index_tag_map.has (i, &axis_tag))
2835
0
        return false;
2836
2837
0
      float min_val = axis_region->startCoord.to_float ();
2838
0
      float def_val = axis_region->peakCoord.to_float ();
2839
0
      float max_val = axis_region->endCoord.to_float ();
2840
2841
0
      if (def_val != 0.f)
2842
0
        axis_tuples.set (*axis_tag, Triple ((double) min_val, (double) def_val, (double) max_val));
2843
0
      axis_region++;
2844
0
    }
2845
0
    return !axis_tuples.in_error ();
2846
0
  }
2847
2848
  bool get_var_regions (const hb_map_t& axes_old_index_tag_map,
2849
                        hb_vector_t<hb_hashmap_t<hb_tag_t, Triple>>& regions /* OUT */) const
2850
0
  {
2851
0
    if (!regions.alloc (regionCount))
2852
0
      return false;
2853
2854
0
    for (unsigned i = 0; i < regionCount; i++)
2855
0
    {
2856
0
      hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
2857
0
      if (!get_var_region (i, axes_old_index_tag_map, axis_tuples))
2858
0
        return false;
2859
0
      regions.push (std::move (axis_tuples));
2860
0
    }
2861
0
    return !regions.in_error ();
2862
0
  }
2863
2864
  size_t get_size () const
2865
0
  { return hb_unsigned_add_saturate (min_size,
2866
0
             hb_unsigned_mul_saturate (VarRegionAxis::static_size,
2867
0
                     axisCount, regionCount)); }
2868
2869
  public:
2870
  HBUINT16  axisCount;
2871
  HBUINT15  regionCount;
2872
  protected:
2873
  UnsizedArrayOf<VarRegionAxis>
2874
    axesZ;
2875
  public:
2876
  DEFINE_SIZE_ARRAY (4, axesZ);
2877
};
2878
2879
/* Whether a variation region is unreachable given per-axis reachable
2880
 * final-coordinate ranges, in F2Dot14 units (avar2 partial-instancing
2881
 * culling; see hb_subset_plan_t::avar2_reachable_ranges). A region is dead
2882
 * if some axis's tent evaluates to zero over the axis's entire reachable
2883
 * range. Mirrors the runtime evaluation: invalid tents evaluate as
2884
 * constant 1 and never kill a region. */
2885
static inline bool
2886
_hb_avar2_region_is_dead (const hb_hashmap_t<hb_tag_t, Triple> &axis_tuples,
2887
        const hb_hashmap_t<hb_tag_t, Triple> &reachable_ranges)
2888
0
{
2889
0
  for (auto _ : axis_tuples)
2890
0
  {
2891
0
    Triple *range;
2892
0
    if (!reachable_ranges.has (_.first, &range)) continue;
2893
0
    const Triple &tent = _.second;
2894
0
    int start = (int) roundf ((float) tent.minimum * 16384.f);
2895
0
    int peak  = (int) roundf ((float) tent.middle * 16384.f);
2896
0
    int end   = (int) roundf ((float) tent.maximum * 16384.f);
2897
0
    if (!peak) continue;
2898
0
    if (start > peak || peak > end) continue;
2899
0
    if (start < 0 && end > 0) continue;
2900
0
    int lo = (int) roundf ((float) range->minimum * 16384.f);
2901
0
    int hi = (int) roundf ((float) range->maximum * 16384.f);
2902
    /* Strict comparisons: the scalar is 1 (not 0) at v == peak, so a tent
2903
     * whose peak sits exactly on the range boundary is still live there.
2904
     * (Reachable ranges are padded by one F2Dot14 unit at their producer,
2905
     * which already covers this; strictness keeps the predicate correct on
2906
     * its own terms.) */
2907
0
    if (hi < start || lo > end)
2908
0
      return true;
2909
0
  }
2910
0
  return false;
2911
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&)
2912
2913
struct SparseVariationRegion
2914
{
2915
  float evaluate (const int *coords, unsigned int coord_len) const
2916
0
  {
2917
0
    float v = 1.f;
2918
0
    unsigned int count = axes.len;
2919
0
    for (unsigned int i = 0; i < count; i++)
2920
0
    {
2921
0
      float factor = (this+axes[i]).evaluate (coords, coord_len);
2922
0
      if (factor == 0.f)
2923
0
  return 0.;
2924
0
      v *= factor;
2925
0
    }
2926
0
    return v;
2927
0
  }
2928
2929
  bool serialize (hb_serialize_context_t *c,
2930
      const SparseVariationRegion *src)
2931
0
  {
2932
0
    TRACE_SERIALIZE (this);
2933
0
    if (unlikely (!axes.serialize (c, (unsigned) src->axes.len))) return_trace (false);
2934
0
    for (unsigned i = 0; i < axes.len; i++)
2935
0
      if (unlikely (!axes[i].serialize_copy (c, src->axes[i], src)))
2936
0
  return_trace (false);
2937
0
    return_trace (true);
2938
0
  }
2939
2940
  bool sanitize (hb_sanitize_context_t *c) const
2941
0
  {
2942
0
    TRACE_SANITIZE (this);
2943
0
    return_trace (axes.sanitize (c, this));
2944
0
  }
2945
2946
  protected:
2947
  Array16Of<Offset32To<SparseVarRegionAxis>> axes;
2948
  public:
2949
  DEFINE_SIZE_ARRAY (2, axes);
2950
};
2951
2952
struct SparseVarRegionList
2953
{
2954
  HB_ALWAYS_INLINE
2955
  float evaluate (unsigned int region_index,
2956
      const int *coords, unsigned int coord_len,
2957
      hb_scalar_cache_t *cache = nullptr) const
2958
0
  {
2959
0
    if (unlikely (region_index >= regions.len))
2960
0
      return 0.;
2961
2962
0
    float v;
2963
0
    if (cache && cache->get (region_index, &v))
2964
0
      return v;
2965
2966
0
    const SparseVariationRegion &region = this+regions[region_index];
2967
2968
0
    v = region.evaluate (coords, coord_len);
2969
0
    if (cache)
2970
0
      cache->set (region_index, v);
2971
2972
0
    return v;
2973
0
  }
2974
2975
  bool sanitize (hb_sanitize_context_t *c) const
2976
0
  {
2977
0
    TRACE_SANITIZE (this);
2978
0
    return_trace (regions.sanitize (c, this));
2979
0
  }
2980
2981
  bool serialize (hb_serialize_context_t *c,
2982
      const SparseVarRegionList *src,
2983
      const hb_inc_bimap_t &region_map)
2984
0
  {
2985
0
    TRACE_SERIALIZE (this);
2986
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
2987
0
    regions.len = region_map.get_population ();
2988
0
    if (unlikely (!c->extend (regions))) return_trace (false);
2989
2990
0
    for (unsigned i = 0; i < regions.len; i++)
2991
0
    {
2992
0
      unsigned old_index = region_map.backward (i);
2993
0
      if (unlikely (old_index >= src->regions.len ||
2994
0
        !regions[i].serialize_serialize (c,
2995
0
               &(src+src->regions[old_index]))))
2996
0
  return_trace (false);
2997
0
    }
2998
0
    return_trace (true);
2999
0
  }
3000
3001
  public:
3002
  Array32Of<Offset32To<SparseVariationRegion>>
3003
    regions;
3004
  public:
3005
  DEFINE_SIZE_ARRAY (4, regions);
3006
};
3007
3008
3009
struct VarData
3010
{
3011
  unsigned int get_item_count () const
3012
0
  { return itemCount; }
3013
3014
  unsigned int get_region_index_count () const
3015
0
  { return regionIndices.len; }
3016
3017
  unsigned get_region_index (unsigned i) const
3018
0
  { return i >= regionIndices.len ? -1 : regionIndices[i]; }
3019
3020
  size_t get_row_size () const
3021
0
  { return (wordCount () + regionIndices.len) * (longWords () ? 2 : 1); }
3022
3023
  size_t get_size () const
3024
0
  { return hb_unsigned_add_saturate (min_size - regionIndices.min_size,
3025
0
             regionIndices.get_size (),
3026
0
             hb_unsigned_mul_saturate (itemCount, get_row_size ())); }
3027
3028
  float _get_delta (unsigned int inner,
3029
        const int *coords, unsigned int coord_count,
3030
        const VarRegionList &regions,
3031
        hb_scalar_cache_t *cache = nullptr) const
3032
0
  {
3033
0
    if (unlikely (inner >= itemCount))
3034
0
      return 0.;
3035
0
    bool is_long = longWords ();
3036
0
    unsigned int count = regionIndices.len;
3037
0
    unsigned word_count = wordCount ();
3038
0
    unsigned int scount = is_long ? count : word_count;
3039
0
    unsigned int lcount = is_long ? word_count : 0;
3040
3041
0
    const HBUINT8 *bytes = get_delta_bytes ();
3042
0
    const HBUINT8 *row = bytes + inner * get_row_size ();
3043
3044
0
    float delta = 0.;
3045
0
    unsigned int i = 0;
3046
3047
0
    const HBINT32 *lcursor = reinterpret_cast<const HBINT32 *> (row);
3048
0
    for (; i < lcount; i++)
3049
0
    {
3050
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
3051
0
      if (scalar)
3052
0
        delta += scalar * *lcursor;
3053
0
      lcursor++;
3054
0
    }
3055
0
    const HBINT16 *scursor = reinterpret_cast<const HBINT16 *> (lcursor);
3056
0
    for (; i < scount; i++)
3057
0
    {
3058
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
3059
0
      if (scalar)
3060
0
       delta += scalar * *scursor;
3061
0
      scursor++;
3062
0
    }
3063
0
    const HBINT8 *bcursor = reinterpret_cast<const HBINT8 *> (scursor);
3064
0
    for (; i < count; i++)
3065
0
    {
3066
0
      float scalar = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count, cache);
3067
0
      if (scalar)
3068
0
        delta += scalar * *bcursor;
3069
0
      bcursor++;
3070
0
    }
3071
3072
0
    return delta;
3073
0
  }
3074
3075
  HB_ALWAYS_INLINE
3076
  float get_delta (unsigned int inner,
3077
       const int *coords, unsigned int coord_count,
3078
       const VarRegionList &regions,
3079
       hb_scalar_cache_t *cache = nullptr) const
3080
0
  {
3081
0
    unsigned int count = regionIndices.len;
3082
0
    if (!count) return 0.f; // This is quite common, so optimize it.
3083
0
    return _get_delta (inner, coords, coord_count, regions, cache);
3084
0
  }
3085
3086
  void get_region_scalars (const int *coords, unsigned int coord_count,
3087
         const VarRegionList &regions,
3088
         float *scalars /*OUT */,
3089
         unsigned int num_scalars) const
3090
0
  {
3091
0
    unsigned count = hb_min (num_scalars, regionIndices.len);
3092
0
    for (unsigned int i = 0; i < count; i++)
3093
0
      scalars[i] = regions.evaluate (regionIndices.arrayZ[i], coords, coord_count);
3094
0
    for (unsigned int i = count; i < num_scalars; i++)
3095
0
      scalars[i] = 0.f;
3096
0
  }
3097
3098
  bool sanitize (hb_sanitize_context_t *c) const
3099
0
  {
3100
0
    TRACE_SANITIZE (this);
3101
0
    return_trace (c->check_struct (this) &&
3102
0
      regionIndices.sanitize (c) &&
3103
0
      hb_barrier () &&
3104
0
      wordCount () <= regionIndices.len &&
3105
0
      c->check_range (get_delta_bytes (),
3106
0
          itemCount,
3107
0
          get_row_size ()));
3108
0
  }
3109
3110
  bool serialize (hb_serialize_context_t *c,
3111
                  bool has_long,
3112
                  const hb_vector_t<const hb_vector_t<int>*>& rows)
3113
0
  {
3114
0
    TRACE_SERIALIZE (this);
3115
0
    unsigned row_count = rows.length;
3116
0
    if (!row_count) {
3117
      // Nothing to serialize, will be empty.
3118
0
      return false;
3119
0
    }
3120
3121
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3122
0
    if (unlikely (!c->check_assign (itemCount, row_count,
3123
0
                                    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
3124
0
      return_trace (false);
3125
3126
0
    int min_threshold = has_long ? -65536 : -128;
3127
0
    int max_threshold = has_long ? +65535 : +127;
3128
0
    enum delta_size_t { kZero=0, kNonWord, kWord };
3129
0
    hb_vector_t<delta_size_t> delta_sz;
3130
0
    unsigned num_regions = rows[0]->length;
3131
0
    if (!delta_sz.resize (num_regions))
3132
0
      return_trace (false);
3133
3134
0
    unsigned word_count = 0;
3135
0
    for (unsigned r = 0; r < num_regions; r++)
3136
0
    {
3137
0
      for (unsigned i = 0; i < row_count; i++)
3138
0
      {
3139
0
        int delta = rows[i]->arrayZ[r];
3140
0
        if (delta < min_threshold || delta > max_threshold)
3141
0
        {
3142
0
          delta_sz[r] = kWord;
3143
0
          word_count++;
3144
0
          break;
3145
0
        }
3146
0
        else if (delta != 0)
3147
0
        {
3148
0
          delta_sz[r] = kNonWord;
3149
0
        }
3150
0
      }
3151
0
    }
3152
3153
    /* reorder regions: words and then non-words*/
3154
0
    unsigned word_index = 0;
3155
0
    unsigned non_word_index = word_count;
3156
0
    hb_map_t ri_map;
3157
0
    for (unsigned r = 0; r < num_regions; r++)
3158
0
    {
3159
0
      if (!delta_sz[r]) continue;
3160
0
      unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
3161
0
      if (!ri_map.set (new_r, r))
3162
0
        return_trace (false);
3163
0
    }
3164
3165
0
    wordSizeCount = word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0);
3166
3167
0
    unsigned ri_count = ri_map.get_population ();
3168
0
    regionIndices.len = ri_count;
3169
0
    if (unlikely (!c->extend (this))) return_trace (false);
3170
3171
0
    for (unsigned r = 0; r < ri_count; r++)
3172
0
    {
3173
0
      hb_codepoint_t *idx;
3174
0
      if (!ri_map.has (r, &idx))
3175
0
        return_trace (false);
3176
0
      regionIndices[r] = *idx;
3177
0
    }
3178
3179
0
    HBUINT8 *delta_bytes = get_delta_bytes ();
3180
0
    unsigned row_size = get_row_size ();
3181
0
    for (unsigned int i = 0; i < row_count; i++)
3182
0
    {
3183
0
      for (unsigned int r = 0; r < ri_count; r++)
3184
0
      {
3185
0
        int delta = rows[i]->arrayZ[ri_map[r]];
3186
0
        set_item_delta_fast (i, r, delta, delta_bytes, row_size);
3187
0
      }
3188
0
    }
3189
0
    return_trace (true);
3190
0
  }
3191
3192
  bool serialize (hb_serialize_context_t *c,
3193
      const VarData *src,
3194
      const hb_inc_bimap_t &inner_map,
3195
      const hb_inc_bimap_t &region_map,
3196
      const hb_set_t *culled_regions = nullptr)
3197
0
  {
3198
0
    TRACE_SERIALIZE (this);
3199
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3200
0
    itemCount = inner_map.get_next_value ();
3201
3202
    /* Optimize word count */
3203
0
    unsigned ri_count = src->regionIndices.len;
3204
0
    enum delta_size_t { kZero=0, kNonWord, kWord };
3205
0
    hb_vector_t<delta_size_t> delta_sz;
3206
0
    hb_vector_t<unsigned int> ri_map; /* maps new index to old index */
3207
0
    delta_sz.resize (ri_count);
3208
0
    ri_map.resize (ri_count);
3209
0
    unsigned int new_word_count = 0;
3210
0
    unsigned int r;
3211
3212
0
    const HBUINT8 *src_delta_bytes = src->get_delta_bytes ();
3213
0
    unsigned src_row_size = src->get_row_size ();
3214
0
    unsigned src_word_count = src->wordCount ();
3215
0
    bool     src_long_words = src->longWords ();
3216
3217
0
    bool has_long = false;
3218
0
    if (src_long_words)
3219
0
    {
3220
0
      for (r = 0; r < src_word_count; r++)
3221
0
      {
3222
0
        for (unsigned old_gid : inner_map.keys())
3223
0
  {
3224
0
    int32_t delta = src->get_item_delta_fast (old_gid, r, src_delta_bytes, src_row_size);
3225
0
    if (delta < -65536 || 65535 < delta)
3226
0
    {
3227
0
      has_long = true;
3228
0
      break;
3229
0
    }
3230
0
        }
3231
0
      }
3232
0
    }
3233
3234
0
    signed min_threshold = has_long ? -65536 : -128;
3235
0
    signed max_threshold = has_long ? +65535 : +127;
3236
0
    for (r = 0; r < ri_count; r++)
3237
0
    {
3238
0
      bool short_circuit = src_long_words == has_long && src_word_count <= r;
3239
3240
0
      delta_sz[r] = kZero;
3241
0
      if (culled_regions && culled_regions->has (src->regionIndices[r]))
3242
0
  continue; /* unreachable region: drop its column */
3243
0
      for (unsigned old_gid : inner_map.keys())
3244
0
      {
3245
0
  int32_t delta = src->get_item_delta_fast (old_gid, r, src_delta_bytes, src_row_size);
3246
0
  if (delta < min_threshold || max_threshold < delta)
3247
0
  {
3248
0
    delta_sz[r] = kWord;
3249
0
    new_word_count++;
3250
0
    break;
3251
0
  }
3252
0
  else if (delta != 0)
3253
0
  {
3254
0
    delta_sz[r] = kNonWord;
3255
0
    if (short_circuit)
3256
0
      break;
3257
0
  }
3258
0
      }
3259
0
    }
3260
3261
0
    unsigned int word_index = 0;
3262
0
    unsigned int non_word_index = new_word_count;
3263
0
    unsigned int new_ri_count = 0;
3264
0
    for (r = 0; r < ri_count; r++)
3265
0
      if (delta_sz[r])
3266
0
      {
3267
0
  unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++;
3268
0
  ri_map[new_r] = r;
3269
0
  new_ri_count++;
3270
0
      }
3271
3272
0
    wordSizeCount = new_word_count | (has_long ? 0x8000u /* LONG_WORDS */ : 0);
3273
3274
0
    regionIndices.len = new_ri_count;
3275
3276
0
    if (unlikely (!c->extend (this))) return_trace (false);
3277
3278
0
    for (r = 0; r < new_ri_count; r++)
3279
0
      regionIndices[r] = region_map[src->regionIndices[ri_map[r]]];
3280
3281
0
    HBUINT8 *delta_bytes = get_delta_bytes ();
3282
0
    unsigned row_size = get_row_size ();
3283
0
    unsigned count = itemCount;
3284
0
    for (unsigned int i = 0; i < count; i++)
3285
0
    {
3286
0
      unsigned int old = inner_map.backward (i);
3287
0
      for (unsigned int r = 0; r < new_ri_count; r++)
3288
0
  set_item_delta_fast (i, r,
3289
0
           src->get_item_delta_fast (old, ri_map[r],
3290
0
                   src_delta_bytes, src_row_size),
3291
0
           delta_bytes, row_size);
3292
0
    }
3293
3294
0
    return_trace (true);
3295
0
  }
3296
3297
  void collect_region_refs (hb_set_t &region_indices, const hb_inc_bimap_t &inner_map) const
3298
0
  {
3299
0
    const HBUINT8 *delta_bytes = get_delta_bytes ();
3300
0
    unsigned row_size = get_row_size ();
3301
3302
0
    for (unsigned int r = 0; r < regionIndices.len; r++)
3303
0
    {
3304
0
      unsigned int region = regionIndices.arrayZ[r];
3305
0
      if (region_indices.has (region)) continue;
3306
0
      for (hb_codepoint_t old_gid : inner_map.keys())
3307
0
  if (get_item_delta_fast (old_gid, r, delta_bytes, row_size) != 0)
3308
0
  {
3309
0
    region_indices.add (region);
3310
0
    break;
3311
0
  }
3312
0
    }
3313
0
  }
3314
3315
  public:
3316
  const HBUINT8 *get_delta_bytes () const
3317
0
  { return &StructAfter<HBUINT8> (regionIndices); }
3318
3319
  protected:
3320
  HBUINT8 *get_delta_bytes ()
3321
0
  { return &StructAfter<HBUINT8> (regionIndices); }
3322
3323
  public:
3324
  int32_t get_item_delta_fast (unsigned int item, unsigned int region,
3325
             const HBUINT8 *delta_bytes, unsigned row_size) const
3326
0
  {
3327
0
    if (unlikely (item >= itemCount || region >= regionIndices.len)) return 0;
3328
3329
0
    const HBINT8 *p = (const HBINT8 *) delta_bytes + item * row_size;
3330
0
    unsigned word_count = wordCount ();
3331
0
    bool is_long = longWords ();
3332
0
    if (is_long)
3333
0
    {
3334
0
      if (region < word_count)
3335
0
  return ((const HBINT32 *) p)[region];
3336
0
      else
3337
0
  return ((const HBINT16 *)(p + HBINT32::static_size * word_count))[region - word_count];
3338
0
    }
3339
0
    else
3340
0
    {
3341
0
      if (region < word_count)
3342
0
  return ((const HBINT16 *) p)[region];
3343
0
      else
3344
0
  return (p + HBINT16::static_size * word_count)[region - word_count];
3345
0
    }
3346
0
  }
3347
  int32_t get_item_delta (unsigned int item, unsigned int region) const
3348
0
  {
3349
0
     return get_item_delta_fast (item, region,
3350
0
         get_delta_bytes (),
3351
0
         get_row_size ());
3352
0
  }
3353
3354
  protected:
3355
  void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta,
3356
          HBUINT8 *delta_bytes, unsigned row_size)
3357
0
  {
3358
0
    HBINT8 *p = (HBINT8 *) delta_bytes + item * row_size;
3359
0
    unsigned word_count = wordCount ();
3360
0
    bool is_long = longWords ();
3361
0
    if (is_long)
3362
0
    {
3363
0
      if (region < word_count)
3364
0
  ((HBINT32 *) p)[region] = delta;
3365
0
      else
3366
0
  ((HBINT16 *)(p + HBINT32::static_size * word_count))[region - word_count] = delta;
3367
0
    }
3368
0
    else
3369
0
    {
3370
0
      if (region < word_count)
3371
0
  ((HBINT16 *) p)[region] = delta;
3372
0
      else
3373
0
  (p + HBINT16::static_size * word_count)[region - word_count] = delta;
3374
0
    }
3375
0
  }
3376
  void set_item_delta (unsigned int item, unsigned int region, int32_t delta)
3377
0
  {
3378
0
    set_item_delta_fast (item, region, delta,
3379
0
       get_delta_bytes (),
3380
0
       get_row_size ());
3381
0
  }
3382
3383
0
  bool longWords () const { return wordSizeCount & 0x8000u /* LONG_WORDS */; }
3384
0
  unsigned wordCount () const { return wordSizeCount & 0x7FFFu /* WORD_DELTA_COUNT_MASK */; }
3385
3386
  protected:
3387
  HBUINT16    itemCount;
3388
  HBUINT16    wordSizeCount;
3389
  Array16Of<HBUINT16> regionIndices;
3390
/*UnsizedArrayOf<HBUINT8>bytesX;*/
3391
  public:
3392
  DEFINE_SIZE_ARRAY (6, regionIndices);
3393
};
3394
3395
struct MultiVarData
3396
{
3397
  size_t get_size () const
3398
0
  { return hb_unsigned_add_saturate (min_size - regionIndices.min_size,
3399
0
             regionIndices.get_size ()); }
3400
3401
  const TupleList &get_delta_sets () const
3402
0
  { return this+StructAfter<decltype (deltaSetsX)> (regionIndices); }
3403
3404
  void get_delta (unsigned int inner,
3405
      const int *coords, unsigned int coord_count,
3406
      const SparseVarRegionList &regions,
3407
      hb_array_t<double> out,
3408
      hb_scalar_cache_t *cache = nullptr) const
3409
0
  {
3410
0
    auto &deltaSets = get_delta_sets ();
3411
3412
0
    auto values_iter = deltaSets.fetcher (inner);
3413
0
    unsigned regionCount = regionIndices.len;
3414
0
    unsigned skip = 0;
3415
0
    for (unsigned regionIndex = 0; regionIndex < regionCount; regionIndex++)
3416
0
    {
3417
0
      float scalar = regions.evaluate (regionIndices.arrayZ[regionIndex],
3418
0
               coords, coord_count,
3419
0
               cache);
3420
      // We skip lazily. Helps with the tail end.
3421
0
      if (scalar == 0.0f)
3422
0
        skip += out.length;
3423
0
      else
3424
0
      {
3425
0
        if (skip)
3426
0
  {
3427
0
    values_iter.skip (skip);
3428
0
    skip = 0;
3429
0
  }
3430
0
  values_iter.add_to (out, scalar);
3431
0
      }
3432
0
    }
3433
0
  }
3434
3435
  bool sanitize (hb_sanitize_context_t *c) const
3436
0
  {
3437
0
    TRACE_SANITIZE (this);
3438
0
    return_trace (format.sanitize (c) &&
3439
0
      hb_barrier () &&
3440
0
      format == 1 &&
3441
0
      regionIndices.sanitize (c) &&
3442
0
      hb_barrier () &&
3443
0
      StructAfter<decltype (deltaSetsX)> (regionIndices).sanitize (c, this));
3444
0
  }
3445
3446
  unsigned get_item_count () const
3447
0
  { return get_delta_sets ().count; }
3448
3449
  void collect_region_refs (hb_set_t &region_indices) const
3450
0
  {
3451
0
    for (unsigned region : regionIndices)
3452
0
      region_indices.add (region);
3453
0
  }
3454
3455
  bool serialize (hb_serialize_context_t *c,
3456
      const MultiVarData *src,
3457
      const hb_inc_bimap_t &inner_map,
3458
      const hb_inc_bimap_t &region_map)
3459
0
  {
3460
0
    TRACE_SERIALIZE (this);
3461
0
    unsigned region_count = src->regionIndices.len;
3462
0
    unsigned header_size = HBUINT8::static_size +
3463
0
         Array16Of<HBUINT16>::min_size +
3464
0
         region_count * HBUINT16::static_size +
3465
0
         HBUINT32::static_size;
3466
0
    if (unlikely (!c->extend_size (this, header_size, false)))
3467
0
      return_trace (false);
3468
0
    format = 1;
3469
0
    regionIndices.len = region_count;
3470
0
    for (unsigned i = 0; i < regionIndices.len; i++)
3471
0
    {
3472
0
      unsigned old_region = src->regionIndices[i];
3473
0
      if (unlikely (!region_map.has (old_region)))
3474
0
  return_trace (false);
3475
0
      regionIndices[i] = region_map.get (old_region);
3476
0
    }
3477
3478
0
    const auto &src_delta_sets = src->get_delta_sets ();
3479
0
    hb_vector_t<hb_ubytes_t> delta_sets;
3480
0
    unsigned data_size = 0;
3481
0
    if (unlikely (!delta_sets.alloc_exact (inner_map.get_population ())))
3482
0
      return_trace (false);
3483
0
    for (unsigned i = 0; i < inner_map.get_population (); i++)
3484
0
    {
3485
0
      unsigned old_inner = inner_map.backward (i);
3486
0
      if (unlikely (old_inner >= src_delta_sets.count)) return_trace (false);
3487
0
      hb_ubytes_t bytes = static_cast<const CFF2Index &> (src_delta_sets)[old_inner];
3488
0
      data_size = hb_unsigned_add_saturate (data_size, bytes.length);
3489
0
      delta_sets.push (bytes);
3490
0
    }
3491
0
    if (unlikely (data_size == UINT_MAX || delta_sets.in_error ()))
3492
0
      return_trace (false);
3493
3494
0
    auto &out_delta_sets = StructAfter<decltype (deltaSetsX)> (regionIndices);
3495
0
    return_trace (out_delta_sets.serialize_serialize (c, delta_sets.iter (), &data_size));
3496
0
  }
3497
3498
  protected:
3499
  HBUINT8       format; // 1
3500
  Array16Of<HBUINT16> regionIndices;
3501
  Offset32To<TupleList> deltaSetsX;
3502
  public:
3503
  DEFINE_SIZE_MIN (7);
3504
};
3505
3506
struct ItemVariationStore
3507
{
3508
  friend struct item_variations_t;
3509
3510
  hb_scalar_cache_t *create_cache () const
3511
161k
  {
3512
#ifdef HB_NO_VAR
3513
    return hb_scalar_cache_t::create (0);
3514
#endif
3515
161k
    return hb_scalar_cache_t::create ((this+regions).regionCount);
3516
161k
  }
3517
3518
  static void destroy_cache (hb_scalar_cache_t *cache)
3519
161k
  {
3520
161k
    hb_scalar_cache_t::destroy (cache);
3521
161k
  }
3522
3523
  private:
3524
  float get_delta (unsigned int outer, unsigned int inner,
3525
       const int *coords, unsigned int coord_count,
3526
       hb_scalar_cache_t *cache = nullptr) const
3527
0
  {
3528
#ifdef HB_NO_VAR
3529
    return 0.f;
3530
#endif
3531
3532
0
    if (unlikely (outer >= dataSets.len))
3533
0
      return 0.f;
3534
3535
0
    return (this+dataSets[outer]).get_delta (inner,
3536
0
               coords, coord_count,
3537
0
               this+regions,
3538
0
               cache);
3539
0
  }
3540
3541
  public:
3542
  bool has_delta_set (unsigned int index) const
3543
0
  {
3544
#ifdef HB_NO_VAR
3545
    return false;
3546
#endif
3547
3548
0
    unsigned int outer = index >> 16;
3549
0
    unsigned int inner = index & 0xFFFF;
3550
0
    return outer < dataSets.len &&
3551
0
     inner < (this+dataSets[outer]).get_item_count ();
3552
0
  }
3553
3554
  float get_delta (unsigned int index,
3555
       const int *coords, unsigned int coord_count,
3556
       hb_scalar_cache_t *cache = nullptr) const
3557
0
  {
3558
0
    unsigned int outer = index >> 16;
3559
0
    unsigned int inner = index & 0xFFFF;
3560
0
    return get_delta (outer, inner, coords, coord_count, cache);
3561
0
  }
3562
  float get_delta (unsigned int index,
3563
       hb_array_t<const int> coords,
3564
       hb_scalar_cache_t *cache = nullptr) const
3565
0
  {
3566
0
    return get_delta (index,
3567
0
          coords.arrayZ, coords.length,
3568
0
          cache);
3569
0
  }
3570
3571
  bool sanitize (hb_sanitize_context_t *c) const
3572
0
  {
3573
#ifdef HB_NO_VAR
3574
    return true;
3575
#endif
3576
3577
0
    TRACE_SANITIZE (this);
3578
0
    return_trace (c->check_struct (this) &&
3579
0
      hb_barrier () &&
3580
0
      format == 1 &&
3581
0
      regions.sanitize (c, this) &&
3582
0
      dataSets.sanitize (c, this));
3583
0
  }
3584
3585
  bool serialize (hb_serialize_context_t *c,
3586
                  bool has_long,
3587
                  const hb_vector_t<hb_tag_t>& axis_tags,
3588
                  const hb_vector_t<const hb_hashmap_t<hb_tag_t, Triple>*>& region_list,
3589
                  const hb_vector_t<delta_row_encoding_t>& vardata_encodings)
3590
0
  {
3591
0
    TRACE_SERIALIZE (this);
3592
#ifdef HB_NO_VAR
3593
    return_trace (false);
3594
#endif
3595
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3596
3597
0
    format = 1;
3598
0
    if (!regions.serialize_serialize (c, axis_tags, region_list))
3599
0
      return_trace (false);
3600
3601
0
    unsigned num_var_data = vardata_encodings.length;
3602
0
    if (!num_var_data) return_trace (false);
3603
0
    if (unlikely (!c->check_assign (dataSets.len, num_var_data,
3604
0
                                    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
3605
0
      return_trace (false);
3606
3607
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3608
0
    for (unsigned i = 0; i < num_var_data; i++)
3609
0
      if (!dataSets[i].serialize_serialize (c, has_long, vardata_encodings[i].items))
3610
0
        return_trace (false);
3611
3612
0
    return_trace (true);
3613
0
  }
3614
3615
  bool serialize (hb_serialize_context_t *c,
3616
      const ItemVariationStore *src,
3617
      const hb_array_t <const hb_inc_bimap_t> &inner_maps,
3618
      const hb_set_t *culled_regions = nullptr)
3619
0
  {
3620
0
    TRACE_SERIALIZE (this);
3621
#ifdef HB_NO_VAR
3622
    return_trace (false);
3623
#endif
3624
3625
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3626
3627
0
    unsigned int set_count = 0;
3628
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3629
0
      if (inner_maps[i].get_population ())
3630
0
  set_count++;
3631
3632
0
    format = 1;
3633
3634
0
    const auto &src_regions = src+src->regions;
3635
3636
0
    hb_set_t region_indices;
3637
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3638
0
      (src+src->dataSets[i]).collect_region_refs (region_indices, inner_maps[i]);
3639
3640
0
    if (region_indices.in_error ())
3641
0
      return_trace (false);
3642
3643
0
    region_indices.del_range ((src_regions).regionCount, hb_set_t::INVALID);
3644
3645
0
    if (culled_regions)
3646
0
      region_indices.subtract (*culled_regions);
3647
3648
    /* TODO use constructor when our data-structures support that. */
3649
0
    hb_inc_bimap_t region_map;
3650
0
    + hb_iter (region_indices)
3651
0
    | hb_apply ([&region_map] (unsigned _) { region_map.add(_); })
3652
0
    ;
3653
0
    if (region_map.in_error())
3654
0
      return_trace (false);
3655
3656
0
    if (unlikely (!regions.serialize_serialize (c, &src_regions, region_map)))
3657
0
      return_trace (false);
3658
3659
0
    dataSets.len = set_count;
3660
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3661
3662
    /* TODO: The following code could be simplified when
3663
     * List16OfOffset16To::subset () can take a custom param to be passed to VarData::serialize () */
3664
0
    unsigned int set_index = 0;
3665
0
    for (unsigned int i = 0; i < inner_maps.length; i++)
3666
0
    {
3667
0
      if (!inner_maps[i].get_population ()) continue;
3668
0
      if (unlikely (!dataSets[set_index++]
3669
0
         .serialize_serialize (c, &(src+src->dataSets[i]), inner_maps[i], region_map,
3670
0
             culled_regions)))
3671
0
  return_trace (false);
3672
0
    }
3673
3674
0
    return_trace (true);
3675
0
  }
3676
3677
  ItemVariationStore *copy (hb_serialize_context_t *c) const
3678
0
  {
3679
0
    TRACE_SERIALIZE (this);
3680
0
    auto *out = c->start_embed (this);
3681
0
    if (unlikely (!out)) return_trace (nullptr);
3682
0
3683
0
    hb_vector_t <hb_inc_bimap_t> inner_maps;
3684
0
    unsigned count = dataSets.len;
3685
0
    for (unsigned i = 0; i < count; i++)
3686
0
    {
3687
0
      hb_inc_bimap_t *map = inner_maps.push ();
3688
0
      if (unlikely (!c->propagate_error(inner_maps)))
3689
0
        return_trace(nullptr);
3690
0
      auto &data = this+dataSets[i];
3691
0
3692
0
      unsigned itemCount = data.get_item_count ();
3693
0
      for (unsigned j = 0; j < itemCount; j++)
3694
0
  map->add (j);
3695
0
    }
3696
0
3697
0
    if (unlikely (!out->serialize (c, this, inner_maps))) return_trace (nullptr);
3698
0
3699
0
    return_trace (out);
3700
0
  }
3701
3702
  /* Collect regions that a partial avar2 instance can never reach, per the
3703
   * plan's reachable final-coordinate ranges. */
3704
  bool collect_dead_regions (const hb_map_t &axes_old_index_tag_map,
3705
           const hb_hashmap_t<hb_tag_t, Triple> &reachable_ranges,
3706
           hb_set_t &dead_regions /* OUT */) const
3707
0
  {
3708
0
#ifndef HB_NO_VAR
3709
0
    if (!reachable_ranges.get_population ()) return true;
3710
0
    const VarRegionList &region_list = this+regions;
3711
0
    unsigned count = region_list.regionCount;
3712
0
    for (unsigned i = 0; i < count; i++)
3713
0
    {
3714
0
      hb_hashmap_t<hb_tag_t, Triple> axis_tuples;
3715
0
      if (!region_list.get_var_region (i, axes_old_index_tag_map, axis_tuples))
3716
0
  return false;
3717
0
      if (_hb_avar2_region_is_dead (axis_tuples, reachable_ranges))
3718
0
  dead_regions.add (i);
3719
0
    }
3720
0
    return !dead_regions.in_error ();
3721
#else
3722
    return true;
3723
#endif
3724
0
  }
3725
3726
  bool subset (hb_subset_context_t *c, const hb_array_t<const hb_inc_bimap_t> &inner_maps) const
3727
0
  {
3728
0
    TRACE_SUBSET (this);
3729
#ifdef HB_NO_VAR
3730
    return_trace (false);
3731
#endif
3732
3733
0
    ItemVariationStore *varstore_prime = c->serializer->start_embed<ItemVariationStore> ();
3734
0
    if (unlikely (!varstore_prime)) return_trace (false);
3735
3736
    /* avar2 partial instancing: cull unreachable regions. */
3737
0
    hb_set_t dead_regions;
3738
0
    if (c->plan->has_avar2)
3739
0
      if (!collect_dead_regions (c->plan->axes_old_index_tag_map,
3740
0
         c->plan->avar2_reachable_ranges,
3741
0
         dead_regions))
3742
0
  return_trace (false);
3743
3744
0
    varstore_prime->serialize (c->serializer, this, inner_maps,
3745
0
             dead_regions.get_population () ? &dead_regions : nullptr);
3746
3747
0
    return_trace (
3748
0
        !c->serializer->in_error()
3749
0
        && varstore_prime->dataSets);
3750
0
  }
3751
3752
  unsigned int get_region_index_count (unsigned int major) const
3753
0
  {
3754
#ifdef HB_NO_VAR
3755
    return 0;
3756
#endif
3757
0
    return (this+dataSets[major]).get_region_index_count ();
3758
0
  }
3759
3760
  void get_region_scalars (unsigned int major,
3761
         const int *coords, unsigned int coord_count,
3762
         float *scalars /*OUT*/,
3763
         unsigned int num_scalars) const
3764
0
  {
3765
#ifdef HB_NO_VAR
3766
    for (unsigned i = 0; i < num_scalars; i++)
3767
      scalars[i] = 0.f;
3768
    return;
3769
#endif
3770
3771
0
    (this+dataSets[major]).get_region_scalars (coords, coord_count,
3772
0
                 this+regions,
3773
0
                 &scalars[0], num_scalars);
3774
0
  }
3775
3776
  unsigned int get_sub_table_count () const
3777
0
   {
3778
#ifdef HB_NO_VAR
3779
     return 0;
3780
#endif
3781
0
     return dataSets.len;
3782
0
   }
3783
3784
  const VarData& get_sub_table (unsigned i) const
3785
0
  {
3786
#ifdef HB_NO_VAR
3787
     return Null (VarData);
3788
#endif
3789
0
     return this+dataSets[i];
3790
0
  }
3791
3792
  const VarRegionList& get_region_list () const
3793
0
  {
3794
#ifdef HB_NO_VAR
3795
     return Null (VarRegionList);
3796
#endif
3797
0
     return this+regions;
3798
0
  }
3799
3800
  protected:
3801
  HBUINT16        format;
3802
  Offset32To<VarRegionList>   regions;
3803
  Array16OfOffset32To<VarData>    dataSets;
3804
  public:
3805
  DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
3806
};
3807
3808
struct MultiItemVariationStore
3809
{
3810
  hb_scalar_cache_t *create_cache (hb_scalar_cache_t *static_cache = nullptr) const
3811
0
  {
3812
#ifdef HB_NO_VAR
3813
    return hb_scalar_cache_t::create (0);
3814
#endif
3815
0
    auto &r = this+regions;
3816
0
    unsigned count = r.regions.len;
3817
3818
0
    return hb_scalar_cache_t::create (count, static_cache);
3819
0
  }
3820
3821
  static void destroy_cache (hb_scalar_cache_t *cache,
3822
           hb_scalar_cache_t *static_cache = nullptr)
3823
0
  {
3824
0
    hb_scalar_cache_t::destroy (cache, static_cache);
3825
0
  }
3826
3827
  private:
3828
  void get_delta (unsigned int outer, unsigned int inner,
3829
      const int *coords, unsigned int coord_count,
3830
      hb_array_t<double> out,
3831
      hb_scalar_cache_t *cache = nullptr) const
3832
0
  {
3833
#ifdef HB_NO_VAR
3834
    return;
3835
#endif
3836
3837
0
    if (unlikely (outer >= dataSets.len))
3838
0
      return;
3839
3840
0
    return (this+dataSets[outer]).get_delta (inner,
3841
0
               coords, coord_count,
3842
0
               this+regions,
3843
0
               out,
3844
0
               cache);
3845
0
  }
3846
3847
  public:
3848
  void get_delta (unsigned int index,
3849
      const int *coords, unsigned int coord_count,
3850
      hb_array_t<double> out,
3851
      hb_scalar_cache_t *cache = nullptr) const
3852
0
  {
3853
0
    unsigned int outer = index >> 16;
3854
0
    unsigned int inner = index & 0xFFFF;
3855
0
    get_delta (outer, inner, coords, coord_count, out, cache);
3856
0
  }
3857
  void get_delta (unsigned int index,
3858
      hb_array_t<const int> coords,
3859
      hb_array_t<double> out,
3860
      hb_scalar_cache_t *cache = nullptr) const
3861
0
  {
3862
0
    return get_delta (index,
3863
0
          coords.arrayZ, coords.length,
3864
0
          out,
3865
0
          cache);
3866
0
  }
3867
3868
  bool sanitize (hb_sanitize_context_t *c) const
3869
0
  {
3870
#ifdef HB_NO_VAR
3871
    return true;
3872
#endif
3873
3874
0
    TRACE_SANITIZE (this);
3875
0
    return_trace (c->check_struct (this) &&
3876
0
      hb_barrier () &&
3877
0
      format == 1 &&
3878
0
      regions.sanitize (c, this) &&
3879
0
      dataSets.sanitize (c, this));
3880
0
  }
3881
3882
  bool create_subset_plan (const hb_set_t &var_indices,
3883
         hb_vector_t<hb_inc_bimap_t> *inner_maps,
3884
         hb_map_t *varidx_map) const
3885
0
  {
3886
0
    if (unlikely (!inner_maps->resize (dataSets.len))) return false;
3887
0
    for (hb_codepoint_t var_idx : var_indices)
3888
0
    {
3889
0
      unsigned outer = var_idx >> 16;
3890
0
      unsigned inner = var_idx & 0xFFFFu;
3891
0
      if (unlikely (outer >= dataSets.len ||
3892
0
        inner >= (this+dataSets[outer]).get_item_count ()))
3893
0
  return false;
3894
0
      (*inner_maps)[outer].add (inner);
3895
0
    }
3896
3897
0
    unsigned new_outer = 0;
3898
0
    for (unsigned outer = 0; outer < inner_maps->length; outer++)
3899
0
    {
3900
0
      const hb_inc_bimap_t &inner_map = (*inner_maps)[outer];
3901
0
      if (!inner_map.get_population ()) continue;
3902
0
      if (unlikely (inner_map.in_error ())) return false;
3903
0
      for (unsigned new_inner = 0;
3904
0
     new_inner < inner_map.get_population ();
3905
0
     new_inner++)
3906
0
      {
3907
0
  unsigned old_inner = inner_map.backward (new_inner);
3908
0
  varidx_map->set ((outer << 16) | old_inner,
3909
0
      (new_outer << 16) | new_inner);
3910
0
      }
3911
0
      new_outer++;
3912
0
    }
3913
0
    return !inner_maps->in_error () && !varidx_map->in_error ();
3914
0
  }
3915
3916
  bool serialize (hb_serialize_context_t *c,
3917
      const MultiItemVariationStore *src,
3918
      const hb_array_t<const hb_inc_bimap_t> &inner_maps)
3919
0
  {
3920
0
    TRACE_SERIALIZE (this);
3921
0
    if (unlikely (!c->extend_min (this) ||
3922
0
      inner_maps.length < src->dataSets.len))
3923
0
      return_trace (false);
3924
0
    format = 1;
3925
3926
0
    const auto &src_regions = src+src->regions;
3927
0
    hb_set_t region_indices;
3928
0
    unsigned set_count = 0;
3929
0
    for (unsigned i = 0; i < src->dataSets.len; i++)
3930
0
    {
3931
0
      if (!inner_maps[i].get_population ()) continue;
3932
0
      set_count++;
3933
0
      (src+src->dataSets[i]).collect_region_refs (region_indices);
3934
0
    }
3935
0
    region_indices.del_range (src_regions.regions.len, hb_set_t::INVALID);
3936
0
    hb_inc_bimap_t region_map;
3937
0
    region_map.add_set (&region_indices);
3938
0
    if (unlikely (region_indices.in_error () || region_map.in_error () ||
3939
0
      !regions.serialize_serialize (c, &src_regions, region_map)))
3940
0
      return_trace (false);
3941
3942
0
    dataSets.len = set_count;
3943
0
    if (unlikely (!c->extend (dataSets))) return_trace (false);
3944
0
    unsigned set_index = 0;
3945
0
    for (unsigned i = 0; i < src->dataSets.len; i++)
3946
0
    {
3947
0
      if (!inner_maps[i].get_population ()) continue;
3948
0
      if (unlikely (!dataSets[set_index++].serialize_serialize (
3949
0
          c, &(src+src->dataSets[i]), inner_maps[i], region_map)))
3950
0
  return_trace (false);
3951
0
    }
3952
0
    return_trace (true);
3953
0
  }
3954
3955
  protected:
3956
  HBUINT16        format; // 1
3957
  Offset32To<SparseVarRegionList> regions;
3958
  Array16OfOffset32To<MultiVarData> dataSets;
3959
  public:
3960
  DEFINE_SIZE_ARRAY_SIZED (8, dataSets);
3961
};
3962
3963
template <typename MapCountT>
3964
struct DeltaSetIndexMapFormat01
3965
{
3966
  friend struct DeltaSetIndexMap;
3967
3968
  size_t get_size () const
3969
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
3970
3971
  private:
3972
  DeltaSetIndexMapFormat01* copy (hb_serialize_context_t *c) const
3973
0
  {
3974
0
    TRACE_SERIALIZE (this);
3975
0
    return_trace (c->embed (this));
3976
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
3977
3978
  template <typename T>
3979
  bool serialize (hb_serialize_context_t *c, const T &plan)
3980
0
  {
3981
0
    unsigned int width = plan.get_width ();
3982
0
    unsigned int inner_bit_count = plan.get_inner_bit_count ();
3983
0
    const hb_array_t<const uint32_t> output_map = plan.get_output_map ();
3984
3985
0
    TRACE_SERIALIZE (this);
3986
0
    if (unlikely (output_map.length && ((((inner_bit_count-1)&~0xF)!=0) || (((width-1)&~0x3)!=0))))
3987
0
      return_trace (false);
3988
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
3989
3990
0
    entryFormat = ((width-1)<<4)|(inner_bit_count-1);
3991
0
    mapCount = output_map.length;
3992
0
    HBUINT8 *p = c->allocate_size<HBUINT8> (width * output_map.length);
3993
0
    if (unlikely (!p)) return_trace (false);
3994
0
    for (unsigned int i = 0; i < output_map.length; i++)
3995
0
    {
3996
0
      unsigned int v = output_map.arrayZ[i];
3997
0
      if (v)
3998
0
      {
3999
0
  unsigned int outer = v >> 16;
4000
0
  unsigned int inner = v & 0xFFFF;
4001
0
  unsigned int u = (outer << inner_bit_count) | inner;
4002
0
  for (unsigned int w = width; w > 0;)
4003
0
  {
4004
0
    p[--w] = u;
4005
0
    u >>= 8;
4006
0
  }
4007
0
      }
4008
0
      p += width;
4009
0
    }
4010
0
    return_trace (true);
4011
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&)
4012
4013
  HB_ALWAYS_INLINE
4014
  uint32_t map (unsigned int v) const /* Returns 16.16 outer.inner. */
4015
0
  {
4016
    /* If count is zero, pass value unchanged.  This takes
4017
     * care of direct mapping for advance map. */
4018
0
    if (!mapCount)
4019
0
      return v;
4020
0
    return _map (v);
4021
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
4022
4023
  HB_HOT
4024
  uint32_t _map (unsigned int v) const /* Returns 16.16 outer.inner. */
4025
0
  {
4026
0
    if (v >= mapCount)
4027
0
      v = mapCount - 1;
4028
4029
0
    unsigned int u = 0;
4030
0
    { /* Fetch it. */
4031
0
      unsigned int w = get_width ();
4032
0
      const HBUINT8 *p = mapDataZ.arrayZ + w * v;
4033
0
      for (; w; w--)
4034
0
        u = (u << 8) + *p++;
4035
0
    }
4036
4037
0
    { /* Repack it. */
4038
0
      unsigned int n = get_inner_bit_count ();
4039
0
      unsigned int outer = u >> n;
4040
0
      unsigned int inner = u & ((1 << n) - 1);
4041
0
      u = (outer<<16) | inner;
4042
0
    }
4043
4044
0
    return u;
4045
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
4046
4047
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
4048
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
4049
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
4050
4051
4052
  bool sanitize (hb_sanitize_context_t *c) const
4053
0
  {
4054
0
    TRACE_SANITIZE (this);
4055
0
    return_trace (c->check_struct (this) &&
4056
0
      hb_barrier () &&
4057
0
                  c->check_range (mapDataZ.arrayZ,
4058
0
                                  mapCount,
4059
0
                                  get_width ()));
4060
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
4061
4062
  protected:
4063
  HBUINT8       format;         /* Format identifier--format = 0 */
4064
  HBUINT8       entryFormat;    /* A packed field that describes the compressed
4065
                                 * representation of delta-set indices. */
4066
  MapCountT     mapCount;       /* The number of mapping entries. */
4067
  UnsizedArrayOf<HBUINT8>
4068
                mapDataZ;       /* The delta-set index mapping data. */
4069
4070
  public:
4071
  DEFINE_SIZE_ARRAY (2+MapCountT::static_size, mapDataZ);
4072
};
4073
4074
struct DeltaSetIndexMap
4075
{
4076
  template <typename T>
4077
  bool serialize (hb_serialize_context_t *c, const T &plan)
4078
0
  {
4079
0
    TRACE_SERIALIZE (this);
4080
0
    unsigned length = plan.get_output_map ().length;
4081
0
    u.format.v = length <= 0xFFFF ? 0 : 1;
4082
0
    switch (u.format.v) {
4083
0
    case 0: hb_barrier (); return_trace (u.format0.serialize (c, plan));
4084
0
    case 1: hb_barrier (); return_trace (u.format1.serialize (c, plan));
4085
0
    default:return_trace (false);
4086
0
    }
4087
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&)
4088
4089
  uint32_t map (unsigned v) const
4090
0
  {
4091
0
    switch (u.format.v) {
4092
0
    case 0: hb_barrier (); return (u.format0.map (v));
4093
0
    case 1: hb_barrier (); return (u.format1.map (v));
4094
0
    default:return v;
4095
0
    }
4096
0
  }
4097
4098
  unsigned get_map_count () const
4099
0
  {
4100
0
    switch (u.format.v) {
4101
0
    case 0: hb_barrier (); return u.format0.get_map_count ();
4102
0
    case 1: hb_barrier (); return u.format1.get_map_count ();
4103
0
    default:return 0;
4104
0
    }
4105
0
  }
4106
4107
  unsigned get_width () const
4108
0
  {
4109
0
    switch (u.format.v) {
4110
0
    case 0: hb_barrier (); return u.format0.get_width ();
4111
0
    case 1: hb_barrier (); return u.format1.get_width ();
4112
0
    default:return 0;
4113
0
    }
4114
0
  }
4115
4116
  unsigned get_inner_bit_count () const
4117
0
  {
4118
0
    switch (u.format.v) {
4119
0
    case 0: hb_barrier (); return u.format0.get_inner_bit_count ();
4120
0
    case 1: hb_barrier (); return u.format1.get_inner_bit_count ();
4121
0
    default:return 0;
4122
0
    }
4123
0
  }
4124
4125
  bool sanitize (hb_sanitize_context_t *c) const
4126
0
  {
4127
0
    TRACE_SANITIZE (this);
4128
0
    if (!u.format.v.sanitize (c)) return_trace (false);
4129
0
    hb_barrier ();
4130
0
    switch (u.format.v) {
4131
0
    case 0: hb_barrier (); return_trace (u.format0.sanitize (c));
4132
0
    case 1: hb_barrier (); return_trace (u.format1.sanitize (c));
4133
0
    default:return_trace (true);
4134
0
    }
4135
0
  }
4136
4137
  DeltaSetIndexMap* copy (hb_serialize_context_t *c) const
4138
0
  {
4139
0
    TRACE_SERIALIZE (this);
4140
0
    switch (u.format.v) {
4141
0
    case 0: hb_barrier (); return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format0.copy (c)));
4142
0
    case 1: hb_barrier (); return_trace (reinterpret_cast<DeltaSetIndexMap *> (u.format1.copy (c)));
4143
0
    default:return_trace (nullptr);
4144
0
    }
4145
0
  }
4146
4147
  protected:
4148
  union {
4149
  struct { HBUINT8 v; }             format;         /* Format identifier */
4150
  DeltaSetIndexMapFormat01<HBUINT16> format0;
4151
  DeltaSetIndexMapFormat01<HBUINT32> format1;
4152
  } u;
4153
  public:
4154
  DEFINE_SIZE_UNION (1, format.v);
4155
};
4156
4157
4158
struct ItemVarStoreInstancer
4159
{
4160
  ItemVarStoreInstancer (const ItemVariationStore *varStore_,
4161
       const DeltaSetIndexMap *varIdxMap,
4162
       hb_array_t<const int> coords,
4163
       hb_scalar_cache_t *cache = nullptr) :
4164
35.1M
    varStore (varStore_), varIdxMap (varIdxMap), coords (coords), cache (cache)
4165
35.1M
  {
4166
35.1M
    if (!varStore)
4167
0
      varStore = &Null(ItemVariationStore);
4168
35.1M
  }
4169
4170
0
  operator bool () const { return varStore && bool (coords); }
4171
4172
  float operator[] (uint32_t varIdx) const
4173
0
  { return (*this) (varIdx); }
4174
4175
  float operator() (uint32_t varIdx, unsigned short offset = 0) const
4176
0
  {
4177
   /* Keep the empty-coordinate shortcut for ordinary stores, even though
4178
    * zero-axis regions could still contribute constant deltas. */
4179
0
   if (!coords || varIdx == VarIdx::NO_VARIATION)
4180
0
     return 0.f;
4181
4182
0
    varIdx += offset;
4183
0
    if (varIdxMap)
4184
0
      varIdx = varIdxMap->map (varIdx);
4185
0
    return varStore->get_delta (varIdx, coords, cache);
4186
0
  }
4187
4188
  const ItemVariationStore *varStore;
4189
  const DeltaSetIndexMap *varIdxMap;
4190
  hb_array_t<const int> coords;
4191
  hb_scalar_cache_t *cache;
4192
};
4193
4194
struct MultiItemVarStoreInstancer
4195
{
4196
  MultiItemVarStoreInstancer (const MultiItemVariationStore *varStore,
4197
            const DeltaSetIndexMap *varIdxMap,
4198
            hb_array_t<const int> coords,
4199
            hb_scalar_cache_t *cache = nullptr) :
4200
0
    varStore (varStore), varIdxMap (varIdxMap), coords (coords), cache (cache)
4201
0
  {
4202
0
    if (!varStore)
4203
0
      varStore = &Null(MultiItemVariationStore);
4204
0
  }
4205
4206
0
  operator bool () const { return varStore; }
4207
4208
  double operator[] (uint32_t varIdx) const
4209
0
  {
4210
0
    double v = 0;
4211
0
    (*this) (hb_array (&v, 1), varIdx);
4212
0
    return v;
4213
0
  }
4214
4215
  void operator() (hb_array_t<double> out, uint32_t varIdx, unsigned short offset = 0) const
4216
0
  {
4217
    /* Static VARC fonts can have constant deltas even with empty coordinates. */
4218
0
    if (varIdx != VarIdx::NO_VARIATION)
4219
0
    {
4220
0
      varIdx += offset;
4221
0
      if (varIdxMap)
4222
0
  varIdx = varIdxMap->map (varIdx);
4223
0
      varStore->get_delta (varIdx, coords, out, cache);
4224
0
    }
4225
0
    else
4226
0
      for (unsigned i = 0; i < out.length; i++)
4227
0
        out.arrayZ[i] = 0.;
4228
0
  }
4229
4230
  const MultiItemVariationStore *varStore;
4231
  const DeltaSetIndexMap *varIdxMap;
4232
  hb_array_t<const int> coords;
4233
  hb_scalar_cache_t *cache;
4234
};
4235
4236
4237
/*
4238
 * Feature Variations
4239
 */
4240
enum Cond_with_Var_flag_t
4241
{
4242
  KEEP_COND_WITH_VAR = 0,
4243
  KEEP_RECORD_WITH_VAR = 1,
4244
  DROP_COND_WITH_VAR = 2,
4245
  DROP_RECORD_WITH_VAR = 3,
4246
};
4247
4248
enum lookup_condition_subset_result_t
4249
{
4250
  LOOKUP_CONDITION_SUBSET_ERROR,
4251
  LOOKUP_CONDITION_SUBSET_FALSE,
4252
  LOOKUP_CONDITION_SUBSET_TRUE,
4253
  LOOKUP_CONDITION_SUBSET_KEEP,
4254
};
4255
4256
struct Condition;
4257
4258
template <typename Instancer>
4259
static bool
4260
_hb_recurse_condition_evaluate (const struct Condition &condition,
4261
        const int *coords,
4262
        unsigned int coord_len,
4263
        Instancer *instancer);
4264
4265
struct ConditionAxisRange
4266
{
4267
  friend struct Condition;
4268
4269
  bool subset (hb_subset_context_t *c) const
4270
0
  {
4271
0
    TRACE_SUBSET (this);
4272
0
    auto *out = c->serializer->embed (this);
4273
0
    if (unlikely (!out)) return_trace (false);
4274
4275
0
    const hb_map_t *index_map = &c->plan->axes_index_map;
4276
0
    if (index_map->is_empty ()) return_trace (true);
4277
4278
0
    const hb_map_t& axes_old_index_tag_map = c->plan->axes_old_index_tag_map;
4279
0
    hb_codepoint_t *axis_tag;
4280
0
    if (!axes_old_index_tag_map.has (axisIndex, &axis_tag) ||
4281
0
        !index_map->has (axisIndex))
4282
0
      return_trace (false);
4283
4284
0
    const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location = c->plan->axes_location;
4285
0
    Triple axis_limit{-1.0, 0.0, 1.0};
4286
0
    Triple *normalized_limit;
4287
0
    if (normalized_axes_location.has (*axis_tag, &normalized_limit))
4288
0
      axis_limit = *normalized_limit;
4289
4290
0
    const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances = c->plan->axes_triple_distances;
4291
0
    TripleDistances axis_triple_distances{1.0, 1.0};
4292
0
    TripleDistances *triple_dists;
4293
0
    if (axes_triple_distances.has (*axis_tag, &triple_dists))
4294
0
      axis_triple_distances = *triple_dists;
4295
4296
0
    float normalized_min = renormalizeValue ((double) filterRangeMinValue.to_float (), axis_limit, axis_triple_distances, false);
4297
0
    float normalized_max = renormalizeValue ((double) filterRangeMaxValue.to_float (), axis_limit, axis_triple_distances, false);
4298
0
    out->filterRangeMinValue.set_float (normalized_min);
4299
0
    out->filterRangeMaxValue.set_float (normalized_max);
4300
4301
0
    return_trace (c->serializer->check_assign (out->axisIndex, index_map->get (axisIndex),
4302
0
                                               HB_SERIALIZE_ERROR_INT_OVERFLOW));
4303
0
  }
4304
4305
  private:
4306
  Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
4307
                                             hb_map_t *condition_map /* OUT */) const
4308
0
  {
4309
    //invalid axis index, drop the entire record
4310
0
    if (!c->axes_index_tag_map->has (axisIndex))
4311
0
      return DROP_RECORD_WITH_VAR;
4312
4313
0
    hb_tag_t axis_tag = c->axes_index_tag_map->get (axisIndex);
4314
4315
0
    Triple axis_range (-1.0, 0.0, 1.0);
4316
0
    Triple *axis_limit;
4317
0
    bool axis_set_by_user = false;
4318
0
    if (c->axes_location->has (axis_tag, &axis_limit))
4319
0
    {
4320
0
      axis_range = *axis_limit;
4321
0
      axis_set_by_user = true;
4322
0
    }
4323
4324
0
    float axis_min_val = axis_range.minimum;
4325
0
    float axis_default_val = axis_range.middle;
4326
0
    float axis_max_val = axis_range.maximum;
4327
4328
0
    float filter_min_val = filterRangeMinValue.to_float ();
4329
0
    float filter_max_val = filterRangeMaxValue.to_float ();
4330
4331
0
    if (axis_default_val < filter_min_val ||
4332
0
        axis_default_val > filter_max_val)
4333
0
      c->apply = false;
4334
4335
    //condition not met, drop the entire record
4336
0
    if (axis_min_val > filter_max_val || axis_max_val < filter_min_val ||
4337
0
        filter_min_val > filter_max_val)
4338
0
      return DROP_RECORD_WITH_VAR;
4339
4340
    //condition met and axis pinned, drop the condition
4341
0
    if (axis_set_by_user && axis_range.is_point ())
4342
0
      return DROP_COND_WITH_VAR;
4343
4344
0
    if (filter_max_val != axis_max_val || filter_min_val != axis_min_val)
4345
0
    {
4346
      // add axisIndex->value into the hashmap so we can check if the record is
4347
      // unique with variations
4348
0
      uint16_t int_filter_max_val = (uint16_t) filterRangeMaxValue.to_int ();
4349
0
      uint16_t int_filter_min_val = (uint16_t) filterRangeMinValue.to_int ();
4350
0
      hb_codepoint_t val = (int_filter_max_val << 16) + int_filter_min_val;
4351
4352
0
      condition_map->set (axisIndex, val);
4353
0
      return KEEP_COND_WITH_VAR;
4354
0
    }
4355
0
    return KEEP_RECORD_WITH_VAR;
4356
0
  }
4357
4358
  template <typename Instancer>
4359
  bool evaluate (const int *coords, unsigned int coord_len,
4360
     Instancer *instancer HB_UNUSED) const
4361
0
  {
4362
0
    int coord = axisIndex < coord_len ? coords[axisIndex] : 0;
4363
0
    return filterRangeMinValue.to_int () <= coord && coord <= filterRangeMaxValue.to_int ();
4364
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
4365
4366
  public:
4367
  bool sanitize (hb_sanitize_context_t *c) const
4368
0
  {
4369
0
    TRACE_SANITIZE (this);
4370
0
    return_trace (c->check_struct (this));
4371
0
  }
4372
4373
  protected:
4374
  HBUINT16  format;   /* Format identifier--format = 1 */
4375
  HBUINT16  axisIndex;
4376
  F2DOT14 filterRangeMinValue;
4377
  F2DOT14 filterRangeMaxValue;
4378
  public:
4379
  DEFINE_SIZE_STATIC (8);
4380
};
4381
4382
struct ConditionValue
4383
{
4384
  friend struct Condition;
4385
4386
  bool subset (hb_subset_context_t *c) const
4387
0
  {
4388
0
    TRACE_SUBSET (this);
4389
0
    auto *out = c->serializer->embed (this);
4390
0
    if (unlikely (!out)) return_trace (false);
4391
4392
0
    if (varIdx == VarIdx::NO_VARIATION)
4393
0
      return_trace (true);
4394
4395
0
    hb_pair_t<unsigned, int> *new_varidx_delta;
4396
0
    if (!c->plan->layout_variation_idx_delta_map.has (varIdx, &new_varidx_delta))
4397
0
      return_trace (false);
4398
4399
0
    if (unlikely (!c->serializer->check_assign (
4400
0
    out->defaultValue,
4401
0
    defaultValue + hb_second (*new_varidx_delta),
4402
0
    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
4403
0
      return_trace (false);
4404
0
    out->varIdx = hb_first (*new_varidx_delta);
4405
0
    return_trace (true);
4406
0
  }
4407
4408
  private:
4409
  template <typename Instancer>
4410
  bool evaluate (const int *coords, unsigned int coord_len,
4411
     Instancer *instancer) const
4412
0
  {
4413
0
    double value = defaultValue;
4414
0
    value += (double) (*instancer)[varIdx];
4415
0
    return value > 0;
4416
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
4417
4418
  public:
4419
  bool sanitize (hb_sanitize_context_t *c) const
4420
0
  {
4421
0
    TRACE_SANITIZE (this);
4422
0
    return_trace (c->check_struct (this));
4423
0
  }
4424
4425
  protected:
4426
  HBUINT16  format;   /* Format identifier--format = 2 */
4427
  HBINT16 defaultValue;   /* Value at default instance. */
4428
  VarIdx  varIdx;   /* Variation index */
4429
  public:
4430
  DEFINE_SIZE_STATIC (8);
4431
};
4432
4433
struct ConditionAnd
4434
{
4435
  friend struct Condition;
4436
4437
  bool subset (hb_subset_context_t *c) const
4438
0
  {
4439
0
    TRACE_SUBSET (this);
4440
0
    auto *out = c->serializer->start_embed (this);
4441
0
    if (unlikely (!out || !c->serializer->extend_min (out)))
4442
0
      return_trace (false);
4443
0
    out->format = format;
4444
4445
0
    for (const auto &offset : conditions)
4446
0
    {
4447
0
      if (offset.is_null ())
4448
0
      {
4449
0
  auto *out_offset = out->conditions.serialize_append (c->serializer);
4450
0
  if (unlikely (!out_offset)) return_trace (false);
4451
0
  *out_offset = 0;
4452
0
      }
4453
0
      else if (unlikely (!subset_offset_array (c, out->conditions, this) (offset)))
4454
0
  return_trace (false);
4455
0
    }
4456
4457
0
    return_trace (true);
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
    unsigned int count = conditions.len;
4466
0
    for (unsigned int i = 0; i < count; i++)
4467
0
      if (!_hb_recurse_condition_evaluate (this+conditions.arrayZ[i],
4468
0
             coords, coord_len,
4469
0
             instancer))
4470
0
  return false;
4471
0
    return true;
4472
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
4473
4474
  public:
4475
  bool sanitize (hb_sanitize_context_t *c) const
4476
0
  {
4477
0
    TRACE_SANITIZE (this);
4478
0
    return_trace (conditions.sanitize (c, this));
4479
0
  }
4480
4481
  protected:
4482
  HBUINT16  format;   /* Format identifier--format = 3 */
4483
  Array8OfOffset24To<struct Condition>  conditions;
4484
  public:
4485
  DEFINE_SIZE_ARRAY (3, conditions);
4486
};
4487
4488
struct ConditionOr
4489
{
4490
  friend struct Condition;
4491
4492
  bool subset (hb_subset_context_t *c) const
4493
0
  {
4494
0
    TRACE_SUBSET (this);
4495
0
    auto *out = c->serializer->start_embed (this);
4496
0
    if (unlikely (!out || !c->serializer->extend_min (out)))
4497
0
      return_trace (false);
4498
0
    out->format = format;
4499
4500
0
    for (const auto &offset : conditions)
4501
0
    {
4502
0
      if (offset.is_null ())
4503
0
      {
4504
0
  auto *out_offset = out->conditions.serialize_append (c->serializer);
4505
0
  if (unlikely (!out_offset)) return_trace (false);
4506
0
  *out_offset = 0;
4507
0
      }
4508
0
      else if (unlikely (!subset_offset_array (c, out->conditions, this) (offset)))
4509
0
  return_trace (false);
4510
0
    }
4511
4512
0
    return_trace (true);
4513
0
  }
4514
4515
  private:
4516
  template <typename Instancer>
4517
  bool evaluate (const int *coords, unsigned int coord_len,
4518
     Instancer *instancer) const
4519
0
  {
4520
0
    unsigned int count = conditions.len;
4521
0
    for (unsigned int i = 0; i < count; i++)
4522
0
      if (_hb_recurse_condition_evaluate (this+conditions.arrayZ[i],
4523
0
            coords, coord_len,
4524
0
            instancer))
4525
0
  return true;
4526
0
    return false;
4527
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
4528
4529
  public:
4530
  bool sanitize (hb_sanitize_context_t *c) const
4531
0
  {
4532
0
    TRACE_SANITIZE (this);
4533
0
    return_trace (conditions.sanitize (c, this));
4534
0
  }
4535
4536
  protected:
4537
  HBUINT16  format;   /* Format identifier--format = 4 */
4538
  Array8OfOffset24To<struct Condition>  conditions;
4539
  public:
4540
  DEFINE_SIZE_ARRAY (3, conditions);
4541
};
4542
4543
struct ConditionNegate
4544
{
4545
  friend struct Condition;
4546
4547
  bool subset (hb_subset_context_t *c) const
4548
0
  {
4549
0
    TRACE_SUBSET (this);
4550
0
    auto *out = c->serializer->embed (this);
4551
0
    if (unlikely (!out)) return_trace (false);
4552
0
    if (condition.is_null ())
4553
0
    {
4554
0
      out->condition = 0;
4555
0
      return_trace (true);
4556
0
    }
4557
0
    return_trace (out->condition.serialize_subset (c, condition, this));
4558
0
  }
4559
4560
  private:
4561
  template <typename Instancer>
4562
  bool evaluate (const int *coords, unsigned int coord_len,
4563
     Instancer *instancer) const
4564
0
  {
4565
0
    return !_hb_recurse_condition_evaluate (this+condition,
4566
0
              coords, coord_len,
4567
0
              instancer);
4568
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
4569
4570
  public:
4571
  bool sanitize (hb_sanitize_context_t *c) const
4572
0
  {
4573
0
    TRACE_SANITIZE (this);
4574
0
    return_trace (condition.sanitize (c, this));
4575
0
  }
4576
4577
  protected:
4578
  HBUINT16  format;   /* Format identifier--format = 5 */
4579
  Offset24To<struct Condition>  condition;
4580
  public:
4581
  DEFINE_SIZE_STATIC (5);
4582
};
4583
4584
struct Condition
4585
{
4586
  friend struct ConditionSet;
4587
4588
  static bool serialize_constant (hb_serialize_context_t *c, bool value)
4589
0
  {
4590
0
    auto *out = c->start_embed<ConditionValue> ();
4591
0
    if (unlikely (!out || !c->extend_min (out))) return false;
4592
0
    out->format = 2;
4593
0
    out->defaultValue = value ? 1 : 0;
4594
0
    out->varIdx = VarIdx::NO_VARIATION;
4595
0
    return true;
4596
0
  }
4597
4598
  lookup_condition_subset_result_t subset_lookup_condition (
4599
              hb_subset_context_t *c,
4600
              unsigned depth = HB_MAX_NESTING_LEVEL,
4601
              bool materialize_true = false) const;
4602
4603
  template <typename Instancer>
4604
  bool evaluate (const int *coords, unsigned int coord_len,
4605
     Instancer *instancer) const
4606
0
  {
4607
0
    switch (u.format.v) {
4608
    /* A null condition offset resolves to the nil Condition, whose reserved
4609
     * format 0 represents the True condition required by the specification. */
4610
0
    case 0: return true;
4611
0
    case 1: hb_barrier (); return u.format1.evaluate (coords, coord_len, instancer);
4612
0
    case 2: hb_barrier (); return u.format2.evaluate (coords, coord_len, instancer);
4613
0
    case 3: hb_barrier (); return u.format3.evaluate (coords, coord_len, instancer);
4614
0
    case 4: hb_barrier (); return u.format4.evaluate (coords, coord_len, instancer);
4615
0
    case 5: hb_barrier (); return u.format5.evaluate (coords, coord_len, instancer);
4616
0
    default:return false;
4617
0
    }
4618
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
4619
4620
  Cond_with_Var_flag_t keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
4621
                                             hb_map_t *condition_map /* OUT */,
4622
                                             unsigned depth = HB_MAX_NESTING_LEVEL) const
4623
0
  {
4624
0
    if (unlikely (!depth))
4625
0
    {
4626
0
      c->apply = false;
4627
0
      return DROP_RECORD_WITH_VAR;
4628
0
    }
4629
4630
0
    switch (u.format.v) {
4631
0
    case 0: return KEEP_RECORD_WITH_VAR;
4632
0
    case 1: hb_barrier (); return u.format1.keep_with_variations (c, condition_map);
4633
0
    case 2: case 3: case 4: case 5: break;
4634
0
    default: c->apply = false; return DROP_RECORD_WITH_VAR;
4635
0
    }
4636
4637
0
    hb_barrier ();
4638
0
    bool applies = evaluate (c->instancer->coords.arrayZ,
4639
0
           c->instancer->coords.length, c->instancer);
4640
0
    c->apply &= applies;
4641
0
    if (c->all_axes_pinned)
4642
0
      return applies ? DROP_COND_WITH_VAR : DROP_RECORD_WITH_VAR;
4643
4644
0
    if (u.format.v == 2)
4645
0
      return u.format2.varIdx == VarIdx::NO_VARIATION ||
4646
0
             !c->instancer->varStore->has_delta_set (u.format2.varIdx) ?
4647
0
             (applies ? KEEP_RECORD_WITH_VAR : DROP_RECORD_WITH_VAR) :
4648
0
             KEEP_COND_WITH_VAR;
4649
4650
0
    auto classify_child = [c, condition_map, depth] (const Condition &child)
4651
0
    {
4652
0
      auto child_context = *c;
4653
0
      child_context.apply = true;
4654
0
      return child.keep_with_variations (&child_context, condition_map, depth - 1);
4655
0
    };
4656
4657
0
    if (u.format.v == 5)
4658
0
    {
4659
0
      auto result = classify_child (&u.format5 + u.format5.condition);
4660
0
      return result == DROP_RECORD_WITH_VAR ? KEEP_RECORD_WITH_VAR :
4661
0
             result == KEEP_COND_WITH_VAR ? KEEP_COND_WITH_VAR :
4662
0
             DROP_RECORD_WITH_VAR;
4663
0
    }
4664
4665
0
    bool is_and = u.format.v == 3;
4666
0
    bool variable = false;
4667
0
    const auto &conditions = is_and ? u.format3.conditions : u.format4.conditions;
4668
0
    const void *base = is_and ? (const void *) &u.format3 : (const void *) &u.format4;
4669
0
    for (const auto &offset : conditions)
4670
0
    {
4671
0
      auto result = classify_child (base + offset);
4672
0
      if (is_and && result == DROP_RECORD_WITH_VAR)
4673
0
        return DROP_RECORD_WITH_VAR;
4674
0
      if (!is_and && (result == DROP_COND_WITH_VAR || result == KEEP_RECORD_WITH_VAR))
4675
0
        return KEEP_RECORD_WITH_VAR;
4676
0
      variable |= result == KEEP_COND_WITH_VAR;
4677
0
    }
4678
0
    return variable ? KEEP_COND_WITH_VAR :
4679
0
           is_and ? KEEP_RECORD_WITH_VAR : DROP_RECORD_WITH_VAR;
4680
0
  }
4681
4682
  template <typename context_t, typename ...Ts>
4683
  typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
4684
0
  {
4685
0
    if (unlikely (!c->may_dispatch (this, &u.format.v))) return c->no_dispatch_return_value ();
4686
0
    TRACE_DISPATCH (this, u.format.v);
4687
0
    switch (u.format.v) {
4688
0
    case 1: hb_barrier (); return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
4689
0
    case 2: hb_barrier (); return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
4690
0
    case 3: hb_barrier (); return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
4691
0
    case 4: hb_barrier (); return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
4692
0
    case 5: hb_barrier (); return_trace (c->dispatch (u.format5, std::forward<Ts> (ds)...));
4693
0
    default:return_trace (c->default_return_value ());
4694
0
    }
4695
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
4696
4697
  bool sanitize (hb_sanitize_context_t *c) const
4698
0
  {
4699
0
    TRACE_SANITIZE (this);
4700
4701
0
    if (unlikely (!c->check_start_recursion (HB_MAX_NESTING_LEVEL)))
4702
0
      return_trace (c->no_dispatch_return_value ());
4703
4704
0
    return_trace (c->end_recursion (this->dispatch (c)));
4705
0
  }
4706
4707
  bool collect_var_indices (hb_set_t *var_indices,
4708
          unsigned depth = HB_MAX_NESTING_LEVEL) const;
4709
4710
  bool serialize (hb_serialize_context_t *c,
4711
      const Condition *src,
4712
      const hb_map_t &varidx_map);
4713
4714
  private:
4715
  lookup_condition_subset_result_t subset_lookup_condition_impl (
4716
              hb_subset_context_t *c,
4717
              unsigned depth) const;
4718
4719
  protected:
4720
  union {
4721
  struct { HBUINT16 v; }  format;   /* Format identifier */
4722
  ConditionAxisRange  format1;
4723
  ConditionValue  format2;
4724
  ConditionAnd    format3;
4725
  ConditionOr   format4;
4726
  ConditionNegate format5;
4727
  } u;
4728
  public:
4729
  DEFINE_SIZE_UNION (2, format.v);
4730
};
4731
4732
template <typename Instancer>
4733
bool
4734
_hb_recurse_condition_evaluate (const struct Condition &condition,
4735
        const int *coords,
4736
        unsigned int coord_len,
4737
        Instancer *instancer)
4738
0
{
4739
0
  return condition.evaluate (coords, coord_len, instancer);
4740
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*)
4741
4742
struct ConditionList
4743
{
4744
  const Condition& operator[] (unsigned i) const
4745
0
  { return this+conditions[i]; }
4746
4747
0
  unsigned get_count () const { return conditions.len; }
4748
4749
  bool serialize (hb_serialize_context_t *c,
4750
      const ConditionList *src,
4751
      const hb_inc_bimap_t &condition_map,
4752
      const hb_map_t &varidx_map)
4753
0
  {
4754
0
    TRACE_SERIALIZE (this);
4755
0
    if (unlikely (!c->extend_min (this))) return_trace (false);
4756
0
    conditions.len = condition_map.get_population ();
4757
0
    if (unlikely (!c->extend (conditions))) return_trace (false);
4758
0
    for (unsigned i = 0; i < conditions.len; i++)
4759
0
    {
4760
0
      unsigned old_index = condition_map.backward (i);
4761
0
      if (unlikely (old_index >= src->conditions.len ||
4762
0
        !conditions[i].serialize_serialize (
4763
0
      c, &(src+src->conditions[old_index]), varidx_map)))
4764
0
  return_trace (false);
4765
0
    }
4766
0
    return_trace (true);
4767
0
  }
4768
4769
  bool sanitize (hb_sanitize_context_t *c) const
4770
0
  {
4771
0
    TRACE_SANITIZE (this);
4772
0
    return_trace (conditions.sanitize (c, this));
4773
0
  }
4774
4775
  protected:
4776
  Array32OfOffset32To<Condition> conditions;
4777
  public:
4778
  DEFINE_SIZE_ARRAY (4, conditions);
4779
};
4780
4781
inline bool
4782
Condition::collect_var_indices (hb_set_t *var_indices, unsigned depth) const
4783
0
{
4784
0
  if (unlikely (!depth)) return false;
4785
0
  switch (u.format.v)
4786
0
  {
4787
0
    case 0:
4788
0
    case 1:
4789
0
      return true;
4790
0
    case 2:
4791
0
      if (u.format2.varIdx != VarIdx::NO_VARIATION)
4792
0
  var_indices->add (u.format2.varIdx);
4793
0
      return !var_indices->in_error ();
4794
0
    case 3:
4795
0
      for (const auto &offset : u.format3.conditions)
4796
0
  if (unlikely (!(&u.format3+offset).collect_var_indices (var_indices,
4797
0
                   depth - 1)))
4798
0
    return false;
4799
0
      return true;
4800
0
    case 4:
4801
0
      for (const auto &offset : u.format4.conditions)
4802
0
  if (unlikely (!(&u.format4+offset).collect_var_indices (var_indices,
4803
0
                   depth - 1)))
4804
0
    return false;
4805
0
      return true;
4806
0
    case 5:
4807
0
      return (&u.format5+u.format5.condition).collect_var_indices (var_indices,
4808
0
                  depth - 1);
4809
0
    default:
4810
0
      return false;
4811
0
  }
4812
0
}
4813
4814
inline bool
4815
Condition::serialize (hb_serialize_context_t *c,
4816
          const Condition *src,
4817
          const hb_map_t &varidx_map)
4818
0
{
4819
0
  TRACE_SERIALIZE (this);
4820
0
  switch (src->u.format.v)
4821
0
  {
4822
0
    case 0:
4823
0
    {
4824
0
      auto *out = c->start_embed<ConditionValue> ();
4825
0
      if (unlikely (!out || !c->extend_min (out))) return_trace (false);
4826
0
      out->format = 2;
4827
0
      out->defaultValue = 1;
4828
0
      out->varIdx = VarIdx::NO_VARIATION;
4829
0
      return_trace (true);
4830
0
    }
4831
0
    case 1:
4832
0
      return_trace (bool (c->embed (&src->u.format1)));
4833
0
    case 2:
4834
0
    {
4835
0
      auto *out = c->embed (&src->u.format2);
4836
0
      if (unlikely (!out ||
4837
0
        (src->u.format2.varIdx != VarIdx::NO_VARIATION &&
4838
0
         !varidx_map.has (src->u.format2.varIdx))))
4839
0
  return_trace (false);
4840
0
      out->varIdx = src->u.format2.varIdx == VarIdx::NO_VARIATION ?
4841
0
        src->u.format2.varIdx : varidx_map.get (src->u.format2.varIdx);
4842
0
      return_trace (true);
4843
0
    }
4844
0
    case 3:
4845
0
    {
4846
0
      auto *out = c->start_embed<ConditionAnd> ();
4847
0
      if (unlikely (!c->extend_min (out))) return_trace (false);
4848
0
      out->format = 3;
4849
0
      out->conditions.len = src->u.format3.conditions.len;
4850
0
      if (unlikely (!c->extend (out->conditions))) return_trace (false);
4851
0
      for (unsigned i = 0; i < out->conditions.len; i++)
4852
0
  if (unlikely (!out->conditions[i].serialize_serialize (
4853
0
      c, &(&src->u.format3+src->u.format3.conditions[i]),
4854
0
      varidx_map)))
4855
0
    return_trace (false);
4856
0
      return_trace (true);
4857
0
    }
4858
0
    case 4:
4859
0
    {
4860
0
      auto *out = c->start_embed<ConditionOr> ();
4861
0
      if (unlikely (!c->extend_min (out))) return_trace (false);
4862
0
      out->format = 4;
4863
0
      out->conditions.len = src->u.format4.conditions.len;
4864
0
      if (unlikely (!c->extend (out->conditions))) return_trace (false);
4865
0
      for (unsigned i = 0; i < out->conditions.len; i++)
4866
0
  if (unlikely (!out->conditions[i].serialize_serialize (
4867
0
      c, &(&src->u.format4+src->u.format4.conditions[i]),
4868
0
      varidx_map)))
4869
0
    return_trace (false);
4870
0
      return_trace (true);
4871
0
    }
4872
0
    case 5:
4873
0
    {
4874
0
      auto *out = c->embed (&src->u.format5);
4875
0
      if (unlikely (!out ||
4876
0
        !out->condition.serialize_serialize (
4877
0
      c, &(&src->u.format5+src->u.format5.condition),
4878
0
      varidx_map)))
4879
0
  return_trace (false);
4880
0
      return_trace (true);
4881
0
    }
4882
0
    default:
4883
0
      return_trace (false);
4884
0
  }
4885
0
}
4886
4887
inline lookup_condition_subset_result_t
4888
Condition::subset_lookup_condition (hb_subset_context_t *c,
4889
            unsigned depth,
4890
            bool materialize_true) const
4891
0
{
4892
0
  auto snap = c->serializer->snapshot ();
4893
0
  lookup_condition_subset_result_t result =
4894
0
      subset_lookup_condition_impl (c, depth);
4895
0
  if (result == LOOKUP_CONDITION_SUBSET_KEEP)
4896
0
    return result;
4897
4898
0
  c->serializer->revert (snap);
4899
0
  if (result != LOOKUP_CONDITION_SUBSET_TRUE || !materialize_true)
4900
0
    return result;
4901
4902
0
  return serialize_constant (c->serializer, true) ?
4903
0
         LOOKUP_CONDITION_SUBSET_KEEP : LOOKUP_CONDITION_SUBSET_ERROR;
4904
0
}
4905
4906
inline lookup_condition_subset_result_t
4907
Condition::subset_lookup_condition_impl (hb_subset_context_t *c,
4908
           unsigned depth) const
4909
0
{
4910
0
  if (unlikely (!depth))
4911
0
    return LOOKUP_CONDITION_SUBSET_ERROR;
4912
4913
0
  auto subset_offset = [c, depth] (Array8OfOffset24To<Condition> &out,
4914
0
           const Condition &condition)
4915
0
      -> lookup_condition_subset_result_t
4916
0
  {
4917
0
    auto snap = c->serializer->snapshot ();
4918
0
    auto *offset = out.serialize_append (c->serializer);
4919
0
    if (unlikely (!offset))
4920
0
      return LOOKUP_CONDITION_SUBSET_ERROR;
4921
4922
0
    c->serializer->push ();
4923
0
    lookup_condition_subset_result_t result =
4924
0
        condition.subset_lookup_condition (c, depth - 1);
4925
0
    if (result == LOOKUP_CONDITION_SUBSET_KEEP)
4926
0
      c->serializer->add_link (*offset, c->serializer->pop_pack ());
4927
0
    else
4928
0
    {
4929
0
      c->serializer->pop_discard ();
4930
0
      out.pop ();
4931
0
      c->serializer->revert (snap);
4932
0
    }
4933
0
    return result;
4934
0
  };
4935
4936
0
  switch (u.format.v)
4937
0
  {
4938
0
    case 0:
4939
0
      return LOOKUP_CONDITION_SUBSET_TRUE;
4940
4941
0
    case 1:
4942
0
    {
4943
0
      const ConditionAxisRange &src = u.format1;
4944
0
      if (c->plan->user_axes_location.is_empty ())
4945
0
        return c->serializer->embed (&src) ?
4946
0
               LOOKUP_CONDITION_SUBSET_KEEP :
4947
0
               LOOKUP_CONDITION_SUBSET_ERROR;
4948
4949
0
      hb_codepoint_t *axis_tag;
4950
0
      if (!c->plan->axes_old_index_tag_map.has (src.axisIndex, &axis_tag))
4951
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
4952
4953
0
      Triple axis_limit {-1.0, 0.0, 1.0};
4954
0
      Triple *normalized_limit;
4955
0
      if (c->plan->axes_location.has (*axis_tag, &normalized_limit))
4956
0
        axis_limit = *normalized_limit;
4957
4958
0
      double filter_min = (double) src.filterRangeMinValue.to_float ();
4959
0
      double filter_max = (double) src.filterRangeMaxValue.to_float ();
4960
0
      if (filter_min > filter_max)
4961
0
        return LOOKUP_CONDITION_SUBSET_FALSE;
4962
0
      if (axis_limit.is_point ())
4963
0
        return filter_min <= axis_limit.middle &&
4964
0
         axis_limit.middle <= filter_max ?
4965
0
         LOOKUP_CONDITION_SUBSET_TRUE :
4966
0
         LOOKUP_CONDITION_SUBSET_FALSE;
4967
0
      if (axis_limit.maximum < filter_min ||
4968
0
    filter_max < axis_limit.minimum)
4969
0
        return LOOKUP_CONDITION_SUBSET_FALSE;
4970
0
      if (filter_min <= axis_limit.minimum &&
4971
0
    axis_limit.maximum <= filter_max)
4972
0
        return LOOKUP_CONDITION_SUBSET_TRUE;
4973
0
      if (!c->plan->axes_index_map.has (src.axisIndex))
4974
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
4975
4976
0
      auto *out = c->serializer->embed (&src);
4977
0
      if (unlikely (!out))
4978
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
4979
4980
0
      TripleDistances axis_distances {1.0, 1.0};
4981
0
      TripleDistances *distances;
4982
0
      if (c->plan->axes_triple_distances.has (*axis_tag, &distances))
4983
0
        axis_distances = *distances;
4984
4985
0
      out->filterRangeMinValue.set_float (
4986
0
    renormalizeValue (filter_min, axis_limit, axis_distances, false));
4987
0
      out->filterRangeMaxValue.set_float (
4988
0
    renormalizeValue (filter_max, axis_limit, axis_distances, false));
4989
0
      if (unlikely (!c->serializer->check_assign (
4990
0
    out->axisIndex,
4991
0
    c->plan->axes_index_map.get (src.axisIndex),
4992
0
    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
4993
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
4994
0
      return LOOKUP_CONDITION_SUBSET_KEEP;
4995
0
    }
4996
4997
0
    case 2:
4998
0
    {
4999
0
      const ConditionValue &src = u.format2;
5000
0
      auto *out = c->serializer->embed (&src);
5001
0
      if (unlikely (!out))
5002
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
5003
5004
0
      if (src.varIdx == VarIdx::NO_VARIATION)
5005
0
        return c->plan->user_axes_location.is_empty () ?
5006
0
               LOOKUP_CONDITION_SUBSET_KEEP :
5007
0
               ((int) src.defaultValue > 0 ?
5008
0
    LOOKUP_CONDITION_SUBSET_TRUE :
5009
0
    LOOKUP_CONDITION_SUBSET_FALSE);
5010
5011
0
      hb_pair_t<unsigned, int> *new_varidx_delta;
5012
0
      if (!c->plan->layout_variation_idx_delta_map.has (src.varIdx,
5013
0
              &new_varidx_delta))
5014
0
        return c->plan->user_axes_location.is_empty () ?
5015
0
               LOOKUP_CONDITION_SUBSET_KEEP :
5016
0
               ((int) src.defaultValue > 0 ?
5017
0
    LOOKUP_CONDITION_SUBSET_TRUE :
5018
0
    LOOKUP_CONDITION_SUBSET_FALSE);
5019
5020
0
      if (!c->plan->user_axes_location.is_empty () &&
5021
0
          hb_first (*new_varidx_delta) == VarIdx::NO_VARIATION)
5022
0
      {
5023
        // Conditions becoming constant depend on the unrounded sign, not
5024
        // the integer delta used to instance positioning values.
5025
0
        float value = (int) src.defaultValue +
5026
0
                      c->plan->layout_variation_delta (src.varIdx);
5027
0
        return value > 0 ? LOOKUP_CONDITION_SUBSET_TRUE :
5028
0
                          LOOKUP_CONDITION_SUBSET_FALSE;
5029
0
      }
5030
5031
0
      int default_value = (int) src.defaultValue +
5032
0
        hb_second (*new_varidx_delta);
5033
0
      if (unlikely (!c->serializer->check_assign (
5034
0
    out->defaultValue,
5035
0
    default_value,
5036
0
    HB_SERIALIZE_ERROR_INT_OVERFLOW)))
5037
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
5038
0
      out->varIdx = hb_first (*new_varidx_delta);
5039
5040
0
      return LOOKUP_CONDITION_SUBSET_KEEP;
5041
0
    }
5042
5043
0
    case 3:
5044
0
    {
5045
0
      const ConditionAnd &src = u.format3;
5046
0
      auto *out = c->serializer->start_embed (&src);
5047
0
      if (unlikely (!out || !c->serializer->extend_min (out)))
5048
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
5049
0
      out->format = 3;
5050
5051
0
      for (const auto &offset : src.conditions)
5052
0
      {
5053
0
        lookup_condition_subset_result_t result =
5054
0
            subset_offset (out->conditions, &src + offset);
5055
0
        if (result == LOOKUP_CONDITION_SUBSET_ERROR ||
5056
0
      result == LOOKUP_CONDITION_SUBSET_FALSE)
5057
0
          return result;
5058
0
      }
5059
0
      return out->conditions ?
5060
0
       LOOKUP_CONDITION_SUBSET_KEEP :
5061
0
       LOOKUP_CONDITION_SUBSET_TRUE;
5062
0
    }
5063
5064
0
    case 4:
5065
0
    {
5066
0
      const ConditionOr &src = u.format4;
5067
0
      auto *out = c->serializer->start_embed (&src);
5068
0
      if (unlikely (!out || !c->serializer->extend_min (out)))
5069
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
5070
0
      out->format = 4;
5071
5072
0
      for (const auto &offset : src.conditions)
5073
0
      {
5074
0
        lookup_condition_subset_result_t result =
5075
0
            subset_offset (out->conditions, &src + offset);
5076
0
        if (result == LOOKUP_CONDITION_SUBSET_ERROR ||
5077
0
      result == LOOKUP_CONDITION_SUBSET_TRUE)
5078
0
          return result;
5079
0
      }
5080
0
      return out->conditions ?
5081
0
       LOOKUP_CONDITION_SUBSET_KEEP :
5082
0
       LOOKUP_CONDITION_SUBSET_FALSE;
5083
0
    }
5084
5085
0
    case 5:
5086
0
    {
5087
0
      const ConditionNegate &src = u.format5;
5088
0
      auto *out = c->serializer->embed (&src);
5089
0
      if (unlikely (!out))
5090
0
        return LOOKUP_CONDITION_SUBSET_ERROR;
5091
0
      out->condition = 0;
5092
5093
0
      c->serializer->push ();
5094
0
      lookup_condition_subset_result_t result =
5095
0
          (&src + src.condition).subset_lookup_condition (c, depth - 1);
5096
0
      if (result == LOOKUP_CONDITION_SUBSET_KEEP)
5097
0
      {
5098
0
        c->serializer->add_link (out->condition,
5099
0
         c->serializer->pop_pack ());
5100
0
        return result;
5101
0
      }
5102
5103
0
      c->serializer->pop_discard ();
5104
0
      if (result == LOOKUP_CONDITION_SUBSET_TRUE)
5105
0
        return LOOKUP_CONDITION_SUBSET_FALSE;
5106
0
      if (result == LOOKUP_CONDITION_SUBSET_FALSE)
5107
0
        return LOOKUP_CONDITION_SUBSET_TRUE;
5108
0
      return result;
5109
0
    }
5110
5111
0
    default:
5112
0
      return LOOKUP_CONDITION_SUBSET_FALSE;
5113
0
  }
5114
0
}
5115
5116
struct ConditionSet
5117
{
5118
  bool evaluate (const int *coords, unsigned int coord_len,
5119
     ItemVarStoreInstancer *instancer) const
5120
0
  {
5121
0
    unsigned int count = conditions.len;
5122
0
    for (unsigned int i = 0; i < count; i++)
5123
0
      if (!(this+conditions.arrayZ[i]).evaluate (coords, coord_len, instancer))
5124
0
  return false;
5125
0
    return true;
5126
0
  }
5127
5128
  void keep_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
5129
0
  {
5130
0
    hb_map_t *condition_map = hb_map_create ();
5131
0
    if (unlikely (!condition_map)) return;
5132
0
    hb::shared_ptr<hb_map_t> p {condition_map};
5133
5134
0
    hb_set_t *cond_set = hb_set_create ();
5135
0
    if (unlikely (!cond_set)) return;
5136
0
    hb::shared_ptr<hb_set_t> s {cond_set};
5137
5138
0
    c->apply = true;
5139
0
    bool should_keep = false;
5140
    /* The range map cannot identify value or boolean expressions uniquely. */
5141
0
    bool can_deduplicate = true;
5142
0
    unsigned num_kept_cond = 0, cond_idx = 0;
5143
0
    for (const auto& offset : conditions)
5144
0
    {
5145
0
      const Condition &condition = this+offset;
5146
0
      can_deduplicate &= condition.u.format.v <= 1;
5147
0
      Cond_with_Var_flag_t ret = condition.keep_with_variations (c, condition_map);
5148
      // condition is not met or condition out of range, drop the entire record
5149
0
      if (ret == DROP_RECORD_WITH_VAR)
5150
0
      {
5151
0
        c->apply = false;
5152
0
        return;
5153
0
      }
5154
5155
0
      if (ret == KEEP_COND_WITH_VAR)
5156
0
      {
5157
0
        should_keep = true;
5158
0
        cond_set->add (cond_idx);
5159
0
        num_kept_cond++;
5160
0
      }
5161
5162
0
      if (ret == KEEP_RECORD_WITH_VAR)
5163
0
        should_keep = true;
5164
5165
0
      cond_idx++;
5166
0
    }
5167
5168
    /* Satisfied pinned conditions still terminate first-match processing.
5169
     * Keep their universal record when other axes remain variable. */
5170
0
    c->universal = num_kept_cond == 0;
5171
0
    if (!should_keep && c->all_axes_pinned) return;
5172
5173
    //check if condition_set is unique with variations
5174
0
    if (can_deduplicate && c->conditionset_map->has (p))
5175
      //duplicate found, drop the entire record
5176
0
      return;
5177
5178
0
    if (can_deduplicate)
5179
0
      c->conditionset_map->set (p, 1);
5180
0
    c->record_cond_idx_map->set (c->cur_record_idx, s);
5181
0
  }
5182
5183
  bool subset (hb_subset_context_t *c,
5184
               hb_subset_layout_context_t *l,
5185
               bool insert_catch_all) const
5186
0
  {
5187
0
    TRACE_SUBSET (this);
5188
0
    auto *out = c->serializer->start_embed (this);
5189
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
5190
5191
0
    if (insert_catch_all) return_trace (true);
5192
5193
0
    hb_set_t *retained_cond_set = nullptr;
5194
0
    if (l->feature_record_cond_idx_map != nullptr)
5195
0
      retained_cond_set = l->feature_record_cond_idx_map->get (l->cur_feature_var_record_idx);
5196
5197
0
    unsigned int count = conditions.len;
5198
0
    for (unsigned int i = 0; i < count; i++)
5199
0
    {
5200
0
      if (retained_cond_set != nullptr && !retained_cond_set->has (i))
5201
0
        continue;
5202
0
      const Condition &condition = this+conditions[i];
5203
0
      if (condition.u.format.v == 1)
5204
0
      {
5205
0
        subset_offset_array (c, out->conditions, this) (conditions[i]);
5206
0
        continue;
5207
0
      }
5208
5209
0
      auto *offset = out->conditions.serialize_append (c->serializer);
5210
0
      if (unlikely (!offset)) return_trace (false);
5211
0
      c->serializer->push ();
5212
0
      auto result = condition.subset_lookup_condition (c, HB_MAX_NESTING_LEVEL, true);
5213
0
      if (result == LOOKUP_CONDITION_SUBSET_FALSE)
5214
        /* A false condition must not become a null (true) ConditionSet. */
5215
0
        result = Condition::serialize_constant (c->serializer, false) ?
5216
0
                 LOOKUP_CONDITION_SUBSET_KEEP : LOOKUP_CONDITION_SUBSET_ERROR;
5217
0
      if (unlikely (result == LOOKUP_CONDITION_SUBSET_ERROR))
5218
0
      {
5219
0
        c->serializer->pop_discard ();
5220
0
        c->serializer->check_success (false);
5221
0
        return_trace (false);
5222
0
      }
5223
0
      c->serializer->add_link (*offset, c->serializer->pop_pack ());
5224
0
    }
5225
5226
0
    return_trace (bool (out->conditions));
5227
0
  }
5228
5229
  bool sanitize (hb_sanitize_context_t *c) const
5230
0
  {
5231
0
    TRACE_SANITIZE (this);
5232
0
    return_trace (conditions.sanitize (c, this));
5233
0
  }
5234
5235
  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
5236
0
  {
5237
0
    for (const auto &offset : conditions)
5238
0
      if (unlikely (!(this+offset).collect_var_indices (c->layout_variation_indices)))
5239
0
  c->layout_variation_indices->err ();
5240
0
  }
5241
5242
  protected:
5243
  Array16OfOffset32To<Condition>  conditions;
5244
  public:
5245
  DEFINE_SIZE_ARRAY (2, conditions);
5246
};
5247
5248
struct FeatureTableSubstitutionRecord
5249
{
5250
  friend struct FeatureTableSubstitution;
5251
5252
  void collect_lookups (const void *base, hb_set_t *lookup_indexes /* OUT */) const
5253
0
  {
5254
0
    return (base+feature).add_lookup_indexes_to (lookup_indexes);
5255
0
  }
5256
5257
  void closure_features (const void *base,
5258
       const hb_map_t *lookup_indexes,
5259
       hb_set_t       *feature_indexes /* OUT */) const
5260
0
  {
5261
0
    if ((base+feature).intersects_lookup_indexes (lookup_indexes))
5262
0
      feature_indexes->add (featureIndex);
5263
0
  }
5264
5265
  void collect_feature_substitutes_with_variations (hb_hashmap_t<unsigned, const Feature*> *feature_substitutes_map,
5266
                                                    hb_set_t& catch_all_record_feature_idxes,
5267
                                                    const hb_set_t *feature_indices,
5268
                                                    const void *base) const
5269
0
  {
5270
0
    if (feature_indices->has (featureIndex))
5271
0
    {
5272
0
      feature_substitutes_map->set (featureIndex, &(base+feature));
5273
0
      catch_all_record_feature_idxes.add (featureIndex);
5274
0
    }
5275
0
  }
5276
5277
  bool serialize (hb_subset_layout_context_t *c,
5278
                  unsigned feature_index,
5279
                  const Feature *f, const Tag *tag)
5280
0
  {
5281
0
    TRACE_SERIALIZE (this);
5282
0
    hb_serialize_context_t *s = c->subset_context->serializer;
5283
0
    if (unlikely (!s->extend_min (this))) return_trace (false);
5284
5285
0
    uint32_t *new_feature_idx;
5286
0
    if (!c->feature_map_w_duplicates->has (feature_index, &new_feature_idx))
5287
0
      return_trace (false);
5288
5289
0
    if (!s->check_assign (featureIndex, *new_feature_idx, HB_SERIALIZE_ERROR_INT_OVERFLOW))
5290
0
      return_trace (false);
5291
5292
0
    s->push ();
5293
0
    bool ret = f->subset (c->subset_context, c, tag);
5294
0
    if (ret) s->add_link (feature, s->pop_pack ());
5295
0
    else s->pop_discard ();
5296
5297
0
    return_trace (ret);
5298
0
  }
5299
5300
  bool subset (hb_subset_layout_context_t *c, const void *base) const
5301
0
  {
5302
0
    TRACE_SUBSET (this);
5303
0
    uint32_t *new_feature_index;
5304
0
    if (!c->feature_map_w_duplicates->has (featureIndex, &new_feature_index))
5305
0
      return_trace (false);
5306
5307
0
    auto *out = c->subset_context->serializer->embed (this);
5308
0
    if (unlikely (!out)) return_trace (false);
5309
5310
0
    out->featureIndex = *new_feature_index;
5311
0
    return_trace (out->feature.serialize_subset (c->subset_context, feature, base, c));
5312
0
  }
5313
5314
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
5315
0
  {
5316
0
    TRACE_SANITIZE (this);
5317
0
    return_trace (c->check_struct (this) && feature.sanitize (c, base));
5318
0
  }
5319
5320
  protected:
5321
  HBUINT16    featureIndex;
5322
  Offset32To<Feature> feature;
5323
  public:
5324
  DEFINE_SIZE_STATIC (6);
5325
};
5326
5327
struct FeatureTableSubstitution
5328
{
5329
  const Feature *find_substitute (unsigned int feature_index) const
5330
0
  {
5331
0
    unsigned int count = substitutions.len;
5332
0
    for (unsigned int i = 0; i < count; i++)
5333
0
    {
5334
0
      const FeatureTableSubstitutionRecord &record = substitutions.arrayZ[i];
5335
0
      if (record.featureIndex == feature_index)
5336
0
  return &(this+record.feature);
5337
0
    }
5338
0
    return nullptr;
5339
0
  }
5340
5341
  void collect_lookups (const hb_set_t *feature_indexes,
5342
      hb_set_t       *lookup_indexes /* OUT */) const
5343
0
  {
5344
0
    + hb_iter (substitutions)
5345
0
    | hb_filter (feature_indexes, &FeatureTableSubstitutionRecord::featureIndex)
5346
0
    | hb_apply ([this, lookup_indexes] (const FeatureTableSubstitutionRecord& r)
5347
0
    { r.collect_lookups (this, lookup_indexes); })
5348
0
    ;
5349
0
  }
5350
5351
  void closure_features (const hb_map_t *lookup_indexes,
5352
       hb_set_t       *feature_indexes /* OUT */) const
5353
0
  {
5354
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
5355
0
      record.closure_features (this, lookup_indexes, feature_indexes);
5356
0
  }
5357
5358
  bool intersects_features (const hb_map_t *feature_index_map) const
5359
0
  {
5360
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
5361
0
    {
5362
0
      if (feature_index_map->has (record.featureIndex)) return true;
5363
0
    }
5364
0
    return false;
5365
0
  }
5366
5367
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
5368
0
  {
5369
0
    for (const FeatureTableSubstitutionRecord& record : substitutions)
5370
0
      record.collect_feature_substitutes_with_variations (c->feature_substitutes_map,
5371
0
                                                          c->catch_all_record_feature_idxes,
5372
0
                                                          c->feature_indices, this);
5373
0
  }
5374
5375
  bool subset (hb_subset_context_t        *c,
5376
         hb_subset_layout_context_t *l,
5377
               bool insert_catch_all) const
5378
0
  {
5379
0
    TRACE_SUBSET (this);
5380
0
    auto *out = c->serializer->start_embed (*this);
5381
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
5382
5383
0
    out->version.major = version.major;
5384
0
    out->version.minor = version.minor;
5385
5386
0
    if (insert_catch_all)
5387
0
    {
5388
0
      for (unsigned feature_index : *(l->catch_all_record_feature_idxes))
5389
0
      {
5390
0
        hb_pair_t<const void*, const void*> *p;
5391
0
        if (!l->feature_idx_tag_map->has (feature_index, &p))
5392
0
          return_trace (false);
5393
0
        auto *o = out->substitutions.serialize_append (c->serializer);
5394
0
        if (!o->serialize (l, feature_index,
5395
0
                           reinterpret_cast<const Feature*> (p->first),
5396
0
                           reinterpret_cast<const Tag*> (p->second)))
5397
0
          return_trace (false);
5398
0
      }
5399
0
      return_trace (true);
5400
0
    }
5401
5402
0
    + substitutions.iter ()
5403
0
    | hb_apply (subset_record_array (l, &(out->substitutions), this))
5404
0
    ;
5405
5406
0
    return_trace (bool (out->substitutions));
5407
0
  }
5408
5409
  bool sanitize (hb_sanitize_context_t *c) const
5410
0
  {
5411
0
    TRACE_SANITIZE (this);
5412
0
    return_trace (version.sanitize (c) &&
5413
0
      hb_barrier () &&
5414
0
      likely (version.major == 1) &&
5415
0
      substitutions.sanitize (c, this));
5416
0
  }
5417
5418
  protected:
5419
  FixedVersion<>  version;  /* Version--0x00010000u */
5420
  Array16Of<FeatureTableSubstitutionRecord>
5421
      substitutions;
5422
  public:
5423
  DEFINE_SIZE_ARRAY (6, substitutions);
5424
};
5425
5426
struct FeatureVariationRecord
5427
{
5428
  friend struct FeatureVariations;
5429
5430
  void collect_lookups (const void     *base,
5431
      const hb_set_t *feature_indexes,
5432
      hb_set_t       *lookup_indexes /* OUT */) const
5433
0
  {
5434
0
    return (base+substitutions).collect_lookups (feature_indexes, lookup_indexes);
5435
0
  }
5436
5437
  void closure_features (const void     *base,
5438
       const hb_map_t *lookup_indexes,
5439
       hb_set_t       *feature_indexes /* OUT */) const
5440
0
  {
5441
0
    (base+substitutions).closure_features (lookup_indexes, feature_indexes);
5442
0
  }
5443
5444
  bool intersects_features (const void *base, const hb_map_t *feature_index_map) const
5445
0
  {
5446
0
    return (base+substitutions).intersects_features (feature_index_map);
5447
0
  }
5448
5449
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c,
5450
                                                    const void *base) const
5451
0
  {
5452
0
    (base+conditions).keep_with_variations (c);
5453
0
    if (c->apply && !c->variation_applied)
5454
0
    {
5455
0
      (base+substitutions).collect_feature_substitutes_with_variations (c);
5456
0
      c->variation_applied = true; // set variations only once
5457
0
    }
5458
0
  }
5459
5460
  bool subset (hb_subset_layout_context_t *c, const void *base,
5461
               bool insert_catch_all = false) const
5462
0
  {
5463
0
    TRACE_SUBSET (this);
5464
0
    auto *out = c->subset_context->serializer->embed (this);
5465
0
    if (unlikely (!out)) return_trace (false);
5466
5467
0
    hb_set_t *retained_conditions = c->feature_record_cond_idx_map ?
5468
0
        c->feature_record_cond_idx_map->get (c->cur_feature_var_record_idx).get () : nullptr;
5469
0
    if (!insert_catch_all && retained_conditions && retained_conditions->is_empty ())
5470
      /* A null ConditionSet is the unconditional first-match record. */
5471
0
      out->conditions = 0;
5472
0
    else
5473
0
      out->conditions.serialize_subset (c->subset_context, conditions, base, c, insert_catch_all);
5474
0
    out->substitutions.serialize_subset (c->subset_context, substitutions, base, c, insert_catch_all);
5475
5476
0
    return_trace (true);
5477
0
  }
5478
5479
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
5480
0
  {
5481
0
    TRACE_SANITIZE (this);
5482
0
    return_trace (conditions.sanitize (c, base) &&
5483
0
      substitutions.sanitize (c, base));
5484
0
  }
5485
5486
  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
5487
          const void *base) const
5488
0
  { (base+conditions).collect_variation_indices (c); }
5489
5490
  protected:
5491
  Offset32To<ConditionSet>
5492
      conditions;
5493
  Offset32To<FeatureTableSubstitution>
5494
      substitutions;
5495
  public:
5496
  DEFINE_SIZE_STATIC (8);
5497
};
5498
5499
struct LookupIndexList
5500
{
5501
  void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
5502
0
  { lookupIndices.add_indexes_to (lookup_indexes); }
5503
5504
  bool intersects_lookup_indexes (const hb_map_t *lookup_indexes) const
5505
0
  { return lookupIndices.intersects (lookup_indexes); }
5506
5507
  bool subset (hb_subset_context_t *c,
5508
         hb_subset_layout_context_t *l) const
5509
0
  {
5510
0
    TRACE_SUBSET (this);
5511
0
    auto *out = c->serializer->start_embed (this);
5512
0
    if (unlikely (!out || !c->serializer->extend_min (out)))
5513
0
      return_trace (false);
5514
5515
0
    auto it =
5516
0
    + hb_iter (lookupIndices)
5517
0
    | hb_filter (l->lookup_index_map)
5518
0
    | hb_map (l->lookup_index_map)
5519
0
    ;
5520
0
    out->lookupIndices.serialize (c->serializer, l, it);
5521
0
    return_trace (bool (out->lookupIndices));
5522
0
  }
5523
5524
  bool sanitize (hb_sanitize_context_t *c) const
5525
0
  {
5526
0
    TRACE_SANITIZE (this);
5527
0
    return_trace (lookupIndices.sanitize (c));
5528
0
  }
5529
5530
  protected:
5531
  IndexArray  lookupIndices;
5532
  public:
5533
  DEFINE_SIZE_ARRAY_SIZED (2, lookupIndices);
5534
};
5535
5536
struct LookupConditionRecord
5537
{
5538
  template <typename Instancer>
5539
  bool evaluate (const void *base,
5540
     const int *coords,
5541
     unsigned int coord_len,
5542
     Instancer *instancer) const
5543
0
  { return (base+condition).evaluate (coords, coord_len, instancer); }
5544
5545
  void add_lookup_indexes_to (const void *base,
5546
            hb_set_t *lookup_indexes) const
5547
0
  { (base+lookupIndices).add_lookup_indexes_to (lookup_indexes); }
5548
5549
  bool intersects_lookup_indexes (const void *base,
5550
           const hb_map_t *lookup_indexes) const
5551
0
  { return (base+lookupIndices).intersects_lookup_indexes (lookup_indexes); }
5552
5553
  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
5554
          const void *base) const
5555
0
  {
5556
0
    if (unlikely (!(base+condition).collect_var_indices (c->layout_variation_indices)))
5557
0
      c->layout_variation_indices->err ();
5558
0
  }
5559
5560
  bool subset (hb_subset_context_t *c,
5561
         hb_subset_layout_context_t *l,
5562
         const void *base) const
5563
0
  {
5564
0
    TRACE_SUBSET (this);
5565
0
    auto *out = c->serializer->embed (this);
5566
0
    if (unlikely (!out)) return_trace (false);
5567
5568
0
    out->condition = 0;
5569
0
    c->serializer->push ();
5570
0
    lookup_condition_subset_result_t result =
5571
0
        (base + condition).subset_lookup_condition (c,
5572
0
              HB_MAX_NESTING_LEVEL,
5573
0
              true);
5574
0
    if (result != LOOKUP_CONDITION_SUBSET_KEEP)
5575
0
    {
5576
0
      c->serializer->pop_discard ();
5577
0
      return_trace (false);
5578
0
    }
5579
0
    c->serializer->add_link (out->condition, c->serializer->pop_pack ());
5580
5581
0
    return_trace (out->lookupIndices.serialize_subset (c, lookupIndices, base, l));
5582
0
  }
5583
5584
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
5585
0
  {
5586
0
    TRACE_SANITIZE (this);
5587
0
    return_trace (condition.sanitize (c, base) &&
5588
0
      lookupIndices.sanitize (c, base));
5589
0
  }
5590
5591
  protected:
5592
  Offset32To<Condition>   condition;
5593
  Offset32To<LookupIndexList> lookupIndices;
5594
  public:
5595
  DEFINE_SIZE_STATIC (8);
5596
};
5597
5598
struct FeatureLookupsTable
5599
{
5600
0
  bool adds_default_lookups () const { return flags & 0x0001u; }
5601
5602
  template <typename Instancer>
5603
  void collect_lookups (const int *coords,
5604
      unsigned int coord_len,
5605
      Instancer *instancer,
5606
      hb_set_t *lookup_indexes) const
5607
0
  {
5608
0
    for (const LookupConditionRecord &record : records)
5609
0
      if (record.evaluate (this, coords, coord_len, instancer))
5610
0
  record.add_lookup_indexes_to (this, lookup_indexes);
5611
0
  }
5612
5613
  void collect_lookups (hb_set_t *lookup_indexes) const
5614
0
  {
5615
0
    for (const LookupConditionRecord &record : records)
5616
0
      record.add_lookup_indexes_to (this, lookup_indexes);
5617
0
  }
5618
5619
  bool intersects_lookup_indexes (const hb_map_t *lookup_indexes) const
5620
0
  {
5621
0
    for (const LookupConditionRecord &record : records)
5622
0
      if (record.intersects_lookup_indexes (this, lookup_indexes))
5623
0
  return true;
5624
0
    return false;
5625
0
  }
5626
5627
  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
5628
0
  {
5629
0
    for (const LookupConditionRecord &record : records)
5630
0
      record.collect_variation_indices (c, this);
5631
0
  }
5632
5633
  bool subset (hb_subset_context_t *c,
5634
         hb_subset_layout_context_t *l) const
5635
0
  {
5636
0
    TRACE_SUBSET (this);
5637
0
    auto *out = c->serializer->start_embed (this);
5638
0
    if (unlikely (!out || !c->serializer->extend_min (out)))
5639
0
      return_trace (false);
5640
5641
0
    out->version.major = version.major;
5642
0
    out->version.minor = version.minor;
5643
0
    out->flags = flags;
5644
5645
0
    for (const LookupConditionRecord &record : records)
5646
0
    {
5647
0
      auto snap = c->serializer->snapshot ();
5648
0
      if (record.subset (c, l, this))
5649
0
  out->records.len++;
5650
0
      else
5651
0
  c->serializer->revert (snap);
5652
0
    }
5653
5654
0
    return_trace (true);
5655
0
  }
5656
5657
  bool sanitize (hb_sanitize_context_t *c) const
5658
0
  {
5659
0
    TRACE_SANITIZE (this);
5660
0
    return_trace (version.sanitize (c) &&
5661
0
      hb_barrier () &&
5662
0
      likely (version.major == 1) &&
5663
0
      records.sanitize (c, this));
5664
0
  }
5665
5666
  protected:
5667
  FixedVersion<>  version;  /* Version--0x00010000u */
5668
  HBUINT16  flags;
5669
  Array32Of<LookupConditionRecord>
5670
    records;
5671
  public:
5672
  DEFINE_SIZE_ARRAY (10, records);
5673
};
5674
5675
struct LookupVariationRecord
5676
{
5677
  friend struct FeatureVariations;
5678
5679
  void collect_lookups (const void *base,
5680
      const hb_set_t *feature_indexes,
5681
      hb_set_t *lookup_indexes) const
5682
0
  {
5683
0
    if (feature_indexes->has (featureIndex))
5684
0
      (base+featureLookups).collect_lookups (lookup_indexes);
5685
0
  }
5686
5687
  void closure_features (const void *base,
5688
       const hb_map_t *lookup_indexes,
5689
       hb_set_t *feature_indexes) const
5690
0
  {
5691
0
    if ((base+featureLookups).intersects_lookup_indexes (lookup_indexes))
5692
0
      feature_indexes->add (featureIndex);
5693
0
  }
5694
5695
  void collect_variation_indices (hb_collect_variation_indices_context_t *c,
5696
          const void *base) const
5697
0
  { (base+featureLookups).collect_variation_indices (c); }
5698
5699
  bool subset (hb_subset_layout_context_t *l, const void *base) const
5700
0
  {
5701
0
    hb_subset_context_t *c = l->subset_context;
5702
0
    TRACE_SUBSET (this);
5703
0
    uint32_t *new_feature_index;
5704
0
    if (!l->feature_map_w_duplicates->has (featureIndex, &new_feature_index))
5705
0
      return_trace (false);
5706
5707
0
    auto *out = c->serializer->embed (this);
5708
0
    if (unlikely (!out ||
5709
0
      !c->serializer->check_assign (out->featureIndex,
5710
0
            *new_feature_index,
5711
0
            HB_SERIALIZE_ERROR_INT_OVERFLOW)))
5712
0
      return_trace (false);
5713
5714
0
    return_trace (out->featureLookups.serialize_subset (c, featureLookups, base, l));
5715
0
  }
5716
5717
  bool sanitize (hb_sanitize_context_t *c, const void *base) const
5718
0
  {
5719
0
    TRACE_SANITIZE (this);
5720
0
    return_trace (c->check_struct (this) &&
5721
0
      featureLookups.sanitize (c, base));
5722
0
  }
5723
5724
  protected:
5725
  HBUINT16      featureIndex;
5726
  Offset32To<FeatureLookupsTable> featureLookups;
5727
  public:
5728
  DEFINE_SIZE_STATIC (6);
5729
};
5730
5731
struct FeatureVariations
5732
{
5733
  static constexpr unsigned NOT_FOUND_INDEX = 0xFFFFFFFFu;
5734
5735
  const Array32Of<LookupVariationRecord> &get_lookup_variation_records () const
5736
35.1M
  {
5737
35.1M
    if (version.to_int () < 0x00010001u)
5738
35.1M
      return Null (Array32Of<LookupVariationRecord>);
5739
0
    return StructAfter<Array32Of<LookupVariationRecord>> (varRecords);
5740
35.1M
  }
5741
5742
  unsigned record_count () const
5743
0
  {
5744
0
    return varRecords.len;
5745
0
  }
5746
5747
  bool find_index (const int *coords, unsigned int coord_len,
5748
       unsigned int *index,
5749
       ItemVarStoreInstancer *instancer) const
5750
35.1M
  {
5751
35.1M
    unsigned int count = varRecords.len;
5752
35.1M
    for (unsigned int i = 0; i < count; i++)
5753
0
    {
5754
0
      const FeatureVariationRecord &record = varRecords.arrayZ[i];
5755
0
      if ((this+record.conditions).evaluate (coords, coord_len, instancer))
5756
0
      {
5757
0
  *index = i;
5758
0
  return true;
5759
0
      }
5760
0
    }
5761
35.1M
    *index = NOT_FOUND_INDEX;
5762
35.1M
    return false;
5763
35.1M
  }
5764
5765
  const Feature *find_substitute (unsigned int variations_index,
5766
          unsigned int feature_index) const
5767
0
  {
5768
0
    const FeatureVariationRecord &record = varRecords[variations_index];
5769
0
    return (this+record.substitutions).find_substitute (feature_index);
5770
0
  }
5771
5772
  template <typename FeatureGetter>
5773
  bool resolve_lookup_variations (const int *coords,
5774
          unsigned int coord_len,
5775
          ItemVarStoreInstancer *instancer,
5776
          FeatureGetter get_current_feature,
5777
          hb_vector_t<unsigned> *state) const
5778
35.1M
  {
5779
35.1M
    for (const LookupVariationRecord &record : get_lookup_variation_records ())
5780
0
    {
5781
0
      const FeatureLookupsTable &feature_lookups = this+record.featureLookups;
5782
0
      hb_set_t lookup_indexes;
5783
5784
0
      if (feature_lookups.adds_default_lookups ())
5785
0
  get_current_feature (record.featureIndex).add_lookup_indexes_to (&lookup_indexes);
5786
0
      feature_lookups.collect_lookups (coords, coord_len, instancer, &lookup_indexes);
5787
5788
0
      if (unlikely (lookup_indexes.in_error ()))
5789
0
  return false;
5790
5791
0
      state->push (record.featureIndex);
5792
0
      state->push (lookup_indexes.get_population ());
5793
0
      for (unsigned lookup_index : lookup_indexes)
5794
0
  state->push (lookup_index);
5795
5796
0
      if (unlikely (state->in_error ()))
5797
0
  return false;
5798
0
    }
5799
35.1M
    return true;
5800
35.1M
  }
5801
5802
  void collect_feature_substitutes_with_variations (hb_collect_feature_substitutes_with_var_context_t *c) const
5803
0
  {
5804
0
    unsigned int count = varRecords.len;
5805
0
    for (unsigned int i = 0; i < count; i++)
5806
0
    {
5807
0
      c->cur_record_idx = i;
5808
0
      varRecords[i].collect_feature_substitutes_with_variations (c, this);
5809
0
      if (c->universal)
5810
0
        break;
5811
0
    }
5812
0
    if (c->universal || c->record_cond_idx_map->is_empty ())
5813
0
      c->catch_all_record_feature_idxes.reset ();
5814
0
  }
5815
5816
  FeatureVariations* copy (hb_serialize_context_t *c) const
5817
0
  {
5818
0
    TRACE_SERIALIZE (this);
5819
0
    return_trace (c->embed (*this));
5820
0
  }
5821
5822
  void collect_lookups (const hb_set_t *feature_indexes,
5823
      const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
5824
      hb_set_t       *lookup_indexes /* OUT */) const
5825
90
  {
5826
90
    unsigned count = varRecords.len;
5827
90
    for (unsigned int i = 0; i < count; i++)
5828
0
    {
5829
0
      if (feature_record_cond_idx_map &&
5830
0
          !feature_record_cond_idx_map->has (i))
5831
0
        continue;
5832
0
      varRecords[i].collect_lookups (this, feature_indexes, lookup_indexes);
5833
0
    }
5834
5835
90
    collect_lookup_variation_lookups (feature_indexes, lookup_indexes);
5836
90
  }
5837
5838
  void collect_lookup_variation_lookups (const hb_set_t *feature_indexes,
5839
           hb_set_t *lookup_indexes /* OUT */) const
5840
90
  {
5841
90
    for (const LookupVariationRecord &record : get_lookup_variation_records ())
5842
0
      record.collect_lookups (this, feature_indexes, lookup_indexes);
5843
90
  }
5844
5845
  void closure_features (const hb_map_t *lookup_indexes,
5846
       const hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *feature_record_cond_idx_map,
5847
       hb_set_t       *feature_indexes /* OUT */) const
5848
0
  {
5849
0
    unsigned int count = varRecords.len;
5850
0
    for (unsigned int i = 0; i < count; i++)
5851
0
    {
5852
0
      if (feature_record_cond_idx_map != nullptr &&
5853
0
          !feature_record_cond_idx_map->has (i))
5854
0
        continue;
5855
0
      varRecords[i].closure_features (this, lookup_indexes, feature_indexes);
5856
0
    }
5857
5858
0
    for (const LookupVariationRecord &record : get_lookup_variation_records ())
5859
0
      record.closure_features (this, lookup_indexes, feature_indexes);
5860
0
  }
5861
5862
  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
5863
0
  {
5864
0
    for (const FeatureVariationRecord &record : varRecords)
5865
0
      record.collect_variation_indices (c, this);
5866
0
    for (const LookupVariationRecord &record : get_lookup_variation_records ())
5867
0
      record.collect_variation_indices (c, this);
5868
0
  }
5869
5870
  bool has_lookup_variations (unsigned feature_index) const
5871
0
  {
5872
0
    for (const LookupVariationRecord &record : get_lookup_variation_records ())
5873
0
    {
5874
0
      if (record.featureIndex == feature_index)
5875
0
  return true;
5876
0
      if (record.featureIndex > feature_index)
5877
0
  break;
5878
0
    }
5879
0
    return false;
5880
0
  }
5881
5882
  bool subset (hb_subset_context_t *c,
5883
         hb_subset_layout_context_t *l) const
5884
0
  {
5885
0
    TRACE_SUBSET (this);
5886
0
    auto *out = c->serializer->start_embed (*this);
5887
0
    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
5888
5889
0
    out->version.major = version.major;
5890
0
    out->version.minor = version.minor;
5891
5892
0
    int keep_up_to = -1;
5893
0
    for (int i = varRecords.len - 1; i >= 0; i--) {
5894
0
      if (varRecords[i].intersects_features (this, l->feature_map_w_duplicates)) {
5895
0
        keep_up_to = i;
5896
0
        break;
5897
0
      }
5898
0
    }
5899
5900
0
    unsigned count = (unsigned) (keep_up_to + 1);
5901
0
    for (unsigned i = 0; i < count; i++)
5902
0
    {
5903
0
      if (l->feature_record_cond_idx_map != nullptr &&
5904
0
          !l->feature_record_cond_idx_map->has (i))
5905
0
        continue;
5906
5907
0
      l->cur_feature_var_record_idx = i;
5908
0
      subset_record_array (l, &(out->varRecords), this) (varRecords[i]);
5909
0
    }
5910
5911
0
    if (out->varRecords.len && !l->catch_all_record_feature_idxes->is_empty ())
5912
0
    {
5913
0
      bool insert_catch_all_record = true;
5914
0
      subset_record_array (l, &(out->varRecords), this, insert_catch_all_record) (varRecords[0]);
5915
0
    }
5916
5917
0
    Array32Of<LookupVariationRecord> *out_lookup_records = nullptr;
5918
0
    if (version.minor >= 1)
5919
0
    {
5920
0
      out_lookup_records = &StructAfter<Array32Of<LookupVariationRecord>> (out->varRecords);
5921
0
      if (unlikely (!c->serializer->extend_min (out_lookup_records)))
5922
0
  return_trace (false);
5923
5924
0
      + get_lookup_variation_records ().iter ()
5925
0
      | hb_apply (subset_record_array (l, out_lookup_records, this))
5926
0
      ;
5927
0
    }
5928
5929
0
    return_trace (bool (out->varRecords) ||
5930
0
      (out_lookup_records && bool (*out_lookup_records)));
5931
0
  }
5932
5933
  bool sanitize (hb_sanitize_context_t *c) const
5934
0
  {
5935
0
    TRACE_SANITIZE (this);
5936
0
    return_trace (version.sanitize (c) &&
5937
0
      hb_barrier () &&
5938
0
      likely (version.major == 1) &&
5939
0
      varRecords.sanitize (c, this) &&
5940
0
      (version.minor < 1 ||
5941
0
       get_lookup_variation_records ().sanitize (c, this)));
5942
0
  }
5943
5944
  protected:
5945
  FixedVersion<>  version;  /* Version--0x00010000u */
5946
  Array32Of<FeatureVariationRecord>
5947
      varRecords;
5948
  public:
5949
  DEFINE_SIZE_ARRAY_SIZED (8, varRecords);
5950
};
5951
5952
5953
/*
5954
 * Device Tables
5955
 */
5956
5957
struct HintingDevice
5958
{
5959
  friend struct Device;
5960
5961
  private:
5962
5963
  hb_position_t get_x_delta (hb_font_t *font) const
5964
0
  { return get_delta (font->x_ppem, font->x_scale); }
5965
5966
  hb_position_t get_y_delta (hb_font_t *font) const
5967
0
  { return get_delta (font->y_ppem, font->y_scale); }
5968
5969
  public:
5970
5971
  size_t get_size () const
5972
0
  {
5973
0
    unsigned int f = deltaFormat;
5974
0
    if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * HBUINT16::static_size;
5975
0
    return HBUINT16::static_size * (4 + ((endSize - startSize) >> (4 - f)));
5976
0
  }
5977
5978
  bool sanitize (hb_sanitize_context_t *c) const
5979
0
  {
5980
0
    TRACE_SANITIZE (this);
5981
0
    return_trace (c->check_struct (this) && c->check_range (this, this->get_size ()));
5982
0
  }
5983
5984
  HintingDevice* copy (hb_serialize_context_t *c) const
5985
0
  {
5986
0
    TRACE_SERIALIZE (this);
5987
0
    return_trace (c->embed<HintingDevice> (this));
5988
0
  }
5989
5990
  private:
5991
5992
  int get_delta (unsigned int ppem, int scale) const
5993
0
  {
5994
0
    if (!ppem) return 0;
5995
5996
0
    int pixels = get_delta_pixels (ppem);
5997
5998
0
    if (!pixels) return 0;
5999
6000
0
    return (int) (pixels * (int64_t) scale / ppem);
6001
0
  }
6002
  int get_delta_pixels (unsigned int ppem_size) const
6003
0
  {
6004
0
    unsigned int f = deltaFormat;
6005
0
    if (unlikely (f < 1 || f > 3))
6006
0
      return 0;
6007
6008
0
    if (ppem_size < startSize || ppem_size > endSize)
6009
0
      return 0;
6010
6011
0
    unsigned int s = ppem_size - startSize;
6012
6013
0
    unsigned int byte = deltaValueZ[s >> (4 - f)];
6014
0
    unsigned int bits = (byte >> (16 - (((s & ((1 << (4 - f)) - 1)) + 1) << f)));
6015
0
    unsigned int mask = (0xFFFFu >> (16 - (1 << f)));
6016
6017
0
    int delta = bits & mask;
6018
6019
0
    if ((unsigned int) delta >= ((mask + 1) >> 1))
6020
0
      delta -= mask + 1;
6021
6022
0
    return delta;
6023
0
  }
6024
6025
  protected:
6026
  HBUINT16  startSize;    /* Smallest size to correct--in ppem */
6027
  HBUINT16  endSize;    /* Largest size to correct--in ppem */
6028
  HBUINT16  deltaFormat;    /* Format of DeltaValue array data: 1, 2, or 3
6029
           * 1  Signed 2-bit value, 8 values per uint16
6030
           * 2  Signed 4-bit value, 4 values per uint16
6031
           * 3  Signed 8-bit value, 2 values per uint16
6032
           */
6033
  UnsizedArrayOf<HBUINT16>
6034
    deltaValueZ;    /* Array of compressed data */
6035
  public:
6036
  DEFINE_SIZE_ARRAY (6, deltaValueZ);
6037
};
6038
6039
struct VariationDevice
6040
{
6041
  friend struct Device;
6042
6043
  private:
6044
6045
  hb_position_t get_x_delta (hb_font_t *font,
6046
           const ItemVariationStore &store,
6047
           hb_scalar_cache_t *store_cache = nullptr) const
6048
0
  { return !font->has_nonzero_coords ? 0 : font->em_scalef_x (get_delta (font, store, store_cache)); }
6049
6050
  hb_position_t get_y_delta (hb_font_t *font,
6051
           const ItemVariationStore &store,
6052
           hb_scalar_cache_t *store_cache = nullptr) const
6053
0
  { return !font->has_nonzero_coords ? 0 : font->em_scalef_y (get_delta (font, store, store_cache)); }
6054
6055
  VariationDevice* copy (hb_serialize_context_t *c,
6056
                         const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map) const
6057
0
  {
6058
0
    TRACE_SERIALIZE (this);
6059
0
    if (!layout_variation_idx_delta_map) return_trace (nullptr);
6060
6061
0
    hb_pair_t<unsigned, int> *v;
6062
0
    if (!layout_variation_idx_delta_map->has (varIdx, &v))
6063
0
      return_trace (nullptr);
6064
    /* The varidx was mapped to "no variations" during instancing (e.g. the
6065
     * instantiated row is all zeros). Drop the device instead of emitting one
6066
     * with an out-of-range varidx. */
6067
0
    if (hb_first (*v) == HB_OT_LAYOUT_NO_VARIATIONS_INDEX)
6068
0
      return_trace (nullptr);
6069
6070
0
    c->start_zerocopy (this->static_size);
6071
0
    auto *out = c->embed (this);
6072
0
    if (unlikely (!out)) return_trace (nullptr);
6073
6074
0
    if (!c->check_assign (out->varIdx, hb_first (*v), HB_SERIALIZE_ERROR_INT_OVERFLOW))
6075
0
      return_trace (nullptr);
6076
0
    return_trace (out);
6077
0
  }
6078
6079
  void collect_variation_index (hb_collect_variation_indices_context_t *c) const
6080
0
  { c->layout_variation_indices->add (varIdx); }
6081
6082
  bool sanitize (hb_sanitize_context_t *c) const
6083
0
  {
6084
0
    TRACE_SANITIZE (this);
6085
0
    return_trace (c->check_struct (this));
6086
0
  }
6087
6088
  private:
6089
6090
  float get_delta (hb_font_t *font,
6091
       const ItemVariationStore &store,
6092
       hb_scalar_cache_t *store_cache = nullptr) const
6093
0
  {
6094
0
    return store.get_delta (varIdx, font->coords, font->num_coords, store_cache);
6095
0
  }
6096
6097
  protected:
6098
  VarIdx  varIdx;   /* Variation index */
6099
  HBUINT16  deltaFormat;  /* Format identifier for this table: 0x0x8000 */
6100
  public:
6101
  DEFINE_SIZE_STATIC (6);
6102
};
6103
6104
struct DeviceHeader
6105
{
6106
  protected:
6107
  HBUINT16    reserved1;
6108
  HBUINT16    reserved2;
6109
  public:
6110
  HBUINT16    format;   /* Format identifier */
6111
  public:
6112
  DEFINE_SIZE_STATIC (6);
6113
};
6114
6115
struct Device
6116
{
6117
  hb_position_t get_x_delta (hb_font_t *font,
6118
           const ItemVariationStore &store=Null (ItemVariationStore),
6119
           hb_scalar_cache_t *store_cache = nullptr) const
6120
0
  {
6121
0
    switch (u.b.format)
6122
0
    {
6123
0
#ifndef HB_NO_HINTING
6124
0
    case 1: case 2: case 3:
6125
0
      hb_barrier ();
6126
0
      return u.hinting.get_x_delta (font);
6127
0
#endif
6128
0
#ifndef HB_NO_VAR
6129
0
    case 0x8000:
6130
0
      hb_barrier ();
6131
0
      return u.variation.get_x_delta (font, store, store_cache);
6132
0
#endif
6133
0
    default:
6134
0
      return 0;
6135
0
    }
6136
0
  }
6137
  hb_position_t get_y_delta (hb_font_t *font,
6138
           const ItemVariationStore &store=Null (ItemVariationStore),
6139
           hb_scalar_cache_t *store_cache = nullptr) const
6140
0
  {
6141
0
    switch (u.b.format)
6142
0
    {
6143
0
    case 1: case 2: case 3:
6144
0
#ifndef HB_NO_HINTING
6145
0
      hb_barrier ();
6146
0
      return u.hinting.get_y_delta (font);
6147
0
#endif
6148
0
#ifndef HB_NO_VAR
6149
0
    case 0x8000:
6150
0
      hb_barrier ();
6151
0
      return u.variation.get_y_delta (font, store, store_cache);
6152
0
#endif
6153
0
    default:
6154
0
      return 0;
6155
0
    }
6156
0
  }
6157
6158
  bool sanitize (hb_sanitize_context_t *c) const
6159
0
  {
6160
0
    TRACE_SANITIZE (this);
6161
0
    if (!u.b.format.sanitize (c)) return_trace (false);
6162
0
    switch (u.b.format) {
6163
0
#ifndef HB_NO_HINTING
6164
0
    case 1: case 2: case 3:
6165
0
      hb_barrier ();
6166
0
      return_trace (u.hinting.sanitize (c));
6167
0
#endif
6168
0
#ifndef HB_NO_VAR
6169
0
    case 0x8000:
6170
0
      hb_barrier ();
6171
0
      return_trace (u.variation.sanitize (c));
6172
0
#endif
6173
0
    default:
6174
0
      return_trace (true);
6175
0
    }
6176
0
  }
6177
6178
  Device* copy (hb_serialize_context_t *c,
6179
                const hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map=nullptr) const
6180
0
  {
6181
0
    TRACE_SERIALIZE (this);
6182
0
    switch (u.b.format) {
6183
0
#ifndef HB_NO_HINTING
6184
0
    case 1:
6185
0
    case 2:
6186
0
    case 3:
6187
0
      hb_barrier ();
6188
0
      return_trace (reinterpret_cast<Device *> (u.hinting.copy (c)));
6189
0
#endif
6190
0
#ifndef HB_NO_VAR
6191
0
    case 0x8000:
6192
0
      hb_barrier ();
6193
0
      return_trace (reinterpret_cast<Device *> (u.variation.copy (c, layout_variation_idx_delta_map)));
6194
0
#endif
6195
0
    default:
6196
0
      return_trace (nullptr);
6197
0
    }
6198
0
  }
6199
6200
  void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
6201
0
  {
6202
0
    switch (u.b.format) {
6203
0
#ifndef HB_NO_HINTING
6204
0
    case 1:
6205
0
    case 2:
6206
0
    case 3:
6207
0
      return;
6208
0
#endif
6209
0
#ifndef HB_NO_VAR
6210
0
    case 0x8000:
6211
0
      hb_barrier ();
6212
0
      u.variation.collect_variation_index (c);
6213
0
      return;
6214
0
#endif
6215
0
    default:
6216
0
      return;
6217
0
    }
6218
0
  }
6219
6220
  unsigned get_variation_index () const
6221
0
  {
6222
0
    switch (u.b.format) {
6223
0
#ifndef HB_NO_VAR
6224
0
    case 0x8000:
6225
0
      hb_barrier ();
6226
0
      return u.variation.varIdx;
6227
0
#endif
6228
0
    default:
6229
0
      return HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
6230
0
    }
6231
0
  }
6232
6233
  bool is_variation_device () const
6234
0
  {
6235
0
    switch (u.b.format) {
6236
0
#ifndef HB_NO_VAR
6237
0
    case 0x8000:
6238
0
      return true;
6239
0
#endif
6240
0
    default:
6241
0
      return false;
6242
0
    }
6243
0
  }
6244
6245
  protected:
6246
  union {
6247
  DeviceHeader    b;
6248
  HintingDevice   hinting;
6249
#ifndef HB_NO_VAR
6250
  VariationDevice variation;
6251
#endif
6252
  } u;
6253
  public:
6254
  DEFINE_SIZE_UNION (6, b);
6255
};
6256
6257
6258
} /* namespace OT */
6259
6260
6261
#endif /* HB_OT_LAYOUT_COMMON_HH */