QtBase  v6.3.1
hb-subset-plan.hh
Go to the documentation of this file.
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 
39 {
41 
42  bool successful;
43  unsigned flags;
44 
45  // For each cp that we'd like to retain maps to the corresponding gid.
47 
48  // name_ids we would like to retain
50 
51  // name_languages we would like to retain
53 
54  //layout features which will be preserved
56 
57  //glyph ids requested to retain
59 
60  // Tables which should not be processed, just pass them through.
62 
63  // Tables which should be dropped.
65 
66  // The glyph subset
68 
69  // Old -> New glyph id mapping
72 
73  // Plan is only good for a specific source/dest so keep them with it
76 
77  unsigned int _num_output_glyphs;
82 
83  //active lookups we'd like to retain
86 
87  //active langsys we'd like to retain
90 
91  //active features after removing redundant langsys and prune_features
94 
95  //active layers/palettes we'd like to retain
98 
99  //The set of layout item variation store delta set indices to be retained
101  //Old -> New layout item variation store delta set index mapping
103 
104  public:
105 
106  bool in_error () const { return !successful; }
107 
108  bool check_success(bool success)
109  {
110  successful = (successful && success);
111  return successful;
112  }
113 
114  /*
115  * The set of input glyph ids which will be retained in the subset.
116  * Does NOT include ids kept due to retain_gids. You probably want to use
117  * glyph_map/reverse_glyph_map.
118  */
119  inline const hb_set_t *
120  glyphset () const
121  {
122  return _glyphset;
123  }
124 
125  /*
126  * The set of input glyph ids which will be retained in the subset.
127  */
128  inline const hb_set_t *
129  glyphset_gsub () const
130  {
131  return _glyphset_gsub;
132  }
133 
134  /*
135  * The total number of output glyphs in the final subset.
136  */
137  inline unsigned int
139  {
140  return _num_output_glyphs;
141  }
142 
143  /*
144  * Given an output gid , returns true if that glyph id is an empty
145  * glyph (ie. it's a gid that we are dropping all data for).
146  */
147  inline bool is_empty_glyph (hb_codepoint_t gid) const
148  {
149  return !_glyphset->has (gid);
150  }
151 
152  inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
153  hb_codepoint_t *new_gid) const
154  {
155  hb_codepoint_t old_gid = codepoint_to_glyph->get (codepoint);
156  if (old_gid == HB_MAP_VALUE_INVALID)
157  return false;
158 
159  return new_gid_for_old_gid (old_gid, new_gid);
160  }
161 
162  inline bool new_gid_for_old_gid (hb_codepoint_t old_gid,
163  hb_codepoint_t *new_gid) const
164  {
165  hb_codepoint_t gid = glyph_map->get (old_gid);
166  if (gid == HB_MAP_VALUE_INVALID)
167  return false;
168 
169  *new_gid = gid;
170  return true;
171  }
172 
173  inline bool old_gid_for_new_gid (hb_codepoint_t new_gid,
174  hb_codepoint_t *old_gid) const
175  {
176  hb_codepoint_t gid = reverse_glyph_map->get (new_gid);
177  if (gid == HB_MAP_VALUE_INVALID)
178  return false;
179 
180  *old_gid = gid;
181  return true;
182  }
183 
184  inline bool
187  {
188  if (HB_DEBUG_SUBSET)
189  {
190  hb_blob_t *source_blob = source->reference_table (tag);
191  DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
192  HB_UNTAG(tag),
194  hb_blob_get_length (source_blob));
195  hb_blob_destroy (source_blob);
196  }
198  }
199 };
200 
201 #endif /* HB_SUBSET_PLAN_HH */
unsigned int hb_blob_get_length(hb_blob_t *blob)
Definition: hb-blob.cc:360
void hb_blob_destroy(hb_blob_t *blob)
Definition: hb-blob.cc:262
#define DEBUG_MSG(WHAT, OBJ,...)
hb_bool_t hb_face_builder_add_table(hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
Definition: hb-face.cc:770
#define HB_MAP_VALUE_INVALID
Definition: hb-map.h:46
GLsizei GLsizei GLchar * source
#define HB_UNTAG(tag)
Definition: hb-common.h:180
uint32_t hb_codepoint_t
Definition: hb-common.h:106
uint32_t hb_tag_t
Definition: hb-common.h:157
V get(K key) const
Definition: hb-map.hh:202
bool has(hb_codepoint_t k) const
Definition: hb-set.hh:111
bool check_success(bool success)
hb_set_t * unicodes
hb_set_t * layout_variation_indices
hb_set_t * _glyphset
hb_hashmap_t< unsigned, hb_set_t * > * gpos_langsys
hb_set_t * _glyphset_colred
bool old_gid_for_new_gid(hb_codepoint_t new_gid, hb_codepoint_t *old_gid) const
bool new_gid_for_codepoint(hb_codepoint_t codepoint, hb_codepoint_t *new_gid) const
hb_map_t * layout_variation_idx_map
bool is_empty_glyph(hb_codepoint_t gid) const
hb_map_t * colr_palettes
hb_set_t * layout_features
hb_map_t * gsub_features
hb_object_header_t header
hb_map_t * gpos_lookups
bool new_gid_for_old_gid(hb_codepoint_t old_gid, hb_codepoint_t *new_gid) const
bool in_error() const
hb_map_t * glyph_map
hb_map_t * gsub_lookups
unsigned int _num_output_glyphs
const hb_set_t * glyphset_gsub() const
hb_map_t * gpos_features
hb_set_t * drop_tables
unsigned int num_output_glyphs() const
hb_map_t * codepoint_to_glyph
bool add_table(hb_tag_t tag, hb_blob_t *contents)
hb_hashmap_t< unsigned, hb_set_t * > * gsub_langsys
hb_set_t * _glyphset_gsub
hb_face_t * dest
const hb_set_t * glyphset() const
hb_set_t * name_languages
hb_set_t * no_subset_tables
hb_map_t * colrv1_layers
hb_set_t * name_ids
hb_face_t * source
hb_set_t * glyphs_requested
hb_set_t * _glyphset_mathed
hb_map_t * reverse_glyph_map
XmlOutput::xml_output tag(const QString &name)
Definition: xmloutput.h:154