xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-subset-input.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2018  Google, Inc.
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  *
24*2d1272b8SAndroid Build Coastguard Worker  * Google Author(s): Garret Rieger, Roderick Sheeter
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SUBSET_INPUT_HH
28*2d1272b8SAndroid Build Coastguard Worker #define HB_SUBSET_INPUT_HH
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker 
31*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
32*2d1272b8SAndroid Build Coastguard Worker 
33*2d1272b8SAndroid Build Coastguard Worker #include "hb-subset.h"
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-map.hh"
35*2d1272b8SAndroid Build Coastguard Worker #include "hb-set.hh"
36*2d1272b8SAndroid Build Coastguard Worker #include "hb-cplusplus.hh"
37*2d1272b8SAndroid Build Coastguard Worker #include "hb-font.hh"
38*2d1272b8SAndroid Build Coastguard Worker #include "hb-subset-instancer-solver.hh"
39*2d1272b8SAndroid Build Coastguard Worker 
40*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_name_record_ids_t
41*2d1272b8SAndroid Build Coastguard Worker {
42*2d1272b8SAndroid Build Coastguard Worker   hb_ot_name_record_ids_t () = default;
hb_ot_name_record_ids_thb_ot_name_record_ids_t43*2d1272b8SAndroid Build Coastguard Worker   hb_ot_name_record_ids_t (unsigned platform_id_,
44*2d1272b8SAndroid Build Coastguard Worker                            unsigned encoding_id_,
45*2d1272b8SAndroid Build Coastguard Worker                            unsigned language_id_,
46*2d1272b8SAndroid Build Coastguard Worker                            unsigned name_id_)
47*2d1272b8SAndroid Build Coastguard Worker       :platform_id (platform_id_),
48*2d1272b8SAndroid Build Coastguard Worker       encoding_id (encoding_id_),
49*2d1272b8SAndroid Build Coastguard Worker       language_id (language_id_),
50*2d1272b8SAndroid Build Coastguard Worker       name_id (name_id_) {}
51*2d1272b8SAndroid Build Coastguard Worker 
operator !=hb_ot_name_record_ids_t52*2d1272b8SAndroid Build Coastguard Worker   bool operator != (const hb_ot_name_record_ids_t o) const
53*2d1272b8SAndroid Build Coastguard Worker   { return !(*this == o); }
54*2d1272b8SAndroid Build Coastguard Worker 
operator ==hb_ot_name_record_ids_t55*2d1272b8SAndroid Build Coastguard Worker   inline bool operator == (const hb_ot_name_record_ids_t& o) const
56*2d1272b8SAndroid Build Coastguard Worker   {
57*2d1272b8SAndroid Build Coastguard Worker     return platform_id == o.platform_id &&
58*2d1272b8SAndroid Build Coastguard Worker            encoding_id == o.encoding_id &&
59*2d1272b8SAndroid Build Coastguard Worker            language_id == o.language_id &&
60*2d1272b8SAndroid Build Coastguard Worker            name_id == o.name_id;
61*2d1272b8SAndroid Build Coastguard Worker   }
62*2d1272b8SAndroid Build Coastguard Worker 
hashhb_ot_name_record_ids_t63*2d1272b8SAndroid Build Coastguard Worker   inline uint32_t hash () const
64*2d1272b8SAndroid Build Coastguard Worker   {
65*2d1272b8SAndroid Build Coastguard Worker     uint32_t current = 0;
66*2d1272b8SAndroid Build Coastguard Worker     current = current * 31 + hb_hash (platform_id);
67*2d1272b8SAndroid Build Coastguard Worker     current = current * 31 + hb_hash (encoding_id);
68*2d1272b8SAndroid Build Coastguard Worker     current = current * 31 + hb_hash (language_id);
69*2d1272b8SAndroid Build Coastguard Worker     current = current * 31 + hb_hash (name_id);
70*2d1272b8SAndroid Build Coastguard Worker     return current;
71*2d1272b8SAndroid Build Coastguard Worker   }
72*2d1272b8SAndroid Build Coastguard Worker 
73*2d1272b8SAndroid Build Coastguard Worker   unsigned platform_id;
74*2d1272b8SAndroid Build Coastguard Worker   unsigned encoding_id;
75*2d1272b8SAndroid Build Coastguard Worker   unsigned language_id;
76*2d1272b8SAndroid Build Coastguard Worker   unsigned name_id;
77*2d1272b8SAndroid Build Coastguard Worker };
78*2d1272b8SAndroid Build Coastguard Worker 
79*2d1272b8SAndroid Build Coastguard Worker typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t;
80*2d1272b8SAndroid Build Coastguard Worker 
81*2d1272b8SAndroid Build Coastguard Worker 
82*2d1272b8SAndroid Build Coastguard Worker HB_MARK_AS_FLAG_T (hb_subset_flags_t);
83*2d1272b8SAndroid Build Coastguard Worker 
84*2d1272b8SAndroid Build Coastguard Worker struct hb_subset_input_t
85*2d1272b8SAndroid Build Coastguard Worker {
86*2d1272b8SAndroid Build Coastguard Worker   HB_INTERNAL hb_subset_input_t ();
87*2d1272b8SAndroid Build Coastguard Worker 
~hb_subset_input_thb_subset_input_t88*2d1272b8SAndroid Build Coastguard Worker   ~hb_subset_input_t ()
89*2d1272b8SAndroid Build Coastguard Worker   {
90*2d1272b8SAndroid Build Coastguard Worker     sets.~sets_t ();
91*2d1272b8SAndroid Build Coastguard Worker 
92*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API
93*2d1272b8SAndroid Build Coastguard Worker     for (auto _ : name_table_overrides.values ())
94*2d1272b8SAndroid Build Coastguard Worker       _.fini ();
95*2d1272b8SAndroid Build Coastguard Worker #endif
96*2d1272b8SAndroid Build Coastguard Worker   }
97*2d1272b8SAndroid Build Coastguard Worker 
98*2d1272b8SAndroid Build Coastguard Worker   hb_object_header_t header;
99*2d1272b8SAndroid Build Coastguard Worker 
100*2d1272b8SAndroid Build Coastguard Worker   struct sets_t {
101*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> glyphs;
102*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> unicodes;
103*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> no_subset_tables;
104*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> drop_tables;
105*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> name_ids;
106*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> name_languages;
107*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> layout_features;
108*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> layout_scripts;
109*2d1272b8SAndroid Build Coastguard Worker   };
110*2d1272b8SAndroid Build Coastguard Worker 
111*2d1272b8SAndroid Build Coastguard Worker   union {
112*2d1272b8SAndroid Build Coastguard Worker     sets_t sets;
113*2d1272b8SAndroid Build Coastguard Worker     hb::shared_ptr<hb_set_t> set_ptrs[sizeof (sets_t) / sizeof (hb_set_t*)];
114*2d1272b8SAndroid Build Coastguard Worker   };
115*2d1272b8SAndroid Build Coastguard Worker 
116*2d1272b8SAndroid Build Coastguard Worker   unsigned flags;
117*2d1272b8SAndroid Build Coastguard Worker   bool attach_accelerator_data = false;
118*2d1272b8SAndroid Build Coastguard Worker 
119*2d1272b8SAndroid Build Coastguard Worker   // If set loca format will always be the long version.
120*2d1272b8SAndroid Build Coastguard Worker   bool force_long_loca = false;
121*2d1272b8SAndroid Build Coastguard Worker 
122*2d1272b8SAndroid Build Coastguard Worker   hb_hashmap_t<hb_tag_t, Triple> axes_location;
123*2d1272b8SAndroid Build Coastguard Worker   hb_map_t glyph_map;
124*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API
125*2d1272b8SAndroid Build Coastguard Worker   hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides;
126*2d1272b8SAndroid Build Coastguard Worker #endif
127*2d1272b8SAndroid Build Coastguard Worker 
num_setshb_subset_input_t128*2d1272b8SAndroid Build Coastguard Worker   inline unsigned num_sets () const
129*2d1272b8SAndroid Build Coastguard Worker   {
130*2d1272b8SAndroid Build Coastguard Worker     return sizeof (set_ptrs) / sizeof (hb_set_t*);
131*2d1272b8SAndroid Build Coastguard Worker   }
132*2d1272b8SAndroid Build Coastguard Worker 
sets_iterhb_subset_input_t133*2d1272b8SAndroid Build Coastguard Worker   inline hb_array_t<hb::shared_ptr<hb_set_t>> sets_iter ()
134*2d1272b8SAndroid Build Coastguard Worker   {
135*2d1272b8SAndroid Build Coastguard Worker     return hb_array (set_ptrs);
136*2d1272b8SAndroid Build Coastguard Worker   }
137*2d1272b8SAndroid Build Coastguard Worker 
in_errorhb_subset_input_t138*2d1272b8SAndroid Build Coastguard Worker   bool in_error () const
139*2d1272b8SAndroid Build Coastguard Worker   {
140*2d1272b8SAndroid Build Coastguard Worker     for (unsigned i = 0; i < num_sets (); i++)
141*2d1272b8SAndroid Build Coastguard Worker     {
142*2d1272b8SAndroid Build Coastguard Worker       if (unlikely (set_ptrs[i]->in_error ()))
143*2d1272b8SAndroid Build Coastguard Worker         return true;
144*2d1272b8SAndroid Build Coastguard Worker     }
145*2d1272b8SAndroid Build Coastguard Worker 
146*2d1272b8SAndroid Build Coastguard Worker     return axes_location.in_error ()
147*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API
148*2d1272b8SAndroid Build Coastguard Worker 	|| name_table_overrides.in_error ()
149*2d1272b8SAndroid Build Coastguard Worker #endif
150*2d1272b8SAndroid Build Coastguard Worker 	;
151*2d1272b8SAndroid Build Coastguard Worker   }
152*2d1272b8SAndroid Build Coastguard Worker };
153*2d1272b8SAndroid Build Coastguard Worker 
154*2d1272b8SAndroid Build Coastguard Worker 
155*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_SUBSET_INPUT_HH */
156