2 * Copyright © 2011,2012 Google, Inc.
4 * This is part of HarfBuzz, a text shaping library.
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24 * Google Author(s): Behdad Esfahbod
27 #ifndef HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
28 #define HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH
30 #include "hb-private.hh"
35 machine indic_syllable_machine;
36 alphtype unsigned char;
42 # Same order as enum indic_category_t. Not sure how to avoid duplication.
61 matra_group = M N? H?;
62 syllable_tail = SM? (VD VD?)?;
63 place_holder = NBSP | DOTTEDCIRCLE;
66 consonant_syllable = (c.n? (H.z?|z.H))* c.n? A? (H.z? | matra_group*)? syllable_tail;
67 vowel_syllable = (Ra H)? V n? (z?.H.c | ZWJ.c)* matra_group* syllable_tail;
68 standalone_cluster = (Ra H)? place_holder n? (z? H c)* matra_group* syllable_tail;
72 consonant_syllable => { process_syllable (consonant_syllable); };
73 vowel_syllable => { process_syllable (vowel_syllable); };
74 standalone_cluster => { process_syllable (standalone_cluster); };
75 other => { process_syllable (non_indic); };
81 #define process_syllable(func) \
83 /* fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #func); */ \
84 for (unsigned int i = last; i < p+1; i++) \
85 info[i].syllable() = syllable_serial; \
86 PASTE (initial_reordering_, func) (map, buffer, mask_array, last, p+1); \
89 if (unlikely (!syllable_serial)) syllable_serial++; \
93 find_syllables (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array)
95 unsigned int p, pe, eof, ts, te, act;
97 hb_glyph_info_t *info = buffer->info;
100 getkey info[p].indic_category();
104 pe = eof = buffer->len;
106 unsigned int last = 0;
107 uint8_t syllable_serial = 1;
115 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_MACHINE_HH */