Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/PIL/GbrImagePlugin.py: 75%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

44 statements  

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://developer.gimp.org/core/standards/gbr/ 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. 

26from __future__ import annotations 

27 

28__lazy_modules__ = {"PIL._binary"} 

29 

30from . import Image, ImageFile 

31from ._binary import i32be as i32 

32 

33 

34def _accept(prefix: bytes) -> bool: 

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

36 

37 

38## 

39# Image plugin for the GIMP brush format. 

40 

41 

42class GbrImageFile(ImageFile.ImageFile): 

43 format = "GBR" 

44 format_description = "GIMP brush file" 

45 

46 def _open(self) -> None: 

47 assert self.fp is not None 

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

49 if header_size < 20: 

50 msg = "not a GIMP brush" 

51 raise SyntaxError(msg) 

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

53 if version not in (1, 2): 

54 msg = f"Unsupported GIMP brush version: {version}" 

55 raise SyntaxError(msg) 

56 

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

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

59 if width == 0 or height == 0: 

60 msg = "not a GIMP brush" 

61 raise SyntaxError(msg) 

62 self._size = width, height 

63 

64 # Image might not be small 

65 Image._decompression_bomb_check(self.size) 

66 

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

68 if color_depth not in (1, 4): 

69 msg = f"Unsupported GIMP brush color depth: {color_depth}" 

70 raise SyntaxError(msg) 

71 self._mode = "L" if color_depth == 1 else "RGBA" 

72 

73 if version == 1: 

74 comment_length = header_size - 20 

75 else: 

76 comment_length = header_size - 28 

77 magic_number = self.fp.read(4) 

78 if magic_number != b"GIMP": 

79 msg = "not a GIMP brush, bad magic number" 

80 raise SyntaxError(msg) 

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

82 

83 self.info["comment"] = self.fp.read(comment_length)[:-1] 

84 

85 self.tile = [ImageFile._Tile("raw", None, self.fp.tell(), self.mode)] 

86 

87 

88# 

89# registry 

90 

91 

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

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