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_INPUT_HH |
28 | #define HB_SUBSET_INPUT_HH |
29 | |
30 | |
31 | #include "hb.hh" |
32 | |
33 | #include "hb-subset.h" |
34 | #include "hb-map.hh" |
35 | #include "hb-set.hh" |
36 | #include "hb-cplusplus.hh" |
37 | #include "hb-font.hh" |
38 | #include "hb-subset-instancer-solver.hh" |
39 | |
40 | struct hb_ot_name_record_ids_t |
41 | { |
42 | hb_ot_name_record_ids_t () = default; |
43 | hb_ot_name_record_ids_t (unsigned platform_id_, |
44 | unsigned encoding_id_, |
45 | unsigned language_id_, |
46 | unsigned name_id_) |
47 | :platform_id (platform_id_), |
48 | encoding_id (encoding_id_), |
49 | language_id (language_id_), |
50 | name_id (name_id_) {} |
51 | |
52 | bool operator != (const hb_ot_name_record_ids_t o) const |
53 | { return !(*this == o); } |
54 | |
55 | inline bool operator == (const hb_ot_name_record_ids_t& o) const |
56 | { |
57 | return platform_id == o.platform_id && |
58 | encoding_id == o.encoding_id && |
59 | language_id == o.language_id && |
60 | name_id == o.name_id; |
61 | } |
62 | |
63 | inline uint32_t hash () const |
64 | { |
65 | uint32_t current = 0; |
66 | current = current * 31 + hb_hash (platform_id); |
67 | current = current * 31 + hb_hash (encoding_id); |
68 | current = current * 31 + hb_hash (language_id); |
69 | current = current * 31 + hb_hash (name_id); |
70 | return current; |
71 | } |
72 | |
73 | unsigned platform_id; |
74 | unsigned encoding_id; |
75 | unsigned language_id; |
76 | unsigned name_id; |
77 | }; |
78 | |
79 | typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t; |
80 | |
81 | |
82 | HB_MARK_AS_FLAG_T (hb_subset_flags_t); |
83 | |
84 | struct hb_subset_input_t |
85 | { |
86 | HB_INTERNAL hb_subset_input_t (); |
87 | |
88 | ~hb_subset_input_t () |
89 | { |
90 | sets.~sets_t (); |
91 | |
92 | #ifdef HB_EXPERIMENTAL_API |
93 | for (auto _ : name_table_overrides.values ()) |
94 | _.fini (); |
95 | #endif |
96 | } |
97 | |
98 | hb_object_header_t ; |
99 | |
100 | struct sets_t { |
101 | hb::shared_ptr<hb_set_t> glyphs; |
102 | hb::shared_ptr<hb_set_t> unicodes; |
103 | hb::shared_ptr<hb_set_t> no_subset_tables; |
104 | hb::shared_ptr<hb_set_t> drop_tables; |
105 | hb::shared_ptr<hb_set_t> name_ids; |
106 | hb::shared_ptr<hb_set_t> name_languages; |
107 | hb::shared_ptr<hb_set_t> layout_features; |
108 | hb::shared_ptr<hb_set_t> layout_scripts; |
109 | }; |
110 | |
111 | union { |
112 | sets_t sets; |
113 | hb::shared_ptr<hb_set_t> set_ptrs[sizeof (sets_t) / sizeof (hb_set_t*)]; |
114 | }; |
115 | |
116 | unsigned flags; |
117 | bool attach_accelerator_data = false; |
118 | |
119 | // If set loca format will always be the long version. |
120 | bool force_long_loca = false; |
121 | |
122 | hb_hashmap_t<hb_tag_t, Triple> axes_location; |
123 | hb_map_t glyph_map; |
124 | #ifdef HB_EXPERIMENTAL_API |
125 | hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides; |
126 | #endif |
127 | |
128 | inline unsigned num_sets () const |
129 | { |
130 | return sizeof (set_ptrs) / sizeof (hb_set_t*); |
131 | } |
132 | |
133 | inline hb_array_t<hb::shared_ptr<hb_set_t>> sets_iter () |
134 | { |
135 | return hb_array (set_ptrs); |
136 | } |
137 | |
138 | bool in_error () const |
139 | { |
140 | for (unsigned i = 0; i < num_sets (); i++) |
141 | { |
142 | if (unlikely (set_ptrs[i]->in_error ())) |
143 | return true; |
144 | } |
145 | |
146 | return axes_location.in_error () |
147 | #ifdef HB_EXPERIMENTAL_API |
148 | || name_table_overrides.in_error () |
149 | #endif |
150 | ; |
151 | } |
152 | }; |
153 | |
154 | |
155 | #endif /* HB_SUBSET_INPUT_HH */ |
156 | |