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
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
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
28__lazy_modules__ = {"PIL._binary"}
30from . import Image, ImageFile
31from ._binary import i32be as i32
34def _accept(prefix: bytes) -> bool:
35 return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2)
38##
39# Image plugin for the GIMP brush format.
42class GbrImageFile(ImageFile.ImageFile):
43 format = "GBR"
44 format_description = "GIMP brush file"
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)
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
64 # Image might not be small
65 Image._decompression_bomb_check(self.size)
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"
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))
83 self.info["comment"] = self.fp.read(comment_length)[:-1]
85 self.tile = [ImageFile._Tile("raw", None, self.fp.tell(), self.mode)]
88#
89# registry
92Image.register_open(GbrImageFile.format, GbrImageFile, _accept)
93Image.register_extension(GbrImageFile.format, ".gbr")