Skip to content

Commit a0389bd

Browse files
committed
Khottabun: Avoid USE.
By the absence of 'lana' script tag in all rules, Harfbuzz will handle Tai Tham script using "default" engine, rather than USE. With this, only limited features like 'ccmp' and 'liga' are called. While the USE engine provides many useful reordering, it's not ready for Tai Tham yet. Doing it all ourselves make us free from its restrictions on clustering and encoding order. As a result, we gain the working Mai Kang Lai handling, for example. * fonts/Khottabun.sfd: - Remove 'lana' script tag from all GSUB, GPOS. - Remove "'psts' Post Base Ligatures" and "'pstf' Post Base Ligatures with marks", as they are not called in default engine. No replacement since there are already 'ccmp' rules that do the same job. - Remove "'ccmp' Ligatures with marks", as SARA AM is already handled in other rules. - Bump font version to 003.000.
1 parent 4fddb2d commit a0389bd

2 files changed

Lines changed: 42 additions & 25 deletions

File tree

ChangeLog

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
1+
2025-04-10 Theppitak Karoonboonyanan <theppitak@gmail.com>
2+
3+
Khottabun: Avoid USE.
4+
5+
By the absence of 'lana' script tag in all rules, Harfbuzz will
6+
handle Tai Tham script using "default" engine, rather than USE.
7+
With this, only limited features like 'ccmp' and 'liga' are called.
8+
9+
While the USE engine provides many useful reordering, it's not
10+
ready for Tai Tham yet. Doing it all ourselves make us free from
11+
its restrictions on clustering and encoding order. As a result,
12+
we gain the working Mai Kang Lai handling, for example.
13+
14+
* fonts/Khottabun.sfd:
15+
- Remove 'lana' script tag from all GSUB, GPOS.
16+
- Remove "'psts' Post Base Ligatures" and
17+
"'pstf' Post Base Ligatures with marks",
18+
as they are not called in default engine.
19+
No replacement since there are already 'ccmp' rules that do
20+
the same job.
21+
- Remove "'ccmp' Ligatures with marks", as SARA AM is already
22+
handled in other rules.
23+
- Bump font version to 003.000.
24+
125
2025-03-21 Theppitak Karoonboonyanan <theppitak@gmail.com>
226

327
Khottabun: Correct spline direction for Mai Kong.

