## 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.#from__future__importannotationsimportrefromtypingimportIOfrom.importImage,ImageFile# XBM headerxbm_head=re.compile(rb"\s*#define[ \t]+.*_width[ \t]+(?P<width>[0-9]+)[\r\n]+"b"#define[ \t]+.*_height[ \t]+(?P<height>[0-9]+)[\r\n]+"b"(?P<hotspot>"b"#define[ \t]+[^_]*_x_hot[ \t]+(?P<xhot>[0-9]+)[\r\n]+"b"#define[ \t]+[^_]*_y_hot[ \t]+(?P<yhot>[0-9]+)[\r\n]+"b")?"rb"[\000-\377]*_bits\[]")def_accept(prefix:bytes)->bool:returnprefix.lstrip().startswith(b"#define")### Image plugin for X11 bitmaps.
[docs]classXbmImageFile(ImageFile.ImageFile):format="XBM"format_description="X11 Bitmap"def_open(self)->None:assertself.fpisnotNonem=xbm_head.match(self.fp.read(512))ifnotm:msg="not a XBM file"raiseSyntaxError(msg)xsize=int(m.group("width"))ysize=int(m.group("height"))ifm.group("hotspot"):self.info["hotspot"]=(int(m.group("xhot")),int(m.group("yhot")))self._mode="1"self._size=xsize,ysizeself.tile=[ImageFile._Tile("xbm",(0,0)+self.size,m.end())]