Coverage Report

Created: 2021-08-22 09:07

/src/skia/third_party/externals/harfbuzz/src/hb-subset-plan.hh
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright © 2018  Google, Inc.
3
 *
4
 *  This is part of HarfBuzz, a text shaping library.
5
 *
6
 * Permission is hereby granted, without written agreement and without
7
 * license or royalty fees, to use, copy, modify, and distribute this
8
 * software and its documentation for any purpose, provided that the
9
 * above copyright notice and the following two paragraphs appear in
10
 * all copies of this software.
11
 *
12
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16
 * DAMAGE.
17
 *
18
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23
 *
24
 * Google Author(s): Garret Rieger, Roderick Sheeter
25
 */
26
27
#ifndef HB_SUBSET_PLAN_HH
28
#define HB_SUBSET_PLAN_HH
29
30
#include "hb.hh"
31
32
#include "hb-subset.h"
33
#include "hb-subset-input.hh"
34
35
#include "hb-map.hh"
36
#include "hb-set.hh"
37
38
struct hb_subset_plan_t
39
{
40
  hb_object_header_t header;
41
42
  bool successful;
43
  unsigned flags;
44
45
  // For each cp that we'd like to retain maps to the corresponding gid.
46
  hb_set_t *unicodes;
47
48
  // name_ids we would like to retain
49
  hb_set_t *name_ids;
50
51
  // name_languages we would like to retain
52
  hb_set_t *name_languages;
53
54
  //layout features which will be preserved
55
  hb_set_t *layout_features;
56
57
  //glyph ids requested to retain
58
  hb_set_t *glyphs_requested;
59
60
  // Tables which should not be processed, just pass them through.
61
  hb_set_t *no_subset_tables;
62
63
  // Tables which should be dropped.
64
  hb_set_t *drop_tables;
65
66
  // The glyph subset
67
  hb_map_t *codepoint_to_glyph;
68
69
  // Old -> New glyph id mapping
70
  hb_map_t *glyph_map;
71
  hb_map_t *reverse_glyph_map;
72
73
  // Plan is only good for a specific source/dest so keep them with it
74
  hb_face_t *source;
75
  hb_face_t *dest;
76
77
  unsigned int _num_output_glyphs;
78
  hb_set_t *_glyphset;
79
  hb_set_t *_glyphset_gsub;
80
81
  //active lookups we'd like to retain
82
  hb_map_t *gsub_lookups;
83
  hb_map_t *gpos_lookups;
84
85
  //active langsys we'd like to retain
86
  hb_hashmap_t<unsigned, hb_set_t *, (unsigned)-1, nullptr> *gsub_langsys;
87
  hb_hashmap_t<unsigned, hb_set_t *, (unsigned)-1, nullptr> *gpos_langsys;
88
89
  //active features after removing redundant langsys and prune_features
90
  hb_map_t *gsub_features;
91
  hb_map_t *gpos_features;
92
93
  //active layers/palettes we'd like to retain
94
  hb_map_t *colrv1_layers;
95
  hb_map_t *colr_palettes;
96
97
  //The set of layout item variation store delta set indices to be retained
98
  hb_set_t *layout_variation_indices;
99
  //Old -> New layout item variation store delta set index mapping
100
  hb_map_t *layout_variation_idx_map;
101
102
 public:
103
104
0
  bool in_error () const { return !successful; }
105
106
  bool check_success(bool success)
107
0
  {
108
0
    successful = (successful && success);
109
0
    return successful;
110
0
  }
111
112
  /*
113
   * The set of input glyph ids which will be retained in the subset.
114
   * Does NOT include ids kept due to retain_gids. You probably want to use
115
   * glyph_map/reverse_glyph_map.
116
   */
117
  inline const hb_set_t *
118
  glyphset () const
119
0
  {
120
0
    return _glyphset;
121
0
  }
122
123
  /*
124
   * The set of input glyph ids which will be retained in the subset.
125
   */
126
  inline const hb_set_t *
127
  glyphset_gsub () const
128
0
  {
129
0
    return _glyphset_gsub;
130
0
  }
131
132
  /*
133
   * The total number of output glyphs in the final subset.
134
   */
135
  inline unsigned int
136
  num_output_glyphs () const
137
0
  {
138
0
    return _num_output_glyphs;
139
0
  }
140
141
  /*
142
   * Given an output gid , returns true if that glyph id is an empty
143
   * glyph (ie. it's a gid that we are dropping all data for).
144
   */
145
  inline bool is_empty_glyph (hb_codepoint_t gid) const
146
0
  {
147
0
    return !_glyphset->has (gid);
148
0
  }
149
150
  inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
151
             hb_codepoint_t *new_gid) const
