- ..
- __init__.py
- __main__.py
- _binary.py
- _deprecate.py
- _imaging.cpython-310-x86_64-linux-gnu.so
- _imagingcms.cpython-310-x86_64-linux-gnu.so
- _imagingft.cpython-310-x86_64-linux-gnu.so
- _imagingmath.cpython-310-x86_64-linux-gnu.so
- _imagingmorph.cpython-310-x86_64-linux-gnu.so
- _imagingtk.cpython-310-x86_64-linux-gnu.so
- _tkinter_finder.py
- _util.py
- _version.py
- _webp.cpython-310-x86_64-linux-gnu.so
- BdfFontFile.py
- BlpImagePlugin.py
- BmpImagePlugin.py
- BufrStubImagePlugin.py
- ContainerIO.py
- CurImagePlugin.py
- DcxImagePlugin.py
- DdsImagePlugin.py
- EpsImagePlugin.py
- ExifTags.py
- features.py
- FitsImagePlugin.py
- FliImagePlugin.py
- FontFile.py
- FpxImagePlugin.py
- FtexImagePlugin.py
- GbrImagePlugin.py
- GdImageFile.py
- GifImagePlugin.py
- GimpGradientFile.py
- GimpPaletteFile.py
- GribStubImagePlugin.py
- Hdf5StubImagePlugin.py
- IcnsImagePlugin.py
- IcoImagePlugin.py
- Image.py
- ImageChops.py
- ImageCms.py
- ImageColor.py
- ImageDraw.py
- ImageDraw2.py
- ImageEnhance.py
- ImageFile.py
- ImageFilter.py
- ImageFont.py
- ImageGrab.py
- ImageMath.py
- ImageMode.py
- ImageMorph.py
- ImageOps.py
- ImagePalette.py
- ImagePath.py
- ImageQt.py
- ImageSequence.py
- ImageShow.py
- ImageStat.py
- ImageTk.py
- ImageTransform.py
- ImageWin.py
- ImImagePlugin.py
- ImtImagePlugin.py
- IptcImagePlugin.py
- Jpeg2KImagePlugin.py
- JpegImagePlugin.py
- JpegPresets.py
- McIdasImagePlugin.py
- MicImagePlugin.py
- MpegImagePlugin.py
- MpoImagePlugin.py
- MspImagePlugin.py
- PaletteFile.py
- PalmImagePlugin.py
- PcdImagePlugin.py
- PcfFontFile.py
- PcxImagePlugin.py
- PdfImagePlugin.py
- PdfParser.py
- PixarImagePlugin.py
- PngImagePlugin.py
- PpmImagePlugin.py
- PsdImagePlugin.py
- PSDraw.py
- PyAccess.py
- QoiImagePlugin.py
- SgiImagePlugin.py
- SpiderImagePlugin.py
- SunImagePlugin.py
- TarIO.py
- TgaImagePlugin.py
- TiffImagePlugin.py
- TiffTags.py
- WalImageFile.py
- WebPImagePlugin.py
- WmfImagePlugin.py
- XbmImagePlugin.py
- XpmImagePlugin.py
- XVThumbImagePlugin.py
FontFile.py @a8e0244 — raw · history · blame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #
# The Python Imaging Library
# $Id$
#
# base class for raster font file parsers
#
# history:
# 1997-06-05 fl created
# 1997-08-19 fl restrict image width
#
# Copyright (c) 1997-1998 by Secret Labs AB
# Copyright (c) 1997-1998 by Fredrik Lundh
#
# See the README file for information on usage and redistribution.
#
import os
from . import Image, _binary
WIDTH = 800
def puti16(fp, values):
"""Write network order (big-endian) 16-bit sequence"""
for v in values:
if v < 0:
v += 65536
fp.write(_binary.o16be(v))
class FontFile:
"""Base class for raster font file handlers."""
bitmap = None
def __init__(self):
self.info = {}
self.glyph = [None] * 256
def __getitem__(self, ix):
return self.glyph[ix]
def compile(self):
"""Create metrics and bitmap"""
if self.bitmap:
return
# create bitmap large enough to hold all data
h = w = maxwidth = 0
lines = 1
for glyph in self:
if glyph:
d, dst, src, im = glyph
h = max(h, src[3] - src[1])
w = w + (src[2] - src[0])
if w > WIDTH:
lines += 1
w = src[2] - src[0]
maxwidth = max(maxwidth, w)
xsize = maxwidth
ysize = lines * h
if xsize == 0 and ysize == 0:
return ""
self.ysize = h
# paste glyphs into bitmap
self.bitmap = Image.new("1", (xsize, ysize))
self.metrics = [None] * 256
x = y = 0
for i in range(256):
glyph = self[i]
if glyph:
d, dst, src, im = glyph
xx = src[2] - src[0]
# yy = src[3] - src[1]
x0, y0 = x, y
x = x + xx
if x > WIDTH:
x, y = 0, y + h
x0, y0 = x, y
x = xx
s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0
self.bitmap.paste(im.crop(src), s)
self.metrics[i] = d, dst, s
def save(self, filename):
"""Save font"""
self.compile()
# font data
self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG")
# font metrics
with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp:
fp.write(b"PILfont\n")
fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!!
fp.write(b"DATA\n")
for id in range(256):
m = self.metrics[id]
if not m:
puti16(fp, [0] * 10)
else:
puti16(fp, m[0] + m[1] + m[2])
|