Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/PIL/XpmImagePlugin.py: 19%
55 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1#
2# The Python Imaging Library.
3# $Id$
4#
5# XPM File handling
6#
7# History:
8# 1996-12-29 fl Created
9# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7)
10#
11# Copyright (c) Secret Labs AB 1997-2001.
12# Copyright (c) Fredrik Lundh 1996-2001.
13#
14# See the README file for information on usage and redistribution.
15#
18import re
20from . import Image, ImageFile, ImagePalette
21from ._binary import o8
23# XPM header
24xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)')
27def _accept(prefix):
28 return prefix[:9] == b"/* XPM */"
31##
32# Image plugin for X11 pixel maps.
35class XpmImageFile(ImageFile.ImageFile):
37 format = "XPM"
38 format_description = "X11 Pixel Map"
40 def _open(self):
42 if not _accept(self.fp.read(9)):
43 raise SyntaxError("not an XPM file")
45 # skip forward to next string
46 while True:
47 s = self.fp.readline()
48 if not s:
49 raise SyntaxError("broken XPM file")
50 m = xpm_head.match(s)
51 if m:
52 break
54 self._size = int(m.group(1)), int(m.group(2))
56 pal = int(m.group(3))
57 bpp = int(m.group(4))
59 if pal > 256 or bpp != 1:
60 raise ValueError("cannot read this XPM file")
62 #
63 # load palette description
65 palette = [b"\0\0\0"] * 256
67 for _ in range(pal):
69 s = self.fp.readline()
70 if s[-2:] == b"\r\n":
71 s = s[:-2]
72 elif s[-1:] in b"\r\n":
73 s = s[:-1]
75 c = s[1]
76 s = s[2:-2].split()
78 for i in range(0, len(s), 2):
80 if s[i] == b"c":
82 # process colour key
83 rgb = s[i + 1]
84 if rgb == b"None":
85 self.info["transparency"] = c
86 elif rgb[:1] == b"#":
87 # FIXME: handle colour names (see ImagePalette.py)
88 rgb = int(rgb[1:], 16)
89 palette[c] = (
90 o8((rgb >> 16) & 255) + o8((rgb >> 8) & 255) + o8(rgb & 255)
91 )
92 else:
93 # unknown colour
94 raise ValueError("cannot read this XPM file")
95 break
97 else:
99 # missing colour key
100 raise ValueError("cannot read this XPM file")
102 self.mode = "P"
103 self.palette = ImagePalette.raw("RGB", b"".join(palette))
105 self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))]
107 def load_read(self, bytes):
109 #
110 # load all image data in one chunk
112 xsize, ysize = self.size
114 s = [None] * ysize
116 for i in range(ysize):
117 s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize)
119 return b"".join(s)
122#
123# Registry
126Image.register_open(XpmImageFile.format, XpmImageFile, _accept)
128Image.register_extension(XpmImageFile.format, ".xpm")
130Image.register_mime(XpmImageFile.format, "image/xpm")