# 
 | 
# The Python Imaging Library. 
 | 
# $Id$ 
 | 
# 
 | 
# XBM File handling 
 | 
# 
 | 
# History: 
 | 
# 1995-09-08 fl   Created 
 | 
# 1996-11-01 fl   Added save support 
 | 
# 1997-07-07 fl   Made header parser more tolerant 
 | 
# 1997-07-22 fl   Fixed yet another parser bug 
 | 
# 2001-02-17 fl   Use 're' instead of 'regex' (Python 2.1) (0.4) 
 | 
# 2001-05-13 fl   Added hotspot handling (based on code from Bernhard Herzog) 
 | 
# 2004-02-24 fl   Allow some whitespace before first #define 
 | 
# 
 | 
# Copyright (c) 1997-2004 by Secret Labs AB 
 | 
# Copyright (c) 1996-1997 by Fredrik Lundh 
 | 
# 
 | 
# See the README file for information on usage and redistribution. 
 | 
# 
 | 
  
 | 
__version__ = "0.6" 
 | 
  
 | 
import re, string 
 | 
import Image, ImageFile 
 | 
  
 | 
# XBM header 
 | 
xbm_head = re.compile( 
 | 
    "\s*#define[ \t]+[^_]*_width[ \t]+(?P<width>[0-9]+)[\r\n]+" 
 | 
    "#define[ \t]+[^_]*_height[ \t]+(?P<height>[0-9]+)[\r\n]+" 
 | 
    "(?P<hotspot>" 
 | 
    "#define[ \t]+[^_]*_x_hot[ \t]+(?P<xhot>[0-9]+)[\r\n]+" 
 | 
    "#define[ \t]+[^_]*_y_hot[ \t]+(?P<yhot>[0-9]+)[\r\n]+" 
 | 
    ")?" 
 | 
    "[\\000-\\377]*_bits\\[\\]" 
 | 
) 
 | 
  
 | 
def _accept(prefix): 
 | 
    return string.lstrip(prefix)[:7] == "#define" 
 | 
  
 | 
## 
 | 
# Image plugin for X11 bitmaps. 
 | 
  
 | 
class XbmImageFile(ImageFile.ImageFile): 
 | 
  
 | 
    format = "XBM" 
 | 
    format_description = "X11 Bitmap" 
 | 
  
 | 
    def _open(self): 
 | 
  
 | 
        m = xbm_head.match(self.fp.read(512)) 
 | 
  
 | 
        if m: 
 | 
  
 | 
            xsize = int(m.group("width")) 
 | 
            ysize = int(m.group("height")) 
 | 
  
 | 
            if m.group("hotspot"): 
 | 
                self.info["hotspot"] = ( 
 | 
                    int(m.group("xhot")), int(m.group("yhot")) 
 | 
                    ) 
 | 
  
 | 
            self.mode = "1" 
 | 
            self.size = xsize, ysize 
 | 
  
 | 
            self.tile = [("xbm", (0, 0)+self.size, m.end(), None)] 
 | 
  
 | 
  
 | 
def _save(im, fp, filename): 
 | 
  
 | 
    if im.mode != "1": 
 | 
        raise IOError, "cannot write mode %s as XBM" % im.mode 
 | 
  
 | 
    fp.write("#define im_width %d\n" % im.size[0]) 
 | 
    fp.write("#define im_height %d\n" % im.size[1]) 
 | 
  
 | 
    hotspot = im.encoderinfo.get("hotspot") 
 | 
    if hotspot: 
 | 
        fp.write("#define im_x_hot %d\n" % hotspot[0]) 
 | 
        fp.write("#define im_y_hot %d\n" % hotspot[1]) 
 | 
  
 | 
    fp.write("static char im_bits[] = {\n") 
 | 
  
 | 
    ImageFile._save(im, fp, [("xbm", (0,0)+im.size, 0, None)]) 
 | 
  
 | 
    fp.write("};\n") 
 | 
  
 | 
  
 | 
Image.register_open("XBM", XbmImageFile, _accept) 
 | 
Image.register_save("XBM", _save) 
 | 
  
 | 
Image.register_extension("XBM", ".xbm") 
 | 
  
 | 
Image.register_mime("XBM", "image/xbm") 
 |