mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-31 16:07:30 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #
 | |
| # The Python Imaging Library
 | |
| # $Id$
 | |
| #
 | |
| # bitmap distribution font (bdf) file parser
 | |
| #
 | |
| # history:
 | |
| # 1996-05-16 fl   created (as bdf2pil)
 | |
| # 1997-08-25 fl   converted to FontFile driver
 | |
| # 2001-05-25 fl   removed bogus __init__ call
 | |
| # 2002-11-20 fl   robustification (from Kevin Cazabon, Dmitry Vasiliev)
 | |
| # 2003-04-22 fl   more robustification (from Graham Dumpleton)
 | |
| #
 | |
| # Copyright (c) 1997-2003 by Secret Labs AB.
 | |
| # Copyright (c) 1997-2003 by Fredrik Lundh.
 | |
| #
 | |
| # See the README file for information on usage and redistribution.
 | |
| #
 | |
| 
 | |
| from PIL import Image
 | |
| from PIL import FontFile
 | |
| 
 | |
| 
 | |
| # --------------------------------------------------------------------
 | |
| # parse X Bitmap Distribution Format (BDF)
 | |
| # --------------------------------------------------------------------
 | |
| 
 | |
| bdf_slant = {
 | |
|    "R": "Roman",
 | |
|    "I": "Italic",
 | |
|    "O": "Oblique",
 | |
|    "RI": "Reverse Italic",
 | |
|    "RO": "Reverse Oblique",
 | |
|    "OT": "Other"
 | |
| }
 | |
| 
 | |
| bdf_spacing = {
 | |
|     "P": "Proportional",
 | |
|     "M": "Monospaced",
 | |
|     "C": "Cell"
 | |
| }
 | |
| 
 | |
| def bdf_char(f):
 | |
| 
 | |
|     # skip to STARTCHAR
 | |
|     while True:
 | |
|         s = f.readline()
 | |
|         if not s:
 | |
|             return None
 | |
|         if s[:9] == b"STARTCHAR":
 | |
|             break
 | |
|     id = s[9:].strip().decode('ascii')
 | |
| 
 | |
|     # load symbol properties
 | |
|     props = {}
 | |
|     while True:
 | |
|         s = f.readline()
 | |
|         if not s or s[:6] == b"BITMAP":
 | |
|             break
 | |
|         i = s.find(b" ")
 | |
|         props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii')
 | |
| 
 | |
|     # load bitmap
 | |
|     bitmap = []
 | |
|     while True:
 | |
|         s = f.readline()
 | |
|         if not s or s[:7] == b"ENDCHAR":
 | |
|             break
 | |
|         bitmap.append(s[:-1])
 | |
|     bitmap = b"".join(bitmap)
 | |
| 
 | |
|     [x, y, l, d] = [int(s) for s in props["BBX"].split()]
 | |
|     [dx, dy] = [int(s) for s in props["DWIDTH"].split()]
 | |
| 
 | |
|     bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y)
 | |
| 
 | |
|     try:
 | |
|         im = Image.frombytes("1", (x, y), bitmap, "hex", "1")
 | |
|     except ValueError:
 | |
|         # deal with zero-width characters
 | |
|         im = Image.new("1", (x, y))
 | |
| 
 | |
|     return id, int(props["ENCODING"]), bbox, im
 | |
| 
 | |
| ##
 | |
| # Font file plugin for the X11 BDF format.
 | |
| 
 | |
| class BdfFontFile(FontFile.FontFile):
 | |
| 
 | |
|     def __init__(self, fp):
 | |
| 
 | |
|         FontFile.FontFile.__init__(self)
 | |
| 
 | |
|         s = fp.readline()
 | |
|         if s[:13] != b"STARTFONT 2.1":
 | |
|             raise SyntaxError("not a valid BDF file")
 | |
| 
 | |
|         props = {}
 | |
|         comments = []
 | |
| 
 | |
|         while True:
 | |
|             s = fp.readline()
 | |
|             if not s or s[:13] == b"ENDPROPERTIES":
 | |
|                 break
 | |
|             i = s.find(b" ")
 | |
|             props[s[:i].decode('ascii')] = s[i+1:-1].decode('ascii')
 | |
|             if s[:i] in [b"COMMENT", b"COPYRIGHT"]:
 | |
|                 if s.find(b"LogicalFontDescription") < 0:
 | |
|                     comments.append(s[i+1:-1].decode('ascii'))
 | |
| 
 | |
|         font = props["FONT"].split("-")
 | |
| 
 | |
|         font[4] = bdf_slant[font[4].upper()]
 | |
|         font[11] = bdf_spacing[font[11].upper()]
 | |
| 
 | |
|         ascent = int(props["FONT_ASCENT"])
 | |
|         descent = int(props["FONT_DESCENT"])
 | |
| 
 | |
|         fontname = ";".join(font[1:])
 | |
| 
 | |
|         # print "#", fontname
 | |
|         # for i in comments:
 | |
|         #       print "#", i
 | |
| 
 | |
|         font = []
 | |
|         while True:
 | |
|             c = bdf_char(fp)
 | |
|             if not c:
 | |
|                 break
 | |
|             id, ch, (xy, dst, src), im = c
 | |
|             if 0 <= ch < len(self.glyph):
 | |
|                 self.glyph[ch] = xy, dst, src, im
 |