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