You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.0 KiB

"""
This module is part of the 'blup' package and defines a font class as well as
some methods to load fonts from files and draw text on frames.
"""
import re
class FontFileError(Exception):
def __init__(self, value):
self.__value = value
def __str__(self):
return repr(self.__value)
class Font(object):
def __init__(self):
self.__chars = {}
self.__spacing = 1
self.__height = -1
@property
def spacing(self):
return self.__spacing
@spacing.setter
def spacing(self, value):
if type(self.value) == int and self.value > 0:
self.__spacing = value
else:
raise ValueError('illegal spacing given')
@property
def height(self):
if self.__height == -1:
raise ValueError('this font does not contain any characters')
else:
return self.__height
def __setitem__(self, item, value):
height = len(value)
if self.__height == -1:
self.__height = height
elif height != self.__height:
raise ValueError('character height does not match font height')
if len(set(map(len, value))) != 1:
raise ValueError('character lines differ in width')
allowedValues = set([0,1])
for line in value:
if set(line) != allowedValues:
raise ValueError('character contains invalid pixel value')
self.__chars[item] = value
def __getitem__(self, item):
return self.__chars[item]
charPixels = None
def load(filename):
f = open(filename, 'r')
data = f.read()
f = Font()
for line in f:
m = re.match('^\s*§(\d+)\s*$', line)
if m:
f.spacing = int(m.group(1))
continue
m = re.match('^\s*@(\d+)\|(\d+)\s*$', line):
if m:
charCode = int(m.group(1))
charWidth = int(m.group(2))
charPixels = []
continue
m = re.match('^\s*([01]+)\s*$', line):
if m and charPixels != None:
charRow = m.group(1)
if len(charRow) < charWidth:
raise FontFileError('char row does not contain enough pixels')
row = []
for i in xrange(charWidth):
row.append(int(charRow[i]))
charPixels.append(row)
continue