fonts: ตัวอย่างการ hint ค.ควาย

ค่า 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
เส้นทาง hint ในแนวแกน 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
เส้นทาง hint ในแนวแกน 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 ได้ภาพดังนี้
17ppem gridfit

แก้ด้วยการขยับจุดจำนวน 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

ภาพหลังการขยับแล้วจะป็นดังนี้
17ppem after gridfit

เสร็จแล้ว
เมื่อนำมาถอดด้วย 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