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)
HEADER
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.