RZ 19 Feb 2015 - This is a procedure to display the original hershey vector font data in a canvas.
## Display hershey font data.
#
# \param pattern Glob like pattern of hershey files.
proc hershey_display {pattern} {
array set myData {}
foreach myFile [glob $pattern] {
array set myData [hershey_readfile $myFile]
}
catch {destroy .f}
grid rowconfigure . 1 -weight 1
grid columnconfigure . 1 -weight 1
grid [frame .f] -row 1 -column 1 -sticky nesw
grid rowconfigure .f 1 -weight 1
grid columnconfigure .f 1 -weight 1
grid [scrollbar .f.v -command {.f.c yview} -orient vertical] -row 1 -column 2 -sticky ns
grid [scrollbar .f.h -command {.f.c xview} -orient horizontal] -row 2 -column 1 -sticky ew
grid [canvas .f.c -xscrollcommand {.f.h set} -yscrollcommand {.f.v set}] -row 1 -column 1 -sticky nesw
set r 0
set c 0
foreach myNr [lsort -integer [array names myData]] {
if {[incr c] > 10} {
set c 1
incr r
}
.f.c create text [expr {10+60*$c}] [expr {30+40*$r}] -text $myNr: -anchor s
hershey_glyph .f.c $myData($myNr) [expr {30+60*$c}] [expr {30+40*$r}] 0 1
}
.f.c configure -scrollregion [.f.c bbox all]
}
## Draw a single glyph on a canvas.
# \param canvas Name of canvas widget.
# \param data Converted glyph line from hershey file.
# \param x X-offset in canvas.
# \param y Y-offset in canvas.
# \param angle Angle of glyph.
# \param scale Scaling factor of glyph.
# \private
proc hershey_glyph {canvas data x y angle scale} {
if {$angle == 0} {
set l [lindex $data 0]
set xoff [expr {$x - $l * $scale}]
set yoff [expr {$y - 9 * $scale}]
foreach myCoor [lrange $data 2 end] {
set myList {}
foreach {x2 y2} $myCoor {
lappend myList [expr {$xoff+$scale*$x2}] [expr {$yoff+$scale*$y2}]
}
if {[llength $myList] < 4} continue
$canvas create line $myList
}
} else {
set s [expr {sin(0.0174532925199433 * -$angle)}]
set c [expr {cos(0.0174532925199433 * $angle)}]
set l [lindex $data 0]
set xoff [expr {$x + $scale * (-$l * $c + 9 * $s)}]
set yoff [expr {$y + $scale * (-9 * $c - $l * $s)}]
foreach myCoor [lrange $data 2 end] {
set myList {}
foreach {x2 y2} $myCoor {
set px [expr {$x2 * $c - $y2 * $s}]
set py [expr {$x2 * $s + $y2 * $c}]
lappend myList [expr {$xoff+$scale*$px}] [expr {$yoff+$scale*$py}]
}
if {[llength $myList] < 4} continue
$canvas create line $myList
}
}
}
## Create internal data representation from original hershey data.
# \param file Name of hershey.oc? file
proc hershey_readfile {file} {
set myFd [open $file r]
set myC [read $myFd]
close $myFd
set myNr 0
foreach myLine [split $myC \n] {
if {[string index $myLine 4] in {0 1 2 3 4 5 6 7 8 9}} {
set myNr [string trim [string range $myLine 1 4]]
# ignore chars at 5,6,7
set myGlyph($myNr) [string range $myLine 8 end]
} else {
append myGlyph($myNr) $myLine
}
}
# Parse all found entries, R==82
# xxlr.. -- xx=word count (not used) l=left margin, r=right margin
array set myRet {}
foreach {myNr myLine} [array get myGlyph] {
set myRet($myNr) [expr {[scan [string index $myLine 0] %c]-82}]
lappend myRet($myNr) [expr {[scan [string index $myLine 1] %c]-82}]
set myList {}
set myR 0
foreach myC [split [string range $myLine 2 end] {}] {
if {$myR} {
if {$myC ne {R}} {error $myNr=$myLine}
set myR 0
continue
}
if {$myC eq { }} {
lappend myRet($myNr) $myList
set myList {}
set myR 1
continue
}
lappend myList [expr {[scan $myC %c]-82}]
}
if {[llength $myList]} {lappend myRet($myNr) $myList}
}
return [array get myRet]
}Then get the original hersh.oc1..4 files (see at Vector Font) and start with:
hershey_display hershey-font/hersh.oc?