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]
Topic: