From 14f391013f1f41d02973cfbac0966aeaf34a242a Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Fri, 21 Oct 2011 21:11:42 -0600 Subject: [PATCH] adding fonts and ui elements --- .hgignore | 2 + fonts.py | 156 ++++++++++++++++++++++++ roc_main.py | 7 +- tools/examplefonts/coure10.png | Bin 0 -> 1962 bytes tools/examplefonts/coure10.tfd | 102 ++++++++++++++++ tools/examplefonts/micross20.png | Bin 0 -> 14615 bytes tools/examplefonts/micross20.tfd | 102 ++++++++++++++++ tools/examplefonts/micross42.png | Bin 0 -> 35285 bytes tools/examplefonts/micross42.tfd | 102 ++++++++++++++++ tools/examplefonts/monopro6.png | Bin 0 -> 1557 bytes tools/examplefonts/monopro6.tfd | 102 ++++++++++++++++ tools/examplefonts/proggysquaresz12.png | Bin 0 -> 1717 bytes tools/examplefonts/proggysquaresz12.tfd | 102 ++++++++++++++++ tools/examplefonts/proggytinysz12.png | Bin 0 -> 1578 bytes tools/examplefonts/proggytinysz12.tfd | 102 ++++++++++++++++ tools/examplefonts/vgafix12.png | Bin 0 -> 1857 bytes tools/examplefonts/vgafix12.tfd | 102 ++++++++++++++++ tools/fontmaker.py | 93 ++++++++++++++ universe.py | 4 +- widgets.py | 21 ++++ 20 files changed, 991 insertions(+), 6 deletions(-) create mode 100644 .hgignore create mode 100644 fonts.py create mode 100644 tools/examplefonts/coure10.png create mode 100644 tools/examplefonts/coure10.tfd create mode 100644 tools/examplefonts/micross20.png create mode 100644 tools/examplefonts/micross20.tfd create mode 100644 tools/examplefonts/micross42.png create mode 100644 tools/examplefonts/micross42.tfd create mode 100644 tools/examplefonts/monopro6.png create mode 100644 tools/examplefonts/monopro6.tfd create mode 100644 tools/examplefonts/proggysquaresz12.png create mode 100644 tools/examplefonts/proggysquaresz12.tfd create mode 100644 tools/examplefonts/proggytinysz12.png create mode 100644 tools/examplefonts/proggytinysz12.tfd create mode 100644 tools/examplefonts/vgafix12.png create mode 100644 tools/examplefonts/vgafix12.tfd create mode 100644 tools/fontmaker.py create mode 100644 widgets.py diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..9e32b48 --- /dev/null +++ b/.hgignore @@ -0,0 +1,2 @@ +syntax: glob +*.pyc diff --git a/fonts.py b/fonts.py new file mode 100644 index 0000000..f7ed13f --- /dev/null +++ b/fonts.py @@ -0,0 +1,156 @@ +import os +import pygame +from OpenGL.GL import * + +class TextureFile(object): + def __init__(self): + self.id = None + self.filename = None + self.h = None + self.w = None + + def load(self, filename): + self.filename = filename + img = files.mgr.png(filename) + texid = glGenTextures(1) + print "Generated texture id %s" % (texid,) + + self.id = texid + + imgdata = pygame.image.tostring(img, "RGBA") + imgr = img.get_rect() + self.h = imgr.h + self.w = imgr.w + + dimension = GL_TEXTURE_2D + glBindTexture(dimension, texid) + glTexImage2D(dimension, 0, GL_RGBA8, imgr.w, imgr.h, 0, GL_RGBA, GL_UNSIGNED_BYTE, imgdata) + glBindTexture(dimension, 0) + +class TexFont(object): + def __init__(self): + self.image = None + self.start = None + self.end = None + self.rows = None + self.cols = None + self.charheight = None + self.charwidth = None + self.texwidth = None + self.texheight = None + self.gltex = None + self.monospace = False + self.charsizes = [] + + @staticmethod + def new(fontdir, fontname): + tf = TexFont() + tf.load_definition(os.path.join(fontdir, "%s.tfd" % (fontname,))) + tf.load_texture(os.path.join(fontdir, "%s.png" % (fontname,))) + return tf + + def mapchar(self, char): + """ + Maps a char to an index. + + Takes a character either as ascii ordinal number or as a 1-length string. + Returns the index of that character in this texture font. + + If the character is not valid in this texture font, the index number will + instead reference the last character in the font, which is usually a + symbol for unknown characters (either totally blank or a box.) + """ + + if isinstance(char, basestring): + char = ord(char) + + if char >= self.start and char < self.end: + return self.end - self.start - 1 + else: + return char - self.start + + + def get_coordinates(self, idx): + """ + Maps an index to their x, y coordinates in the texture. + + Invalid indexes will be mapped to the last character in the font. + """ + if idx < 0 or idx >= (self.end - self.start): + idx = (self.end - self.start - 1) + + xp1 = (idx % self.cols) * self.charwidth + yp1 = (idx // self.cols) * self.charheight + + if self.monospace: + xp2 = xp + self.charwidth + yp2 = yp + self.charheight + else: + xp2 = xp + self.charsizes[idx][0] + yp2 = yp + self.charsizes[idx][1] + + xtc1 = (float(xp1) + 0.0) / self.texwidth + ytc1 = (float(yp1) + 0.0) / self.texheight + xtc2 = (float(xp2) - 1.0) / self.texwidth + ytc2 = (float(yp2) - 1.0) / self.texheight + + return (xtc1, ytc1, xtc2, ytc2) + + def load_definition(self, deffile): + """ + Loads a texture font definition (.tfd). + + These simple datafiles are generated by fontmaker.py to provide character + spacing information about the associated texture font. + + This should be called before load_texture. + """ + dd = open(deffile, 'r') + + if dd.readline() != "fontheader\n": + raise ValueError('"%s" is not a font definition file' % (deffile,)) + + def nextline(dd): + return [int(x) for x in dd.readline().rstrip().split(',')] + + self.start, self.end = nextline(dd) + self.charwidth, self.charheight = nextline(dd) + self.cols, self.rows = nextline(dd) + self.texwidth, self.texheight = nextline(dd) + + assert dd.readline() == "charsizes\n" + + self.charsizes = [None] * (self.end - self.start) + monospace = True + monoheight = True + + for i in xrange(0, (self.end - self.start)): + x, y = nextline(dd) + if x != self.charwidth: + monospace = False + if y != self.charheight: + monoheight = False + self.charsizes[i] = (x, y) + + "not yet capable of dealing properly with fonts of variable height" + assert monoheight + self.monospace = monospace + + + def load_texture(self, texfile): + """ + Loads a texture image (.png) + + The PNG image should contain 32-bit color with alpha channel. The image + will be loaded as an OpenGL texture. + + This function must be called after load_definition. + """ + tf = TextureFile() + tf.load(texfile) + self.gltex = tf + assert self.gltex.w == self.texwidth + assert self.gltex.h == self.texheight + + + \ No newline at end of file diff --git a/roc_main.py b/roc_main.py index e5629c7..f5f1466 100755 --- a/roc_main.py +++ b/roc_main.py @@ -34,14 +34,13 @@ def mainloop(): inputs.keydown(ev.key) #elif ev.type == VIDEOEXPOSE: # video.force_redraw() - elif ev.type in (MOUSEBUTTONDOWN, MOUSEBUTTONUP): - pass + - if 'exit' in inputs.commands: + if 'exit' in inputs.commandsh: break video.predraw() - g_universe.frame() + g_universe.frame(events) video.next_frame() diff --git a/tools/examplefonts/coure10.png b/tools/examplefonts/coure10.png new file mode 100644 index 0000000000000000000000000000000000000000..45440c9c727eaa7a9a0189eb90179fc1a4182b5c GIT binary patch literal 1962 zcmV;b2UYlqP) z+mhtC3Pt4;^Z&n`^Kv|+X1Ht+y4Yq#R8*ynL6)$Dz}bEMe!r%1T~{laXUTZ@pG&%U z9Z?6+-SFS@8FJBcR1T5#=o{5>1gFmcnuGjWYZr5l`+WWXC#y}GF0M_-vdaPbCsG>Z ze&D!Hz1n{V!y23up!dFYHksuB7x`_SN1jmbJTmy6C(>#I>R_79`}!aGyoJAZ8aJSw zsCAS!FegpN(o)viCPz5g0b0YJaBJ`{^(=Unib1KmpV5Bj9@TLuhwFF23pcM=34iYcn?=8&A17x8Elk^xj!1u9V`_n<9 z?MDO3m5w$v7CUBu{(3Z`_UhG+ZGY+tY^97PV4WyHiAka!)W#5;` ziX|W#6-Nt15t%H!gTI~G4sb%|4P{4LxA)J?C1CZP+>&_$Vsdl|}jVInf&!M*5+zyaASSJoXswZ3L@npvUCk{UHWN;xkf;T%S$$2YysH~N&@f5)>hYZBi9UxLQla6VrRqln;h<#3v^dhU~ z7>EqSiek{r>pivoUqX9OTRq6u5=~ZR$ov840B9W^kNoRbU(FAx=x$=Z>FY%Xa4&DSsgm^npNKpTJhs#weuFzJzM>NI`F!1u8%9Kc-$aH+u^k}QwAck1k8@K zi=tRXRRdorwRhrz$u@#{(Cz3ZbybAoD$C*#q9u@fyfLz?VIrgbM_<4MMRHuO$z-I;HhLuRWsT+ zZXa${=Qvx9`OMj|^jMWX&p=pJysYYEV?Ixd0YB9l;bf>RC6c_7K(=!pTSGHRp9qo+>_W>mcy#oP=$Tcq8|~w? z8Q_UzI7!6TYnb5xo>7kA9k4tSr+QYSpf+T`y z8>Kd{lDR)i{Rb2IUchRkY^3IVyU|jzQoB9S*(rR_PmclUlRvwpE!7Ej*&1%glO2GY z>ZKx*cAfXU#%;g<&FR;cEEKI+1w(^Cts*8h76}%$shb0-ym{JV1-JD4J)1~2qfZ@L zd9-Xvm034^IhY#fKyTcVv!eMdJ04jn)`;qf2Al|K%TM+a5b?}3Z+;Qd3{(`kJhB>C zW(B!aYhL$R3MFNInOnqo3L z93U$hQY65AH!y2J>gj#}+!sT#GEkMtdH_$Z1{MjF1ALrvfRDrN0!D+k%)qZ=h@vQp wq9}@@D2k#eilQirq9}@@D2k#eilXrFH+y+*1@LO8o&W#<07*qoM6N<$f($0P#sB~S literal 0 HcmV?d00001 diff --git a/tools/examplefonts/coure10.tfd b/tools/examplefonts/coure10.tfd new file mode 100644 index 0000000..1ed4e56 --- /dev/null +++ b/tools/examplefonts/coure10.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +14,9 +8,13 +128,128 +charsizes +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 +8,13 diff --git a/tools/examplefonts/micross20.png b/tools/examplefonts/micross20.png new file mode 100644 index 0000000000000000000000000000000000000000..fac17ec45c68e19daacd46103697c1674e42f30b GIT binary patch literal 14615 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 literal 0 HcmV?d00001 diff --git a/tools/examplefonts/micross20.tfd b/tools/examplefonts/micross20.tfd new file mode 100644 index 0000000..094defd --- /dev/null +++ b/tools/examplefonts/micross20.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +25,21 +9,11 +256,256 +charsizes +5,24 +6,24 +7,24 +13,24 +11,24 +17,24 +13,24 +4,24 +7,24 +7,24 +8,24 +11,24 +6,24 +7,24 +6,24 +6,24 +11,24 +12,24 +12,24 +11,24 +12,24 +11,24 +11,24 +11,24 +11,24 +11,24 +6,24 +6,24 +12,24 +11,24 +12,24 +12,24 +20,24 +15,24 +14,24 +14,24 +15,24 +14,24 +12,24 +15,24 +15,24 +6,24 +10,24 +14,24 +12,24 +17,24 +15,24 +16,24 +14,24 +16,24 +14,24 +13,24 +13,24 +15,24 +14,24 +19,24 +14,24 +14,24 +13,24 +6,24 +6,24 +6,24 +9,24 +11,24 +7,24 +11,24 +11,24 +10,24 +11,24 +11,24 +7,24 +11,24 +11,24 +4,24 +5,24 +10,24 +4,24 +16,24 +11,24 +12,24 +11,24 +11,24 +7,24 +11,24 +7,24 +11,24 +10,24 +15,24 +10,24 +10,24 +11,24 +7,24 +6,24 +8,24 +12,24 +6,24 diff --git a/tools/examplefonts/micross42.png b/tools/examplefonts/micross42.png new file mode 100644 index 0000000000000000000000000000000000000000..c4169e9354d89c17eb00a4f6ab03458e4872a0e9 GIT binary patch literal 35285 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%0AS2*tDXLu#P*EI| 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 literal 0 HcmV?d00001 diff --git a/tools/examplefonts/micross42.tfd b/tools/examplefonts/micross42.tfd new file mode 100644 index 0000000..61b103f --- /dev/null +++ b/tools/examplefonts/micross42.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +49,43 +10,11 +512,512 +charsizes +11,48 +12,48 +15,48 +25,48 +23,48 +38,48 +28,48 +8,48 +15,48 +15,48 +16,48 +24,48 +12,48 +13,48 +12,48 +12,48 +24,48 +24,48 +23,48 +24,48 +24,48 +24,48 +24,48 +23,48 +24,48 +24,48 +12,48 +12,48 +24,48 +24,48 +24,48 +24,48 +42,48 +30,48 +27,48 +30,48 +30,48 +28,48 +26,48 +33,48 +30,48 +12,48 +21,48 +28,48 +23,48 +34,48 +30,48 +33,48 +28,48 +33,48 +30,48 +28,48 +26,48 +30,48 +28,48 +40,48 +28,48 +28,48 +26,48 +12,48 +12,48 +12,48 +20,48 +24,48 +14,48 +24,48 +23,48 +21,48 +23,48 +23,48 +13,48 +23,48 +24,48 +10,48 +12,48 +22,48 +10,48 +36,48 +24,48 +22,48 +23,48 +23,48 +15,48 +21,48 +12,48 +24,48 +21,48 +31,48 +21,48 +21,48 +21,48 +14,48 +11,48 +13,48 +25,48 +12,48 diff --git a/tools/examplefonts/monopro6.png b/tools/examplefonts/monopro6.png new file mode 100644 index 0000000000000000000000000000000000000000..64be62469388faa870b88bbbdfd2811c8ab4629a GIT binary patch literal 1557 zcmb7^`CHNl0LH(HVl%a-QF*Xzl?#(OQ&dbyOF=ZnSsvsOd4Q;SCV3`M)66+MDbKZ% z$Pf=y)Yf57D@6m#v_w$ppv=T0DDPbDKiK;`@B8`b{pJ1P&G+@e>g$^50sx?o^KkR~ zO4>JX0DsK~=#%{bpe@6>xgJZaR@Nv>>MZqglVWDpSz|kb#r*eKAd~8adMAVwv)Nm3 z?$82Ktco-1NwOPxJ8Jn+;mo|p&FR^*;!z_*a+2U&Xf^8D=NEE)n#6;iB6x1_HZ7ra zx;8es=`a5YkM44E6cFSSuT;IS920^Bn6Ns`fl=zo+;G zksrYcIy<i zB7xA!zR#XMKV+BqPyT_Tih3aNAa+l^S}C}gg>NXR+IPZD3(BkZ=L{P(HrO4`FY9k> z)v^U$$xC67Ev}TeP7O_c0v812RyC5Ogj~Wo7o`QyL6{=rr;nP8L}?!&e4j1AxTLpn(-6BcOaJc_ws86ZXZNpDoCtW>t_%E zP__K#3I!J%${4NhqI3dFyh}2$eUwq5XK0jDAdvXVGi78sx^44j7vY#Gs<^-$Ox+Og9OYCVtUzlHe_LmP? z__cs_)B{-4lqTj85VHCA1{pySh?Wg{b?m#0*w{Rn&V1)g$tv>Z5nv;+1p4LL-l1-*8#xCTzev#+dHi7vGU6KPn0QUG9KC_lCt6s;2#RE zh9DbJbV+)0qV_}GFuL&pF!BGh;1~LIAG>_gDQAsNW<|d`Qc$` z`aaST0wvfvHM75P64G%PM9ZXA5a;%0bNwRhHjuQ!BOxtY@Yx4C+i$@#%Xl;Im&3ZF zP2P+H_?i%l%kUP`?CeZ3lZdpzVC;eXF4 zsGQ(4Iw%3M0N5fX*u8&a{c)Hypu1UH(=PnFzJ?{`=iV)^1xBOXJjBAfBg9kb&#=Se}qe(O_VkETrYn{+rQcQ0L{*K-doS1EW1(Df= zazK^ERictn6i>@xVfN>d$%&^t<8M{@3hhAM~nQWi1!BSm6Z41Hq0}5e~3UL#Y##w!;&5Uw(Gd z%EgG>8NqfpAU`!@f1nGO>q7%?r{KbL6Pe^JS|D^7D;=hHxUU;RUv{63axRG|K zVNgRbvPlP>v%{Q^HCTBc1}vn^hshVW(FkAv`hN?u2wKa4IJ?g7zx=I>bN6v;JVa#t E3va#RrT_o{ literal 0 HcmV?d00001 diff --git a/tools/examplefonts/monopro6.tfd b/tools/examplefonts/monopro6.tfd new file mode 100644 index 0000000..4e2cc44 --- /dev/null +++ b/tools/examplefonts/monopro6.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +11,7 +8,13 +128,128 +charsizes +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 diff --git a/tools/examplefonts/proggysquaresz12.png b/tools/examplefonts/proggysquaresz12.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2d01fdd0d5f4215d2e138f8c5851f970bb6d4 GIT binary patch literal 1717 zcmV;m21@yfP) z?UEcJ2u1Bw-v5;+KT>WP0s@MPJ@-^?ZD#yzMMSVS&*$?g63_FLFHHZGQXVG#=ljU^ zPxC9Vt`GS=lBZYJ(!N&Sk}l24V<>+eUIAD+0IhJ)cDQywDG5G_VzDtv6FZC(AV>bI1StnUh18(`KjnJs^E z@*na;`x9Zbr4*=LHh@LNT8~lEKHjq%W^9U@zt=x4JuQ&}F#FIegDfKxe!34^s9V5l z^_24A0r+}O#R8CC^2GvP>F8*feLjz`eUQpWmi%)K!$Uy=BMYNPMcmGZCyP#?dZgx9={>1TYz<7M$Yn< zNwW^9CI~aCSbP2}R6fPy2#R)%(t2k!0L?ct_^psz_V`y2?F!aHvDQdk`kGFWIcM$*X!VWM-7D|y|1rLC3jhFA5DVCs{+|tSQ!Iey@%Z_*JeJ$M zJy)vbl4mbns>55p*MI5rajdZbi!a-o-%>7`RrOm0J|%B30=Z+CccN(>ZTXShyC zB9ZBt&Ah<|s8}zIXcm22mz66gzZBnJ37gp>X8r7Ged!IBYjNqY#sX*_8q?R#yVil2 z@%Q)gjP%dr&!4>uag5Pd!_qv!MPST8K58t0HDWBj>|kH{(@CGLKV|x9Jg0!C=xS`n z$uo0lB-*(&(~pzRE;sb;;L{>`y8Rh4jGvpxzYnn56E}M;T|0_ut2X-DdkSHpp1{mf zyeb+g<=4`={L(Q`tN$2L8i0$QMGMmDLDTLnWL`WXQ~EFls^zKqytim-y<8g>KYQ=_ zyydy}rM_9(KZf_OglQ_;dR`wnN7J(0MNX*=OKiYfp3>`EHowXbyKe=j9f$xVVXUOI zZ+8Cg;VB1T6Rl=wKObkO2B}$B4WTQc3%;006?b#RC4Z!X4#V>-|l!fKuLXoma!t;>o1E_5|~$ z*Tca8Q~;zmTV_5>tEQJ{zRlMY@8e70eBOZy-kp@6@1cQNYx2?*_J? zrL+;A=66pZI3dv5|B&Bpd!U2I2%NbNrupi297ejy0t4?mbM{i00000 z000000000000000000000000000000000000000000000U@w0F|9<+G8G49L00000 LNkvXXu0mjfaPKv~ literal 0 HcmV?d00001 diff --git a/tools/examplefonts/proggysquaresz12.tfd b/tools/examplefonts/proggysquaresz12.tfd new file mode 100644 index 0000000..4e546fd --- /dev/null +++ b/tools/examplefonts/proggysquaresz12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +12,8 +8,12 +128,128 +charsizes +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 +7,11 diff --git a/tools/examplefonts/proggytinysz12.png b/tools/examplefonts/proggytinysz12.png new file mode 100644 index 0000000000000000000000000000000000000000..d62117e7ee56a4ac4365693227f19156c3215c82 GIT binary patch literal 1578 zcmV+_2G#kAP) z>yG0f428*P-v5=eKXx->J-!2pNzW%$RpS^aI9v{N<~Yx@aU93d9JaHyc69Gvzg4!M zatMB0IsfxnS05Y89U9wTT^!aMQOoK^{f1#zR z<+Xj_j0V6#-Y;n5pTySt9gK}OdbB(w9I^$z`ff;RqjEgBSAv_L$Y z-ivL+${|3b4-6{^F1R6JWyRB;s?Y0aaxbFjEK_#)_Wgu6fEZ zPt5_I!V`3>@&TY8$3)5V{A+qt3NCG{h<6TH z9^H%P{bU1_A3D5~z|6L+r`z>R-Dzw>BmPd%Nn0&8jd@g+|rB zyKSWy83MNXk^lgKnNl!pkbEX$~$cX%krlRChPE_>B55J|J* zFeGyQE+AXzeoT(clKbmX-)yfD_0QJJmP0^BVvYED)0pAMrI9IT#BVf69|KY_0H4g8 zq~KrU?mrtl3wQWUFK0!*ntpzdew(LlQaLYND!1}^tXZ8hLn`R>-s6!GkNvtMt!u;uVCdLi$0s& z&|24ekax}xOk&2Li;p%+wrd@2{4K`hyRi<1R+BZo5;Jh(ITk)Dmu6(sh@9KQZD-Ro zti1;hlFxPlS@GAwSt6S}8NX2<0P0~$!Iq3F`O(YgUsLGczjY?lZ&o>}?N_>tgnTeI zHqDAu+zq@c{ccrqR43SyiUF{S>}2-USicL1*r;85qNFtGso!i_B%9R8mi@XXx)Lcb zTyZCYyayb$FQ+ZFI2#p)JSw2KoPD|ymVHF(E*%714{!%NDRQM7a1`m6L95xRLd!qJ zBX~{)OJghN=h65zKaD4~{MQCS^i*)fzS^cu`m$28<`b2ywO!3J>?Q@z-k7Si(FMT$ zyy;YMd0RzxQv!EdK5oHo0RSe${ns$B#2WGI?esigL|*Rgn)0V9mUq}FHT(Z&OTk(B z)e@Jadp&FI6_v^5o0W65`YOj$Lx2=SS7l$XS$XxFOj%7oO8Lfbt>zq{KMSyW(q}#8 zbhz@eMdPr0wuN=Ec!Ijvy(E<2@O2I$l9CJ$dC(50tW`Ae4p;Y>I=s%5$w!)Kp^k4!Nmx16$ z5C9*}6#yf`g)|IMH4j5YLHfObnUW{BIf7YUL00Ji)>%4G1k3?GoIU_vz3BmXXb%w8 z+0pm_000000000000000000000000000000000000000000000000000000000000 c007M358kosfzABya{vGU07*qoM6N<$f(yIv2><{9 literal 0 HcmV?d00001 diff --git a/tools/examplefonts/proggytinysz12.tfd b/tools/examplefonts/proggytinysz12.tfd new file mode 100644 index 0000000..4e2cc44 --- /dev/null +++ b/tools/examplefonts/proggytinysz12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +11,7 +8,13 +128,128 +charsizes +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 +6,10 diff --git a/tools/examplefonts/vgafix12.png b/tools/examplefonts/vgafix12.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5b810b8a0b78c1cc2e2b512d508911ad3b919e GIT binary patch literal 1857 zcmV-H2fp};P) z>#`gx2uAHx-v5>7{5hQ%w!+87+sLX)WoI{y-HM39OrFo@Q#hXIDJk=PGB3Ya$@P5x z|C0>j_v#05P#eb6l}cDF9)O#b^jc50{yitt`nmr1)4ASiOY$VBx6!=+_Gk@&8Oh~XMN~V}SP=vCjEL*B+7L?l+0l=1|4ty@Pr4RHv;njRiq4kSK=yt{ zjG`X=UR%=4?LBJ^qNCNObbV?3q74GM&W`47>m#(qJK)B zk`ZV+hjz#cqi7AX$7>;Nu~?P>$yG{dV*q4kAd!A=xtUFLVCo`z8;F3!0B9SnC299y zu%1BNWI`qyy2b6X>q%fem{NeJ(c>`^^xoa#4i-xc5b zJ%E;aOE|inQuw`lEjJo>dnfDyc0=+;Gug3!l9PCL%TuS!9GRDIi2)KLX#khw2?CKb z_`=9U=+MYW&p?sdqt{VAQSTMP2oHef@}(jUNr$y&pvOc0NV1muSG*UC)dQgWPwl{u z#B%VfZ(>RX=$*edBplAM)45DW=t)!JVA-2UH-eLfn4v47K(X8Q7SxWAB`jxe$ zsO$cSFeLXx8MzCHaP`_s9!oJrYwaGjOtqe;7w~Oa5;pU!8=3iN2T|FX1Ka~OYE+*I zx&%bIQ}6vzhSuAHS+=FKL7ru55QugTP0u3tNNu+CM74wLxue=b^-S9-Q3Hswd{mDV zY(=%h$w#&|Q%0k!Yfu^wu!CDn^st_L_j-WDPfpyVPu2rmD)W-*;LAw^xSU=PXgv_I zW(lpib*ask9!vh+lEZJwM%4_^ckcCp_}ncI;5iLL&eElPH@%LW^-FC=<=>I_L+S!J znaFwo@i>_pKxBq$^l8@A!ikERZ4IYh0wPPN>LX8jz2y?o^X?h!wr?K#Jg)(uX;TfH z5uk0>G9E*SOmaoEHKK;W#A^W3U~!GD&a5GwfE02>5qZ`x8H#&3s+R!C2sE7*pys}a(B2__5j*EepEexM-R>ab2S4~uo^(biQk9(&B>g| z^1($|=>gs&Pc&z+J3AMObf3xkWznU~vF@l&tS@ZJd=NB(>z20set@6s z6mTZVSh61AQkj=qmVn6Ig;&p3+z~?!(>j$1>9~}!&q$q-k>p}T%02fFZph=9^g`$m)r(k&PoH&Y?)3t2s#q( zKaMO#9|X-j21eSN@%eE84p9kkoPR!2&?YHc-;R*uSBy%t5Pbh6~} zt$KRT!&PTN?P+2FO|pZ_L8Hl%*+~^z2-E94PafZ@hojd9)zj2RYXa%dr>vQ`rl8&V z5n2-V{(KUrK6eCCUPep?eZx6G26}zO618tIfKt*3%xM4j@Q6bhF6fCy+g4QFf~3!z z>qmfg9GdS3pfX4UEuGQjV&1lp`_OucsIv{r7S!}C-?9WGMl?%+)e(jnvUUzjiaP-H$kOGNWXg+;4ja`?3dR9jnCZ{LT_>W3V?P>s}{5u$@4F1b8 zMzFI1^x_h$9w~tnIatfrc9duXKwNh%(~CVc^>rNRKtvkBF@s;q&vY=C&qnjqvjR$M z{+*M%4w?0ew00000NkvXXu0mjf`;wC> literal 0 HcmV?d00001 diff --git a/tools/examplefonts/vgafix12.tfd b/tools/examplefonts/vgafix12.tfd new file mode 100644 index 0000000..0bf6823 --- /dev/null +++ b/tools/examplefonts/vgafix12.tfd @@ -0,0 +1,102 @@ +fontheader +32,128 +16,9 +8,14 +128,128 +charsizes +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 +8,15 diff --git a/tools/fontmaker.py b/tools/fontmaker.py new file mode 100644 index 0000000..ab12a9a --- /dev/null +++ b/tools/fontmaker.py @@ -0,0 +1,93 @@ +import os +import pygame +import sys +import math + +pygame.init() +pygame.font.init() + +assert pygame.font.get_init() + +fmod = pygame.font +Font = pygame.font.Font + +fontname, fontsize = sys.argv[1:] + +if '/' in fontname: + ffile = fontname + fontname = os.path.splitext(os.path.split(fontname)[1])[0].lower() +else: + ffile = fmod.match_font(fontname) + +if not ffile: + print "Unable to find font... here is a list of fonts:\n" + for x in sorted(fmod.get_fonts()): + print x + sys.exit(0) + +fontsize = int(fontsize) +fontname = "%s%s" % (fontname, fontsize) + +f = Font(ffile, fontsize) + +start = 32 +end = 128 +images = [] +imsizes = [] +maxwidth = 0 +maxheight = 0 +for char in xrange(start, end): + letter = chr(char) + sz = f.size(letter) + maxwidth = max(maxwidth, sz[0]) + maxheight = max(maxheight, sz[1]) + im = f.render(letter, True, (255, 255, 255)) + images.append(im) + imsizes.append(sz) + +print len(images) +maxwidth += 1 +maxheight += 1 + +ratio = float(maxwidth) / float(maxheight) +print "Ratio %s" % (ratio,) +reqwidth = maxwidth * len(images) + +ratioheight = int(math.ceil(math.sqrt(len(images) * ratio))) +ratiowidth = int(math.ceil(len(images) / math.sqrt(len(images) * ratio))) + +print [ratioheight, ratiowidth] + +reqwidth = maxwidth * ratiowidth +reqheight = maxheight * ratioheight + +print [reqheight, reqwidth] + +texsize = 16 + +while texsize < reqheight or texsize < reqwidth: + texsize *= 2 + +print texsize + +tex = pygame.Surface((texsize, texsize), pygame.SRCALPHA, 32) +tex.fill((0, 0, 0, 0)) + +for i, im in enumerate(images): + tex.blit(im, (((i % ratiowidth) * maxwidth), ((i // ratiowidth) * maxheight))) + +pygame.image.save(tex, "%s.png" % (fontname,)) + +datf = open("%s.tfd" % (fontname,), "w") +datf.write("fontheader\n") +datf.write("%s,%s\n" % (start, end)) +datf.write("%s,%s\n" % (maxheight, maxwidth)) +datf.write("%s,%s\n" % (ratioheight, ratiowidth)) +datf.write("%s,%s\n" % (texsize, texsize)) +datf.write("charsizes\n") +for i, sz in enumerate(imsizes): + datf.write("%s,%s\n" % (sz[0], sz[1])) + +datf.close() + + diff --git a/universe.py b/universe.py index fac9d82..5056682 100755 --- a/universe.py +++ b/universe.py @@ -11,7 +11,7 @@ class base_universe(object): def init(self): pass - def frame(self): + def frame(self, events): pass def update(self): @@ -27,6 +27,6 @@ class tiled_universe(base_universe): def init(self): pass - def frame(self): + def frame(self, events): pass diff --git a/widgets.py b/widgets.py new file mode 100644 index 0000000..c3554b8 --- /dev/null +++ b/widgets.py @@ -0,0 +1,21 @@ + + +class BaseWidget(object): + def __init__(self): + pass + +class InvisibleWidget(BaseWidget): + pass + +class BoxWidget(BaseWidget): + def __init__(self, pos): + self.pos = pos + self.border = None + self.background = None + + +class Button(BoxWidget): + def __init__(self, pos, label, callback): + BoxWidget.__init__(self, pos) + + def \ No newline at end of file