Coverage Report

Created: 2026-11-06 11:29

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