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

ค่า cvt ที่เกี่ยวข้องคือ

cvt_dict = {
    ...
    "w_690":            14,     #690    =width of kho_khai
    "hstem":            8,      #184    =horizontal stem
    "vstem":            96,     #154    =vertical stem
    "headstem":         258,    #116    =head stem
    "headstem_plus_hole":   259, #268   =head stem + hole width
    "headdia":          257,    #384    =head diameter
    "vheight":          188,    #1120   =normal height 
    "vheight_shoot":    184,    #1147   =overshoot height
    "front_khai":       32,     #51     =front spacing of kho_khai
    ...
}

ภาพลายเส้น
โครง ข.ไข่

แนวแกน X
เส้นทาง hint ในแนวแกน X

ตัวอย่างนี้เริ่มซับซ้อน เนื่องจากช่วงหัวของ ข.ไข่ มีทางเดินที่ต้องการทดลงจุดมาก ทำให้ระยะที่ได้มีค่าไม่แน่นอนตามขนาดฟอนต์ที่เปลี่ยนไป ผลที่ได้คือ
ถ้าเราทำให้ฟอนต์มีขนาดคงที่ จะทำให้บางครั้งหัวดูลีบหรือใหญ่เกินไป
ถ้าเราทำให้หัวดูสวยงาม บางครั้งฟอนต์จะดูกว้างหรือลีบเกินไป
ทางแก้คือเราจะ hint ให้ช่วงหัวให้ดูสวยงามก่อน แล้วโยงไปเส้น stem ด้านหลัง แล้วจึงโยงกลับมาที่ stem ด้านหน้าอีกครั้ง โดยใช้ตรงโค้งช่วงคอของอักษรเป็นช่วงที่รับระยะการเปลี่ยนแปลง วิธีนี้ทำให้เกิดผลข้างเคียงน้อยที่สุด (แต่ก็ยังมีอยู่ดี ต้องแก้ต่อไปด้วย delta hint สำหรับขนาดฟอนต์ที่ดูไม่งาม)

เริ่มต้นที่จุด 53

srp0                53

เคลื่อนไปจุดใกล้ทีสุดด้วยระยะ front_khai

mirp[rp0,min,rnd,grey]  front_khai 21

จัดการหัวก่อน ด้วยการกำหนดขนาดเส้นหัว เคลือนไปอีกด้านหนึ่ง แล้วกำหนดขนาดย้อนกลับอีกครั้ง

mirp[min,rnd,grey]  headstem 50
mirp[rp0,rnd,grey]  headdia 15
mirp[min,rnd,grey]  headstem 44

กำหนดจุดคอดที่จุด 12

mdrp[rnd,grey]      12

เคลื่อนไปที่จุด 7 ด้วยการแรเงาแบบ white เพื่อแยกหัวออกจากคออักษรให้ชัดเจน

mdrp[rp0,rnd,white] 7

เคลื่อนไปต่อ เพื่อกำหนดความกว้างของคอ ให้เท่ากับระยะ vstem (ยืมค่า vstem ซึ่งน้อยกว่า hstem มาใช้สำหรับคออักษร)

mirp[rp0,rnd,grey]  vstem 27

เคลื่อนไปต้อ ด้วยการแรเงาแบบ white เพื่อแยกเส้นหน้าและเส้นหลังจากกัน

mdrp[rp0,rnd,white] 36

เคลื่อนต่อ กำหนดขนาดของเส้นหลัง

mirp[rp0,min,rnd,grey] hstem 38

กำหนดระยะกั้นหลัง

mdrp[rnd,white]     54

เคลื่อนย้อนกลับมาที่จุด 1 เพื่อกำหนดความกว้างหลักของอักษร ให้เท่ากับระยะ w_690

mirp[rp0,rnd,grey]  w_690 1

กำหนดความกว้างของเส้นหน้า

mirp[min,rnd,grey]  hstem 32

เกลี่ยจุดที่เหลือ จบการทำงานในแกน X

IUP[x]

แนวแกน Y
เส้นทาง hint ในแนวแกน Y

ทำงานในแกน Y

SVTCA[y-axis]

ปัดเศษลงจุด 1

mdap[rnd]           1

กำหนดความสูงปกติของเส้นหลัง

mirp[rnd,grey]      vheight 38

กำหนดความหนาของเส้นแนวนอนให้เท่ากับระยะ vstem

mirp[min,rnd,grey]  vstem 33

เคลื่อนไปเพื่อกำหนดความสูงหลอกตา (overshoot) ของหัว

mirp[rp0,rnd,grey]  vheight_shoot 24

เคลื่อนจุด กำหนดความหนาของคอแนวนอน โดยกำหนดให้เท่ากับความหนาของหัว คือ headstem

mirp[rp0,rnd,grey]  headstem 10

ย้ายมากำหนดส่วนคอด

mdrp[rp0,rnd,white] 12

ตรงนี้ เราจะเคลื่อนลงไปใต้สุดของหัวเลย เพื่ออาศัยพื้นที่ส่วนบนของหัว เป็นระยะรองรับการทดจุด (มีพื้นที่ดำมากกว่าส่วนอื่น) แล้วจึงกำหนดจุดของความหนาหัวและรูของหัวอักษรจากด้านล่าง

mdrp[rp0,rnd,grey]  18
mirp[min,rnd,grey]  headstem 41
mirp[rnd,grey]      headstem_plus_hole 47

เกลี่ยจุดเป็นคำสั่งสุดท้าย

IUP[y]

เสร็จแล้ว
ถอดด้วย dfont.py จะได้โค๊ด instruction ดังนี้

NPUSHB
 12
 32
 8
 1
 14
 54
 38
 8
 36
 27
 96
 7
 44
PUSHW_1
 258
PUSHB_2
 12
 15
PUSHW_1
 257
PUSHB_1
 50
PUSHW_1
 258
PUSHB_3
 21
 32
 53
SRP0
MIRP[rp0,min,rnd,grey]
MIRP[min,rnd,grey]
MIRP[rp0,rnd,grey]
MDRP[rnd,grey]
MIRP[min,rnd,grey]
MDRP[rp0,rnd,white]
MIRP[rp0,rnd,grey]
MDRP[rp0,rnd,white]
MIRP[rp0,min,rnd,grey]
MDRP[rnd,white]
MIRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
IUP[x]
PUSHB_1
 47
PUSHW_1
 259
PUSHB_1
 41
PUSHW_1
 258
PUSHB_3
 18
 12
 10
PUSHW_1
 258
PUSHB_7
 24
 184
 33
 96
 38
 188
 1
SVTCA[y-axis]
MDAP[rnd]
MIRP[rnd,grey]
MIRP[min,rnd,grey]
MIRP[rp0,rnd,grey]
MIRP[rp0,rnd,grey]
MDRP[rp0,rnd,white]
MDRP[rp0,rnd,grey]
MIRP[min,rnd,grey]
MIRP[rnd,grey]
IUP[y]