fonts/Khottabun.sfd

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ FamilyName: Khottabun
55
Weight: Medium
66
Copyright: Created by Theppitak Karoonboonyanan, with FontForge 2.0 (http://fontforge.sf.net).\n\nTham glyphs are based on UbwManut font by Sanit Pokhaphun, Ubon Ratchathani Rajabhat University, Thailand, 8 September 2004.\n\nThai Noi glyphs are based on TNManut font by Sanit Pokhaphun, Ubon Ratchathani Rajabhat University, Thailand, September 2004.
77
UComments: "2010-12-9: Created."
8-
Version: 002.022
8+
Version: 003.000
99
ItalicAngle: 0
1010
UnderlinePosition: -174
1111
UnderlineWidth: 184
@@ -21,7 +21,7 @@ OS2Version: 0
2121
OS2_WeightWidthSlopeOnly: 0
2222
OS2_UseTypoMetrics: 1
2323
CreationTime: 1291888288
24-
ModificationTime: 1742529516
24+
ModificationTime: 1744276506
2525
PfmFamily: 33
2626
TTFWeight: 500
2727
TTFWidth: 5
@@ -42,24 +42,21 @@ HheadDescent: 0
4242
HheadDOffset: 1
4343
OS2Vendor: 'PfEd'
4444
Lookup: 4 0 0 "'ccmp' TN conjuncts" { "'ccmp' TN conjuncts" } ['ccmp' ('DFLT' <'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
45-
Lookup: 5 0 0 "'ccmp' Pali ANG-LAN stage 1" { "'ccmp' Pali ANG-LAN append intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
46-
Lookup: 5 0 0 "'ccmp' Pali ANG-LAN stage 2" { "'ccmp' Pali ANG-LAN remove intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
47-
Lookup: 6 0 0 "'ccmp' Context-sensitive subjoin" { "Context-sensitive subjoin convert" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
48-
Lookup: 4 0 1 "'ccmp' Subjoined consonants" { "Subjoined consonants lookup" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
49-
Lookup: 5 0 0 "'ccmp' Deep rigid subjoins stage 1" { "Deep rigid subjoins append intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
50-
Lookup: 5 0 0 "'ccmp' Deep rigid subjoins stage 2" { "Deep rigid subjoins remove intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
51-
Lookup: 5 0 0 "'ccmp' AM reorder stage 1" { "'ccmp' AM reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
52-
Lookup: 5 0 0 "'ccmp' AM reorder stage 2" { "'ccmp' AM reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
53-
Lookup: 5 0 0 "'ccmp' AM-T reorder stage 3" { "'ccmp' AM-T reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
54-
Lookup: 5 0 0 "'ccmp' AM-T reorder stage 4" { "'ccmp' AM-T reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
45+
Lookup: 5 0 0 "'ccmp' Pali ANG-LAN stage 1" { "'ccmp' Pali ANG-LAN append intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
46+
Lookup: 5 0 0 "'ccmp' Pali ANG-LAN stage 2" { "'ccmp' Pali ANG-LAN remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
47+
Lookup: 6 0 0 "'ccmp' Context-sensitive subjoin" { "Context-sensitive subjoin convert" } ['ccmp' ('DFLT' <'dflt' > ) ]
48+
Lookup: 4 0 1 "'ccmp' Subjoined consonants" { "Subjoined consonants lookup" } ['ccmp' ('DFLT' <'dflt' > ) ]
49+
Lookup: 5 0 0 "'ccmp' Deep rigid subjoins stage 1" { "Deep rigid subjoins append intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
50+
Lookup: 5 0 0 "'ccmp' Deep rigid subjoins stage 2" { "Deep rigid subjoins remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
51+
Lookup: 5 0 0 "'ccmp' AM reorder stage 1" { "'ccmp' AM reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
52+
Lookup: 5 0 0 "'ccmp' AM reorder stage 2" { "'ccmp' AM reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
53+
Lookup: 5 0 0 "'ccmp' AM-T reorder stage 3" { "'ccmp' AM-T reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
54+
Lookup: 5 0 0 "'ccmp' AM-T reorder stage 4" { "'ccmp' AM-T reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
5555
Lookup: 5 0 0 "'ccmp' LV reorder stage 1" { "'ccmp' LV reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
5656
Lookup: 5 0 0 "'ccmp' LV reorder stage 2" { "'ccmp' LV reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
57-
Lookup: 5 0 0 "'ccmp' RA reorder stage 1" { "'ccmp' RA-CVR I prepend intermediate" "'ccmp' RA-CVR II prepend intermediate" "'ccmp' RA-CVR UE prepend intermediate" "'ccmp' RA-CVR UEE prepend intermediate" "'ccmp' RA-CVR U prepend intermediate" "'ccmp' RA-CVR UU prepend intermediate" "'ccmp' RA-CAR prepend intermediate" "'ccmp' RA reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
58-
Lookup: 5 0 0 "'ccmp' RA reorder stage 2" { "'ccmp' RA reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
57+
Lookup: 5 0 0 "'ccmp' RA reorder stage 1" { "'ccmp' RA-CVR I prepend intermediate" "'ccmp' RA-CVR II prepend intermediate" "'ccmp' RA-CVR UE prepend intermediate" "'ccmp' RA-CVR UEE prepend intermediate" "'ccmp' RA-CVR U prepend intermediate" "'ccmp' RA-CVR UU prepend intermediate" "'ccmp' RA-CAR prepend intermediate" "'ccmp' RA reorder prepend intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
58+
Lookup: 5 0 0 "'ccmp' RA reorder stage 2" { "'ccmp' RA reorder remove intermediate" } ['ccmp' ('DFLT' <'dflt' > ) ]
5959
Lookup: 4 8 1 "'ccmp' Misc ligatures" { "'ccmp' Misc ligatures lookup" } ['ccmp' ('DFLT' <'dflt' > ) ]
60-
Lookup: 4 0 0 "'ccmp' Ligatures with marks" { "'ccmp' Ligatures with marks lookup" } ['ccmp' ('DFLT' <'dflt' > ) ]
61-
Lookup: 4 8 0 "'psts' Post Base Ligatures" { "'psts' Post Base Ligatures lookup" } ['psts' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
62-
Lookup: 4 0 0 "'pstf' Post Base Ligatures with marks" { "'pstf' Post Base Ligatures with marks lookup" } ['pstf' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > ) ]
6360
Lookup: 4 0 0 "Alternate subjoined consonant" { "Alternate subjoined consonant lookup" } []
6461
Lookup: 2 0 0 "ANG-LAN append intermediate" { "ANG-LAN append intermediate lookup" } []
6562
Lookup: 4 0 0 "ANG-LAN remove intermediate" { "ANG-LAN remove intermediate lookup" } []
@@ -85,10 +82,10 @@ Lookup: 2 0 0 "RA-UU prepend intermediate" { "RA-UU prepend intermediate lookup"
8582
Lookup: 2 0 0 "RA prepend intermediate" { "RA prepend intermediate lookup" } []
8683
Lookup: 2 0 0 "RA-deep prepend intermediate" { "RA-deep prepend intermediate lookup" } []
8784
Lookup: 4 0 0 "RA remove intermediate" { "RA-VV remove intermediate lookup" "RA-V remove intermediate lookup" "RA-C remove intermediate lookup" "RA-S remove intermediate lookup" "RA-AngV remove intermediate lookup" "RA-Ang remove intermediate lookup" } []
88-
Lookup: 260 0 0 "'mark' BelowBase Mark Positioning" { "'mark' BelowBase Mark Positioning-1" } ['mark' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
89-
Lookup: 260 0 0 "'mark' AboveBase Mark Positioning" { "'mark' AboveBase Mark Positioning-1" } ['mark' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
90-
Lookup: 262 0 0 "'mkmk' BelowMark Mark to Mark" { "'mkmk' BelowMark Mark to Mark-1" } ['mkmk' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
91-
Lookup: 262 0 0 "'mkmk' AboveMark Mark to Mark" { "'mkmk' AboveMark Mark to Mark-1" } ['mkmk' ('DFLT' <'dflt' > 'lana' <'LAO ' 'PAL ' 'SAN ' 'THA ' 'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
85+
Lookup: 260 0 0 "'mark' BelowBase Mark Positioning" { "'mark' BelowBase Mark Positioning-1" } ['mark' ('DFLT' <'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
86+
Lookup: 260 0 0 "'mark' AboveBase Mark Positioning" { "'mark' AboveBase Mark Positioning-1" } ['mark' ('DFLT' <'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
87+
Lookup: 262 0 0 "'mkmk' BelowMark Mark to Mark" { "'mkmk' BelowMark Mark to Mark-1" } ['mkmk' ('DFLT' <'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
88+
Lookup: 262 0 0 "'mkmk' AboveMark Mark to Mark" { "'mkmk' AboveMark Mark to Mark-1" } ['mkmk' ('DFLT' <'dflt' > 'lao ' <'LAO ' 'dflt' > ) ]
9289
MarkAttachClasses: 6
9390
"AboveBase" 0
9491
"BelowBase" 0
@@ -11115,7 +11112,6 @@ SplineSet
1111511112
1425 604 1268 474 1062 474 c 3
1111611113
EndSplineSet
1111711114
Ligature2: "'ccmp' Misc ligatures lookup" uni1A36 uni1A63
11118-
Ligature2: "'psts' Post Base Ligatures lookup" uni1A36 uni1A63
1111911115
EndChar
1112011116

1112111117
StartChar: uni1A45.uni1A63
@@ -11212,7 +11208,6 @@ SplineSet
1121211208
215 1524 177 1487 177 1442 c 3
1121311209
EndSplineSet
1121411210
Ligature2: "'ccmp' Misc ligatures lookup" uni1A45 uni1A63
11215-
Ligature2: "'psts' Post Base Ligatures lookup" uni1A45 uni1A63
1121611211
EndChar
1121711212

1121811213
StartChar: uni1A2C.uni1A2C
@@ -16394,8 +16389,6 @@ Fore
1639416389
Refer: 79 6772 N 1 0 0 1 920 0 2
1639516390
Refer: 41 6755 N 1 0 0 1 0 0 2
1639616391
LCarets2: 1 0
16397-
Ligature2: "'pstf' Post Base Ligatures with marks lookup" uni1A63 uni1A74
16398-
Ligature2: "'ccmp' Ligatures with marks lookup" uni1A63 uni1A74
1639916392
EndChar
1640016393

1640116394
StartChar: uni1A58.lai

0 commit comments

Comments
 (0)