Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/PIL/GbrImagePlugin.py: 20%

43 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1# 

2# The Python Imaging Library 

3# 

4# load a GIMP brush file 

5# 

6# History: 

7# 96-03-14 fl Created 

8# 16-01-08 es Version 2 

9# 

10# Copyright (c) Secret Labs AB 1997. 

11# Copyright (c) Fredrik Lundh 1996. 

12# Copyright (c) Eric Soroos 2016. 

13# 

14# See the README file for information on usage and redistribution. 

15# 

16# 

17# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for 

18# format documentation. 

19# 

20# This code Interprets version 1 and 2 .gbr files. 

21# Version 1 files are obsolete, and should not be used for new 

22# brushes. 

23# Version 2 files are saved by GIMP v2.8 (at least) 

24# Version 3 files have a format specifier of 18 for 16bit floats in 

25# the color depth field. This is currently unsupported by Pillow. 

26 

27from . import Image, ImageFile 

28from ._binary import i32be as i32 

29 

30 

31def _accept(prefix): 

32 return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) 

33 

34 

35## 

36# Image plugin for the GIMP brush format. 

37 

38 

39class GbrImageFile(ImageFile.ImageFile): 

40 

41 format = "GBR" 

42 format_description = "GIMP brush file" 

43 

44 def _open(self): 

45 header_size = i32(self.fp.read(4)) 

46 if header_size < 20: 

47 raise SyntaxError("not a GIMP brush") 

48 version = i32(self.fp.read(4)) 

49 if version not in (1, 2): 

50 raise SyntaxError(f"Unsupported GIMP brush version: {version}") 

51 

52 width = i32(self.fp.read(4)) 

53 height = i32(self.fp.read(4)) 

54 color_depth = i32(self.fp.read(4)) 

55 if width <= 0 or height <= 0: 

56 raise SyntaxError("not a GIMP brush") 

57 if color_depth not in (1, 4): 

58 raise SyntaxError(f"Unsupported GIMP brush color depth: {color_depth}") 

59 

60 if version == 1: 

61 comment_length = header_size - 20 

62 else: 

63 comment_length = header_size - 28 

64 magic_number = self.fp.read(4) 

65 if magic_number != b"GIMP": 

66 raise SyntaxError("not a GIMP brush, bad magic number") 

67 self.info["spacing"] = i32(self.fp.read(4)) 

68 

69 comment = self.fp.read(comment_length)[:-1] 

70 

71 if color_depth == 1: 

72 self.mode = "L" 

73 else: 

74 self.mode = "RGBA" 

75 

76 self._size = width, height 

77 

78 self.info["comment"] = comment 

79 

80 # Image might not be small 

81 Image._decompression_bomb_check(self.size) 

82 

83 # Data is an uncompressed block of w * h * bytes/pixel 

84 self._data_size = width * height * color_depth 

85 

86 def load(self): 

87 if not self.im: 

88 self.im = Image.core.new(self.mode, self.size) 

89 self.frombytes(self.fp.read(self._data_size)) 

90 return Image.Image.load(self) 

91 

92 

93# 

94# registry 

95 

96 

97Image.register_open(GbrImageFile.format, GbrImageFile, _accept) 

98Image.register_extension(GbrImageFile.format, ".gbr")