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

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# 

16 

17 

18import re 

19 

20from . import Image, ImageFile, ImagePalette 

21from ._binary import o8 

22 

23# XPM header 

24xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') 

25 

26 

27def _accept(prefix): 

28 return prefix[:9] == b"/* XPM */" 

29 

30 

31## 

32# Image plugin for X11 pixel maps. 

33 

34 

35class XpmImageFile(ImageFile.ImageFile): 

36 

37 format = "XPM" 

38 format_description = "X11 Pixel Map" 

39 

40 def _open(self): 

41 

42 if not _accept(self.fp.read(9)): 

43 raise SyntaxError("not an XPM file") 

44 

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 

53 

54 self._size = int(m.group(1)), int(m.group(2)) 

55 

56 pal = int(m.group(3)) 

57 bpp = int(m.group(4)) 

58 

59 if pal > 256 or bpp != 1: 

60 raise ValueError("cannot read this XPM file") 

61 

62 # 

63 # load palette description 

64 

65 palette = [b"\0\0\0"] * 256 

66 

67 for _ in range(pal): 

68 

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] 

74 

75 c = s[1] 

76 s = s[2:-2].split() 

77 

78 for i in range(0, len(s), 2): 

79 

80 if s[i] == b"c": 

81 

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 

96 

97 else: 

98 

99 # missing colour key 

100 raise ValueError("cannot read this XPM file") 

101 

102 self.mode = "P" 

103 self.palette = ImagePalette.raw("RGB", b"".join(palette)) 

104 

105 self.tile = [("raw", (0, 0) + self.size, self.fp.tell(), ("P", 0, 1))] 

106 

107 def load_read(self, bytes): 

108 

109 # 

110 # load all image data in one chunk 

111 

112 xsize, ysize = self.size 

113 

114 s = [None] * ysize 

115 

116 for i in range(ysize): 

117 s[i] = self.fp.readline()[1 : xsize + 1].ljust(xsize) 

118 

119 return b"".join(s) 

120 

121 

122# 

123# Registry 

124 

125 

126Image.register_open(XpmImageFile.format, XpmImageFile, _accept) 

127 

128Image.register_extension(XpmImageFile.format, ".xpm") 

129 

130Image.register_mime(XpmImageFile.format, "image/xpm")