home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / BdfFontFile.py < prev    next >
Encoding:
Python Source  |  2004-04-20  |  3.1 KB  |  128 lines

  1. #
  2. # THIS IS WORK IN PROGRESS
  3. #
  4. # The Python Imaging Library
  5. # $Id: //modules/pil/PIL/BdfFontFile.py#3 $
  6. #
  7. # bitmap distribution font file parser
  8. #
  9. # history:
  10. # 1996-05-16 fl   created (as bdf2pil)
  11. # 1997-08-25 fl   converted to FontFile driver
  12. # 2001-05-25 fl   removed bogus __init__ call
  13. #
  14. # Copyright (c) Secret Labs AB 1997-2001.
  15. # Copyright (c) Fredrik Lundh 1997-2001.
  16. #
  17. # See the README file for information on usage and redistribution.
  18. #
  19.  
  20. import Image
  21. import FontFile
  22.  
  23. import string
  24.  
  25. # --------------------------------------------------------------------
  26. # parse X Bitmap Distribution Format (BDF)
  27. # --------------------------------------------------------------------
  28.  
  29. bdf_slant = {
  30.    "R": "Roman",
  31.    "I": "Italic",
  32.    "O": "Oblique",
  33.    "RI": "Reverse Italic",
  34.    "RO": "Reverse Oblique",
  35.    "OT": "Other"
  36. }
  37.  
  38. bdf_spacing = {
  39.     "P": "Proportional",
  40.     "M": "Monospaced",
  41.     "C": "Cell"
  42. }
  43.  
  44. def bdf_char(f):
  45.  
  46.     # skip to STARTCHAR
  47.     while 1:
  48.         s = f.readline()
  49.         if not s:
  50.             return None
  51.         if s[:9] == "STARTCHAR":
  52.             break
  53.     id = string.strip(s[9:])
  54.  
  55.     # load symbol properties
  56.     props = {}
  57.     while 1:
  58.         s = f.readline()
  59.         if not s or s[:6] == "BITMAP":
  60.             break
  61.         i = string.find(s, " ")
  62.         props[s[:i]] = s[i+1:-1]
  63.  
  64.     # load bitmap
  65.     bitmap = []
  66.     while 1:
  67.         s = f.readline()
  68.         if not s or s[:7] == "ENDCHAR":
  69.             break
  70.         bitmap.append(s[:-1])
  71.     bitmap = string.join(bitmap, "")
  72.  
  73.     [x, y, l, d] = map(string.atoi, string.split(props["BBX"]))
  74.     [dx, dy] = map(string.atoi, string.split(props["DWIDTH"]))
  75.  
  76.     bbox = (dx, dy), (l, -d-y, x+l, -d), (0, 0, x, y)
  77.  
  78.     im = Image.fromstring("1", (x, y), bitmap, "hex", "1")
  79.  
  80.     return id, string.atoi(props["ENCODING"]), bbox, im
  81.  
  82.  
  83. class BdfFontFile(FontFile.FontFile):
  84.  
  85.     def __init__(self, fp):
  86.  
  87.         FontFile.FontFile.__init__(self)
  88.  
  89.         s = fp.readline()
  90.         if s[:13] != "STARTFONT 2.1":
  91.             raise SyntaxError, "not a valid BDF file"
  92.  
  93.         props = {}
  94.         comments = []
  95.  
  96.         while 1:
  97.             s = fp.readline()
  98.             if not s or s[:13] == "ENDPROPERTIES":
  99.                 break
  100.             i = string.find(s, " ")
  101.             props[s[:i]] = s[i+1:-1]
  102.             if s[:i] in ["COMMENT", "COPYRIGHT"]:
  103.                 if string.find(s, "LogicalFontDescription") < 0:
  104.                     comments.append(s[i+1:-1])
  105.  
  106.         font = string.split(props["FONT"], "-")
  107.  
  108.         font[4] = bdf_slant[font[4]]
  109.         font[11] = bdf_spacing[font[11]]
  110.  
  111.         ascent = string.atoi(props["FONT_ASCENT"])
  112.         descent = string.atoi(props["FONT_DESCENT"])
  113.  
  114.         fontname = string.join(font[1:], ";")
  115.  
  116.         # print "#", fontname
  117.         # for i in comments:
  118.         #       print "#", i
  119.  
  120.         font = []
  121.         while 1:
  122.             c = bdf_char(fp)
  123.             if not c:
  124.                 break
  125.             id, ch, (xy, dst, src), im = c
  126.             if ch >= 0:
  127.                 self.glyph[ch] = xy, dst, src, im
  128.