[Myanmar] Fixup handling of joiners and GB characters

This commit is contained in:
Behdad Esfahbod 2013-02-11 16:06:02 -05:00
parent 1c8654ead4
commit 0572c1410a
2 changed files with 19 additions and 6 deletions

View File

@ -44,8 +44,7 @@ C = 1;
D = 19; D = 19;
D0 = 20; D0 = 20;
DB = 3; DB = 3;
DOTTEDCIRCLE = 12; GB = 12;
NBSP = 11;
H = 4; H = 4;
IV = 2; IV = 2;
MH = 21; MH = 21;
@ -63,7 +62,6 @@ ZWJ = 6;
ZWNJ = 5; ZWNJ = 5;
Ra = 16; Ra = 16;
gb = (DOTTEDCIRCLE | NBSP); # Generic base characters
j = ZWJ|ZWNJ; # Joiners j = ZWJ|ZWNJ; # Joiners
k = (Ra As H); # Kinzi k = (Ra As H); # Kinzi
@ -77,7 +75,7 @@ pwo_tone_group = PT A* (DB As?)?;
complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?; complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?;
syllable_tail = (H | complex_syllable_tail); syllable_tail = (H | complex_syllable_tail);
consonant_syllable = k? (c|IV|D|gb).VS? (H (c|IV).VS?)* syllable_tail; consonant_syllable = k? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail;
broken_cluster = k? VS? syllable_tail; broken_cluster = k? VS? syllable_tail;
other = any; other = any;

View File

@ -146,7 +146,7 @@ enum myanmar_category_t {
OT_SM = 8, OT_SM = 8,
OT_A = 10, OT_A = 10,
OT_NBSP = 11, OT_NBSP = 11,
OT_DOTTEDCIRCLE = 12, /* Not in the spec, but special in Uniscribe. /Very very/ special! */ OT_GB = 12,
OT_Ra = 16, /* Not explicitly listed in the OT spec, but used in the grammar. */ OT_Ra = 16, /* Not explicitly listed in the OT spec, but used in the grammar. */
OT_CM = 17, /* Generic Consonant_Medial; NOT used for Myanmar. */ OT_CM = 17, /* Generic Consonant_Medial; NOT used for Myanmar. */
@ -210,7 +210,7 @@ is_one_of (const hb_glyph_info_t &info, unsigned int flags)
* We treat Vowels and placeholders as if they were consonants. This is safe because Vowels * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels
* cannot happen in a consonant syllable. The plus side however is, we can call the * cannot happen in a consonant syllable. The plus side however is, we can call the
* consonant syllable logic from the vowel syllable function and get it all right! */ * consonant syllable logic from the vowel syllable function and get it all right! */
#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CM) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_DOTTEDCIRCLE)) #define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CM) | FLAG (OT_Ra) | FLAG (OT_V) | FLAG (OT_NBSP) | FLAG (OT_GB))
static inline bool static inline bool
is_consonant (const hb_glyph_info_t &info) is_consonant (const hb_glyph_info_t &info)
{ {
@ -232,6 +232,21 @@ set_myanmar_properties (hb_glyph_info_t &info)
cat = OT_VS; cat = OT_VS;
switch (u) switch (u)
{ {
case 0x002D: case 0x00A0: case 0x00D7: case 0x2012:
case 0x2013: case 0x2014: case 0x2015: case 0x2022:
case 0x25CC: case 0x25FB: case 0x25FC: case 0x25FD:
case 0x25FE:
cat = OT_GB;
break;
case 0x200C:
cat = OT_ZWNJ;
break;
case 0x200D:
cat = OT_ZWJ;
break;
case 0x1004: case 0x101B: case 0x105A: case 0x1004: case 0x101B: case 0x105A:
cat = OT_Ra; cat = OT_Ra;
break; break;