ค่า cvt ที่เกี่ยวข้องคือ
cvt_dict = {
...
"w_1001": 71, #1001 =width of kho_kwai
"w_690": 14, #690 =
"front_kai": 11, #113 =front spacing of ko_kai
"hstem": 8, #184 =horizontal stem thick
"headstem": 258, #116 =head stem thick
"headstem_plus_hole": 259, #268 =head stem thick + head hole width
"vheight_shoot": 184, #1147 =overshoot height
"vstem_curve": 185, #156 =curve range vertical stem
...
}
ภาพลายเส้น
แนวแกน X
เริ่มที่จุด 52
srp0 52
เคลื่อนไปที่จุดใกล้สุด 33 ด้วยระยะ front_kai
mirp[rp0,min,rnd,grey] front_kai 33
กำหนดความหนาของเส้นหน้า ที่จุด 8
mirp[min,rnd,grey] hstem 8
เคลื่อนไปกำหนดความกว้างของตัวอักษรที่จุดขวาสุด 39 ด้วยความกว้าง w_1001
mirp[rp0,rnd,grey] w_1001 39
กำหนดช่องไฟหลัง
mdrp[rnd,white] 53
กำหนดความหนาของเส้นหลัง ที่จุด 1
mirp[min,rnd,grey] hstem 1
มาเริ่มกันใหม่ที่จุด 8
srp0 8
เคลื่อนลงข้างล่าง สู่จุด 11 (เพื่อจะนำไปสู่ฐานของเส้นหน้า) ให้การแรเงาเป็น white เพื่อแยกเส้นหน้ากับคอของหัวอักษร
mdrp[rp0,rnd,white] 11
เนื่องจากเส้นตรงนี้บางมาก จึงกำหนดจุดเพื่อคงระยะอย่างน้อย ที่จุด 27 กำหนดเป็น min
mdrp[min,rnd,grey] 27
จากจุด 11 เคลื่อนไปลงจุด 30
mdrp[rp0,rnd,grey] 30
กำหนดความหนาของฐาน ที่จุด 29
mirp[min,rnd,grey] hstem 29
กลับไปที่จุด 11
srp0 11
เคลื่อนไปที่จุด 14 ด้วยการแรเงา white อีกครั้ง เพื่อแยกเส้นให้เด็ดขาด
mdrp[rp0,rnd,white] 14
คงความหนาของส่วนคอดไว้
mdrp[min,rnd,grey] 25
ย้อนกลับไปตั้งต้นที่จุด 33 อีกครั้งหนึ่ง เพื่อจะสร้างหัวอักษร โดยให้ระยะ จาก 14-49 เป็นตัวรองรับการทดจุด
srp0 33
เพื่อความแน่นอนแม่นยำ เราจะเคลื่อนจุดไปหาจุดขวาสุดของหัวอักษร โดยกำหนดค่าเป็น w_690
(จำเป็นต้องให้แม่นยำ เนื่องจากช่องว่างตรงหัวอักษรมีจำกัดมาก) แล้วจึงกำหนดขนาดความหนาหัวอักษรและรูย้อนกลับอีกที
mirp[rp0,rnd,grey] w_690 20
mirp[min,rnd,grey] headstem 43
mirp[rnd,grey] headstem_plus_hole 49
เกลี่ยจุดเป็นคำสั่งสุดท้าย
IUP[x]
แนวแกน Y
ทำงานในแกน Y
SVTCA[y-axis]
เริ่มที่จุด 0
MDAP[rnd] 0
บอกว่าจุด 29 อยู่ในระดับเดียวกัน
ALIGNRP 29
เคลื่อนไปกำหนดจุดสูงสุดด้วยค่า vheight_shoot
mirp[rp0,rnd,grey] vheight_shoot 36
กำหนดความหนาตรงส่วนนี้ด้วยค่า vstem_curve
mirp[min,rnd,grey] vstem_curve 5
จากจุด 36 เดิม เคลื่อนไปส่วนบนของหัวอักษรที่จุด 17 เนื่องจากไม่กังวลระยะมากนัก จึงใช้การเคลื่อนแบบไม่อ้างค่า cvt คือคำสั่ง MDRP
(เหตุที่ใช้จุด 36 แทนที่จะเป็นจุด 1 หรือ จุด 0 ในการอ้างอิงสำหรับหัวอักษร ค.ควาย เนื่องจากความสวยงามในการวาดหัวอักษร จะขึ้นกับโค้งด้านบนมากว่าฐานด้านล่าง)
mdrp[rp0,rnd,grey] 17
กำหนดขนาดหัวโดยใช้เทคนิกเหมือนเดิม คือกำหนดความหนาด้านบน เคลื่อนไปกำหนดขนาดรวม และกำหนดความหนาด้านล่าง
mirp[min,rnd,grey] headstem 46
mirp[rp0,rnd,grey] headdia 23
mirp[min,rnd,grey] headstem 40
ย้ายมาที่จุด 29 เพื่อมากำหนดความหนาตรงจุดนั้น
srp0 29
mdrp[min,rnd,grey] 11
เกลี่ยจุดสำคัญ โดยให้ท้องตัวอักษรเป็นจุดเริ่มต้น คือจุด 5 และความหนาของฐานเป็นจุดสิ้นสุด คือจุด 11
srp1 5
srp2 11
sloop 4
ip 33 8 2 39
เกลี่ยจุดที่เหลือ
IUP[y]
เสร็จแล้ว
แต่ถึงแม้จะป้องกันอย่างไร รูปร่างฟอนต์แบบตัว ค.ควาย จะยังมีปัญหาในตอนทดจุดอยู่ดี
คือที่ขนาด 17 ppem หัวอักษรจะชิดติดกับแกนขวาของอักษร
(สรุปเป็นปอยต์ตามความละเอียดของจอภาพคือ 72dpi=17pt, 85dpi=14.5pt, 96dpi=13pt)
ดูจากเมนู
View -> Grid Fit -> Show Grid Fit -> 17pt 72dpi
ได้ภาพดังนี้
แก้ด้วยการขยับจุดจำนวน 8 จุด ในแนวแกน X คือ
จุด 2 ขยับไปทางขวา 8px คือ +8px ที่ 17ppem สูตรคือ
+8px ค่าในตาราง delta hint คือ 15
No.of step |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
+1 |
+2 |
+3 |
+4 |
+5 |
+6 |
+7 |
+8 |
Selector |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
17ppem นำมาลบด้วย 9 (ลบด้วย 9 เสมอ) คือ 6
ค่า 6 จะเป็น 4 บิตบน และค่า 15 คือ 4 บิตล่าง รวมกันคือ 6*16+15=143
จะได้คู่ของการทำ delta hint คือ จุด 2 และค่าผลรวม 143
เขียนสรุปย่อดังนี้
ที่ 17 ppem
จุด 2 ขยับ +8 = 2 143
จุด 39 ขยับ +8 = 39 143
จุด 0 ขยับ +8 = 0 143
จุด 1 ขยับ +8 = 1 143
จุด 3 ขยับ +6 = 1 141
จุด 38 ขยับ +6 = 38 141
จุด 37 ขยับ +4 = 37 139
จุด 4 ขยับ +4 = 4 139
นับรวมได้ 8 คู่ จะได้โค๊ดจำลองดังนี้
กำหนดการทำงานในแกน X
SVTCA[x-axis]
ใส่ delta hint โดยใส่จำนวนคู่ไว้เป็นค่าแรก
deltap1 8 2 143 39 143 0 143 1 143 3 141 38 141 37 139 4 139
ภาพหลังการขยับแล้วจะป็นดังนี้
เสร็จแล้ว
เมื่อนำมาถอดด้วย dfont.py จะได้โค๊ด instruction ดังนี้
PUSHB_1
49
PUSHW_1
259
PUSHB_1
43
PUSHW_1
258
NPUSHB
22
20
14
33
25
14
11
29
8
30
27
11
8
1
8
53
39
71
8
8
33
11
52
SRP0
MIRP[rp0,min,rnd,grey]
MIRP[min,rnd,grey]
MIRP[rp0,rnd,grey]
MDRP[rnd,white]
MIRP[min,rnd,grey]
SRP0
MDRP[rp0,rnd,white]
MDRP[min,rnd,grey]
MDRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
SRP0
MDRP[rp0,rnd,white]
MDRP[min,rnd,grey]
SRP0
MIRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
MIRP[rnd,grey]
IUP[x]
NPUSHB
10
39
2
8
33
4
11
5
11
29
40
PUSHW_1
258
PUSHB_1
23
PUSHW_1
257
PUSHB_1
46
PUSHW_1
258
PUSHB_7
17
5
185
36
184
29
0
SVTCA[y-axis]
MDAP[rnd]
ALIGNRP
MIRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
MDRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
MIRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
SRP0
MDRP[min,rnd,grey]
SRP1
SRP2
SLOOP
IP
IUP[y]
NPUSHB
17
139
4
139
37
141
38
141
3
143
1
143
0
143
39
143
2
8
SVTCA[x-axis]
DELTAP1