152
0
  {
153
0
    hb_codepoint_t old_gid = codepoint_to_glyph->get (codepoint);
154
0
    if (old_gid == HB_MAP_VALUE_INVALID)
155
0
      return false;
156
157
0
    return new_gid_for_old_gid (old_gid, new_gid);
158
0
  }
Unexecuted instantiation: hb_subset_plan_t::new_gid_for_codepoint(unsigned int, unsigned int*) const
Unexecuted instantiation: hb_subset_plan_t::new_gid_for_codepoint(unsigned int, unsigned int*) const
159
160
  inline bool new_gid_for_old_gid (hb_codepoint_t old_gid,
161
           hb_codepoint_t *new_gid) const
162
0
  {
163
0
    hb_codepoint_t gid = glyph_map->get (old_gid);
164
0
    if (gid == HB_MAP_VALUE_INVALID)
165
0
      return false;
166
167
0
    *new_gid = gid;
168
0
    return true;
169
0
  }
Unexecuted instantiation: hb_subset_plan_t::new_gid_for_old_gid(unsigned int, unsigned int*) const
Unexecuted instantiation: hb_subset_plan_t::new_gid_for_old_gid(unsigned int, unsigned int*) const
170
171
  inline bool old_gid_for_new_gid (hb_codepoint_t  new_gid,
172
           hb_codepoint_t *old_gid) const
173
0
  {
174
0
    hb_codepoint_t gid = reverse_glyph_map->get (new_gid);
175
0
    if (gid == HB_MAP_VALUE_INVALID)
176
0
      return false;
177
178
0
    *old_gid = gid;
179
0
    return true;
180
0
  }
Unexecuted instantiation: hb_subset_plan_t::old_gid_for_new_gid(unsigned int, unsigned int*) const
Unexecuted instantiation: hb_subset_plan_t::old_gid_for_new_gid(unsigned int, unsigned int*) const
181
182
  inline bool
183
  add_table (hb_tag_t tag,
184
       hb_blob_t *contents)
185
0
  {
186
0
    if (HB_DEBUG_SUBSET)
187
0
    {
188
0
      hb_blob_t *source_blob = source->reference_table (tag);
189
0
      DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
190
0
    HB_UNTAG(tag),
191
0
    hb_blob_get_length (contents),
192
0
    hb_blob_get_length (source_blob));
193
0
      hb_blob_destroy (source_blob);
194
0
    }
195
0
    return hb_face_builder_add_table (dest, tag, contents);
196
0
  }
Unexecuted instantiation: hb_subset_plan_t::add_table(unsigned int, hb_blob_t*)
Unexecuted instantiation: hb_subset_plan_t::add_table(unsigned int, hb_blob_t*)
197
};
198
199
typedef struct hb_subset_plan_t hb_subset_plan_t;
200
201
HB_INTERNAL hb_subset_plan_t *
202
hb_subset_plan_create (hb_face_t           *face,
203
           const hb_subset_input_t   *input);
204
205
HB_INTERNAL void
206
hb_subset_plan_destroy (hb_subset_plan_t *plan);
207
208
#endif /* HB_SUBSET_PLAN_HH */