diff options
author | Sin Nombre <sin@ubuntu.(none)> | 2010-05-28 20:45:29 (GMT) |
---|---|---|
committer | Sin Nombre <sin@ubuntu.(none)> | 2010-05-28 20:45:29 (GMT) |
commit | 9e93d1b9802385900b6f833f81f84c0ac50f91ef (patch) | |
tree | f2c16599bde31b31e5d44bae4a87e7e4093f3cab /pgu/fonts.py | |
parent | ac8cbb6691ba3de1c7c42f4362edbe11270f4506 (diff) |
Diffstat (limited to 'pgu/fonts.py')
-rw-r--r-- | pgu/fonts.py | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/pgu/fonts.py b/pgu/fonts.py new file mode 100644 index 0000000..ab6f73d --- /dev/null +++ b/pgu/fonts.py @@ -0,0 +1,130 @@ +"""Some handy font-like objects. + +<p>please note that this file is alpha, and is subject to modification in +future versions of pgu!</p> +""" + +print 'pgu.fonts','This module is alpha, and is subject to change.' + +import pygame +from pygame.locals import * + +class TileFont: + """Creates an instance of the TileFont class. Interface compatible with pygame.Font + + <p>TileFonts are fonts that are stored in a tiled image. Where the image opaque, it assumed that the font is visible. Font color is changed automatically, so it does not work with + fonts with stylized coloring.</p> + + <pre>TileFont(fname,size,hints,scale=None,sensitive=False)</pre> + + <dl> + <dt>size <dd>the dimensions of the characters + <dt>hints <dd>a string of hints "abcdefg..." + <dt>scale <dd>size to scale font to + <dt>sensitive <dd>case sensitivity + </dl> + """ + + def __init__(self,fname,size,hints,scale=None,sensitive=False): + + self.image = pygame.image.load(fname) + + w,h = self.image.get_width(),self.image.get_height() + tw,th = size + if not scale: scale = size + self._size = size + self.scale = scale + + self.chars = {} + x,y = 0,0 + self.sensitive = sensitive + if not self.sensitive: hints = hints.lower() + for c in hints: + if c not in ('\r','\n','\t'): + img = self.image.subsurface(x,y,tw,th) + self.chars[c] = img + x += tw + if x >= w: x,y = 0,y+th + + self.colors = {} + + def size(self,text): + tw,th = self.scale + return len(text)*tw,th + + def render(self,text,antialias=0,color=(255,255,255),background=None): + size = self.size(text) + scale = self.scale + tw,th = self._size + if background == None: + s = pygame.Surface(size).convert_alpha() + s.fill((0,0,0,0)) + else: + s = pygame.Surface(size).convert() + s.fill(background) + + if not self.sensitive: text = text.lower() + + if color not in self.colors: self.colors[color] = {} + colored = self.colors[color] + + x,y = 0,0 + for c in text: + if c in self.chars: + if c not in colored: + img = self.chars[c].convert_alpha() + for yy in xrange(0,th): + for xx in xrange(0,tw): + r,g,b,a = img.get_at((xx,yy)) + if a > 128: + img.set_at((xx,yy),color) + colored[c] = img + img = colored[c] + if scale != (tw,th): img = pygame.transform.scale(img,scale) + s.blit(img,(x,y)) + x += scale[0] + return s + + +class BorderFont: + """a decorator for normal fonts, adds a border. Interface compatible with pygame.Font. + + <pre>BorderFont(font,size=1,color=(0,0,0))</pre> + + <dl> + <dt>size <dd>width of border; defaults 0 + <dt>color <dd>color of border; default (0,0,0) + </dl> + """ + def __init__(self,font,size=1,color=(0,0,0)): + + self.font = font + self._size = size + self.color = color + + def size(self,text): + w,h = self.font.size(text) + s = self._size + return w+s*2,h+s*2 + + def render(self,text,antialias=0,color=(255,255,255),background=None): + size = self.size(text) + + if background == None: + s = pygame.Surface(size).convert_alpha() + s.fill((0,0,0,0)) + else: + s = pygame.Surface(size).convert() + s.fill(background) + + bg = self.font.render(text,antialias,self.color) + fg = self.font.render(text,antialias,color) + + si = self._size + dirs = [(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)] + for dx,dy in dirs: s.blit(bg,(si+dx*si,si+dy*si)) + s.blit(fg,(si,si)) + + return s + + |