2013-02-11 19:36:23 +01:00
|
|
|
/*
|
|
|
|
* Copyright © 2011,2012 Google, Inc.
|
|
|
|
*
|
|
|
|
* This is part of HarfBuzz, a text shaping library.
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, without written agreement and without
|
|
|
|
* license or royalty fees, to use, copy, modify, and distribute this
|
|
|
|
* software and its documentation for any purpose, provided that the
|
|
|
|
* above copyright notice and the following two paragraphs appear in
|
|
|
|
* all copies of this software.
|
|
|
|
*
|
|
|
|
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
|
|
|
|
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
|
|
|
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
|
|
|
|
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
|
|
|
* DAMAGE.
|
|
|
|
*
|
|
|
|
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
|
|
|
|
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
|
|
|
|
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
|
|
|
|
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
|
|
|
*
|
|
|
|
* Google Author(s): Behdad Esfahbod
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
|
|
|
|
#define HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH
|
|
|
|
|
|
|
|
#include "hb-private.hh"
|
|
|
|
|
|
|
|
%%{
|
|
|
|
machine myanmar_syllable_machine;
|
|
|
|
alphtype unsigned char;
|
|
|
|
write data;
|
|
|
|
}%%
|
|
|
|
|
|
|
|
%%{
|
|
|
|
|
|
|
|
# Same order as enum myanmar_category_t. Not sure how to avoid duplication.
|
|
|
|
A = 10;
|
|
|
|
As = 18;
|
|
|
|
C = 1;
|
2017-10-03 15:20:07 +02:00
|
|
|
D = 32;
|
2013-02-11 19:36:23 +01:00
|
|
|
D0 = 20;
|
|
|
|
DB = 3;
|
2014-05-27 23:49:45 +02:00
|
|
|
GB = 11;
|
2013-02-11 19:36:23 +01:00
|
|
|
H = 4;
|
|
|
|
IV = 2;
|
|
|
|
MH = 21;
|
|
|
|
MR = 22;
|
|
|
|
MW = 23;
|
|
|
|
MY = 24;
|
|
|
|
PT = 25;
|
|
|
|
V = 8;
|
|
|
|
VAbv = 26;
|
|
|
|
VBlw = 27;
|
|
|
|
VPre = 28;
|
|
|
|
VPst = 29;
|
|
|
|
VS = 30;
|
|
|
|
ZWJ = 6;
|
|
|
|
ZWNJ = 5;
|
|
|
|
Ra = 16;
|
2013-11-26 00:10:38 +01:00
|
|
|
P = 31;
|
2017-10-03 15:20:07 +02:00
|
|
|
CS = 19;
|
2013-02-11 19:36:23 +01:00
|
|
|
|
|
|
|
j = ZWJ|ZWNJ; # Joiners
|
|
|
|
k = (Ra As H); # Kinzi
|
|
|
|
|
|
|
|
c = C|Ra; # is_consonant
|
|
|
|
|
[myanmar] Allow MedialYa+Asat in the grammar
The grammar in the OT spec, and the existing Windows implementation
seem to be confused around where to allow Asat around the medial
consonants.
The previous grammar for medial group was allowing an Asat after
the medial group only if there was a medial Wa or Ha, but not if
there was only a medial Ya. This doesn't make sense to me and
sounds reversed, as both medial Wa and Ha are below marks while
Asat is an above mark. An Asat can come before the medial group
already (in fact, multiple ones can. Why?!). The medial Ya
however is a spacing mark and according to Roozbeh it's valid
to want an Asat on the medial Ya instead of the base, so it looks
to me like we want to allow an Asat after the medial group if
there *was* a Ya but not if there wasn't any. Not wanting to
produce dotted-circle where Windows is not, this commit changes
the grammar to allow one Asat after the medial group no matter
what comes in the group.
Test: U+1002,103A,103B vs U+1002,103B,103A
2014-05-15 00:44:39 +02:00
|
|
|
medial_group = MY? MR? MW? MH? As?;
|
2018-02-02 18:04:04 +01:00
|
|
|
main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
|
2013-02-11 19:36:23 +01:00
|
|
|
post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
|
2013-11-25 23:50:07 +01:00
|
|
|
pwo_tone_group = PT A* DB? As?;
|
2013-02-11 19:36:23 +01:00
|
|
|
|
|
|
|
complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
|
|
|
|
syllable_tail = (H | complex_syllable_tail);
|
|
|
|
|
2017-10-03 15:20:07 +02:00
|
|
|
consonant_syllable = (k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
|
2013-11-26 00:10:38 +01:00
|
|
|
punctuation_cluster = P V;
|
2013-02-11 19:36:23 +01:00
|
|
|
broken_cluster = k? VS? syllable_tail;
|
|
|
|
other = any;
|
|
|
|
|
|
|
|
main := |*
|
|
|
|
consonant_syllable => { found_syllable (consonant_syllable); };
|
|
|
|
j => { found_syllable (non_myanmar_cluster); };
|
2013-11-26 00:10:38 +01:00
|
|
|
punctuation_cluster => { found_syllable (punctuation_cluster); };
|
2013-02-11 19:36:23 +01:00
|
|
|
broken_cluster => { found_syllable (broken_cluster); };
|
|
|
|
other => { found_syllable (non_myanmar_cluster); };
|
|
|
|
*|;
|
|
|
|
|
|
|
|
|
|
|
|
}%%
|
|
|
|
|
|
|
|
#define found_syllable(syllable_type) \
|
|
|
|
HB_STMT_START { \
|
|
|
|
if (0) fprintf (stderr, "syllable %d..%d %s\n", last, p+1, #syllable_type); \
|
|
|
|
for (unsigned int i = last; i < p+1; i++) \
|
|
|
|
info[i].syllable() = (syllable_serial << 4) | syllable_type; \
|
|
|
|
last = p+1; \
|
|
|
|
syllable_serial++; \
|
|
|
|
if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
|
|
|
|
} HB_STMT_END
|
|
|
|
|
|
|
|
static void
|
|
|
|
find_syllables (hb_buffer_t *buffer)
|
|
|
|
{
|
2018-04-24 06:34:15 +02:00
|
|
|
unsigned int p, pe, eof, ts HB_UNUSED, te HB_UNUSED, act HB_UNUSED;
|
2013-02-11 19:36:23 +01:00
|
|
|
int cs;
|
|
|
|
hb_glyph_info_t *info = buffer->info;
|
|
|
|
%%{
|
|
|
|
write init;
|
|
|
|
getkey info[p].myanmar_category();
|
|
|
|
}%%
|
|
|
|
|
|
|
|
p = 0;
|
|
|
|
pe = eof = buffer->len;
|
|
|
|
|
|
|
|
unsigned int last = 0;
|
|
|
|
unsigned int syllable_serial = 1;
|
|
|
|
%%{
|
|
|
|
write exec;
|
|
|
|
}%%
|
|
|
|
}
|
|
|
|
|
|
|
|
#undef found_syllable
|
|
|
|
|
|
|
|
#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_MACHINE_HH */
|