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): Rod Sheeter |
25 | */ |
26 | |
27 | #ifndef HB_SUBSET_H |
28 | #define HB_SUBSET_H |
29 | |
30 | #include "hb.h" |
31 | #include "hb-ot.h" |
32 | |
33 | HB_BEGIN_DECLS |
34 | |
35 | /** |
36 | * hb_subset_input_t: |
37 | * |
38 | * Things that change based on the input. Characters to keep, etc. |
39 | */ |
40 | |
41 | typedef struct hb_subset_input_t hb_subset_input_t; |
42 | |
43 | /** |
44 | * hb_subset_plan_t: |
45 | * |
46 | * Contains information about how the subset operation will be executed. |
47 | * Such as mappings from the old glyph ids to the new ones in the subset. |
48 | */ |
49 | |
50 | typedef struct hb_subset_plan_t hb_subset_plan_t; |
51 | |
52 | /** |
53 | * hb_subset_flags_t: |
54 | * @HB_SUBSET_FLAGS_DEFAULT: all flags at their default value of false. |
55 | * @HB_SUBSET_FLAGS_NO_HINTING: If set hinting instructions will be dropped in |
56 | * the produced subset. Otherwise hinting instructions will be retained. |
57 | * @HB_SUBSET_FLAGS_RETAIN_GIDS: If set glyph indices will not be modified in |
58 | * the produced subset. If glyphs are dropped their indices will be retained |
59 | * as an empty glyph. |
60 | * @HB_SUBSET_FLAGS_DESUBROUTINIZE: If set and subsetting a CFF font the |
61 | * subsetter will attempt to remove subroutines from the CFF glyphs. |
62 | * @HB_SUBSET_FLAGS_NAME_LEGACY: If set non-unicode name records will be |
63 | * retained in the subset. |
64 | * @HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG: If set the subsetter will set the |
65 | * OVERLAP_SIMPLE flag on each simple glyph. |
66 | * @HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED: If set the subsetter will not |
67 | * drop unrecognized tables and instead pass them through untouched. |
68 | * @HB_SUBSET_FLAGS_NOTDEF_OUTLINE: If set the notdef glyph outline will be |
69 | * retained in the final subset. |
70 | * @HB_SUBSET_FLAGS_GLYPH_NAMES: If set the PS glyph names will be retained |
71 | * in the final subset. |
72 | * @HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES: If set then the unicode ranges in |
73 | * OS/2 will not be recalculated. |
74 | * @HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE: If set don't perform glyph closure on layout |
75 | * substitution rules (GSUB). Since: 7.2.0. |
76 | * |
77 | * List of boolean properties that can be configured on the subset input. |
78 | * |
79 | * Since: 2.9.0 |
80 | **/ |
81 | typedef enum { /*< flags >*/ |
82 | HB_SUBSET_FLAGS_DEFAULT = 0x00000000u, |
83 | HB_SUBSET_FLAGS_NO_HINTING = 0x00000001u, |
84 | HB_SUBSET_FLAGS_RETAIN_GIDS = 0x00000002u, |
85 | HB_SUBSET_FLAGS_DESUBROUTINIZE = 0x00000004u, |
86 | HB_SUBSET_FLAGS_NAME_LEGACY = 0x00000008u, |
87 | HB_SUBSET_FLAGS_SET_OVERLAPS_FLAG = 0x00000010u, |
88 | HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED = 0x00000020u, |
89 | HB_SUBSET_FLAGS_NOTDEF_OUTLINE = 0x00000040u, |
90 | HB_SUBSET_FLAGS_GLYPH_NAMES = 0x00000080u, |
91 | HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES = 0x00000100u, |
92 | HB_SUBSET_FLAGS_NO_LAYOUT_CLOSURE = 0x00000200u, |
93 | } hb_subset_flags_t; |
94 | |
95 | /** |
96 | * hb_subset_sets_t: |
97 | * @HB_SUBSET_SETS_GLYPH_INDEX: the set of glyph indexes to retain in the subset. |
98 | * @HB_SUBSET_SETS_UNICODE: the set of unicode codepoints to retain in the subset. |
99 | * @HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG: the set of table tags which specifies tables that should not be |
100 | * subsetted. |
101 | * @HB_SUBSET_SETS_DROP_TABLE_TAG: the set of table tags which specifies tables which will be dropped |
102 | * in the subset. |
103 | * @HB_SUBSET_SETS_NAME_ID: the set of name ids that will be retained. |
104 | * @HB_SUBSET_SETS_NAME_LANG_ID: the set of name lang ids that will be retained. |
105 | * @HB_SUBSET_SETS_LAYOUT_FEATURE_TAG: the set of layout feature tags that will be retained |
106 | * in the subset. |
107 | * @HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG: the set of layout script tags that will be retained |
108 | * in the subset. Defaults to all tags. Since: 5.0.0 |
109 | * |
110 | * List of sets that can be configured on the subset input. |
111 | * |
112 | * Since: 2.9.1 |
113 | **/ |
114 | typedef enum { |
115 | HB_SUBSET_SETS_GLYPH_INDEX = 0, |
116 | HB_SUBSET_SETS_UNICODE, |
117 | HB_SUBSET_SETS_NO_SUBSET_TABLE_TAG, |
118 | HB_SUBSET_SETS_DROP_TABLE_TAG, |
119 | HB_SUBSET_SETS_NAME_ID, |
120 | HB_SUBSET_SETS_NAME_LANG_ID, |
121 | HB_SUBSET_SETS_LAYOUT_FEATURE_TAG, |
122 | HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG, |
123 | } hb_subset_sets_t; |
124 | |
125 | HB_EXTERN hb_subset_input_t * |
126 | hb_subset_input_create_or_fail (void); |
127 | |
128 | HB_EXTERN hb_subset_input_t * |
129 | hb_subset_input_reference (hb_subset_input_t *input); |
130 | |
131 | HB_EXTERN void |
132 | hb_subset_input_destroy (hb_subset_input_t *input); |
133 | |
134 | HB_EXTERN hb_bool_t |
135 | hb_subset_input_set_user_data (hb_subset_input_t *input, |
136 | hb_user_data_key_t *key, |
137 | void * data, |
138 | hb_destroy_func_t destroy, |
139 | hb_bool_t replace); |
140 | |
141 | HB_EXTERN void * |
142 | hb_subset_input_get_user_data (const hb_subset_input_t *input, |
143 | hb_user_data_key_t *key); |
144 | |
145 | HB_EXTERN void |
146 | hb_subset_input_keep_everything (hb_subset_input_t *input); |
147 | |
148 | HB_EXTERN hb_set_t * |
149 | hb_subset_input_unicode_set (hb_subset_input_t *input); |
150 | |
151 | HB_EXTERN hb_set_t * |
152 | hb_subset_input_glyph_set (hb_subset_input_t *input); |
153 | |
154 | HB_EXTERN hb_set_t * |
155 | hb_subset_input_set (hb_subset_input_t *input, hb_subset_sets_t set_type); |
156 | |
157 | HB_EXTERN hb_map_t* |
158 | hb_subset_input_old_to_new_glyph_mapping (hb_subset_input_t *input); |
159 | |
160 | HB_EXTERN hb_subset_flags_t |
161 | hb_subset_input_get_flags (hb_subset_input_t *input); |
162 | |
163 | HB_EXTERN void |
164 | hb_subset_input_set_flags (hb_subset_input_t *input, |
165 | unsigned value); |
166 | |
167 | HB_EXTERN hb_bool_t |
168 | hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, |
169 | hb_face_t *face, |
170 | hb_tag_t axis_tag); |
171 | |
172 | HB_EXTERN hb_bool_t |
173 | hb_subset_input_pin_axis_location (hb_subset_input_t *input, |
174 | hb_face_t *face, |
175 | hb_tag_t axis_tag, |
176 | float axis_value); |
177 | |
178 | #ifdef HB_EXPERIMENTAL_API |
179 | HB_EXTERN hb_bool_t |
180 | hb_subset_input_set_axis_range (hb_subset_input_t *input, |
181 | hb_face_t *face, |
182 | hb_tag_t axis_tag, |
183 | float axis_min_value, |
184 | float axis_max_value); |
185 | |
186 | HB_EXTERN hb_bool_t |
187 | hb_subset_input_override_name_table (hb_subset_input_t *input, |
188 | hb_ot_name_id_t name_id, |
189 | unsigned platform_id, |
190 | unsigned encoding_id, |
191 | unsigned language_id, |
192 | const char *name_str, |
193 | int str_len); |
194 | |
195 | #endif |
196 | |
197 | HB_EXTERN hb_face_t * |
198 | hb_subset_preprocess (hb_face_t *source); |
199 | |
200 | HB_EXTERN hb_face_t * |
201 | hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input); |
202 | |
203 | HB_EXTERN hb_face_t * |
204 | hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan); |
205 | |
206 | HB_EXTERN hb_subset_plan_t * |
207 | hb_subset_plan_create_or_fail (hb_face_t *face, |
208 | const hb_subset_input_t *input); |
209 | |
210 | HB_EXTERN void |
211 | hb_subset_plan_destroy (hb_subset_plan_t *plan); |
212 | |
213 | HB_EXTERN hb_map_t * |
214 | hb_subset_plan_old_to_new_glyph_mapping (const hb_subset_plan_t *plan); |
215 | |
216 | HB_EXTERN hb_map_t * |
217 | hb_subset_plan_new_to_old_glyph_mapping (const hb_subset_plan_t *plan); |
218 | |
219 | HB_EXTERN hb_map_t * |
220 | hb_subset_plan_unicode_to_old_glyph_mapping (const hb_subset_plan_t *plan); |
221 | |
222 | |
223 | HB_EXTERN hb_subset_plan_t * |
224 | hb_subset_plan_reference (hb_subset_plan_t *plan); |
225 | |
226 | HB_EXTERN hb_bool_t |
227 | hb_subset_plan_set_user_data (hb_subset_plan_t *plan, |
228 | hb_user_data_key_t *key, |
229 | void *data, |
230 | hb_destroy_func_t destroy, |
231 | hb_bool_t replace); |
232 | |
233 | HB_EXTERN void * |
234 | hb_subset_plan_get_user_data (const hb_subset_plan_t *plan, |
235 | hb_user_data_key_t *key); |
236 | |
237 | |
238 | HB_END_DECLS |
239 | |
240 | #endif /* HB_SUBSET_H */ |
241 | |