xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-subset-accelerator.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2022  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
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SUBSET_ACCELERATOR_HH
28*2d1272b8SAndroid Build Coastguard Worker #define HB_SUBSET_ACCELERATOR_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-map.hh"
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-multimap.hh"
35*2d1272b8SAndroid Build Coastguard Worker #include "hb-set.hh"
36*2d1272b8SAndroid Build Coastguard Worker 
37*2d1272b8SAndroid Build Coastguard Worker extern HB_INTERNAL hb_user_data_key_t _hb_subset_accelerator_user_data_key;
38*2d1272b8SAndroid Build Coastguard Worker 
39*2d1272b8SAndroid Build Coastguard Worker namespace CFF {
40*2d1272b8SAndroid Build Coastguard Worker struct cff_subset_accelerator_t;
41*2d1272b8SAndroid Build Coastguard Worker }
42*2d1272b8SAndroid Build Coastguard Worker 
43*2d1272b8SAndroid Build Coastguard Worker namespace OT {
44*2d1272b8SAndroid Build Coastguard Worker struct SubtableUnicodesCache;
45*2d1272b8SAndroid Build Coastguard Worker struct cff1_subset_accelerator_t;
46*2d1272b8SAndroid Build Coastguard Worker struct cff2_subset_accelerator_t;
47*2d1272b8SAndroid Build Coastguard Worker }
48*2d1272b8SAndroid Build Coastguard Worker 
49*2d1272b8SAndroid Build Coastguard Worker struct hb_subset_accelerator_t
50*2d1272b8SAndroid Build Coastguard Worker {
user_data_keyhb_subset_accelerator_t51*2d1272b8SAndroid Build Coastguard Worker   static hb_user_data_key_t* user_data_key()
52*2d1272b8SAndroid Build Coastguard Worker   {
53*2d1272b8SAndroid Build Coastguard Worker     return &_hb_subset_accelerator_user_data_key;
54*2d1272b8SAndroid Build Coastguard Worker   }
55*2d1272b8SAndroid Build Coastguard Worker 
createhb_subset_accelerator_t56*2d1272b8SAndroid Build Coastguard Worker   static hb_subset_accelerator_t* create(hb_face_t *source,
57*2d1272b8SAndroid Build Coastguard Worker 					 const hb_map_t& unicode_to_gid_,
58*2d1272b8SAndroid Build Coastguard Worker 					 const hb_set_t& unicodes_,
59*2d1272b8SAndroid Build Coastguard Worker 					 bool has_seac_) {
60*2d1272b8SAndroid Build Coastguard Worker     hb_subset_accelerator_t* accel =
61*2d1272b8SAndroid Build Coastguard Worker         (hb_subset_accelerator_t*) hb_calloc (1, sizeof(hb_subset_accelerator_t));
62*2d1272b8SAndroid Build Coastguard Worker 
63*2d1272b8SAndroid Build Coastguard Worker     if (unlikely (!accel)) return accel;
64*2d1272b8SAndroid Build Coastguard Worker 
65*2d1272b8SAndroid Build Coastguard Worker     new (accel) hb_subset_accelerator_t (source,
66*2d1272b8SAndroid Build Coastguard Worker 					 unicode_to_gid_,
67*2d1272b8SAndroid Build Coastguard Worker 					 unicodes_,
68*2d1272b8SAndroid Build Coastguard Worker 					 has_seac_);
69*2d1272b8SAndroid Build Coastguard Worker 
70*2d1272b8SAndroid Build Coastguard Worker     return accel;
71*2d1272b8SAndroid Build Coastguard Worker   }
72*2d1272b8SAndroid Build Coastguard Worker 
destroyhb_subset_accelerator_t73*2d1272b8SAndroid Build Coastguard Worker   static void destroy (void* p)
74*2d1272b8SAndroid Build Coastguard Worker   {
75*2d1272b8SAndroid Build Coastguard Worker     if (!p) return;
76*2d1272b8SAndroid Build Coastguard Worker 
77*2d1272b8SAndroid Build Coastguard Worker     hb_subset_accelerator_t *accel = (hb_subset_accelerator_t *) p;
78*2d1272b8SAndroid Build Coastguard Worker 
79*2d1272b8SAndroid Build Coastguard Worker     accel->~hb_subset_accelerator_t ();
80*2d1272b8SAndroid Build Coastguard Worker 
81*2d1272b8SAndroid Build Coastguard Worker     hb_free (accel);
82*2d1272b8SAndroid Build Coastguard Worker   }
83*2d1272b8SAndroid Build Coastguard Worker 
hb_subset_accelerator_thb_subset_accelerator_t84*2d1272b8SAndroid Build Coastguard Worker   hb_subset_accelerator_t (hb_face_t *source,
85*2d1272b8SAndroid Build Coastguard Worker 			   const hb_map_t& unicode_to_gid_,
86*2d1272b8SAndroid Build Coastguard Worker 			   const hb_set_t& unicodes_,
87*2d1272b8SAndroid Build Coastguard Worker 			   bool has_seac_) :
88*2d1272b8SAndroid Build Coastguard Worker     unicode_to_gid(unicode_to_gid_),
89*2d1272b8SAndroid Build Coastguard Worker     unicodes(unicodes_),
90*2d1272b8SAndroid Build Coastguard Worker     cmap_cache(nullptr),
91*2d1272b8SAndroid Build Coastguard Worker     destroy_cmap_cache(nullptr),
92*2d1272b8SAndroid Build Coastguard Worker     has_seac(has_seac_),
93*2d1272b8SAndroid Build Coastguard Worker     source(hb_face_reference (source))
94*2d1272b8SAndroid Build Coastguard Worker   {
95*2d1272b8SAndroid Build Coastguard Worker     gid_to_unicodes.alloc (unicode_to_gid.get_population ());
96*2d1272b8SAndroid Build Coastguard Worker     for (const auto &_ : unicode_to_gid)
97*2d1272b8SAndroid Build Coastguard Worker     {
98*2d1272b8SAndroid Build Coastguard Worker       auto unicode = _.first;
99*2d1272b8SAndroid Build Coastguard Worker       auto gid = _.second;
100*2d1272b8SAndroid Build Coastguard Worker       gid_to_unicodes.add (gid, unicode);
101*2d1272b8SAndroid Build Coastguard Worker     }
102*2d1272b8SAndroid Build Coastguard Worker   }
103*2d1272b8SAndroid Build Coastguard Worker 
104*2d1272b8SAndroid Build Coastguard Worker   HB_INTERNAL ~hb_subset_accelerator_t ();
105*2d1272b8SAndroid Build Coastguard Worker 
106*2d1272b8SAndroid Build Coastguard Worker   // Generic
107*2d1272b8SAndroid Build Coastguard Worker 
108*2d1272b8SAndroid Build Coastguard Worker   mutable hb_mutex_t sanitized_table_cache_lock;
109*2d1272b8SAndroid Build Coastguard Worker   mutable hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache;
110*2d1272b8SAndroid Build Coastguard Worker 
111*2d1272b8SAndroid Build Coastguard Worker   hb_map_t unicode_to_gid;
112*2d1272b8SAndroid Build Coastguard Worker   hb_multimap_t gid_to_unicodes;
113*2d1272b8SAndroid Build Coastguard Worker   hb_set_t unicodes;
114*2d1272b8SAndroid Build Coastguard Worker 
115*2d1272b8SAndroid Build Coastguard Worker   // cmap
116*2d1272b8SAndroid Build Coastguard Worker   const OT::SubtableUnicodesCache* cmap_cache;
117*2d1272b8SAndroid Build Coastguard Worker   hb_destroy_func_t destroy_cmap_cache;
118*2d1272b8SAndroid Build Coastguard Worker 
119*2d1272b8SAndroid Build Coastguard Worker   // CFF
120*2d1272b8SAndroid Build Coastguard Worker   bool has_seac;
121*2d1272b8SAndroid Build Coastguard Worker 
122*2d1272b8SAndroid Build Coastguard Worker   // TODO(garretrieger): cumulative glyf checksum map
123*2d1272b8SAndroid Build Coastguard Worker 
in_errorhb_subset_accelerator_t124*2d1272b8SAndroid Build Coastguard Worker   bool in_error () const
125*2d1272b8SAndroid Build Coastguard Worker   {
126*2d1272b8SAndroid Build Coastguard Worker     return unicode_to_gid.in_error () ||
127*2d1272b8SAndroid Build Coastguard Worker 	   gid_to_unicodes.in_error () ||
128*2d1272b8SAndroid Build Coastguard Worker 	   unicodes.in_error () ||
129*2d1272b8SAndroid Build Coastguard Worker 	   sanitized_table_cache.in_error ();
130*2d1272b8SAndroid Build Coastguard Worker   }
131*2d1272b8SAndroid Build Coastguard Worker 
132*2d1272b8SAndroid Build Coastguard Worker   hb_face_t *source;
133*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_SUBSET_CFF
134*2d1272b8SAndroid Build Coastguard Worker   // These have to be immediately after source:
135*2d1272b8SAndroid Build Coastguard Worker   mutable hb_face_lazy_loader_t<OT::cff1_subset_accelerator_t, 1> cff1_accel;
136*2d1272b8SAndroid Build Coastguard Worker   mutable hb_face_lazy_loader_t<OT::cff2_subset_accelerator_t, 2> cff2_accel;
137*2d1272b8SAndroid Build Coastguard Worker #endif
138*2d1272b8SAndroid Build Coastguard Worker };
139*2d1272b8SAndroid Build Coastguard Worker 
140*2d1272b8SAndroid Build Coastguard Worker 
141*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_SUBSET_ACCELERATOR_HH */
142