diff options
Diffstat (limited to 'TOOLS/subfont-c/osd/gen.py')
-rwxr-xr-x | TOOLS/subfont-c/osd/gen.py | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/TOOLS/subfont-c/osd/gen.py b/TOOLS/subfont-c/osd/gen.py new file mode 100755 index 0000000000..bf08fb8838 --- /dev/null +++ b/TOOLS/subfont-c/osd/gen.py @@ -0,0 +1,441 @@ +#!/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<code: + encoding.append('dup %i /.notdef put' % (i,)) + i = i+1 + encoding.append('dup %i /uni%04X put' % (code, code+0xE000)) + count = count + 1 + first = 1 + + +def end(): + append("""\ + endchar +} ND""") + + + +######################################## + +r = 400 +s = 375 +hsb = 200 # horizontal side bearing +hsb2 = 30 +over = 10 # overshoot +width = 2*r+2*over+2*hsb2 + +######################################## +begin('play', 0x01, hsb, width) +poly(( (s,r), + (0, 2*r),)) +end() + + +######################################## +w=150 +begin('pause', 0x02, hsb, width) +rect(w, 2*r) +movebase(2*w) +rect(w, 2*r) +end() + + +######################################## +begin('stop', 0x03, hsb, width) +rect(665, 720) +end() + + +######################################## +begin('rewind', 0x04, hsb/2, width) +movebase(2*s+15) +poly(( (0, 2*r), + (-s, r),)) +movebase(-s-15) +poly(( (0, 2*r), + (-s, r),)) +end() + + +######################################## +begin('fast forward', 0x05, hsb/2, width) +poly(( (s,r), + (0, 2*r),)) +movebase(s+15) +poly(( (s,r), + (0, 2*r),)) +end() + + +######################################## +begin('clock', 0x06, hsb2, width) +movebase(r, r) +circle(r+over) +wc = 65 +r0 = r-3*wc +n = 4 +movebase(-wc/2, -wc/2) +rect(-wc, wc) +moveback() +for i in range(n): + a = i*2*pi/n + v = pvec(r0, a) + movebase(v.x, v.y) + line(-wc, r-r0, a) + moveback() +hh = 11 +mm = 8 +line(-50, r*.5, pi/2-2*pi*(hh+mm/60.)/12) +line(-40, r*.9, pi/2-2*pi*mm/60.) +end() + + +######################################## +begin('contrast', 0x07, hsb2, width) +movebase(r, r) +circle(r+over) +circle(-(r+over-80), half=1) +end() + + +######################################## +begin('saturation', 0x08, hsb2, width) +movebase(r, r) +circle(r+over) +circle(-(r+over-80)) + +v = pvec(160, pi/2) +movebase(v.x, v.y) +circle(80) +moveback() + +v = pvec(160, pi/2+pi*2/3) +movebase(v.x, v.y) +circle(80) +moveback() + +v = pvec(160, pi/2-pi*2/3) +movebase(v.x, v.y) +circle(80) +end() + + +######################################## +begin('volume', 0x09, 0, 1000) +poly(( (1000, 0), + (0, 500),)) +end() + + +######################################## +begin('brightness', 0x0A, hsb2, width) +movebase(r, r) +circle(150) +circle(-100) + +rb = 375 +wb = 50 +l = 140 +n = 8 +for i in range(n): + a = i*2*pi/n + v = pvec(l, a) + movebase(v.x, v.y) + line(wb, rb-l, a) + moveback() +end() + + +######################################## +begin('hue', 0x0B, hsb2, width) +movebase(r, r) +circle(r+over) +ellipse(-(322), 166) +movebase(0, 280) +circle(-(60)) +end() + + +######################################## +begin('progress [', 0x10, (334-182)/2, 334) +poly(( (182, 0), + (182, 90), + (145, 90), + (145, 550), + (182, 550), + (182, 640), + (0, 640), +)) +end() + + +######################################## +begin('progress |', 0x11, (334-166)/2, 334) +rect(166, 640) +end() + + +######################################## +begin('progress ]', 0x12, (334-182)/2, 334) +poly(( (182, 0), + (182, 640), + (0, 640), + (0, 550), + (37, 550), + (37, 90), + (0, 90), +)) +end() + + +######################################## +begin('progress .', 0x13, (334-130)/2, 334) +movebase(0, (640-130)/2) +rect(130, 130) +end() + + + +######################################## +print """\ +%!PS-AdobeFont-1.0: OSD 1.00 +%%CreationDate: Sun Jul 22 12:38:28 2001 +% +%%EndComments +12 dict begin +/FontInfo 9 dict dup begin +/version (Version 1.00) readonly def +/Notice () readonly def +/FullName (OSD) readonly def +/FamilyName (OSD) readonly def +/Weight (Regular) readonly def +/ItalicAngle 0.000000 def +/isFixedPitch false def +/UnderlinePosition -133 def +/UnderlineThickness 49 def +end readonly def +/FontName /OSD def +/PaintType 0 def +/StrokeWidth 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/FontBBox {0 -10 1000 800} readonly def +/Encoding 256 array""" + +print string.join(encoding, '\n') +i = len(encoding) +while i<256: + print 'dup %i /.notdef put' % i + i = i+1 + + +print """\ +readonly def +currentdict end +currentfile eexec +dup /Private 15 dict dup begin +/RD{string currentfile exch readstring pop}executeonly def +/ND{noaccess def}executeonly def +/NP{noaccess put}executeonly def +/ForceBold false def +/BlueValues [ -15 0 717 734 693 708 630 649 593 611 658 679 780 800 ] def +/OtherBlues [ -112 -93 -200 -178 -45 -26 -134 -116 -71 -51 ] def +/StdHW [ 7 ] def +/StdVW [ 8 ] def +/StemSnapH [ 4 7 10 13 18 22 27 30 33 38 61 65 ] def +/StemSnapV [ 5 8 11 15 18 21 25 30 33 36 52 64 ] def +/MinFeature {16 16} def +/password 5839 def +/Subrs 1 array +dup 0 { + return + } NP + ND +2 index +/CharStrings %i dict dup begin""" % count + +print """\ +/.notdef { + 0 400 hsbw + endchar +} ND""" + +print string.join(chars, '\n') + + +print """\ +end +end +readonly put +noaccess put +dup/FontName get exch definefont pop +mark currentfile closefile""" |