Version 0 of hershey vector font

Updated 2015-02-19 08:56:38 by RZ

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?