xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-aat-map.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): Behdad Esfahbod
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_AAT_MAP_HH
28*2d1272b8SAndroid Build Coastguard Worker #define HB_AAT_MAP_HH
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
31*2d1272b8SAndroid Build Coastguard Worker 
32*2d1272b8SAndroid Build Coastguard Worker 
33*2d1272b8SAndroid Build Coastguard Worker struct hb_aat_map_t
34*2d1272b8SAndroid Build Coastguard Worker {
35*2d1272b8SAndroid Build Coastguard Worker   friend struct hb_aat_map_builder_t;
36*2d1272b8SAndroid Build Coastguard Worker 
37*2d1272b8SAndroid Build Coastguard Worker   public:
38*2d1272b8SAndroid Build Coastguard Worker   struct range_flags_t
39*2d1272b8SAndroid Build Coastguard Worker   {
40*2d1272b8SAndroid Build Coastguard Worker     hb_mask_t flags;
41*2d1272b8SAndroid Build Coastguard Worker     unsigned cluster_first;
42*2d1272b8SAndroid Build Coastguard Worker     unsigned cluster_last; // end - 1
43*2d1272b8SAndroid Build Coastguard Worker   };
44*2d1272b8SAndroid Build Coastguard Worker 
45*2d1272b8SAndroid Build Coastguard Worker   public:
46*2d1272b8SAndroid Build Coastguard Worker   hb_vector_t<hb_sorted_vector_t<range_flags_t>> chain_flags;
47*2d1272b8SAndroid Build Coastguard Worker };
48*2d1272b8SAndroid Build Coastguard Worker 
49*2d1272b8SAndroid Build Coastguard Worker struct hb_aat_map_builder_t
50*2d1272b8SAndroid Build Coastguard Worker {
51*2d1272b8SAndroid Build Coastguard Worker   public:
52*2d1272b8SAndroid Build Coastguard Worker 
hb_aat_map_builder_thb_aat_map_builder_t53*2d1272b8SAndroid Build Coastguard Worker   HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_,
54*2d1272b8SAndroid Build Coastguard Worker 				    const hb_segment_properties_t props_) :
55*2d1272b8SAndroid Build Coastguard Worker 				      face (face_),
56*2d1272b8SAndroid Build Coastguard Worker 				      props (props_) {}
57*2d1272b8SAndroid Build Coastguard Worker 
58*2d1272b8SAndroid Build Coastguard Worker   HB_INTERNAL void add_feature (const hb_feature_t &feature);
59*2d1272b8SAndroid Build Coastguard Worker 
60*2d1272b8SAndroid Build Coastguard Worker   HB_INTERNAL void compile (hb_aat_map_t  &m);
61*2d1272b8SAndroid Build Coastguard Worker 
62*2d1272b8SAndroid Build Coastguard Worker   public:
63*2d1272b8SAndroid Build Coastguard Worker   struct feature_info_t
64*2d1272b8SAndroid Build Coastguard Worker   {
65*2d1272b8SAndroid Build Coastguard Worker     hb_aat_layout_feature_type_t  type;
66*2d1272b8SAndroid Build Coastguard Worker     hb_aat_layout_feature_selector_t  setting;
67*2d1272b8SAndroid Build Coastguard Worker     bool is_exclusive;
68*2d1272b8SAndroid Build Coastguard Worker     unsigned  seq; /* For stable sorting only. */
69*2d1272b8SAndroid Build Coastguard Worker 
cmphb_aat_map_builder_t::feature_info_t70*2d1272b8SAndroid Build Coastguard Worker     HB_INTERNAL static int cmp (const void *pa, const void *pb)
71*2d1272b8SAndroid Build Coastguard Worker     {
72*2d1272b8SAndroid Build Coastguard Worker       const feature_info_t *a = (const feature_info_t *) pa;
73*2d1272b8SAndroid Build Coastguard Worker       const feature_info_t *b = (const feature_info_t *) pb;
74*2d1272b8SAndroid Build Coastguard Worker       if (a->type != b->type) return (a->type < b->type ? -1 : 1);
75*2d1272b8SAndroid Build Coastguard Worker       if (!a->is_exclusive &&
76*2d1272b8SAndroid Build Coastguard Worker 	  (a->setting & ~1) != (b->setting & ~1)) return (a->setting < b->setting ? -1 : 1);
77*2d1272b8SAndroid Build Coastguard Worker 	    return (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
78*2d1272b8SAndroid Build Coastguard Worker     }
79*2d1272b8SAndroid Build Coastguard Worker 
80*2d1272b8SAndroid Build Coastguard Worker     /* compares type & setting only */
cmphb_aat_map_builder_t::feature_info_t81*2d1272b8SAndroid Build Coastguard Worker     int cmp (const feature_info_t& f) const
82*2d1272b8SAndroid Build Coastguard Worker     {
83*2d1272b8SAndroid Build Coastguard Worker       return (f.type != type) ? (f.type < type ? -1 : 1) :
84*2d1272b8SAndroid Build Coastguard Worker 	     (f.setting != setting) ? (f.setting < setting ? -1 : 1) : 0;
85*2d1272b8SAndroid Build Coastguard Worker     }
86*2d1272b8SAndroid Build Coastguard Worker   };
87*2d1272b8SAndroid Build Coastguard Worker 
88*2d1272b8SAndroid Build Coastguard Worker   struct feature_range_t
89*2d1272b8SAndroid Build Coastguard Worker   {
90*2d1272b8SAndroid Build Coastguard Worker     feature_info_t info;
91*2d1272b8SAndroid Build Coastguard Worker     unsigned start;
92*2d1272b8SAndroid Build Coastguard Worker     unsigned end;
93*2d1272b8SAndroid Build Coastguard Worker   };
94*2d1272b8SAndroid Build Coastguard Worker 
95*2d1272b8SAndroid Build Coastguard Worker   private:
96*2d1272b8SAndroid Build Coastguard Worker   struct feature_event_t
97*2d1272b8SAndroid Build Coastguard Worker   {
98*2d1272b8SAndroid Build Coastguard Worker     unsigned int index;
99*2d1272b8SAndroid Build Coastguard Worker     bool start;
100*2d1272b8SAndroid Build Coastguard Worker     feature_info_t feature;
101*2d1272b8SAndroid Build Coastguard Worker 
cmphb_aat_map_builder_t::feature_event_t102*2d1272b8SAndroid Build Coastguard Worker     HB_INTERNAL static int cmp (const void *pa, const void *pb) {
103*2d1272b8SAndroid Build Coastguard Worker       const feature_event_t *a = (const feature_event_t *) pa;
104*2d1272b8SAndroid Build Coastguard Worker       const feature_event_t *b = (const feature_event_t *) pb;
105*2d1272b8SAndroid Build Coastguard Worker       return a->index < b->index ? -1 : a->index > b->index ? 1 :
106*2d1272b8SAndroid Build Coastguard Worker 	     a->start < b->start ? -1 : a->start > b->start ? 1 :
107*2d1272b8SAndroid Build Coastguard Worker 	     feature_info_t::cmp (&a->feature, &b->feature);
108*2d1272b8SAndroid Build Coastguard Worker     }
109*2d1272b8SAndroid Build Coastguard Worker   };
110*2d1272b8SAndroid Build Coastguard Worker 
111*2d1272b8SAndroid Build Coastguard Worker   public:
112*2d1272b8SAndroid Build Coastguard Worker   hb_face_t *face;
113*2d1272b8SAndroid Build Coastguard Worker   hb_segment_properties_t props;
114*2d1272b8SAndroid Build Coastguard Worker 
115*2d1272b8SAndroid Build Coastguard Worker   public:
116*2d1272b8SAndroid Build Coastguard Worker   hb_sorted_vector_t<feature_range_t> features;
117*2d1272b8SAndroid Build Coastguard Worker   hb_sorted_vector_t<feature_info_t> current_features;
118*2d1272b8SAndroid Build Coastguard Worker   unsigned range_first = HB_FEATURE_GLOBAL_START;
119*2d1272b8SAndroid Build Coastguard Worker   unsigned range_last = HB_FEATURE_GLOBAL_END;
120*2d1272b8SAndroid Build Coastguard Worker };
121*2d1272b8SAndroid Build Coastguard Worker 
122*2d1272b8SAndroid Build Coastguard Worker 
123*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_AAT_MAP_HH */
124