GIMP Paintbrush File Format

The GIMP Paintbrush File Format Version 1 (.gbr)

Based on examples and code, it seems that v1 is like v2, but it is lacking bytes 20 - 27 (no magic or spacing info), and thus having as last header field:

Bytes 20 - (header_size - 1):
    Type: char *
    Value: undefined encoding string - name of brush

GBR v1 is deprecated and should never be used to save new brushes.

The GIMP Paintbrush File Format Version 2 (.gbr)

Bytes 0  - 3:  header_size:
	Type: 32 bit unsigned int
	Value: size of brush header (28) + length of brush name

Bytes 4  - 7: version
	Type: 32 bit unsigned int
	Value: The file format version.

Bytes 8  - 11: width
	Type: 32 bit unsigned int
	Value: Brush width

Bytes 12 - 15: height
	Type: 32 bit unsigned int
	Value: Brush height

Bytes 16 - 19: bytes
	Type: 32 bit unsigned int
	Value: Colour depth of brush.
	1 = greyscale, 4 = RGBA

Bytes 20 - 23: magic_number
	Type: 32 bit unsigned int
	Value: GIMP brush magic number.
	('G' << 24) + ('I' << 16) + ('M' << 8) + 'P'

Bytes 24 - 27: spacing
	Type: 32 bit unsigned int
	Value: Default spacing to be used for brush. Percentage
	of brush width.

Bytes 28 - (header_size - 1):
	Type: char *
	Value: UTF-8 string - name of brush

BODY

	Size: width * height * bytes
	Type: uchar *
	Value: Pixel values (row-first) for brush

The GIMP Paintbrush File Format Version 3 (.gbr)

This changed GIMP brush format was introduced by the FilmGimp or CinePaint developers without notifying the GIMP developers. We’ve added support for reading these brushes. The format is very similar to version 2 but uses the bytes field as a data format identifier. It seems the only format identifier in use is 18 which corresponds to 16bit floats. If you encounter brushes with a different data format, please let the GIMP developers know.