You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
2.7 KiB

4 years ago
  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/master/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. from . import Image, ImageFile
  27. from ._binary import i32be as i32
  28. def _accept(prefix):
  29. return len(prefix) >= 8 and \
  30. i32(prefix[:4]) >= 20 and i32(prefix[4:8]) in (1, 2)
  31. ##
  32. # Image plugin for the GIMP brush format.
  33. class GbrImageFile(ImageFile.ImageFile):
  34. format = "GBR"
  35. format_description = "GIMP brush file"
  36. def _open(self):
  37. header_size = i32(self.fp.read(4))
  38. version = i32(self.fp.read(4))
  39. if header_size < 20:
  40. raise SyntaxError("not a GIMP brush")
  41. if version not in (1, 2):
  42. raise SyntaxError("Unsupported GIMP brush version: %s" % version)
  43. width = i32(self.fp.read(4))
  44. height = i32(self.fp.read(4))
  45. color_depth = i32(self.fp.read(4))
  46. if width <= 0 or height <= 0:
  47. raise SyntaxError("not a GIMP brush")
  48. if color_depth not in (1, 4):
  49. raise SyntaxError(
  50. "Unsupported GIMP brush color depth: %s" % color_depth)
  51. if version == 1:
  52. comment_length = header_size-20
  53. else:
  54. comment_length = header_size-28
  55. magic_number = self.fp.read(4)
  56. if magic_number != b'GIMP':
  57. raise SyntaxError("not a GIMP brush, bad magic number")
  58. self.info['spacing'] = i32(self.fp.read(4))
  59. comment = self.fp.read(comment_length)[:-1]
  60. if color_depth == 1:
  61. self.mode = "L"
  62. else:
  63. self.mode = 'RGBA'
  64. self._size = width, height
  65. self.info["comment"] = comment
  66. # Image might not be small
  67. Image._decompression_bomb_check(self.size)
  68. # Data is an uncompressed block of w * h * bytes/pixel
  69. self._data_size = width * height * color_depth
  70. def load(self):
  71. self.im = Image.core.new(self.mode, self.size)
  72. self.frombytes(self.fp.read(self._data_size))
  73. #
  74. # registry
  75. Image.register_open(GbrImageFile.format, GbrImageFile, _accept)
  76. Image.register_extension(GbrImageFile.format, ".gbr")