xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-ot-shaper-use-machine.rl (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker/*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2015  Mozilla Foundation.
3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2015  Google, Inc.
4*2d1272b8SAndroid Build Coastguard Worker *
5*2d1272b8SAndroid Build Coastguard Worker *  This is part of HarfBuzz, a text shaping library.
6*2d1272b8SAndroid Build Coastguard Worker *
7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
12*2d1272b8SAndroid Build Coastguard Worker *
13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
18*2d1272b8SAndroid Build Coastguard Worker *
19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24*2d1272b8SAndroid Build Coastguard Worker *
25*2d1272b8SAndroid Build Coastguard Worker * Mozilla Author(s): Jonathan Kew
26*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
27*2d1272b8SAndroid Build Coastguard Worker */
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker#ifndef HB_OT_SHAPER_USE_MACHINE_HH
30*2d1272b8SAndroid Build Coastguard Worker#define HB_OT_SHAPER_USE_MACHINE_HH
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker#include "hb.hh"
33*2d1272b8SAndroid Build Coastguard Worker
34*2d1272b8SAndroid Build Coastguard Worker#include "hb-ot-shaper-syllabic.hh"
35*2d1272b8SAndroid Build Coastguard Worker
36*2d1272b8SAndroid Build Coastguard Worker/* buffer var allocations */
37*2d1272b8SAndroid Build Coastguard Worker#define use_category() ot_shaper_var_u8_category()
38*2d1272b8SAndroid Build Coastguard Worker
39*2d1272b8SAndroid Build Coastguard Worker#define USE(Cat) use_syllable_machine_ex_##Cat
40*2d1272b8SAndroid Build Coastguard Worker
41*2d1272b8SAndroid Build Coastguard Workerenum use_syllable_type_t {
42*2d1272b8SAndroid Build Coastguard Worker  use_virama_terminated_cluster,
43*2d1272b8SAndroid Build Coastguard Worker  use_sakot_terminated_cluster,
44*2d1272b8SAndroid Build Coastguard Worker  use_standard_cluster,
45*2d1272b8SAndroid Build Coastguard Worker  use_number_joiner_terminated_cluster,
46*2d1272b8SAndroid Build Coastguard Worker  use_numeral_cluster,
47*2d1272b8SAndroid Build Coastguard Worker  use_symbol_cluster,
48*2d1272b8SAndroid Build Coastguard Worker  use_hieroglyph_cluster,
49*2d1272b8SAndroid Build Coastguard Worker  use_broken_cluster,
50*2d1272b8SAndroid Build Coastguard Worker  use_non_cluster,
51*2d1272b8SAndroid Build Coastguard Worker};
52*2d1272b8SAndroid Build Coastguard Worker
53*2d1272b8SAndroid Build Coastguard Worker%%{
54*2d1272b8SAndroid Build Coastguard Worker  machine use_syllable_machine;
55*2d1272b8SAndroid Build Coastguard Worker  alphtype unsigned char;
56*2d1272b8SAndroid Build Coastguard Worker  write exports;
57*2d1272b8SAndroid Build Coastguard Worker  write data;
58*2d1272b8SAndroid Build Coastguard Worker}%%
59*2d1272b8SAndroid Build Coastguard Worker
60*2d1272b8SAndroid Build Coastguard Worker%%{
61*2d1272b8SAndroid Build Coastguard Worker
62*2d1272b8SAndroid Build Coastguard Worker# Categories used in the Universal Shaping Engine spec:
63*2d1272b8SAndroid Build Coastguard Worker# https://docs.microsoft.com/en-us/typography/script-development/use
64*2d1272b8SAndroid Build Coastguard Worker
65*2d1272b8SAndroid Build Coastguard Workerexport O	= 0; # OTHER
66*2d1272b8SAndroid Build Coastguard Worker
67*2d1272b8SAndroid Build Coastguard Workerexport B	= 1; # BASE
68*2d1272b8SAndroid Build Coastguard Workerexport N	= 4; # BASE_NUM
69*2d1272b8SAndroid Build Coastguard Workerexport GB	= 5; # BASE_OTHER
70*2d1272b8SAndroid Build Coastguard Workerexport CGJ	= 6; # CGJ
71*2d1272b8SAndroid Build Coastguard Workerexport SUB	= 11; # CONS_SUB
72*2d1272b8SAndroid Build Coastguard Workerexport H	= 12; # HALANT
73*2d1272b8SAndroid Build Coastguard Worker
74*2d1272b8SAndroid Build Coastguard Workerexport HN	= 13; # HALANT_NUM
75*2d1272b8SAndroid Build Coastguard Workerexport ZWNJ	= 14; # Zero width non-joiner
76*2d1272b8SAndroid Build Coastguard Workerexport WJ	= 16; # Word joiner
77*2d1272b8SAndroid Build Coastguard Workerexport R	= 18; # REPHA
78*2d1272b8SAndroid Build Coastguard Workerexport CS	= 43; # CONS_WITH_STACKER
79*2d1272b8SAndroid Build Coastguard Workerexport IS	= 44; # INVISIBLE_STACKER
80*2d1272b8SAndroid Build Coastguard Workerexport Sk	= 48; # SAKOT
81*2d1272b8SAndroid Build Coastguard Workerexport G	= 49; # HIEROGLYPH
82*2d1272b8SAndroid Build Coastguard Workerexport J	= 50; # HIEROGLYPH_JOINER
83*2d1272b8SAndroid Build Coastguard Workerexport SB	= 51; # HIEROGLYPH_SEGMENT_BEGIN
84*2d1272b8SAndroid Build Coastguard Workerexport SE	= 52; # HIEROGLYPH_SEGMENT_END
85*2d1272b8SAndroid Build Coastguard Workerexport HVM	= 53; # HALANT_OR_VOWEL_MODIFIER
86*2d1272b8SAndroid Build Coastguard Workerexport HM	= 54; # HIEROGLYPH_MOD
87*2d1272b8SAndroid Build Coastguard Workerexport HR	= 55; # HIEROGLYPH_MIRROR
88*2d1272b8SAndroid Build Coastguard Workerexport RK	= 56; # REORDERING_KILLER
89*2d1272b8SAndroid Build Coastguard Worker
90*2d1272b8SAndroid Build Coastguard Workerexport FAbv	= 24; # CONS_FINAL_ABOVE
91*2d1272b8SAndroid Build Coastguard Workerexport FBlw	= 25; # CONS_FINAL_BELOW
92*2d1272b8SAndroid Build Coastguard Workerexport FPst	= 26; # CONS_FINAL_POST
93*2d1272b8SAndroid Build Coastguard Workerexport MAbv	= 27; # CONS_MED_ABOVE
94*2d1272b8SAndroid Build Coastguard Workerexport MBlw	= 28; # CONS_MED_BELOW
95*2d1272b8SAndroid Build Coastguard Workerexport MPst	= 29; # CONS_MED_POST
96*2d1272b8SAndroid Build Coastguard Workerexport MPre	= 30; # CONS_MED_PRE
97*2d1272b8SAndroid Build Coastguard Workerexport CMAbv	= 31; # CONS_MOD_ABOVE
98*2d1272b8SAndroid Build Coastguard Workerexport CMBlw	= 32; # CONS_MOD_BELOW
99*2d1272b8SAndroid Build Coastguard Workerexport VAbv	= 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
100*2d1272b8SAndroid Build Coastguard Workerexport VBlw	= 34; # VOWEL_BELOW / VOWEL_BELOW_POST
101*2d1272b8SAndroid Build Coastguard Workerexport VPst	= 35; # VOWEL_POST	UIPC = Right
102*2d1272b8SAndroid Build Coastguard Workerexport VPre	= 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
103*2d1272b8SAndroid Build Coastguard Workerexport VMAbv	= 37; # VOWEL_MOD_ABOVE
104*2d1272b8SAndroid Build Coastguard Workerexport VMBlw	= 38; # VOWEL_MOD_BELOW
105*2d1272b8SAndroid Build Coastguard Workerexport VMPst	= 39; # VOWEL_MOD_POST
106*2d1272b8SAndroid Build Coastguard Workerexport VMPre	= 23; # VOWEL_MOD_PRE
107*2d1272b8SAndroid Build Coastguard Workerexport SMAbv	= 41; # SYM_MOD_ABOVE
108*2d1272b8SAndroid Build Coastguard Workerexport SMBlw	= 42; # SYM_MOD_BELOW
109*2d1272b8SAndroid Build Coastguard Workerexport FMAbv	= 45; # CONS_FINAL_MOD	UIPC = Top
110*2d1272b8SAndroid Build Coastguard Workerexport FMBlw	= 46; # CONS_FINAL_MOD	UIPC = Bottom
111*2d1272b8SAndroid Build Coastguard Workerexport FMPst	= 47; # CONS_FINAL_MOD	UIPC = Not_Applicable
112*2d1272b8SAndroid Build Coastguard Worker
113*2d1272b8SAndroid Build Coastguard Worker
114*2d1272b8SAndroid Build Coastguard Workerh = H | HVM | IS | Sk;
115*2d1272b8SAndroid Build Coastguard Worker
116*2d1272b8SAndroid Build Coastguard Workerconsonant_modifiers = CMAbv* CMBlw* ((h B | SUB) CMAbv* CMBlw*)*;
117*2d1272b8SAndroid Build Coastguard Workermedial_consonants = MPre? MAbv? MBlw? MPst?;
118*2d1272b8SAndroid Build Coastguard Workerdependent_vowels = VPre* VAbv* VBlw* VPst* | H;
119*2d1272b8SAndroid Build Coastguard Workervowel_modifiers = HVM? VMPre* VMAbv* VMBlw* VMPst*;
120*2d1272b8SAndroid Build Coastguard Workerfinal_consonants = FAbv* FBlw* FPst*;
121*2d1272b8SAndroid Build Coastguard Workerfinal_modifiers = FMAbv* FMBlw* | FMPst?;
122*2d1272b8SAndroid Build Coastguard Worker
123*2d1272b8SAndroid Build Coastguard Workercomplex_syllable_start = (R | CS)? (B | GB);
124*2d1272b8SAndroid Build Coastguard Workercomplex_syllable_middle =
125*2d1272b8SAndroid Build Coastguard Worker	consonant_modifiers
126*2d1272b8SAndroid Build Coastguard Worker	medial_consonants
127*2d1272b8SAndroid Build Coastguard Worker	dependent_vowels
128*2d1272b8SAndroid Build Coastguard Worker	vowel_modifiers
129*2d1272b8SAndroid Build Coastguard Worker	(Sk B)*
130*2d1272b8SAndroid Build Coastguard Worker;
131*2d1272b8SAndroid Build Coastguard Workercomplex_syllable_tail =
132*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_middle
133*2d1272b8SAndroid Build Coastguard Worker	final_consonants
134*2d1272b8SAndroid Build Coastguard Worker	final_modifiers
135*2d1272b8SAndroid Build Coastguard Worker;
136*2d1272b8SAndroid Build Coastguard Workernumber_joiner_terminated_cluster_tail = (HN N)* HN;
137*2d1272b8SAndroid Build Coastguard Workernumeral_cluster_tail = (HN N)+;
138*2d1272b8SAndroid Build Coastguard Workersymbol_cluster_tail = SMAbv+ SMBlw* | SMBlw+;
139*2d1272b8SAndroid Build Coastguard Worker
140*2d1272b8SAndroid Build Coastguard Workervirama_terminated_cluster_tail =
141*2d1272b8SAndroid Build Coastguard Worker	consonant_modifiers
142*2d1272b8SAndroid Build Coastguard Worker	(IS | RK)
143*2d1272b8SAndroid Build Coastguard Worker;
144*2d1272b8SAndroid Build Coastguard Workervirama_terminated_cluster =
145*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_start
146*2d1272b8SAndroid Build Coastguard Worker	virama_terminated_cluster_tail
147*2d1272b8SAndroid Build Coastguard Worker;
148*2d1272b8SAndroid Build Coastguard Workersakot_terminated_cluster_tail =
149*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_middle
150*2d1272b8SAndroid Build Coastguard Worker	Sk
151*2d1272b8SAndroid Build Coastguard Worker;
152*2d1272b8SAndroid Build Coastguard Workersakot_terminated_cluster =
153*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_start
154*2d1272b8SAndroid Build Coastguard Worker	sakot_terminated_cluster_tail
155*2d1272b8SAndroid Build Coastguard Worker;
156*2d1272b8SAndroid Build Coastguard Workerstandard_cluster =
157*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_start
158*2d1272b8SAndroid Build Coastguard Worker	complex_syllable_tail
159*2d1272b8SAndroid Build Coastguard Worker;
160*2d1272b8SAndroid Build Coastguard Workertail = complex_syllable_tail | sakot_terminated_cluster_tail | symbol_cluster_tail | virama_terminated_cluster_tail;
161*2d1272b8SAndroid Build Coastguard Workerbroken_cluster =
162*2d1272b8SAndroid Build Coastguard Worker	R?
163*2d1272b8SAndroid Build Coastguard Worker	(tail | number_joiner_terminated_cluster_tail | numeral_cluster_tail)
164*2d1272b8SAndroid Build Coastguard Worker;
165*2d1272b8SAndroid Build Coastguard Worker
166*2d1272b8SAndroid Build Coastguard Workernumber_joiner_terminated_cluster = N number_joiner_terminated_cluster_tail;
167*2d1272b8SAndroid Build Coastguard Workernumeral_cluster = N numeral_cluster_tail?;
168*2d1272b8SAndroid Build Coastguard Workersymbol_cluster = (O | GB | SB) tail?;
169*2d1272b8SAndroid Build Coastguard Workerhieroglyph_cluster = SB* G HR? HM? SE* (J SB* (G HR? HM? SE*)?)*;
170*2d1272b8SAndroid Build Coastguard Workerother = any;
171*2d1272b8SAndroid Build Coastguard Worker
172*2d1272b8SAndroid Build Coastguard Workermain := |*
173*2d1272b8SAndroid Build Coastguard Worker	virama_terminated_cluster ZWNJ?		=> { found_syllable (use_virama_terminated_cluster); };
174*2d1272b8SAndroid Build Coastguard Worker	sakot_terminated_cluster ZWNJ?		=> { found_syllable (use_sakot_terminated_cluster); };
175*2d1272b8SAndroid Build Coastguard Worker	standard_cluster ZWNJ?			=> { found_syllable (use_standard_cluster); };
176*2d1272b8SAndroid Build Coastguard Worker	number_joiner_terminated_cluster ZWNJ?	=> { found_syllable (use_number_joiner_terminated_cluster); };
177*2d1272b8SAndroid Build Coastguard Worker	numeral_cluster ZWNJ?			=> { found_syllable (use_numeral_cluster); };
178*2d1272b8SAndroid Build Coastguard Worker	symbol_cluster ZWNJ?			=> { found_syllable (use_symbol_cluster); };
179*2d1272b8SAndroid Build Coastguard Worker	hieroglyph_cluster ZWNJ?		=> { found_syllable (use_hieroglyph_cluster); };
180*2d1272b8SAndroid Build Coastguard Worker	broken_cluster ZWNJ?			=> { found_syllable (use_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; };
181*2d1272b8SAndroid Build Coastguard Worker	other					=> { found_syllable (use_non_cluster); };
182*2d1272b8SAndroid Build Coastguard Worker*|;
183*2d1272b8SAndroid Build Coastguard Worker
184*2d1272b8SAndroid Build Coastguard Worker
185*2d1272b8SAndroid Build Coastguard Worker}%%
186*2d1272b8SAndroid Build Coastguard Worker
187*2d1272b8SAndroid Build Coastguard Worker#define found_syllable(syllable_type) \
188*2d1272b8SAndroid Build Coastguard Worker  HB_STMT_START { \
189*2d1272b8SAndroid Build Coastguard Worker    if (0) fprintf (stderr, "syllable %u..%u %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
190*2d1272b8SAndroid Build Coastguard Worker    for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
191*2d1272b8SAndroid Build Coastguard Worker      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
192*2d1272b8SAndroid Build Coastguard Worker    syllable_serial++; \
193*2d1272b8SAndroid Build Coastguard Worker    if (syllable_serial == 16) syllable_serial = 1; \
194*2d1272b8SAndroid Build Coastguard Worker  } HB_STMT_END
195*2d1272b8SAndroid Build Coastguard Worker
196*2d1272b8SAndroid Build Coastguard Worker
197*2d1272b8SAndroid Build Coastguard Workertemplate <typename Iter>
198*2d1272b8SAndroid Build Coastguard Workerstruct machine_index_t :
199*2d1272b8SAndroid Build Coastguard Worker  hb_iter_with_fallback_t<machine_index_t<Iter>,
200*2d1272b8SAndroid Build Coastguard Worker			  typename Iter::item_t>
201*2d1272b8SAndroid Build Coastguard Worker{
202*2d1272b8SAndroid Build Coastguard Worker  machine_index_t (const Iter& it) : it (it) {}
203*2d1272b8SAndroid Build Coastguard Worker  machine_index_t (const machine_index_t& o) : hb_iter_with_fallback_t<machine_index_t<Iter>,
204*2d1272b8SAndroid Build Coastguard Worker								       typename Iter::item_t> (),
205*2d1272b8SAndroid Build Coastguard Worker					       it (o.it), is_null (o.is_null) {}
206*2d1272b8SAndroid Build Coastguard Worker
207*2d1272b8SAndroid Build Coastguard Worker  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
208*2d1272b8SAndroid Build Coastguard Worker  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
209*2d1272b8SAndroid Build Coastguard Worker
210*2d1272b8SAndroid Build Coastguard Worker  typename Iter::item_t __item__ () const { return *it; }
211*2d1272b8SAndroid Build Coastguard Worker  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
212*2d1272b8SAndroid Build Coastguard Worker  unsigned __len__ () const { return it.len (); }
213*2d1272b8SAndroid Build Coastguard Worker  void __next__ () { ++it; }
214*2d1272b8SAndroid Build Coastguard Worker  void __forward__ (unsigned n) { it += n; }
215*2d1272b8SAndroid Build Coastguard Worker  void __prev__ () { --it; }
216*2d1272b8SAndroid Build Coastguard Worker  void __rewind__ (unsigned n) { it -= n; }
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker  void operator = (unsigned n)
219*2d1272b8SAndroid Build Coastguard Worker  {
220*2d1272b8SAndroid Build Coastguard Worker    assert (n == 0);
221*2d1272b8SAndroid Build Coastguard Worker    is_null = true;
222*2d1272b8SAndroid Build Coastguard Worker  }
223*2d1272b8SAndroid Build Coastguard Worker  explicit operator bool () { return !is_null; }
224*2d1272b8SAndroid Build Coastguard Worker
225*2d1272b8SAndroid Build Coastguard Worker  void operator = (const machine_index_t& o)
226*2d1272b8SAndroid Build Coastguard Worker  {
227*2d1272b8SAndroid Build Coastguard Worker    is_null = o.is_null;
228*2d1272b8SAndroid Build Coastguard Worker    unsigned index = (*it).first;
229*2d1272b8SAndroid Build Coastguard Worker    unsigned n = (*o.it).first;
230*2d1272b8SAndroid Build Coastguard Worker    if (index < n) it += n - index; else if (index > n) it -= index - n;
231*2d1272b8SAndroid Build Coastguard Worker  }
232*2d1272b8SAndroid Build Coastguard Worker  bool operator == (const machine_index_t& o) const
233*2d1272b8SAndroid Build Coastguard Worker  { return is_null ? o.is_null : !o.is_null && (*it).first == (*o.it).first; }
234*2d1272b8SAndroid Build Coastguard Worker  bool operator != (const machine_index_t& o) const { return !(*this == o); }
235*2d1272b8SAndroid Build Coastguard Worker
236*2d1272b8SAndroid Build Coastguard Worker  private:
237*2d1272b8SAndroid Build Coastguard Worker  Iter it;
238*2d1272b8SAndroid Build Coastguard Worker  bool is_null = false;
239*2d1272b8SAndroid Build Coastguard Worker};
240*2d1272b8SAndroid Build Coastguard Workerstruct
241*2d1272b8SAndroid Build Coastguard Worker{
242*2d1272b8SAndroid Build Coastguard Worker  template <typename Iter,
243*2d1272b8SAndroid Build Coastguard Worker	    hb_requires (hb_is_iterable (Iter))>
244*2d1272b8SAndroid Build Coastguard Worker  machine_index_t<hb_iter_type<Iter>>
245*2d1272b8SAndroid Build Coastguard Worker  operator () (Iter&& it) const
246*2d1272b8SAndroid Build Coastguard Worker  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
247*2d1272b8SAndroid Build Coastguard Worker}
248*2d1272b8SAndroid Build Coastguard WorkerHB_FUNCOBJ (machine_index);
249*2d1272b8SAndroid Build Coastguard Worker
250*2d1272b8SAndroid Build Coastguard Worker
251*2d1272b8SAndroid Build Coastguard Worker
252*2d1272b8SAndroid Build Coastguard Workerstatic bool
253*2d1272b8SAndroid Build Coastguard Workernot_ccs_default_ignorable (const hb_glyph_info_t &i)
254*2d1272b8SAndroid Build Coastguard Worker{ return i.use_category() != USE(CGJ); }
255*2d1272b8SAndroid Build Coastguard Worker
256*2d1272b8SAndroid Build Coastguard Workerstatic inline void
257*2d1272b8SAndroid Build Coastguard Workerfind_syllables_use (hb_buffer_t *buffer)
258*2d1272b8SAndroid Build Coastguard Worker{
259*2d1272b8SAndroid Build Coastguard Worker  hb_glyph_info_t *info = buffer->info;
260*2d1272b8SAndroid Build Coastguard Worker  auto p =
261*2d1272b8SAndroid Build Coastguard Worker    + hb_iter (info, buffer->len)
262*2d1272b8SAndroid Build Coastguard Worker    | hb_enumerate
263*2d1272b8SAndroid Build Coastguard Worker    | hb_filter ([] (const hb_glyph_info_t &i) { return not_ccs_default_ignorable (i); },
264*2d1272b8SAndroid Build Coastguard Worker		 hb_second)
265*2d1272b8SAndroid Build Coastguard Worker    | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
266*2d1272b8SAndroid Build Coastguard Worker		 {
267*2d1272b8SAndroid Build Coastguard Worker		   if (p.second.use_category() == USE(ZWNJ))
268*2d1272b8SAndroid Build Coastguard Worker		     for (unsigned i = p.first + 1; i < buffer->len; ++i)
269*2d1272b8SAndroid Build Coastguard Worker		       if (not_ccs_default_ignorable (info[i]))
270*2d1272b8SAndroid Build Coastguard Worker			 return !_hb_glyph_info_is_unicode_mark (&info[i]);
271*2d1272b8SAndroid Build Coastguard Worker		   return true;
272*2d1272b8SAndroid Build Coastguard Worker		 })
273*2d1272b8SAndroid Build Coastguard Worker    | hb_enumerate
274*2d1272b8SAndroid Build Coastguard Worker    | machine_index
275*2d1272b8SAndroid Build Coastguard Worker    ;
276*2d1272b8SAndroid Build Coastguard Worker  auto pe = p + p.len ();
277*2d1272b8SAndroid Build Coastguard Worker  auto eof = +pe;
278*2d1272b8SAndroid Build Coastguard Worker  auto ts = +p;
279*2d1272b8SAndroid Build Coastguard Worker  auto te = +p;
280*2d1272b8SAndroid Build Coastguard Worker  unsigned int act HB_UNUSED;
281*2d1272b8SAndroid Build Coastguard Worker  int cs;
282*2d1272b8SAndroid Build Coastguard Worker  %%{
283*2d1272b8SAndroid Build Coastguard Worker    write init;
284*2d1272b8SAndroid Build Coastguard Worker    getkey (*p).second.second.use_category();
285*2d1272b8SAndroid Build Coastguard Worker  }%%
286*2d1272b8SAndroid Build Coastguard Worker
287*2d1272b8SAndroid Build Coastguard Worker  unsigned int syllable_serial = 1;
288*2d1272b8SAndroid Build Coastguard Worker  %%{
289*2d1272b8SAndroid Build Coastguard Worker    write exec;
290*2d1272b8SAndroid Build Coastguard Worker  }%%
291*2d1272b8SAndroid Build Coastguard Worker}
292*2d1272b8SAndroid Build Coastguard Worker
293*2d1272b8SAndroid Build Coastguard Worker#undef found_syllable
294*2d1272b8SAndroid Build Coastguard Worker
295*2d1272b8SAndroid Build Coastguard Worker#endif /* HB_OT_SHAPER_USE_MACHINE_HH */
296