mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-11 04:07:21 +03:00
37f22ebfcd
First, we go for the obvious stuff. The string module methods are gone in 3.0, so we translate them to the appropriate methods on the string class.
391 lines
17 KiB
Python
391 lines
17 KiB
Python
#
|
|
# The Python Imaging Library.
|
|
# $Id$
|
|
#
|
|
# PIL raster font management
|
|
#
|
|
# History:
|
|
# 1996-08-07 fl created (experimental)
|
|
# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3
|
|
# 1999-02-06 fl rewrote most font management stuff in C
|
|
# 1999-03-17 fl take pth files into account in load_path (from Richard Jones)
|
|
# 2001-02-17 fl added freetype support
|
|
# 2001-05-09 fl added TransposedFont wrapper class
|
|
# 2002-03-04 fl make sure we have a "L" or "1" font
|
|
# 2002-12-04 fl skip non-directory entries in the system path
|
|
# 2003-04-29 fl add embedded default font
|
|
# 2003-09-27 fl added support for truetype charmap encodings
|
|
#
|
|
# Todo:
|
|
# Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
|
|
#
|
|
# Copyright (c) 1997-2003 by Secret Labs AB
|
|
# Copyright (c) 1996-2003 by Fredrik Lundh
|
|
#
|
|
# See the README file for information on usage and redistribution.
|
|
#
|
|
|
|
import Image
|
|
import os, sys
|
|
|
|
class _imagingft_not_installed:
|
|
# module placeholder
|
|
def __getattr__(self, id):
|
|
raise ImportError("The _imagingft C module is not installed")
|
|
|
|
try:
|
|
import _imagingft
|
|
core = _imagingft
|
|
del _imagingft
|
|
except ImportError:
|
|
core = _imagingft_not_installed()
|
|
|
|
# FIXME: add support for pilfont2 format (see FontFile.py)
|
|
|
|
# --------------------------------------------------------------------
|
|
# Font metrics format:
|
|
# "PILfont" LF
|
|
# fontdescriptor LF
|
|
# (optional) key=value... LF
|
|
# "DATA" LF
|
|
# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
|
|
#
|
|
# To place a character, cut out srcbox and paste at dstbox,
|
|
# relative to the character position. Then move the character
|
|
# position according to dx, dy.
|
|
# --------------------------------------------------------------------
|
|
|
|
##
|
|
# The <b>ImageFont</b> module defines a class with the same name.
|
|
# Instances of this class store bitmap fonts, and are used with the
|
|
# <b>text</b> method of the <b>ImageDraw</b> class.
|
|
# <p>
|
|
# PIL uses it's own font file format to store bitmap fonts. You can
|
|
# use the <b>pilfont</b> utility to convert BDF and PCF font
|
|
# descriptors (X window font formats) to this format.
|
|
# <p>
|
|
# Starting with version 1.1.4, PIL can be configured to support
|
|
# TrueType and OpenType fonts. For earlier version, TrueType
|
|
# support is only available as part of the imToolkit package
|
|
#
|
|
# @see ImageDraw#ImageDraw.text
|
|
# @see pilfont
|
|
|
|
class ImageFont:
|
|
"PIL font wrapper"
|
|
|
|
def _load_pilfont(self, filename):
|
|
|
|
file = open(filename, "rb")
|
|
|
|
for ext in (".png", ".gif", ".pbm"):
|
|
try:
|
|
fullname = os.path.splitext(filename)[0] + ext
|
|
image = Image.open(fullname)
|
|
except:
|
|
pass
|
|
else:
|
|
if image and image.mode in ("1", "L"):
|
|
break
|
|
else:
|
|
raise IOError("cannot find glyph data file")
|
|
|
|
self.file = fullname
|
|
|
|
return self._load_pilfont_data(file, image)
|
|
|
|
def _load_pilfont_data(self, file, image):
|
|
|
|
# read PILfont header
|
|
if file.readline() != "PILfont\n":
|
|
raise SyntaxError("Not a PILfont file")
|
|
d = file.readline().split(";")
|
|
self.info = [] # FIXME: should be a dictionary
|
|
while True:
|
|
s = file.readline()
|
|
if not s or s == "DATA\n":
|
|
break
|
|
self.info.append(s)
|
|
|
|
# read PILfont metrics
|
|
data = file.read(256*20)
|
|
|
|
# check image
|
|
if image.mode not in ("1", "L"):
|
|
raise TypeError("invalid font image mode")
|
|
|
|
image.load()
|
|
|
|
self.font = Image.core.font(image.im, data)
|
|
|
|
# delegate critical operations to internal type
|
|
self.getsize = self.font.getsize
|
|
self.getmask = self.font.getmask
|
|
|
|
##
|
|
# Wrapper for FreeType fonts. Application code should use the
|
|
# <b>truetype</b> factory function to create font objects.
|
|
|
|
class FreeTypeFont:
|
|
"FreeType font wrapper (requires _imagingft service)"
|
|
|
|
def __init__(self, file, size, index=0, encoding=""):
|
|
# FIXME: use service provider instead
|
|
self.font = core.getfont(file, size, index, encoding)
|
|
|
|
def getname(self):
|
|
return self.font.family, self.font.style
|
|
|
|
def getmetrics(self):
|
|
return self.font.ascent, self.font.descent
|
|
|
|
def getsize(self, text):
|
|
return self.font.getsize(text)[0]
|
|
|
|
def getmask(self, text, mode=""):
|
|
return self.getmask2(text, mode)[0]
|
|
|
|
def getmask2(self, text, mode="", fill=Image.core.fill):
|
|
size, offset = self.font.getsize(text)
|
|
im = fill("L", size, 0)
|
|
self.font.render(text, im.id, mode=="1")
|
|
return im, offset
|
|
|
|
##
|
|
# Wrapper that creates a transposed font from any existing font
|
|
# object.
|
|
#
|
|
# @param font A font object.
|
|
# @param orientation An optional orientation. If given, this should
|
|
# be one of Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_BOTTOM,
|
|
# Image.ROTATE_90, Image.ROTATE_180, or Image.ROTATE_270.
|
|
|
|
class TransposedFont:
|
|
"Wrapper for writing rotated or mirrored text"
|
|
|
|
def __init__(self, font, orientation=None):
|
|
self.font = font
|
|
self.orientation = orientation # any 'transpose' argument, or None
|
|
|
|
def getsize(self, text):
|
|
w, h = self.font.getsize(text)
|
|
if self.orientation in (Image.ROTATE_90, Image.ROTATE_270):
|
|
return h, w
|
|
return w, h
|
|
|
|
def getmask(self, text, mode=""):
|
|
im = self.font.getmask(text, mode)
|
|
if self.orientation is not None:
|
|
return im.transpose(self.orientation)
|
|
return im
|
|
|
|
##
|
|
# Load font file. This function loads a font object from the given
|
|
# bitmap font file, and returns the corresponding font object.
|
|
#
|
|
# @param filename Name of font file.
|
|
# @return A font object.
|
|
# @exception IOError If the file could not be read.
|
|
|
|
def load(filename):
|
|
"Load a font file."
|
|
f = ImageFont()
|
|
f._load_pilfont(filename)
|
|
return f
|
|
|
|
##
|
|
# Load a TrueType or OpenType font file, and create a font object.
|
|
# This function loads a font object from the given file, and creates
|
|
# a font object for a font of the given size.
|
|
# <p>
|
|
# This function requires the _imagingft service.
|
|
#
|
|
# @param filename A truetype font file. Under Windows, if the file
|
|
# is not found in this filename, the loader also looks in Windows
|
|
# <b>fonts</b> directory
|
|
# @param size The requested size, in points.
|
|
# @param index Which font face to load (default is first available face).
|
|
# @param encoding Which font encoding to use (default is Unicode). Common
|
|
# encodings are "unic" (Unicode), "symb" (Microsoft Symbol), "ADOB"
|
|
# (Adobe Standard), "ADBE" (Adobe Expert), and "armn" (Apple Roman).
|
|
# See the FreeType documentation for more information.
|
|
# @return A font object.
|
|
# @exception IOError If the file could not be read.
|
|
|
|
def truetype(filename, size, index=0, encoding=""):
|
|
"Load a truetype font file."
|
|
try:
|
|
return FreeTypeFont(filename, size, index, encoding)
|
|
except IOError:
|
|
if sys.platform == "win32":
|
|
# check the windows font repository
|
|
# NOTE: must use uppercase WINDIR, to work around bugs in
|
|
# 1.5.2's os.environ.get()
|
|
windir = os.environ.get("WINDIR")
|
|
if windir:
|
|
filename = os.path.join(windir, "fonts", filename)
|
|
return FreeTypeFont(filename, size, index, encoding)
|
|
raise
|
|
|
|
##
|
|
# Load font file. Same as load, but searches for a bitmap font along
|
|
# the Python path.
|
|
#
|
|
# @param filename Name of font file.
|
|
# @return A font object.
|
|
# @exception IOError If the file could not be read.
|
|
# @see #load
|
|
|
|
def load_path(filename):
|
|
"Load a font file, searching along the Python path."
|
|
for dir in sys.path:
|
|
if Image.isDirectory(dir):
|
|
try:
|
|
return load(os.path.join(dir, filename))
|
|
except IOError:
|
|
pass
|
|
raise IOError("cannot find font file")
|
|
|
|
##
|
|
# Load a (probably rather ugly) default font.
|
|
#
|
|
# @return A font object.
|
|
|
|
def load_default():
|
|
"Load a default font."
|
|
from StringIO import StringIO
|
|
import base64
|
|
f = ImageFont()
|
|
f._load_pilfont_data(
|
|
# courB08
|
|
StringIO(base64.decodestring('''
|
|
UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
|
|
BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
|
|
AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
|
|
AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
|
|
ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
|
|
BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
|
|
//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
|
|
AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
|
|
AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
|
|
ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
|
|
AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
|
|
/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
|
|
AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
|
|
AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
|
|
AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
|
|
BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
|
|
AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
|
|
2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
|
|
AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
|
|
+gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
|
|
////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
|
|
BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
|
|
AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
|
|
AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
|
|
AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
|
|
BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
|
|
//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
|
|
AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
|
|
AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
|
|
mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
|
|
AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
|
|
AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
|
|
AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
|
|
Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
|
|
//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
|
|
AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
|
|
AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
|
|
DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
|
|
AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
|
|
+wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
|
|
AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
|
|
///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
|
|
AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
|
|
BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
|
|
Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
|
|
eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
|
|
AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
|
|
+gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
|
|
////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
|
|
BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
|
|
AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
|
|
AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
|
|
Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
|
|
Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
|
|
//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
|
|
AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
|
|
AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
|
|
LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
|
|
AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
|
|
AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
|
|
AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
|
|
AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
|
|
AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
|
|
EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
|
|
AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
|
|
pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
|
|
AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
|
|
+QAGAAIAzgAKANUAEw==
|
|
''')), Image.open(StringIO(base64.decodestring('''
|
|
iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
|
|
Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
|
|
M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
|
|
LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
|
|
IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
|
|
Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
|
|
NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
|
|
in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
|
|
SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
|
|
AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
|
|
y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
|
|
ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
|
|
lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
|
|
/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
|
|
AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
|
|
c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
|
|
/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
|
|
pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
|
|
oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
|
|
evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
|
|
AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
|
|
Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
|
|
w7IkEbzhVQAAAABJRU5ErkJggg==
|
|
'''))))
|
|
return f
|
|
|
|
if __name__ == "__main__":
|
|
# create font data chunk for embedding
|
|
import base64, os, sys
|
|
font = "../Images/courB08"
|
|
print " f._load_pilfont_data("
|
|
print " # %s" % os.path.basename(font)
|
|
print " StringIO(base64.decodestring('''"
|
|
base64.encode(open(font + ".pil", "rb"), sys.stdout)
|
|
print "''')), Image.open(StringIO(base64.decodestring('''"
|
|
base64.encode(open(font + ".pbm", "rb"), sys.stdout)
|
|
print "'''))))"
|