xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-shaper-khmer-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_KHMER_MACHINE_HH
28*2d1272b8SAndroid Build Coastguard Worker#define HB_OT_SHAPER_KHMER_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 khmer_category() ot_shaper_var_u8_category() /* khmer_category_t */
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Workerusing khmer_category_t = unsigned;
39*2d1272b8SAndroid Build Coastguard Worker
40*2d1272b8SAndroid Build Coastguard Worker#define K_Cat(Cat) khmer_syllable_machine_ex_##Cat
41*2d1272b8SAndroid Build Coastguard Worker
42*2d1272b8SAndroid Build Coastguard Workerenum khmer_syllable_type_t {
43*2d1272b8SAndroid Build Coastguard Worker  khmer_consonant_syllable,
44*2d1272b8SAndroid Build Coastguard Worker  khmer_broken_cluster,
45*2d1272b8SAndroid Build Coastguard Worker  khmer_non_khmer_cluster,
46*2d1272b8SAndroid Build Coastguard Worker};
47*2d1272b8SAndroid Build Coastguard Worker
48*2d1272b8SAndroid Build Coastguard Worker%%{
49*2d1272b8SAndroid Build Coastguard Worker  machine khmer_syllable_machine;
50*2d1272b8SAndroid Build Coastguard Worker  alphtype unsigned char;
51*2d1272b8SAndroid Build Coastguard Worker  write exports;
52*2d1272b8SAndroid Build Coastguard Worker  write data;
53*2d1272b8SAndroid Build Coastguard Worker}%%
54*2d1272b8SAndroid Build Coastguard Worker
55*2d1272b8SAndroid Build Coastguard Worker%%{
56*2d1272b8SAndroid Build Coastguard Worker
57*2d1272b8SAndroid Build Coastguard Worker
58*2d1272b8SAndroid Build Coastguard Worker# We use category H for spec category Coeng
59*2d1272b8SAndroid Build Coastguard Worker
60*2d1272b8SAndroid Build Coastguard Workerexport C    = 1;
61*2d1272b8SAndroid Build Coastguard Workerexport V    = 2;
62*2d1272b8SAndroid Build Coastguard Workerexport H    = 4;
63*2d1272b8SAndroid Build Coastguard Workerexport ZWNJ = 5;
64*2d1272b8SAndroid Build Coastguard Workerexport ZWJ  = 6;
65*2d1272b8SAndroid Build Coastguard Workerexport PLACEHOLDER = 10;
66*2d1272b8SAndroid Build Coastguard Workerexport DOTTEDCIRCLE = 11;
67*2d1272b8SAndroid Build Coastguard Workerexport Ra   = 15;
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Workerexport VAbv = 20;
70*2d1272b8SAndroid Build Coastguard Workerexport VBlw = 21;
71*2d1272b8SAndroid Build Coastguard Workerexport VPre = 22;
72*2d1272b8SAndroid Build Coastguard Workerexport VPst = 23;
73*2d1272b8SAndroid Build Coastguard Worker
74*2d1272b8SAndroid Build Coastguard Workerexport Robatic = 25;
75*2d1272b8SAndroid Build Coastguard Workerexport Xgroup  = 26;
76*2d1272b8SAndroid Build Coastguard Workerexport Ygroup  = 27;
77*2d1272b8SAndroid Build Coastguard Worker
78*2d1272b8SAndroid Build Coastguard Worker
79*2d1272b8SAndroid Build Coastguard Workerc = (C | Ra | V);
80*2d1272b8SAndroid Build Coastguard Workercn = c.((ZWJ|ZWNJ)?.Robatic)?;
81*2d1272b8SAndroid Build Coastguard Workerjoiner = (ZWJ | ZWNJ);
82*2d1272b8SAndroid Build Coastguard Workerxgroup = (joiner*.Xgroup)*;
83*2d1272b8SAndroid Build Coastguard Workerygroup = Ygroup*;
84*2d1272b8SAndroid Build Coastguard Worker
85*2d1272b8SAndroid Build Coastguard Worker# This grammar was experimentally extracted from what Uniscribe allows.
86*2d1272b8SAndroid Build Coastguard Worker
87*2d1272b8SAndroid Build Coastguard Workermatra_group = VPre? xgroup VBlw? xgroup (joiner?.VAbv)? xgroup VPst?;
88*2d1272b8SAndroid Build Coastguard Workersyllable_tail = xgroup matra_group xgroup (H.c)? ygroup;
89*2d1272b8SAndroid Build Coastguard Worker
90*2d1272b8SAndroid Build Coastguard Worker
91*2d1272b8SAndroid Build Coastguard Workerbroken_cluster =	Robatic? (H.cn)* (H | syllable_tail);
92*2d1272b8SAndroid Build Coastguard Workerconsonant_syllable =	(cn|PLACEHOLDER|DOTTEDCIRCLE) broken_cluster;
93*2d1272b8SAndroid Build Coastguard Workerother =			any;
94*2d1272b8SAndroid Build Coastguard Worker
95*2d1272b8SAndroid Build Coastguard Workermain := |*
96*2d1272b8SAndroid Build Coastguard Worker	consonant_syllable	=> { found_syllable (khmer_consonant_syllable); };
97*2d1272b8SAndroid Build Coastguard Worker	broken_cluster		=> { found_syllable (khmer_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; };
98*2d1272b8SAndroid Build Coastguard Worker	other			=> { found_syllable (khmer_non_khmer_cluster); };
99*2d1272b8SAndroid Build Coastguard Worker*|;
100*2d1272b8SAndroid Build Coastguard Worker
101*2d1272b8SAndroid Build Coastguard Worker
102*2d1272b8SAndroid Build Coastguard Worker}%%
103*2d1272b8SAndroid Build Coastguard Worker
104*2d1272b8SAndroid Build Coastguard Worker#define found_syllable(syllable_type) \
105*2d1272b8SAndroid Build Coastguard Worker  HB_STMT_START { \
106*2d1272b8SAndroid Build Coastguard Worker    if (0) fprintf (stderr, "syllable %u..%u %s\n", ts, te, #syllable_type); \
107*2d1272b8SAndroid Build Coastguard Worker    for (unsigned int i = ts; i < te; i++) \
108*2d1272b8SAndroid Build Coastguard Worker      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
109*2d1272b8SAndroid Build Coastguard Worker    syllable_serial++; \
110*2d1272b8SAndroid Build Coastguard Worker    if (syllable_serial == 16) syllable_serial = 1; \
111*2d1272b8SAndroid Build Coastguard Worker  } HB_STMT_END
112*2d1272b8SAndroid Build Coastguard Worker
113*2d1272b8SAndroid Build Coastguard Workerinline void
114*2d1272b8SAndroid Build Coastguard Workerfind_syllables_khmer (hb_buffer_t *buffer)
115*2d1272b8SAndroid Build Coastguard Worker{
116*2d1272b8SAndroid Build Coastguard Worker  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
117*2d1272b8SAndroid Build Coastguard Worker  int cs;
118*2d1272b8SAndroid Build Coastguard Worker  hb_glyph_info_t *info = buffer->info;
119*2d1272b8SAndroid Build Coastguard Worker  %%{
120*2d1272b8SAndroid Build Coastguard Worker    write init;
121*2d1272b8SAndroid Build Coastguard Worker    getkey info[p].khmer_category();
122*2d1272b8SAndroid Build Coastguard Worker  }%%
123*2d1272b8SAndroid Build Coastguard Worker
124*2d1272b8SAndroid Build Coastguard Worker  p = 0;
125*2d1272b8SAndroid Build Coastguard Worker  pe = eof = buffer->len;
126*2d1272b8SAndroid Build Coastguard Worker
127*2d1272b8SAndroid Build Coastguard Worker  unsigned int syllable_serial = 1;
128*2d1272b8SAndroid Build Coastguard Worker  %%{
129*2d1272b8SAndroid Build Coastguard Worker    write exec;
130*2d1272b8SAndroid Build Coastguard Worker  }%%
131*2d1272b8SAndroid Build Coastguard Worker}
132*2d1272b8SAndroid Build Coastguard Worker
133*2d1272b8SAndroid Build Coastguard Worker#undef found_syllable
134*2d1272b8SAndroid Build Coastguard Worker
135*2d1272b8SAndroid Build Coastguard Worker#endif /* HB_OT_SHAPER_KHMER_MACHINE_HH */
136