xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-shaper.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2010,2011,2012  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_OT_SHAPER_HH
28*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_SHAPER_HH
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
31*2d1272b8SAndroid Build Coastguard Worker 
32*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-layout.hh"
33*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-shape.hh"
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-shape-normalize.hh"
35*2d1272b8SAndroid Build Coastguard Worker 
36*2d1272b8SAndroid Build Coastguard Worker 
37*2d1272b8SAndroid Build Coastguard Worker /* buffer var allocations, used by all OT shapers */
38*2d1272b8SAndroid Build Coastguard Worker #define ot_shaper_var_u8_category()	var2.u8[2]
39*2d1272b8SAndroid Build Coastguard Worker #define ot_shaper_var_u8_auxiliary()	var2.u8[3]
40*2d1272b8SAndroid Build Coastguard Worker 
41*2d1272b8SAndroid Build Coastguard Worker 
42*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_SHAPE_MAX_COMBINING_MARKS 32
43*2d1272b8SAndroid Build Coastguard Worker 
44*2d1272b8SAndroid Build Coastguard Worker enum hb_ot_shape_zero_width_marks_type_t {
45*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE,
46*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY,
47*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
48*2d1272b8SAndroid Build Coastguard Worker };
49*2d1272b8SAndroid Build Coastguard Worker 
50*2d1272b8SAndroid Build Coastguard Worker 
51*2d1272b8SAndroid Build Coastguard Worker /* Master OT shaper list */
52*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_SHAPERS_IMPLEMENT_SHAPERS \
53*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (arabic) \
54*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (default) \
55*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (dumber) \
56*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (hangul) \
57*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (hebrew) \
58*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (indic) \
59*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (khmer) \
60*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (myanmar) \
61*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (myanmar_zawgyi) \
62*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (thai) \
63*2d1272b8SAndroid Build Coastguard Worker   HB_OT_SHAPER_IMPLEMENT (use) \
64*2d1272b8SAndroid Build Coastguard Worker   /* ^--- Add new shapers here; keep sorted. */
65*2d1272b8SAndroid Build Coastguard Worker 
66*2d1272b8SAndroid Build Coastguard Worker 
67*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_shaper_t
68*2d1272b8SAndroid Build Coastguard Worker {
69*2d1272b8SAndroid Build Coastguard Worker   /* collect_features()
70*2d1272b8SAndroid Build Coastguard Worker    * Called during shape_plan().
71*2d1272b8SAndroid Build Coastguard Worker    * Shapers should use plan->map to add their features and callbacks.
72*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
73*2d1272b8SAndroid Build Coastguard Worker    */
74*2d1272b8SAndroid Build Coastguard Worker   void (*collect_features) (hb_ot_shape_planner_t *plan);
75*2d1272b8SAndroid Build Coastguard Worker 
76*2d1272b8SAndroid Build Coastguard Worker   /* override_features()
77*2d1272b8SAndroid Build Coastguard Worker    * Called during shape_plan().
78*2d1272b8SAndroid Build Coastguard Worker    * Shapers should use plan->map to override features and add callbacks after
79*2d1272b8SAndroid Build Coastguard Worker    * common features are added.
80*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
81*2d1272b8SAndroid Build Coastguard Worker    */
82*2d1272b8SAndroid Build Coastguard Worker   void (*override_features) (hb_ot_shape_planner_t *plan);
83*2d1272b8SAndroid Build Coastguard Worker 
84*2d1272b8SAndroid Build Coastguard Worker 
85*2d1272b8SAndroid Build Coastguard Worker   /* data_create()
86*2d1272b8SAndroid Build Coastguard Worker    * Called at the end of shape_plan().
87*2d1272b8SAndroid Build Coastguard Worker    * Whatever shapers return will be accessible through plan->data later.
88*2d1272b8SAndroid Build Coastguard Worker    * If nullptr is returned, means a plan failure.
89*2d1272b8SAndroid Build Coastguard Worker    */
90*2d1272b8SAndroid Build Coastguard Worker   void *(*data_create) (const hb_ot_shape_plan_t *plan);
91*2d1272b8SAndroid Build Coastguard Worker 
92*2d1272b8SAndroid Build Coastguard Worker   /* data_destroy()
93*2d1272b8SAndroid Build Coastguard Worker    * Called when the shape_plan is being destroyed.
94*2d1272b8SAndroid Build Coastguard Worker    * plan->data is passed here for destruction.
95*2d1272b8SAndroid Build Coastguard Worker    * If nullptr is returned, means a plan failure.
96*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
97*2d1272b8SAndroid Build Coastguard Worker    */
98*2d1272b8SAndroid Build Coastguard Worker   void (*data_destroy) (void *data);
99*2d1272b8SAndroid Build Coastguard Worker 
100*2d1272b8SAndroid Build Coastguard Worker 
101*2d1272b8SAndroid Build Coastguard Worker   /* preprocess_text()
102*2d1272b8SAndroid Build Coastguard Worker    * Called during shape().
103*2d1272b8SAndroid Build Coastguard Worker    * Shapers can use to modify text before shaping starts.
104*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
105*2d1272b8SAndroid Build Coastguard Worker    */
106*2d1272b8SAndroid Build Coastguard Worker   void (*preprocess_text) (const hb_ot_shape_plan_t *plan,
107*2d1272b8SAndroid Build Coastguard Worker 			   hb_buffer_t              *buffer,
108*2d1272b8SAndroid Build Coastguard Worker 			   hb_font_t                *font);
109*2d1272b8SAndroid Build Coastguard Worker 
110*2d1272b8SAndroid Build Coastguard Worker   /* postprocess_glyphs()
111*2d1272b8SAndroid Build Coastguard Worker    * Called during shape().
112*2d1272b8SAndroid Build Coastguard Worker    * Shapers can use to modify glyphs after shaping ends.
113*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
114*2d1272b8SAndroid Build Coastguard Worker    */
115*2d1272b8SAndroid Build Coastguard Worker   void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan,
116*2d1272b8SAndroid Build Coastguard Worker 			      hb_buffer_t              *buffer,
117*2d1272b8SAndroid Build Coastguard Worker 			      hb_font_t                *font);
118*2d1272b8SAndroid Build Coastguard Worker 
119*2d1272b8SAndroid Build Coastguard Worker 
120*2d1272b8SAndroid Build Coastguard Worker   /* decompose()
121*2d1272b8SAndroid Build Coastguard Worker    * Called during shape()'s normalization.
122*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
123*2d1272b8SAndroid Build Coastguard Worker    */
124*2d1272b8SAndroid Build Coastguard Worker   bool (*decompose) (const hb_ot_shape_normalize_context_t *c,
125*2d1272b8SAndroid Build Coastguard Worker 		     hb_codepoint_t  ab,
126*2d1272b8SAndroid Build Coastguard Worker 		     hb_codepoint_t *a,
127*2d1272b8SAndroid Build Coastguard Worker 		     hb_codepoint_t *b);
128*2d1272b8SAndroid Build Coastguard Worker 
129*2d1272b8SAndroid Build Coastguard Worker   /* compose()
130*2d1272b8SAndroid Build Coastguard Worker    * Called during shape()'s normalization.
131*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
132*2d1272b8SAndroid Build Coastguard Worker    */
133*2d1272b8SAndroid Build Coastguard Worker   bool (*compose) (const hb_ot_shape_normalize_context_t *c,
134*2d1272b8SAndroid Build Coastguard Worker 		   hb_codepoint_t  a,
135*2d1272b8SAndroid Build Coastguard Worker 		   hb_codepoint_t  b,
136*2d1272b8SAndroid Build Coastguard Worker 		   hb_codepoint_t *ab);
137*2d1272b8SAndroid Build Coastguard Worker 
138*2d1272b8SAndroid Build Coastguard Worker   /* setup_masks()
139*2d1272b8SAndroid Build Coastguard Worker    * Called during shape().
140*2d1272b8SAndroid Build Coastguard Worker    * Shapers should use map to get feature masks and set on buffer.
141*2d1272b8SAndroid Build Coastguard Worker    * Shapers may NOT modify characters.
142*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
143*2d1272b8SAndroid Build Coastguard Worker    */
144*2d1272b8SAndroid Build Coastguard Worker   void (*setup_masks) (const hb_ot_shape_plan_t *plan,
145*2d1272b8SAndroid Build Coastguard Worker 		       hb_buffer_t              *buffer,
146*2d1272b8SAndroid Build Coastguard Worker 		       hb_font_t                *font);
147*2d1272b8SAndroid Build Coastguard Worker 
148*2d1272b8SAndroid Build Coastguard Worker   /* reorder_marks()
149*2d1272b8SAndroid Build Coastguard Worker    * Called during shape().
150*2d1272b8SAndroid Build Coastguard Worker    * Shapers can use to modify ordering of combining marks.
151*2d1272b8SAndroid Build Coastguard Worker    * May be NULL.
152*2d1272b8SAndroid Build Coastguard Worker    */
153*2d1272b8SAndroid Build Coastguard Worker   void (*reorder_marks) (const hb_ot_shape_plan_t *plan,
154*2d1272b8SAndroid Build Coastguard Worker 			 hb_buffer_t              *buffer,
155*2d1272b8SAndroid Build Coastguard Worker 			 unsigned int              start,
156*2d1272b8SAndroid Build Coastguard Worker 			 unsigned int              end);
157*2d1272b8SAndroid Build Coastguard Worker 
158*2d1272b8SAndroid Build Coastguard Worker   /* gpos_tag()
159*2d1272b8SAndroid Build Coastguard Worker    * If not HB_TAG_NONE, then must match found GPOS script tag for
160*2d1272b8SAndroid Build Coastguard Worker    * GPOS to be applied.  Otherwise, fallback positioning will be used.
161*2d1272b8SAndroid Build Coastguard Worker    */
162*2d1272b8SAndroid Build Coastguard Worker   hb_tag_t gpos_tag;
163*2d1272b8SAndroid Build Coastguard Worker 
164*2d1272b8SAndroid Build Coastguard Worker   hb_ot_shape_normalization_mode_t normalization_preference;
165*2d1272b8SAndroid Build Coastguard Worker 
166*2d1272b8SAndroid Build Coastguard Worker   hb_ot_shape_zero_width_marks_type_t zero_width_marks;
167*2d1272b8SAndroid Build Coastguard Worker 
168*2d1272b8SAndroid Build Coastguard Worker   bool fallback_position;
169*2d1272b8SAndroid Build Coastguard Worker };
170*2d1272b8SAndroid Build Coastguard Worker 
171*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_SHAPER_IMPLEMENT(name) extern HB_INTERNAL const hb_ot_shaper_t _hb_ot_shaper_##name;
172*2d1272b8SAndroid Build Coastguard Worker HB_OT_SHAPERS_IMPLEMENT_SHAPERS
173*2d1272b8SAndroid Build Coastguard Worker #undef HB_OT_SHAPER_IMPLEMENT
174*2d1272b8SAndroid Build Coastguard Worker 
175*2d1272b8SAndroid Build Coastguard Worker 
176*2d1272b8SAndroid Build Coastguard Worker static inline const hb_ot_shaper_t *
hb_ot_shaper_categorize(hb_script_t script,hb_direction_t direction,hb_tag_t gsub_script)177*2d1272b8SAndroid Build Coastguard Worker hb_ot_shaper_categorize (hb_script_t script,
178*2d1272b8SAndroid Build Coastguard Worker 			 hb_direction_t direction,
179*2d1272b8SAndroid Build Coastguard Worker 			 hb_tag_t gsub_script)
180*2d1272b8SAndroid Build Coastguard Worker {
181*2d1272b8SAndroid Build Coastguard Worker   switch ((hb_tag_t) script)
182*2d1272b8SAndroid Build Coastguard Worker   {
183*2d1272b8SAndroid Build Coastguard Worker     default:
184*2d1272b8SAndroid Build Coastguard Worker       return &_hb_ot_shaper_default;
185*2d1272b8SAndroid Build Coastguard Worker 
186*2d1272b8SAndroid Build Coastguard Worker 
187*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-1.1 additions */
188*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_ARABIC:
189*2d1272b8SAndroid Build Coastguard Worker 
190*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-3.0 additions */
191*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SYRIAC:
192*2d1272b8SAndroid Build Coastguard Worker 
193*2d1272b8SAndroid Build Coastguard Worker       /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
194*2d1272b8SAndroid Build Coastguard Worker        * This is because we do fallback shaping for Arabic script (and not others).
195*2d1272b8SAndroid Build Coastguard Worker        * But note that Arabic shaping is applicable only to horizontal layout; for
196*2d1272b8SAndroid Build Coastguard Worker        * vertical text, just use the generic shaper instead. */
197*2d1272b8SAndroid Build Coastguard Worker       if ((gsub_script != HB_OT_TAG_DEFAULT_SCRIPT || script == HB_SCRIPT_ARABIC) &&
198*2d1272b8SAndroid Build Coastguard Worker 	  HB_DIRECTION_IS_HORIZONTAL (direction))
199*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_arabic;
200*2d1272b8SAndroid Build Coastguard Worker       else
201*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_default;
202*2d1272b8SAndroid Build Coastguard Worker 
203*2d1272b8SAndroid Build Coastguard Worker 
204*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-1.1 additions */
205*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_THAI:
206*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_LAO:
207*2d1272b8SAndroid Build Coastguard Worker 
208*2d1272b8SAndroid Build Coastguard Worker       return &_hb_ot_shaper_thai;
209*2d1272b8SAndroid Build Coastguard Worker 
210*2d1272b8SAndroid Build Coastguard Worker 
211*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-1.1 additions */
212*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_HANGUL:
213*2d1272b8SAndroid Build Coastguard Worker 
214*2d1272b8SAndroid Build Coastguard Worker       return &_hb_ot_shaper_hangul;
215*2d1272b8SAndroid Build Coastguard Worker 
216*2d1272b8SAndroid Build Coastguard Worker 
217*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-1.1 additions */
218*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_HEBREW:
219*2d1272b8SAndroid Build Coastguard Worker 
220*2d1272b8SAndroid Build Coastguard Worker       return &_hb_ot_shaper_hebrew;
221*2d1272b8SAndroid Build Coastguard Worker 
222*2d1272b8SAndroid Build Coastguard Worker 
223*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-1.1 additions */
224*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BENGALI:
225*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_DEVANAGARI:
226*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GUJARATI:
227*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GURMUKHI:
228*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KANNADA:
229*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MALAYALAM:
230*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_ORIYA:
231*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAMIL:
232*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TELUGU:
233*2d1272b8SAndroid Build Coastguard Worker 
234*2d1272b8SAndroid Build Coastguard Worker       /* If the designer designed the font for the 'DFLT' script,
235*2d1272b8SAndroid Build Coastguard Worker        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
236*2d1272b8SAndroid Build Coastguard Worker        * Otherwise, use the specific shaper.
237*2d1272b8SAndroid Build Coastguard Worker        *
238*2d1272b8SAndroid Build Coastguard Worker        * If it's indy3 tag, send to USE. */
239*2d1272b8SAndroid Build Coastguard Worker       if (gsub_script == HB_TAG ('D','F','L','T') ||
240*2d1272b8SAndroid Build Coastguard Worker 	  gsub_script == HB_TAG ('l','a','t','n'))
241*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_default;
242*2d1272b8SAndroid Build Coastguard Worker       else if ((gsub_script & 0x000000FF) == '3')
243*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_use;
244*2d1272b8SAndroid Build Coastguard Worker       else
245*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_indic;
246*2d1272b8SAndroid Build Coastguard Worker 
247*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KHMER:
248*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_khmer;
249*2d1272b8SAndroid Build Coastguard Worker 
250*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MYANMAR:
251*2d1272b8SAndroid Build Coastguard Worker       /* If the designer designed the font for the 'DFLT' script,
252*2d1272b8SAndroid Build Coastguard Worker        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
253*2d1272b8SAndroid Build Coastguard Worker        * Otherwise, use the specific shaper.
254*2d1272b8SAndroid Build Coastguard Worker        *
255*2d1272b8SAndroid Build Coastguard Worker        * If designer designed for 'mymr' tag, also send to default
256*2d1272b8SAndroid Build Coastguard Worker        * shaper.  That's tag used from before Myanmar shaping spec
257*2d1272b8SAndroid Build Coastguard Worker        * was developed.  The shaping spec uses 'mym2' tag. */
258*2d1272b8SAndroid Build Coastguard Worker       if (gsub_script == HB_TAG ('D','F','L','T') ||
259*2d1272b8SAndroid Build Coastguard Worker 	  gsub_script == HB_TAG ('l','a','t','n') ||
260*2d1272b8SAndroid Build Coastguard Worker 	  gsub_script == HB_TAG ('m','y','m','r'))
261*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_default;
262*2d1272b8SAndroid Build Coastguard Worker       else
263*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_myanmar;
264*2d1272b8SAndroid Build Coastguard Worker 
265*2d1272b8SAndroid Build Coastguard Worker 
266*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
267*2d1272b8SAndroid Build Coastguard Worker #define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
268*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MYANMAR_ZAWGYI:
269*2d1272b8SAndroid Build Coastguard Worker     /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
270*2d1272b8SAndroid Build Coastguard Worker 
271*2d1272b8SAndroid Build Coastguard Worker       return &_hb_ot_shaper_myanmar_zawgyi;
272*2d1272b8SAndroid Build Coastguard Worker #endif
273*2d1272b8SAndroid Build Coastguard Worker 
274*2d1272b8SAndroid Build Coastguard Worker 
275*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-2.0 additions */
276*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TIBETAN:
277*2d1272b8SAndroid Build Coastguard Worker 
278*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-3.0 additions */
279*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MONGOLIAN:
280*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SINHALA:
281*2d1272b8SAndroid Build Coastguard Worker 
282*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-3.2 additions */
283*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BUHID:
284*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_HANUNOO:
285*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAGALOG:
286*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAGBANWA:
287*2d1272b8SAndroid Build Coastguard Worker 
288*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-4.0 additions */
289*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_LIMBU:
290*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAI_LE:
291*2d1272b8SAndroid Build Coastguard Worker 
292*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-4.1 additions */
293*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BUGINESE:
294*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KHAROSHTHI:
295*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SYLOTI_NAGRI:
296*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TIFINAGH:
297*2d1272b8SAndroid Build Coastguard Worker 
298*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-5.0 additions */
299*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BALINESE:
300*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_NKO:
301*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_PHAGS_PA:
302*2d1272b8SAndroid Build Coastguard Worker 
303*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-5.1 additions */
304*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_CHAM:
305*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KAYAH_LI:
306*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_LEPCHA:
307*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_REJANG:
308*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SAURASHTRA:
309*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SUNDANESE:
310*2d1272b8SAndroid Build Coastguard Worker 
311*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-5.2 additions */
312*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
313*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_JAVANESE:
314*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KAITHI:
315*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MEETEI_MAYEK:
316*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAI_THAM:
317*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAI_VIET:
318*2d1272b8SAndroid Build Coastguard Worker 
319*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-6.0 additions */
320*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BATAK:
321*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BRAHMI:
322*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MANDAIC:
323*2d1272b8SAndroid Build Coastguard Worker 
324*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-6.1 additions */
325*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_CHAKMA:
326*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MIAO:
327*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SHARADA:
328*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TAKRI:
329*2d1272b8SAndroid Build Coastguard Worker 
330*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-7.0 additions */
331*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_DUPLOYAN:
332*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GRANTHA:
333*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KHOJKI:
334*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KHUDAWADI:
335*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MAHAJANI:
336*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MANICHAEAN:
337*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MODI:
338*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_PAHAWH_HMONG:
339*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_PSALTER_PAHLAVI:
340*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SIDDHAM:
341*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TIRHUTA:
342*2d1272b8SAndroid Build Coastguard Worker 
343*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-8.0 additions */
344*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_AHOM:
345*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MULTANI:
346*2d1272b8SAndroid Build Coastguard Worker 
347*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-9.0 additions */
348*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_ADLAM:
349*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_BHAIKSUKI:
350*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MARCHEN:
351*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_NEWA:
352*2d1272b8SAndroid Build Coastguard Worker 
353*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-10.0 additions */
354*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MASARAM_GONDI:
355*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SOYOMBO:
356*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_ZANABAZAR_SQUARE:
357*2d1272b8SAndroid Build Coastguard Worker 
358*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-11.0 additions */
359*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_DOGRA:
360*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GUNJALA_GONDI:
361*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_HANIFI_ROHINGYA:
362*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MAKASAR:
363*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_MEDEFAIDRIN:
364*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_OLD_SOGDIAN:
365*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SOGDIAN:
366*2d1272b8SAndroid Build Coastguard Worker 
367*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-12.0 additions */
368*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_ELYMAIC:
369*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_NANDINAGARI:
370*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_NYIAKENG_PUACHUE_HMONG:
371*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_WANCHO:
372*2d1272b8SAndroid Build Coastguard Worker 
373*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-13.0 additions */
374*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_CHORASMIAN:
375*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_DIVES_AKURU:
376*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KHITAN_SMALL_SCRIPT:
377*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_YEZIDI:
378*2d1272b8SAndroid Build Coastguard Worker 
379*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-14.0 additions */
380*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_CYPRO_MINOAN:
381*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_OLD_UYGHUR:
382*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TANGSA:
383*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TOTO:
384*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_VITHKUQI:
385*2d1272b8SAndroid Build Coastguard Worker 
386*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-15.0 additions */
387*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KAWI:
388*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_NAG_MUNDARI:
389*2d1272b8SAndroid Build Coastguard Worker 
390*2d1272b8SAndroid Build Coastguard Worker     /* Unicode-16.0 additions */
391*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GARAY:
392*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_GURUNG_KHEMA:
393*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_KIRAT_RAI:
394*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_OL_ONAL:
395*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_SUNUWAR:
396*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TODHRI:
397*2d1272b8SAndroid Build Coastguard Worker     case HB_SCRIPT_TULU_TIGALARI:
398*2d1272b8SAndroid Build Coastguard Worker 
399*2d1272b8SAndroid Build Coastguard Worker       /* If the designer designed the font for the 'DFLT' script,
400*2d1272b8SAndroid Build Coastguard Worker        * (or we ended up arbitrarily pick 'latn'), use the default shaper.
401*2d1272b8SAndroid Build Coastguard Worker        * Otherwise, use the specific shaper.
402*2d1272b8SAndroid Build Coastguard Worker        * Note that for some simple scripts, there may not be *any*
403*2d1272b8SAndroid Build Coastguard Worker        * GSUB/GPOS needed, so there may be no scripts found! */
404*2d1272b8SAndroid Build Coastguard Worker       if (gsub_script == HB_TAG ('D','F','L','T') ||
405*2d1272b8SAndroid Build Coastguard Worker 	  gsub_script == HB_TAG ('l','a','t','n'))
406*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_default;
407*2d1272b8SAndroid Build Coastguard Worker       else
408*2d1272b8SAndroid Build Coastguard Worker 	return &_hb_ot_shaper_use;
409*2d1272b8SAndroid Build Coastguard Worker   }
410*2d1272b8SAndroid Build Coastguard Worker }
411*2d1272b8SAndroid Build Coastguard Worker 
412*2d1272b8SAndroid Build Coastguard Worker 
413*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_OT_SHAPER_HH */
414