# 
 | 
# 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, string, 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 = string.split(file.readline(), ";") 
 | 
        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 "'''))))" 
 |