xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-shaper-myanmar-machine.rl (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker/*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 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_MYANMAR_MACHINE_HH
28*2d1272b8SAndroid Build Coastguard Worker#define HB_OT_SHAPER_MYANMAR_MACHINE_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-shaper-indic.hh"
34*2d1272b8SAndroid Build Coastguard Worker
35*2d1272b8SAndroid Build Coastguard Worker/* buffer var allocations */
36*2d1272b8SAndroid Build Coastguard Worker#define myanmar_category() ot_shaper_var_u8_category() /* myanmar_category_t */
37*2d1272b8SAndroid Build Coastguard Worker#define myanmar_position() ot_shaper_var_u8_auxiliary() /* myanmar_position_t */
38*2d1272b8SAndroid Build Coastguard Worker
39*2d1272b8SAndroid Build Coastguard Workerusing myanmar_category_t = unsigned;
40*2d1272b8SAndroid Build Coastguard Workerusing myanmar_position_t = ot_position_t;
41*2d1272b8SAndroid Build Coastguard Worker
42*2d1272b8SAndroid Build Coastguard Worker#define M_Cat(Cat) myanmar_syllable_machine_ex_##Cat
43*2d1272b8SAndroid Build Coastguard Worker
44*2d1272b8SAndroid Build Coastguard Workerenum myanmar_syllable_type_t {
45*2d1272b8SAndroid Build Coastguard Worker  myanmar_consonant_syllable,
46*2d1272b8SAndroid Build Coastguard Worker  myanmar_broken_cluster,
47*2d1272b8SAndroid Build Coastguard Worker  myanmar_non_myanmar_cluster,
48*2d1272b8SAndroid Build Coastguard Worker};
49*2d1272b8SAndroid Build Coastguard Worker
50*2d1272b8SAndroid Build Coastguard Worker%%{
51*2d1272b8SAndroid Build Coastguard Worker  machine myanmar_syllable_machine;
52*2d1272b8SAndroid Build Coastguard Worker  alphtype unsigned char;
53*2d1272b8SAndroid Build Coastguard Worker  write exports;
54*2d1272b8SAndroid Build Coastguard Worker  write data;
55*2d1272b8SAndroid Build Coastguard Worker}%%
56*2d1272b8SAndroid Build Coastguard Worker
57*2d1272b8SAndroid Build Coastguard Worker%%{
58*2d1272b8SAndroid Build Coastguard Worker
59*2d1272b8SAndroid Build Coastguard Worker
60*2d1272b8SAndroid Build Coastguard Worker# Spec category D is folded into GB; D0 is not implemented by Uniscribe and as such folded into D
61*2d1272b8SAndroid Build Coastguard Worker# Spec category P is folded into GB
62*2d1272b8SAndroid Build Coastguard Worker
63*2d1272b8SAndroid Build Coastguard Workerexport C    = 1;
64*2d1272b8SAndroid Build Coastguard Workerexport IV   = 2;
65*2d1272b8SAndroid Build Coastguard Workerexport DB   = 3;	# Dot below	     = OT_N
66*2d1272b8SAndroid Build Coastguard Workerexport H    = 4;
67*2d1272b8SAndroid Build Coastguard Workerexport ZWNJ = 5;
68*2d1272b8SAndroid Build Coastguard Workerexport ZWJ  = 6;
69*2d1272b8SAndroid Build Coastguard Workerexport SM    = 8;	# Visarga and Shan tones
70*2d1272b8SAndroid Build Coastguard Workerexport GB   = 10;	# 		     = OT_PLACEHOLDER
71*2d1272b8SAndroid Build Coastguard Workerexport DOTTEDCIRCLE = 11;
72*2d1272b8SAndroid Build Coastguard Workerexport A    = 9;
73*2d1272b8SAndroid Build Coastguard Workerexport Ra   = 15;
74*2d1272b8SAndroid Build Coastguard Workerexport CS   = 18;
75*2d1272b8SAndroid Build Coastguard Worker
76*2d1272b8SAndroid Build Coastguard Workerexport VAbv = 20;
77*2d1272b8SAndroid Build Coastguard Workerexport VBlw = 21;
78*2d1272b8SAndroid Build Coastguard Workerexport VPre = 22;
79*2d1272b8SAndroid Build Coastguard Workerexport VPst = 23;
80*2d1272b8SAndroid Build Coastguard Worker
81*2d1272b8SAndroid Build Coastguard Worker# 32+ are for Myanmar-specific values
82*2d1272b8SAndroid Build Coastguard Workerexport As   = 32;	# Asat
83*2d1272b8SAndroid Build Coastguard Workerexport MH   = 35;	# Medial Ha
84*2d1272b8SAndroid Build Coastguard Workerexport MR   = 36;	# Medial Ra
85*2d1272b8SAndroid Build Coastguard Workerexport MW   = 37;	# Medial Wa, Shan Wa
86*2d1272b8SAndroid Build Coastguard Workerexport MY   = 38;	# Medial Ya, Mon Na, Mon Ma
87*2d1272b8SAndroid Build Coastguard Workerexport PT   = 39;	# Pwo and other tones
88*2d1272b8SAndroid Build Coastguard Workerexport VS   = 40;	# Variation selectors
89*2d1272b8SAndroid Build Coastguard Workerexport ML   = 41;	# Medial Mon La
90*2d1272b8SAndroid Build Coastguard Worker
91*2d1272b8SAndroid Build Coastguard Worker
92*2d1272b8SAndroid Build Coastguard Workerj = ZWJ|ZWNJ;			# Joiners
93*2d1272b8SAndroid Build Coastguard Workerk = (Ra As H);			# Kinzi
94*2d1272b8SAndroid Build Coastguard Worker
95*2d1272b8SAndroid Build Coastguard Workerc = C|Ra;			# is_consonant
96*2d1272b8SAndroid Build Coastguard Worker
97*2d1272b8SAndroid Build Coastguard Workermedial_group = MY? As? MR? ((MW MH? ML? | MH ML? | ML) As?)?;
98*2d1272b8SAndroid Build Coastguard Workermain_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
99*2d1272b8SAndroid Build Coastguard Workerpost_vowel_group = VPst MH? ML? As* VAbv* A* (DB As?)?;
100*2d1272b8SAndroid Build Coastguard Workerpwo_tone_group = PT A* DB? As?;
101*2d1272b8SAndroid Build Coastguard Worker
102*2d1272b8SAndroid Build Coastguard Workercomplex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* SM* j?;
103*2d1272b8SAndroid Build Coastguard Workersyllable_tail = (H (c|IV).VS?)* (H | complex_syllable_tail);
104*2d1272b8SAndroid Build Coastguard Worker
105*2d1272b8SAndroid Build Coastguard Workerconsonant_syllable =	(k|CS)? (c|IV|GB|DOTTEDCIRCLE).VS? syllable_tail;
106*2d1272b8SAndroid Build Coastguard Workerbroken_cluster =	k? VS? syllable_tail;
107*2d1272b8SAndroid Build Coastguard Workerother =			any;
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Workermain := |*
110*2d1272b8SAndroid Build Coastguard Worker	consonant_syllable	=> { found_syllable (myanmar_consonant_syllable); };
111*2d1272b8SAndroid Build Coastguard Worker	j			=> { found_syllable (myanmar_non_myanmar_cluster); };
112*2d1272b8SAndroid Build Coastguard Worker	broken_cluster		=> { found_syllable (myanmar_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; };
113*2d1272b8SAndroid Build Coastguard Worker	other			=> { found_syllable (myanmar_non_myanmar_cluster); };
114*2d1272b8SAndroid Build Coastguard Worker*|;
115*2d1272b8SAndroid Build Coastguard Worker
116*2d1272b8SAndroid Build Coastguard Worker
117*2d1272b8SAndroid Build Coastguard Worker}%%
118*2d1272b8SAndroid Build Coastguard Worker
119*2d1272b8SAndroid Build Coastguard Worker#define found_syllable(syllable_type) \
120*2d1272b8SAndroid Build Coastguard Worker  HB_STMT_START { \
121*2d1272b8SAndroid Build Coastguard Worker    if (0) fprintf (stderr, "syllable %u..%u %s\n", ts, te, #syllable_type); \
122*2d1272b8SAndroid Build Coastguard Worker    for (unsigned int i = ts; i < te; i++) \
123*2d1272b8SAndroid Build Coastguard Worker      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
124*2d1272b8SAndroid Build Coastguard Worker    syllable_serial++; \
125*2d1272b8SAndroid Build Coastguard Worker    if (syllable_serial == 16) syllable_serial = 1; \
126*2d1272b8SAndroid Build Coastguard Worker  } HB_STMT_END
127*2d1272b8SAndroid Build Coastguard Worker
128*2d1272b8SAndroid Build Coastguard Workerinline void
129*2d1272b8SAndroid Build Coastguard Workerfind_syllables_myanmar (hb_buffer_t *buffer)
130*2d1272b8SAndroid Build Coastguard Worker{
131*2d1272b8SAndroid Build Coastguard Worker  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
132*2d1272b8SAndroid Build Coastguard Worker  int cs;
133*2d1272b8SAndroid Build Coastguard Worker  hb_glyph_info_t *info = buffer->info;
134*2d1272b8SAndroid Build Coastguard Worker  %%{
135*2d1272b8SAndroid Build Coastguard Worker    write init;
136*2d1272b8SAndroid Build Coastguard Worker    getkey info[p].myanmar_category();
137*2d1272b8SAndroid Build Coastguard Worker  }%%
138*2d1272b8SAndroid Build Coastguard Worker
139*2d1272b8SAndroid Build Coastguard Worker  p = 0;
140*2d1272b8SAndroid Build Coastguard Worker  pe = eof = buffer->len;
141*2d1272b8SAndroid Build Coastguard Worker
142*2d1272b8SAndroid Build Coastguard Worker  unsigned int syllable_serial = 1;
143*2d1272b8SAndroid Build Coastguard Worker  %%{
144*2d1272b8SAndroid Build Coastguard Worker    write exec;
145*2d1272b8SAndroid Build Coastguard Worker  }%%
146*2d1272b8SAndroid Build Coastguard Worker}
147*2d1272b8SAndroid Build Coastguard Worker
148*2d1272b8SAndroid Build Coastguard Worker#undef found_syllable
149*2d1272b8SAndroid Build Coastguard Worker
150*2d1272b8SAndroid Build Coastguard Worker#endif /* HB_OT_SHAPER_MYANMAR_MACHINE_HH */
151