#!/usr/bin/python from math import * import sys import string k = (sqrt(2.)-1.)*4./3. chars = [] encoding = [] count = 1 first = 1 def append(s): chars.append(s) def rint(x): return int(round(x)) """ if x>=0: return int(x+0.5) else: return int(x-0.5) """ class vec: def __init__(self, x, y=0): if type(x) is type(()): self.x, self.y = x else: self.x = x self.y = y def set(self, x, y): self.__init__(x, y) def move(self, x, y): self.x = self.x + x self.y = self.y + y def __add__(self, v): return vec(self.x+v.x, self.y+v.y) def __sub__(self, v): return vec(self.x-v.x, self.y-v.y) def int(self): return vec(rint(self.x), rint(self.y)) def t(self): return (self.x, self.y) class pvec(vec): def __init__(self, l, a): self.x = l * cos(a) self.y = l * sin(a) pen = vec(0,0) def moveto(x, y=0): global first dx = rint(x-pen.x) dy = rint(y-pen.y) if dx!=0: if dy!=0: append("\t%i %i rmoveto" % (dx, dy)) else: append("\t%i hmoveto" % (dx)) elif dy!=0: append("\t%i vmoveto" % (dy)) elif first: append("\t0 hmoveto") first = 0 pen.x = pen.x+dx pen.y = pen.y+dx def rlineto(v): if v.x!=0: if v.y!=0: append("\t%i %i rlineto" % (v.x, v.y)) else: append("\t%i hlineto" % (v.x)) elif v.y!=0: append("\t%i vlineto" % (v.y)) def closepath(): append("\tclosepath") history = [] def movebase(x, y=0): history.append((x,y)) pen.move(-x, -y) def moveback(): x, y = history.pop() pen.move(x, y) def ellipse(rx, ry = None, half=0): # rx>0 => counter-clockwise (filled) # rx<0 => clockwise if ry==None: ry = abs(rx) dx1 = rint(k*rx) dx2 = rx-dx1 dy1 = rint(k*ry) dy2 = ry-dy1 rx = abs(rx) moveto(0, -ry) append("\t%i 0 %i %i 0 %i rrcurveto" % (+dx1, +dx2, +dy2, +dy1)) append("\t0 %i %i %i %i 0 rrcurveto" % (+dy1, -dx2, +dy2, -dx1)) if not half: append("\t%i 0 %i %i 0 %i rrcurveto" % (-dx1, -dx2, -dy2, -dy1)) append("\t0 %i %i %i %i 0 rrcurveto" % (-dy1, +dx2, -dy2, +dx1)) closepath() if half: pen.set(0, ry) else: pen.set(0, -ry) circle = ellipse def rect(w, h): moveto(0, 0) if w>0: append("\t%i hlineto" % (w)) append("\t%i vlineto" % (h)) append("\t%i hlineto" % (-w)) pen.set(0, h) else: append("\t%i vlineto" % (h)) append("\t%i hlineto" % (-w)) append("\t%i vlineto" % (-h)) pen.set(-w, 0) closepath() def poly(p): moveto(0, 0) prev = vec(0, 0) for q in p: rlineto(vec(q)-prev) prev = vec(q) closepath() pen.set(prev.x, prev.y) def line(w, l, a): vw = pvec(w*.5, a-pi*.5) vl = pvec(l, a) p = vw moveto(p.x, p.y) p0 = p #print '%%wla %i %i %.3f: %.3f %.3f' % (w, l, a, p0.x, p0.y) p = p+vl rlineto((p-p0).int()) p0 = p #print '%%wla %i %i %.3f: %.3f %.3f' % (w, l, a, p0.x, p0.y) p = p-vw-vw rlineto((p-p0).int()) p0 = p #print '%%wla %i %i %.3f: %.3f %.3f' % (w, l, a, p0.x, p0.y) p = p-vl #print '%%wla %i %i %.3f: %.3f %.3f' % (w, l, a, p.x, p.y) rlineto((p-p0).int()) closepath() pen.set(p.x, p.y) def begin(name, code, hsb, w): global first, count, history history = [] pen.set(0, 0) append("""\ /uni%04X { %% %s %i %i hsbw""" % (code+0xE000, name, hsb, w)) i = len(encoding) while i