From 3c6dc5f289bd87010fdc529162af8c17ce407ddc Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 13 May 2015 18:22:50 +0200 Subject: Initial import --- hershey.go | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 hershey.go (limited to 'hershey.go') 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 +} -- cgit v1.2.3