aboutsummaryrefslogtreecommitdiff
path: root/hershey.go
diff options
context:
space:
mode:
Diffstat (limited to 'hershey.go')
-rw-r--r--hershey.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/hershey.go b/hershey.go
new file mode 100644
index 0000000..01211f5
--- /dev/null
+++ b/hershey.go
@@ -0,0 +1,111 @@
+package main
+
+import (
+ "bufio"
+ "fmt"
+ "log"
+ "os"
+ "strconv"
+ "strings"
+)
+
+type Point struct {
+ X, Y int
+}
+
+type Path []Point
+type Set []Path
+
+type Glyph struct {
+ N, K int
+ L, R int
+ S Set
+}
+
+type Font map[int]Glyph
+
+func parseInt(s string) (n int) {
+ s = strings.TrimSpace(s)
+ n, _ = strconv.Atoi(s)
+ return
+}
+
+func parsePoint(in uint8) int {
+ return int(in) - int('R')
+}
+
+func parseData(s string) Set {
+ var st Set
+ for i, el := range strings.Fields(s) {
+ var ph Path
+ if i > 0 {
+ el = el[1:]
+ }
+ for n := 0; n < len(el); n += 2 {
+ var p Point
+ p.X = parsePoint(el[n])
+ p.Y = parsePoint(el[n+1])
+ ph = append(ph, p)
+ }
+ st = append(st, ph)
+ }
+ return st
+}
+
+func loadFont(fname string) Font {
+ fnt := make(Font)
+
+ f, err := os.Open(fname)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer f.Close()
+
+ scanner := bufio.NewScanner(f)
+ for scanner.Scan() {
+ line := scanner.Text()
+ gl := Glyph{
+ N: parseInt(line[0:5]),
+ K: parseInt(line[5:8]),
+ L: parsePoint(line[8]),
+ R: parsePoint(line[9]),
+ S: parseData(line[10:]),
+ }
+ fnt[gl.N] = gl
+ }
+ if err := scanner.Err(); err != nil {
+ log.Fatal(err)
+ }
+ return fnt
+}
+
+func (p Point) String() string {
+ return fmt.Sprintf("%v,%v,", p.X, p.Y)
+}
+
+func (p Path) String() (s string) {
+ s = fmt.Sprint("M", p[0])
+ for _, pt := range p[1:] {
+ s += fmt.Sprint("D", pt)
+ }
+ return
+}
+
+func (st Set) String() (s string) {
+ for _, p := range st {
+ s += fmt.Sprint(p)
+ }
+ return
+}
+
+func (g Glyph) String() string {
+ return fmt.Sprint(g.S)
+}
+
+func (f Font) Select(n []int) Font {
+ ret := make(Font)
+ for i, p := range n {
+ ret[i+32] = f[p]
+ }
+ return ret
+}