"""Some handy font-like objects.

please note that this file is alpha, and is subject to modification in future versions of pgu!

""" 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

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.

TileFont(fname,size,hints,scale=None,sensitive=False)
size
the dimensions of the characters
hints
a string of hints "abcdefg..."
scale
size to scale font to
sensitive
case sensitivity
""" 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.
BorderFont(font,size=1,color=(0,0,0))
size
width of border; defaults 0
color
color of border; default (0,0,0)
""" 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