<div dir="ltr"><div><div><div><div><div>Hi, Behdad and List,<br><br></div>I'm working on a Tai Tham font called "Hariphunchai". The font primarily uses GSUB substitutions to render the Tai Tham script which, in terms of features as you probably know, is quite similar to Khmer (Cambodian). <br>
<br>Relevant to the current discussion, Tai Tham has (i) above-base vowel marks, (ii) above-base tone marks and (iii) below-base subjoined consonants. The below base subjoined consonants are typed using (iv) U+1A60 TAI THAM SAKOT which is functionally similar to Khmer U+17D2 KHMER SIGN COENG.<br>
<br></div>When shaping text, the correct ordering for your typical consonant-vowel-consonant syllable is: BASE_CONSONANT + (i)VOWEL_MARK + (ii) TONE MARK +(iv) U+1A60 SAKOT + (iii) SUBJOINED CONSONANT<br><br></div>With Harfbuzz 0.90, I get the shaping that I expect as shown in the first image. But with the most recent versions of HarfBuzz including the latest version (sorry, I don't know at which intermediate version things changed), I get incorrect shaping, as shown in the 2nd image. These flaws are apparent in the latest versions of Firefox too (which presumably contains the latest HarfBuzz library unchanged in some statically linked form I guess ... )<br>
<br></div>Can someone please give me a hint about what changed in HarfBuzz? Is this a bug in HarfBuzz? Or is some definition in my OpenType feature file not correct after changes were made in HarfBuzz?<br><br></div><div>Here is a one-word example from the images that anyone can use for testing:<br>
</div><div><br>U+1A20 U+1A62 U+1A76 U+1A60 U+1A36<br><br></div><div>I have also attached the font file.<br></div><div><br></div><div>Let me know if anyone needs any further information. I will be most grateful if someone will take a little bit of time to help me figure this out - especially as I'm beginning to think it might possibly be a regression in HarfBuzz itself. Thanks!<br>
<br></div><div>- Ed<br></div><div><br><br></div>==== OpenType Feature File Below ======<br><br><br># GSUB <br><br><br>lookup VowelAndToneAboveLigatures {<br> lookupflag 0;<br> sub \uni1A62 \uni1A75 by \uni1A62.uni1A75.lig;<br>
sub \uni1A65 \uni1A75 by \uni1A65.uni1A75.lig;<br> sub \uni1A66 \uni1A75 by \uni1A66.uni1A75.lig;<br> sub \uni1A67 \uni1A75 by \uni1A67.uni1A75.lig;<br> sub \uni1A68 \uni1A75 by \uni1A68.uni1A75.lig;<br> sub \uni1A6B \uni1A75 by \uni1A6B.uni1A75.lig;<br>
sub \uni1A74 \uni1A75 by \uni1A74.uni1A75.lig;<br> sub \uni1A75 \uni1A74 by \uni1A74.uni1A75.lig;<br> sub \uni1A62 \uni1A76 by \uni1A62.uni1A76.lig;<br> sub \uni1A65 \uni1A76 by \uni1A65.uni1A76.lig;<br> sub \uni1A66 \uni1A76 by \uni1A66.uni1A76.lig;<br>
sub \uni1A67 \uni1A76 by \uni1A67.uni1A76.lig;<br> sub \uni1A68 \uni1A76 by \uni1A68.uni1A76.lig;<br> sub \uni1A6B \uni1A76 by \uni1A6B.uni1A76.lig;<br> sub \uni1A74 \uni1A76 by \uni1A74.uni1A76.lig;<br> sub \uni1A76 \uni1A74 by \uni1A74.uni1A76.lig;<br>
} VowelAndToneAboveLigatures;<br><br>lookup NaLigatures {<br> lookupflag IgnoreMarks;<br> sub \uni1A2C \uni1A2C by \uni1A2C.uni1A2C.lig;<br> sub \uni1A36 \uni1A63 by \uni1A36.uni1A63.lig;<br> sub \uni1A36 \uni1A60 \uni1A2F \uni1A63 by \uni1A36_1A2F_1A63.lig;<br>
sub \uni1A36 \uni1A60 \uni1A32 \uni1A63 by \uni1A36_1A32_1A63.lig;<br> sub \uni1A36 \uni1A60 \uni1A33 \uni1A63 by \uni1A36_1A33_1A63.lig;<br> sub \uni1A36 \uni1A60 \uni1A34 \uni1A63 by \uni1A36_1A34_1A63.lig;<br>
sub \uni1A36 \uni1A60 \uni1A35 \uni1A63 by \uni1A36_1A35_1A63.lig;<br> sub \uni1A36 \uni1A60 \uni1A36 \uni1A63 by \uni1A36_1A36_1A63.lig;<br>} NaLigatures;<br><br>lookup SubjoinedConsonantsWithVowels {<br> lookupflag 0;<br>
sub \uni1A60 \uni1A36 \uni1A69 by \uni1A36.uni1A69.sub;<br> sub \uni1A60 \uni1A36 \uni1A6A by \uni1A36.uni1A6A.sub;<br> sub \uni1A60 \uni1A3E \uni1A69 by \uni1A3E.uni1A69.sub;<br> sub \uni1A60 \uni1A3E \uni1A6A by \uni1A3E.uni1A6A.sub;<br>
} SubjoinedConsonantsWithVowels;<br><br>lookup SubjoinedConsonants {<br> lookupflag IgnoreMarks, IgnoreLigatures;<br> sub \uni1A60 \uni1A21 by \uni1A21.sub;<br> sub \uni1A60 \uni1A20 by \uni1A20.sub;<br> sub \uni1A60 \uni1A23 by \uni1A23.sub;<br>
sub \uni1A60 \uni1A25 by \uni1A25.sub;<br> sub \uni1A60 \uni1A26 by \uni1A26.sub;<br> sub \uni1A60 \uni1A27 by \uni1A27.sub;<br> sub \uni1A60 \uni1A28 by \uni1A28.sub;<br> sub \uni1A60 \uni1A29 by \uni1A29.sub;<br>
sub \uni1A60 \uni1A2B by \uni1A2B.sub;<br> sub \uni1A60 \uni1A2C by \uni1A2C.sub;<br> sub \uni1A60 \uni1A2D by \uni1A2D.sub;<br> sub \uni1A60 \uni1A2E by \uni1A2E.sub;<br> sub \uni1A60 \uni1A2F by \uni1A2F.sub;<br>
sub \uni1A60 \uni1A30 by \uni1A30.sub;<br> sub \uni1A60 \uni1A31 by \uni1A31.sub;<br> sub \uni1A60 \uni1A32 by \uni1A32.sub;<br> sub \uni1A60 \uni1A33 by \uni1A33.sub;<br> sub \uni1A60 \uni1A34 by \uni1A34.sub;<br>
sub \uni1A60 \uni1A35 by \uni1A35.sub;<br> sub \uni1A60 \uni1A36 by \uni1A36.sub;<br> sub \uni1A60 \uni1A37 by \uni1A37.sub;<br> sub \uni1A60 \uni1A39 by \uni1A39.sub;<br> sub \uni1A60 \uni1A3B by \uni1A3B.sub;<br>
sub \uni1A60 \uni1A3D by \uni1A3D.sub;<br> sub \uni1A60 \uni1A3E by \uni1A3E.sub;<br> sub \uni1A60 \uni1A3F by \uni1A3F.sub;<br> sub \uni1A60 \uni1A41 by \uni1A41.sub;<br> sub \uni1A60 \uni1A43 by \uni1A43.sub;<br>
sub \uni1A60 \uni1A45 by \uni1A45.sub;<br> sub \uni1A60 \uni1A46 by \uni1A46.sub;<br> sub \uni1A60 \uni1A47 by \uni1A47.sub;<br> sub \uni1A60 \uni1A48 by \uni1A48.sub;<br> sub \uni1A60 \uni1A49 by \uni1A49.sub;<br>
sub \uni1A60 \uni1A4A by \uni1A4A.sub;<br> sub \uni1A60 \uni1A4B by \uni1A4B.sub;<br> sub \uni1A60 \uni1A54 by \uni1A54.sub;<br> sub \uni1A60 \uni1A53 by \uni1A53.sub;<br> sub \uni1A60 \uni1A22 by \uni1A22.sub;<br>
sub \uni1A60 \uni1A24 by \uni1A24.sub;<br> sub \uni1A60 \uni1A2A by \uni1A2A.sub;<br> sub \uni1A60 \uni1A3C by \uni1A3C.sub;<br> sub \uni1A60 \uni1A3A by \uni1A3A.sub;<br> sub \uni1A60 \uni1A40 by \uni1A40.sub;<br>
sub \uni1A60 \uni1A4C by \uni1A4C.sub;<br>} SubjoinedConsonants;<br><br>feature ccmp {<br><br> script DFLT;<br> language dflt ;<br> lookup VowelAndToneAboveLigatures;<br> lookup NaLigatures;<br> lookup SubjoinedConsonantsWithVowels;<br>
lookup SubjoinedConsonants;<br><br> script lana;<br> language dflt ;<br> lookup VowelAndToneAboveLigatures;<br> lookup NaLigatures;<br> lookup SubjoinedConsonantsWithVowels;<br> lookup SubjoinedConsonants;<br>
<br>} ccmp;<br><br># GPOS <br><br><br>lookup TopAndBottom {<br> lookupflag 0;<br> markClass [\uni1A74 ] <anchor -66 352> @TopPositioningForMaiKang;<br> markClass [\uni1A74.uni1A75.lig ] <anchor -150 352> @TopPositioningForMaiKang;<br>
markClass [\uni1A74.uni1A76.lig ] <anchor -416 352> @TopPositioningForMaiKang;<br> markClass [\uni1A66 ] <anchor -155 352> @TopSara_II;<br> markClass [\uni1A66.uni1A75.lig ] <anchor -244 352> @TopSara_II;<br>
markClass [\uni1A66.uni1A76.lig ] <anchor -519 352> @TopSara_II;<br> markClass [\uni1A62 ] <anchor -314 352> @TopCenteredOnCenter;<br> markClass [\uni1A76 ] <anchor -300 352> @TopCenteredOnCenter;<br>
markClass [\uni1A62.uni1A75.lig ] <anchor -327 351> @TopCenteredOnCenter;<br> markClass [\uni1A62.uni1A76.lig ] <anchor -311 352> @TopCenteredOnCenter;<br> markClass [\uni1A6B ] <anchor -88 352> @TopPositioningForMaiEekMaiKoo;<br>
markClass [\uni1A73 ] <anchor -91 352> @TopPositioningForMaiEekMaiKoo;<br> markClass [\uni1A75 ] <anchor -22 352> @TopPositioningForMaiEekMaiKoo;<br> markClass [\uni1A77 ] <anchor -104 352> @TopPositioningForMaiEekMaiKoo;<br>
markClass [\uni1A6B.uni1A75.lig ] <anchor -238 352> @TopPositioningForMaiEekMaiKoo;<br> markClass [\uni1A6B.uni1A76.lig ] <anchor -484 353> @TopPositioningForMaiEekMaiKoo;<br> markClass [\uni1A59 ] <anchor -171 352> @TopRightAlignedMarks;<br>
markClass [\uni1A5A ] <anchor -173 353> @TopRightAlignedMarks;<br> markClass [\uni1A78 ] <anchor -22 353> @TopRightAlignedMarks;<br> markClass [\uni1A79 ] <anchor -49 351> @TopRightAlignedMarks;<br> markClass [\uni1A7A ] <anchor -179 352> @TopRightAlignedMarks;<br>
markClass [\uni1A7B ] <anchor -120 351> @TopRightAlignedMarks;<br> markClass [\uni1A7C ] <anchor -186 352> @TopRightAlignedMarks;<br> markClass [\uni1A65 ] <anchor -117 352> @TopPositioningForSara_I;<br>
markClass [\uni1A67 ] <anchor -132 352> @TopPositioningForSara_I;<br> markClass [\uni1A68 ] <anchor -172 351> @TopPositioningForSara_I;<br> markClass [\uni1A58 ] <anchor -535 352> @TopPositioningForSara_I;<br>
markClass [\uni1A65.uni1A75.lig ] <anchor -188 352> @TopPositioningForSara_I;<br> markClass [\uni1A67.uni1A75.lig ] <anchor -215 353> @TopPositioningForSara_I;<br> markClass [\uni1A68.uni1A75.lig ] <anchor -245 352> @TopPositioningForSara_I;<br>
markClass [\uni1A65.uni1A76.lig ] <anchor -469 353> @TopPositioningForSara_I;<br> markClass [\uni1A67.uni1A76.lig ] <anchor -482 353> @TopPositioningForSara_I;<br> markClass [\uni1A68.uni1A76.lig ] <anchor -504 352> @TopPositioningForSara_I;<br>
pos base [\uni1A20 ] <anchor 358 352> mark @TopSara_II<br> <anchor 275 352> mark @TopCenteredOnCenter<br> <anchor 361 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 361 352> mark @TopPositioningForMaiKang<br>
<anchor 490 352> mark @TopRightAlignedMarks<br> <anchor 360 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A21 ] <anchor 237 352> mark @TopSara_II<br> <anchor 208 352> mark @TopCenteredOnCenter<br>
<anchor 292 353> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 292 353> mark @TopPositioningForMaiKang<br> <anchor 365 352> mark @TopRightAlignedMarks<br> <anchor 239 352> mark @TopPositioningForSara_I;<br>
pos base [\uni1A22 ] <anchor 264 352> mark @TopSara_II<br> <anchor 204 352> mark @TopCenteredOnCenter<br> <anchor 362 338> mark @TopRightAlignedMarks<br> <anchor 288 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 288 352> mark @TopPositioningForMaiKang<br> <anchor 250 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A23 \uni1A24 \uni1A28 \uni1A30 \uni1A36 \uni1A37 \uni1A46 ] <anchor 296 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 296 352> mark @TopPositioningForMaiKang<br> <anchor 402 352> mark @TopRightAlignedMarks<br> <anchor 260 352> mark @TopSara_II<br> <anchor 274 352> mark @TopPositioningForSara_I<br>
<anchor 234 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A25 ] <anchor 407 353> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 407 353> mark @TopPositioningForMaiKang<br> <anchor 513 353> mark @TopRightAlignedMarks<br>
<anchor 371 353> mark @TopSara_II<br> <anchor 385 353> mark @TopPositioningForSara_I<br> <anchor 330 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A26 \uni1A4A ] <anchor 324 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 324 352> mark @TopPositioningForMaiKang<br> <anchor 430 352> mark @TopRightAlignedMarks<br> <anchor 288 352> mark @TopSara_II<br> <anchor 302 352> mark @TopPositioningForSara_I<br>
<anchor 240 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A27 ] <anchor 252 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 252 352> mark @TopPositioningForMaiKang<br> <anchor 358 352> mark @TopRightAlignedMarks<br>
<anchor 216 352> mark @TopSara_II<br> <anchor 203 352> mark @TopPositioningForSara_I<br> <anchor 190 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A29 \uni1A2A ] <anchor 307 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 307 352> mark @TopPositioningForMaiKang<br> <anchor 413 352> mark @TopRightAlignedMarks<br> <anchor 271 352> mark @TopSara_II<br> <anchor 285 352> mark @TopPositioningForSara_I<br>
<anchor 245 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A2B ] <anchor 293 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 293 352> mark @TopPositioningForMaiKang<br> <anchor 414 352> mark @TopRightAlignedMarks<br>
<anchor 257 352> mark @TopSara_II<br> <anchor 271 352> mark @TopPositioningForSara_I<br> <anchor 191 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A2C \uni1A2C.uni1A2C.lig ] <anchor 355 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 355 352> mark @TopPositioningForMaiKang<br> <anchor 471 352> mark @TopRightAlignedMarks<br> <anchor 319 352> mark @TopSara_II<br> <anchor 333 352> mark @TopPositioningForSara_I<br>
<anchor 275 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A2D \uni1A2E \uni1A39 ] <anchor 276 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 276 352> mark @TopPositioningForMaiKang<br>
<anchor 402 352> mark @TopRightAlignedMarks<br> <anchor 240 352> mark @TopSara_II<br> <anchor 254 352> mark @TopPositioningForSara_I<br> <anchor 214 352> mark @TopCenteredOnCenter;<br>
pos base [\uni1A2F ] <anchor 315 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 315 352> mark @TopPositioningForMaiKang<br> <anchor 402 352> mark @TopRightAlignedMarks<br> <anchor 241 352> mark @TopSara_II<br>
<anchor 255 352> mark @TopPositioningForSara_I<br> <anchor 222 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A31 ] <anchor 386 352> mark @TopSara_II<br> <anchor 284 352> mark @TopCenteredOnCenter<br>
<anchor 403 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 403 352> mark @TopPositioningForMaiKang<br> <anchor 508 352> mark @TopRightAlignedMarks<br> <anchor 392 352> mark @TopPositioningForSara_I;<br>
pos base [\uni1A32 ] <anchor 359 352> mark @TopSara_II<br> <anchor 284 352> mark @TopCenteredOnCenter<br> <anchor 377 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 377 352> mark @TopPositioningForMaiKang<br>
<anchor 515 352> mark @TopRightAlignedMarks<br> <anchor 368 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A33 ] <anchor 254 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 254 352> mark @TopPositioningForMaiKang<br>
<anchor 430 352> mark @TopRightAlignedMarks<br> <anchor 214 352> mark @TopSara_II<br> <anchor 217 352> mark @TopPositioningForSara_I<br> <anchor 170 352> mark @TopCenteredOnCenter;<br>
pos base [\uni1A34 ] <anchor 297 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 297 352> mark @TopPositioningForMaiKang<br> <anchor 400 352> mark @TopRightAlignedMarks<br> <anchor 234 352> mark @TopSara_II<br>
<anchor 241 352> mark @TopPositioningForSara_I<br> <anchor 227 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A35 ] <anchor 275 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 275 352> mark @TopPositioningForMaiKang<br>
<anchor 349 352> mark @TopRightAlignedMarks<br> <anchor 218 352> mark @TopSara_II<br> <anchor 208 352> mark @TopPositioningForSara_I<br> <anchor 206 352> mark @TopCenteredOnCenter;<br>
pos base [\uni1A38 ] <anchor 233 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 233 352> mark @TopPositioningForMaiKang<br> <anchor 432 352> mark @TopRightAlignedMarks<br> <anchor 148 352> mark @TopSara_II<br>
<anchor 169 352> mark @TopPositioningForSara_I<br> <anchor 228 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A3A ] <anchor 276 382> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 276 382> mark @TopPositioningForMaiKang<br>
<anchor 422 482> mark @TopRightAlignedMarks<br> <anchor 232 382> mark @TopSara_II<br> <anchor 234 382> mark @TopPositioningForSara_I<br> <anchor 214 382> mark @TopCenteredOnCenter;<br>
pos base [\uni1A3B \uni1A3C \uni1A4B ] <anchor 301 352> mark @TopSara_II<br> <anchor 250 352> mark @TopCenteredOnCenter<br> <anchor 334 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 334 352> mark @TopPositioningForMaiKang<br>
<anchor 433 352> mark @TopRightAlignedMarks<br> <anchor 303 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A3D \uni1A43 \uni1A47 \uni1A48 \uni1A49 \uni1A4C ] <anchor 418 352> mark @TopSara_II<br>
<anchor 292 352> mark @TopCenteredOnCenter<br> <anchor 421 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 421 352> mark @TopPositioningForMaiKang<br> <anchor 546 352> mark @TopRightAlignedMarks<br>
<anchor 420 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A3E ] <anchor 312 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 312 352> mark @TopPositioningForMaiKang<br> <anchor 404 352> mark @TopRightAlignedMarks<br>
<anchor 239 352> mark @TopSara_II<br> <anchor 245 352> mark @TopPositioningForSara_I<br> <anchor 234 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A3F ] <anchor 423 352> mark @TopSara_II<br>
<anchor 315 352> mark @TopCenteredOnCenter<br> <anchor 451 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 451 352> mark @TopPositioningForMaiKang<br> <anchor 558 352> mark @TopRightAlignedMarks<br>
<anchor 430 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A40 ] <anchor 224 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 224 352> mark @TopPositioningForMaiKang<br> <anchor 402 352> mark @TopRightAlignedMarks<br>
<anchor 129 352> mark @TopSara_II<br> <anchor 161 352> mark @TopPositioningForSara_I<br> <anchor 214 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A41 \x ] <anchor 246 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 246 352> mark @TopPositioningForMaiKang<br> <anchor 358 352> mark @TopRightAlignedMarks<br> <anchor 216 352> mark @TopSara_II<br> <anchor 203 352> mark @TopPositioningForSara_I<br>
<anchor 190 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A45 \uni25CC ] <anchor 259 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 259 352> mark @TopPositioningForMaiKang<br> <anchor 338 352> mark @TopRightAlignedMarks<br>
<anchor 216 352> mark @TopSara_II<br> <anchor 203 352> mark @TopPositioningForSara_I<br> <anchor 196 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A54 ] <anchor 688 352> mark @TopSara_II<br>
<anchor 540 352> mark @TopCenteredOnCenter<br> <anchor 691 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 691 352> mark @TopPositioningForMaiKang<br> <anchor 816 352> mark @TopRightAlignedMarks<br>
<anchor 690 352> mark @TopPositioningForSara_I;<br> pos base [\uni1A63 ] <anchor -25 352> mark @TopPositioningForMaiKang<br> <anchor 204 352> mark @TopPositioningForMaiEekMaiKoo<br> <anchor 275 352> mark @TopRightAlignedMarks<br>
<anchor 129 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A64 ] <anchor 138 352> mark @TopRightAlignedMarks<br> <anchor -54 352> mark @TopCenteredOnCenter;<br> pos base [\uni1A36.uni1A63.lig \uni1A36_1A2F_1A63.lig \uni1A36_1A32_1A63.lig \uni1A36_1A33_1A63.lig \uni1A36_1A34_1A63.lig \uni1A36_1A35_1A63.lig \uni1A36_1A36_1A63.lig ] <anchor 292 352> mark @TopPositioningForMaiEekMaiKoo<br>
<anchor 292 352> mark @TopPositioningForMaiKang<br> <anchor 380 352> mark @TopRightAlignedMarks<br> <anchor 218 352> mark @TopCenteredOnCenter;<br> subtable;<br> markClass [\uni1A25.sub \uni1A30.sub \uni1A3F.sub \uni1A48.sub \uni1A57 \uni1A54.sub \uni1A53.sub ] <anchor 0 -45> @BottomWithRightVerticalStem;<br>
markClass [\uni1A2C.sub \uni1A37.sub \uni1A39.sub \uni1A43.sub \uni1A3A.sub \uni1A40.sub ] <anchor 0 -46> @BottomWithRightVerticalStem;<br> markClass [\uni1A47.sub \uni1A6D ] <anchor 0 -44> @BottomWithRightVerticalStem;<br>
markClass [\uni1A5B ] <anchor -8 -45> @BottomWithRightVerticalStem;<br> markClass [\uni1A6A ] <anchor -312 -46> @Bottom_Sara_UU;<br> markClass [\uni1A69 ] <anchor -278 -45> @Bottom_Sara_U;<br> markClass [\uni1A21.sub ] <anchor -166 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A20.sub ] <anchor -198 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A23.sub \uni1A41.sub ] <anchor -170 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A26.sub ] <anchor -167 -44> @BottomSubjoinedConsonant;<br>
markClass [\uni1A27.sub ] <anchor -137 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A28.sub \uni1A5C ] <anchor -168 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A29.sub ] <anchor -180 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A2B.sub ] <anchor -179 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A2D.sub ] <anchor -153 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A2E.sub ] <anchor -148 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A2F.sub \uni1A4C.sub ] <anchor -214 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A31.sub ] <anchor -212 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A32.sub ] <anchor -205 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A33.sub ] <anchor -169 -44> @BottomSubjoinedConsonant;<br> markClass [\uni1A34.sub ] <anchor -191 -44> @BottomSubjoinedConsonant;<br> markClass [\uni1A35.sub ] <anchor -150 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A36.sub ] <anchor -161 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A3B.sub ] <anchor -216 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A3D.sub ] <anchor -245 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A3E.sub ] <anchor -285 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A45.sub ] <anchor -145 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A46.sub ] <anchor -164 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A49.sub ] <anchor -215 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A4A.sub ] <anchor -163 -44> @BottomSubjoinedConsonant;<br> markClass [\uni1A4B.sub ] <anchor -321 -61> @BottomSubjoinedConsonant;<br>
markClass [\uni1A56 ] <anchor -210 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A5D ] <anchor -169 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A5E ] <anchor -228 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A6C ] <anchor -293 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A36.uni1A69.sub ] <anchor -376 -44> @BottomSubjoinedConsonant;<br> markClass [\uni1A36.uni1A6A.sub \uni1A3E.uni1A6A.sub ] <anchor -417 -43> @BottomSubjoinedConsonant;<br>
markClass [\uni1A3E.uni1A69.sub ] <anchor -379 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A22.sub ] <anchor -181 -44> @BottomSubjoinedConsonant;<br> markClass [\uni1A24.sub ] <anchor -171 -45> @BottomSubjoinedConsonant;<br>
markClass [\uni1A2A.sub ] <anchor -201 -45> @BottomSubjoinedConsonant;<br> markClass [\uni1A3C.sub ] <anchor -174 -44> @BottomSubjoinedConsonant;<br> pos base [\uni1A20 ] <anchor 514 -45> mark @BottomWithRightVerticalStem<br>
<anchor 339 -45> mark @BottomSubjoinedConsonant<br> <anchor 344 -45> mark @Bottom_Sara_UU<br> <anchor 363 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A21 ] <anchor 419 -45> mark @BottomWithRightVerticalStem<br>
<anchor 219 -44> mark @BottomSubjoinedConsonant<br> <anchor 298 -45> mark @Bottom_Sara_UU<br> <anchor 317 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A22 ] <anchor 419 -46> mark @BottomWithRightVerticalStem<br>
<anchor 216 -45> mark @BottomSubjoinedConsonant<br> <anchor 316 -45> mark @Bottom_Sara_U<br> <anchor 296 -46> mark @Bottom_Sara_UU;<br> pos base [\uni1A23 \uni1A46 ] <anchor 435 -45> mark @BottomWithRightVerticalStem<br>
<anchor 239 -45> mark @BottomSubjoinedConsonant<br> <anchor 258 -45> mark @Bottom_Sara_UU<br> <anchor 275 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A24 ] <anchor 435 -44> mark @BottomWithRightVerticalStem<br>
<anchor 239 -45> mark @BottomSubjoinedConsonant<br> <anchor 258 -46> mark @Bottom_Sara_UU<br> <anchor 275 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A25 ] <anchor 540 -45> mark @BottomWithRightVerticalStem<br>
<anchor 344 -45> mark @BottomSubjoinedConsonant<br> <anchor 404 -45> mark @Bottom_Sara_UU<br> <anchor 421 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A26 \uni1A4A ] <anchor 442 -45> mark @BottomWithRightVerticalStem<br>
<anchor 238 -44> mark @BottomSubjoinedConsonant<br> <anchor 232 -45> mark @Bottom_Sara_UU<br> <anchor 257 -44> mark @Bottom_Sara_U;<br> pos base [\uni1A27 \uni1A41 ] <anchor 359 -45> mark @BottomWithRightVerticalStem<br>
<anchor 190 -45> mark @BottomSubjoinedConsonant<br> <anchor 237 -45> mark @Bottom_Sara_UU<br> <anchor 254 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A28 ] <anchor 428 -45> mark @BottomWithRightVerticalStem<br>
<anchor 236 -46> mark @BottomSubjoinedConsonant<br> <anchor 308 -45> mark @Bottom_Sara_UU<br> <anchor 325 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A29 \uni1A2A ] <anchor 453 -45> mark @BottomWithRightVerticalStem<br>
<anchor 244 -45> mark @BottomSubjoinedConsonant<br> <anchor 263 -45> mark @Bottom_Sara_UU<br> <anchor 280 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A2B ] <anchor 438 -45> mark @BottomWithRightVerticalStem<br>
<anchor 203 -61> mark @BottomSubjoinedConsonant<br> <anchor 323 -101> mark @Bottom_Sara_UU<br> <anchor 340 -101> mark @Bottom_Sara_U;<br> pos base [\uni1A2C ] <anchor 504 -45> mark @BottomWithRightVerticalStem<br>
<anchor 275 -45> mark @BottomSubjoinedConsonant<br> <anchor 356 -46> mark @Bottom_Sara_UU<br> <anchor 376 -46> mark @Bottom_Sara_U;<br> pos base [\uni1A2D \uni1A2E \uni1A39 \uni1A3A \uni1A40 ] <anchor 415 -45> mark @BottomWithRightVerticalStem<br>
<anchor 212 -45> mark @BottomSubjoinedConsonant<br> <anchor 277 -45> mark @Bottom_Sara_UU<br> <anchor 298 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A2F ] <anchor 425 -45> mark @BottomWithRightVerticalStem<br>
<anchor 221 -45> mark @BottomSubjoinedConsonant<br> <anchor 308 -45> mark @Bottom_Sara_UU<br> <anchor 329 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A30 \uni1A34 ] <anchor 408 -45> mark @BottomWithRightVerticalStem<br>
<anchor 212 -45> mark @BottomSubjoinedConsonant<br> <anchor 262 -45> mark @Bottom_Sara_UU<br> <anchor 288 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A31 ] <anchor 537 -45> mark @BottomWithRightVerticalStem<br>
<anchor 357 -45> mark @BottomSubjoinedConsonant<br> <anchor 425 -45> mark @Bottom_Sara_UU<br> <anchor 444 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A32 ] <anchor 520 -45> mark @BottomWithRightVerticalStem<br>
<anchor 347 -45> mark @BottomSubjoinedConsonant<br> <anchor 425 -45> mark @Bottom_Sara_UU<br> <anchor 444 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A33 ] <anchor 434 -45> mark @BottomWithRightVerticalStem<br>
<anchor 192 -45> mark @BottomSubjoinedConsonant<br> <anchor 234 -45> mark @Bottom_Sara_UU<br> <anchor 257 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A35 ] <anchor 373 -45> mark @BottomWithRightVerticalStem<br>
<anchor 204 -45> mark @BottomSubjoinedConsonant<br> <anchor 258 -45> mark @Bottom_Sara_UU<br> <anchor 275 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A36 ] <anchor 404 -45> mark @BottomWithRightVerticalStem<br>
<anchor 225 -45> mark @BottomSubjoinedConsonant<br> <anchor 288 -45> mark @Bottom_Sara_UU<br> <anchor 309 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A37 ] <anchor 417 -45> mark @BottomWithRightVerticalStem<br>
<anchor 233 -45> mark @BottomSubjoinedConsonant<br> <anchor 309 -45> mark @Bottom_Sara_UU<br> <anchor 326 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A38 ] <anchor 426 -46> mark @BottomWithRightVerticalStem<br>
<anchor 233 -45> mark @BottomSubjoinedConsonant<br> <anchor 307 -45> mark @Bottom_Sara_UU<br> <anchor 324 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A3B \uni1A3C \uni1A4B ] <anchor 447 -45> mark @BottomWithRightVerticalStem<br>
<anchor 252 -45> mark @BottomSubjoinedConsonant<br> <anchor 320 -45> mark @Bottom_Sara_UU<br> <anchor 339 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A3D \uni1A47 \uni1A48 \uni1A49 \uni1A4C ] <anchor 558 -45> mark @BottomWithRightVerticalStem<br>
<anchor 376 -45> mark @BottomSubjoinedConsonant<br> <anchor 405 -45> mark @Bottom_Sara_UU<br> <anchor 424 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A3E ] <anchor 424 -45> mark @BottomWithRightVerticalStem<br>
<anchor 234 -45> mark @BottomSubjoinedConsonant<br> <anchor 288 -45> mark @Bottom_Sara_UU<br> <anchor 305 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A3F ] <anchor 589 -45> mark @BottomWithRightVerticalStem<br>
<anchor 437 -45> mark @BottomSubjoinedConsonant<br> <anchor 448 -45> mark @Bottom_Sara_UU<br> <anchor 467 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A43 ] <anchor 548 -45> mark @BottomWithRightVerticalStem<br>
<anchor 404 -45> mark @BottomSubjoinedConsonant<br> <anchor 413 -45> mark @Bottom_Sara_UU<br> <anchor 432 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A45 \uni25CC \x ] <anchor 349 -45> mark @BottomWithRightVerticalStem<br>
<anchor 196 -45> mark @BottomSubjoinedConsonant<br> <anchor 237 -45> mark @Bottom_Sara_UU<br> <anchor 254 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A54 ] <anchor 824 -45> mark @BottomWithRightVerticalStem<br>
<anchor 682 -45> mark @BottomSubjoinedConsonant<br> <anchor 691 -45> mark @Bottom_Sara_UU<br> <anchor 710 -45> mark @Bottom_Sara_U;<br> pos base [\uni1A63 ] <anchor 293 -45> mark @BottomWithRightVerticalStem<br>
<anchor 142 -45> mark @BottomSubjoinedConsonant;<br> pos base [\uni1A64 ] <anchor 125 -45> mark @BottomWithRightVerticalStem<br> <anchor 42 -45> mark @BottomSubjoinedConsonant;<br> pos base [\uni1A2C.uni1A2C.lig ] <anchor 486 -45> mark @BottomWithRightVerticalStem<br>
<anchor 275 -45> mark @BottomSubjoinedConsonant<br> <anchor 356 -46> mark @Bottom_Sara_UU<br> <anchor 376 -46> mark @Bottom_Sara_U;<br> pos base [\uni1A36.uni1A63.lig \uni1A36_1A2F_1A63.lig \uni1A36_1A32_1A63.lig \uni1A36_1A33_1A63.lig \uni1A36_1A34_1A63.lig \uni1A36_1A35_1A63.lig \uni1A36_1A36_1A63.lig ] <anchor 400 -45> mark @BottomWithRightVerticalStem<br>
<anchor 221 -45> mark @BottomSubjoinedConsonant;<br>} TopAndBottom;<br><br>feature mark {<br><br> script DFLT;<br> language dflt ;<br> lookup TopAndBottom;<br><br> script lana;<br> language dflt ;<br>
lookup TopAndBottom;<br>} mark;<br>#Mark attachment classes (defined in GDEF, used in lookupflags)<br>@AboveBaseVowels = [ uni1A62 uni1A65 uni1A66 uni1A67 uni1A68 uni1A6B uni1A73 uni1A74 ];<br>@AboveBaseTones = [ uni1A75 uni1A76 uni1A77 uni1A78 uni1A79 ];<br>
<br>@GDEF_Simple = [\uni1A20 \uni1A21 \uni1A22 \uni1A23 \uni1A24 \uni1A25 \uni1A26 <br> \uni1A27 \uni1A28 \uni1A29 \uni1A2A \uni1A2B \uni1A2C \uni1A2D \uni1A2E \uni1A2F <br> \uni1A30 \uni1A31 \uni1A32 \uni1A33 \uni1A34 \uni1A35 \uni1A36 \uni1A37 \uni1A38 <br>
\uni1A39 \uni1A3A \uni1A3B \uni1A3C \uni1A3D \uni1A3E \uni1A3F \uni1A40 \uni1A41 <br> \uni1A42 \uni1A43 \uni1A44 \uni1A45 \uni1A46 \uni1A47 \uni1A48 \uni1A49 \uni1A4A <br> \uni1A4B \uni1A4C \uni1A4D \uni1A4E \uni1A4F \uni1A50 \uni1A51 \uni1A52 \uni1A53 <br>
\uni1A54 \uni1A55 \uni1A60 \uni1A61 \uni1A63 \uni1A64 \uni1A6E \uni1A6F \uni1A70 <br> \uni1A71 \uni1A72 \uni1A7F \uni1A80 \uni1A81 \uni1A82 \uni1A83 \uni1A84 \uni1A85 <br> \uni1A86 \uni1A87 \uni1A89 \uni1A88 \uni1A90 \uni1A91 \uni1A92 \uni1A93 \uni1A94 <br>
\uni1A95 \uni1A96 \uni1A97 \uni1A98 \uni1A99 \space \uni25CC \uni0000 \uni1AA0 <br> \uni1AA1 \uni1AA2 \uni1AA3 \uni1AA4 \uni1AA6 \uni1AA8 \uni1AA9 \uni1AAA \uni1AAB <br> \uni1AA5 \uni1AA7 \uni1AAC \uni1AAD \plus \hyphen \period \x ];<br>
@GDEF_Ligature = [\uni1A2C.uni1A2C.lig \uni1A36.uni1A63.lig <br> \uni1A36_1A2F_1A63.lig \uni1A36_1A32_1A63.lig \uni1A36_1A33_1A63.lig <br> \uni1A36_1A34_1A63.lig \uni1A36_1A35_1A63.lig \uni1A36_1A36_1A63.lig ];<br>@GDEF_Mark = [\uni1A65 \uni1A66 \uni1A67 \uni1A68 \uni1A69 \uni1A6A \uni1A21.sub <br>
\uni1A20.sub \uni1A23.sub \uni1A25.sub \uni1A26.sub \uni1A27.sub \uni1A28.sub <br> \uni1A29.sub \uni1A2B.sub \uni1A2C.sub \uni1A2D.sub \uni1A2E.sub \uni1A2F.sub <br> \uni1A30.sub \uni1A31.sub \uni1A32.sub \uni1A33.sub \uni1A34.sub \uni1A35.sub <br>
\uni1A36.sub \uni1A37.sub \uni1A39.sub \uni1A3B.sub \uni1A3D.sub \uni1A3E.sub <br> \uni1A3F.sub \uni1A41.sub \uni1A43.sub \uni1A45.sub \uni1A46.sub \uni1A47.sub <br> \uni1A48.sub \uni1A49.sub \uni1A4A.sub \uni1A4B.sub \uni1A56 \uni1A57 \uni1A58 <br>
\uni1A59 \uni1A5A \uni1A5B \uni1A5C \uni1A5D \uni1A5E \uni1A62 \uni1A6B \uni1A6C <br> \uni1A6D \uni1A73 \uni1A74 \uni1A75 \uni1A76 \uni1A77 \uni1A78 \uni1A79 \uni1A7A <br> \uni1A7B \uni1A7C \uni1A36.uni1A69.sub \uni1A36.uni1A6A.sub <br>
\uni1A3E.uni1A69.sub \uni1A3E.uni1A6A.sub \uni1A54.sub \uni1A53.sub <br> \uni1A22.sub \uni1A24.sub \uni1A2A.sub \uni1A3C.sub \uni1A3A.sub \uni1A40.sub <br> \uni1A4C.sub \uni1A62.uni1A75.lig \uni1A65.uni1A75.lig \uni1A66.uni1A75.lig <br>
\uni1A67.uni1A75.lig \uni1A68.uni1A75.lig \uni1A6B.uni1A75.lig <br> \uni1A74.uni1A75.lig \uni1A62.uni1A76.lig \uni1A65.uni1A76.lig <br> \uni1A66.uni1A76.lig \uni1A67.uni1A76.lig \uni1A68.uni1A76.lig <br> \uni1A6B.uni1A76.lig \uni1A74.uni1A76.lig ];<br>
<br>table GDEF {<br> GlyphClassDef @GDEF_Simple, @GDEF_Ligature, @GDEF_Mark, ;<br><br>} GDEF;<br><br><br><div><div><div><div><div><br></div></div></div></div></div></div>