1 /* |
|
2 * Copyright © 2018 Google, Inc. |
|
3 * |
|
4 * This is part of HarfBuzz, a text shaping library. |
|
5 * |
|
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. |
|
11 * |
|
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 |
|
16 * DAMAGE. |
|
17 * |
|
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. |
|
23 * |
|
24 * Google Author(s): Behdad Esfahbod |
|
25 */ |
|
26 |
|
27 #ifndef HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH |
|
28 #define HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH |
|
29 |
|
30 #include "hb-private.hh" |
|
31 |
|
32 #include "hb-ot-shape-complex-indic-private.hh" |
|
33 |
|
34 |
|
35 /* buffer var allocations */ |
|
36 #define myanmar_category() indic_category() /* myanmar_category_t */ |
|
37 #define myanmar_position() indic_position() /* myanmar_position_t */ |
|
38 |
|
39 |
|
40 /* Note: This enum is duplicated in the -machine.rl source file. |
|
41 * Not sure how to avoid duplication. */ |
|
42 enum myanmar_category_t { |
|
43 OT_As = 18, /* Asat */ |
|
44 OT_D0 = 20, /* Digit zero */ |
|
45 OT_DB = OT_N, /* Dot below */ |
|
46 OT_GB = OT_PLACEHOLDER, |
|
47 OT_MH = 21, /* Various consonant medial types */ |
|
48 OT_MR = 22, /* Various consonant medial types */ |
|
49 OT_MW = 23, /* Various consonant medial types */ |
|
50 OT_MY = 24, /* Various consonant medial types */ |
|
51 OT_PT = 25, /* Pwo and other tones */ |
|
52 OT_VAbv = 26, |
|
53 OT_VBlw = 27, |
|
54 OT_VPre = 28, |
|
55 OT_VPst = 29, |
|
56 OT_VS = 30, /* Variation selectors */ |
|
57 OT_P = 31, /* Punctuation */ |
|
58 OT_D = 32, /* Digits except zero */ |
|
59 }; |
|
60 |
|
61 |
|
62 static inline void |
|
63 set_myanmar_properties (hb_glyph_info_t &info) |
|
64 { |
|
65 hb_codepoint_t u = info.codepoint; |
|
66 unsigned int type = hb_indic_get_categories (u); |
|
67 indic_category_t cat = (indic_category_t) (type & 0x7Fu); |
|
68 indic_position_t pos = (indic_position_t) (type >> 8); |
|
69 |
|
70 /* Myanmar |
|
71 * https://docs.microsoft.com/en-us/typography/script-development/myanmar#analyze |
|
72 */ |
|
73 if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu))) |
|
74 cat = (indic_category_t) OT_VS; |
|
75 |
|
76 switch (u) |
|
77 { |
|
78 case 0x104Eu: |
|
79 cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */ |
|
80 break; |
|
81 |
|
82 case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u: |
|
83 case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u: |
|
84 case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu: |
|
85 case 0x25FEu: |
|
86 cat = (indic_category_t) OT_GB; |
|
87 break; |
|
88 |
|
89 case 0x1004u: case 0x101Bu: case 0x105Au: |
|
90 cat = (indic_category_t) OT_Ra; |
|
91 break; |
|
92 |
|
93 case 0x1032u: case 0x1036u: |
|
94 cat = (indic_category_t) OT_A; |
|
95 break; |
|
96 |
|
97 case 0x1039u: |
|
98 cat = (indic_category_t) OT_H; |
|
99 break; |
|
100 |
|
101 case 0x103Au: |
|
102 cat = (indic_category_t) OT_As; |
|
103 break; |
|
104 |
|
105 case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u: |
|
106 case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u: |
|
107 case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u: |
|
108 case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u: |
|
109 case 0x1097u: case 0x1098u: case 0x1099u: |
|
110 cat = (indic_category_t) OT_D; |
|
111 break; |
|
112 |
|
113 case 0x1040u: |
|
114 cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */ |
|
115 break; |
|
116 |
|
117 case 0x103Eu: case 0x1060u: |
|
118 cat = (indic_category_t) OT_MH; |
|
119 break; |
|
120 |
|
121 case 0x103Cu: |
|
122 cat = (indic_category_t) OT_MR; |
|
123 break; |
|
124 |
|
125 case 0x103Du: case 0x1082u: |
|
126 cat = (indic_category_t) OT_MW; |
|
127 break; |
|
128 |
|
129 case 0x103Bu: case 0x105Eu: case 0x105Fu: |
|
130 cat = (indic_category_t) OT_MY; |
|
131 break; |
|
132 |
|
133 case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au: |
|
134 case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu: |
|
135 cat = (indic_category_t) OT_PT; |
|
136 break; |
|
137 |
|
138 case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u: |
|
139 case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du: |
|
140 case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu: |
|
141 cat = (indic_category_t) OT_SM; |
|
142 break; |
|
143 |
|
144 case 0x104Au: case 0x104Bu: |
|
145 cat = (indic_category_t) OT_P; |
|
146 break; |
|
147 |
|
148 case 0xAA74u: case 0xAA75u: case 0xAA76u: |
|
149 /* https://github.com/roozbehp/unicode-data/issues/3 */ |
|
150 cat = (indic_category_t) OT_C; |
|
151 break; |
|
152 } |
|
153 |
|
154 if (cat == OT_M) |
|
155 { |
|
156 switch ((int) pos) |
|
157 { |
|
158 case POS_PRE_C: cat = (indic_category_t) OT_VPre; |
|
159 pos = POS_PRE_M; break; |
|
160 case POS_ABOVE_C: cat = (indic_category_t) OT_VAbv; break; |
|
161 case POS_BELOW_C: cat = (indic_category_t) OT_VBlw; break; |
|
162 case POS_POST_C: cat = (indic_category_t) OT_VPst; break; |
|
163 } |
|
164 } |
|
165 |
|
166 info.myanmar_category() = (myanmar_category_t) cat; |
|
167 info.myanmar_position() = pos; |
|
168 } |
|
169 |
|
170 |
|
171 #endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH */ |
|