xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-subset-input.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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;
hb_ot_name_record_ids_thb_ot_name_record_ids_t43   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 
operator !=hb_ot_name_record_ids_t52   bool operator != (const hb_ot_name_record_ids_t o) const
53   { return !(*this == o); }
54 
operator ==hb_ot_name_record_ids_t55   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 
hashhb_ot_name_record_ids_t63   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 
~hb_subset_input_thb_subset_input_t88   ~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 header;
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 
num_setshb_subset_input_t128   inline unsigned num_sets () const
129   {
130     return sizeof (set_ptrs) / sizeof (hb_set_t*);
131   }
132 
sets_iterhb_subset_input_t133   inline hb_array_t<hb::shared_ptr<hb_set_t>> sets_iter ()
134   {
135     return hb_array (set_ptrs);
136   }
137 
in_errorhb_subset_input_t138   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