As well as outputting the data as a text based file, there is also a binary based file format.
Header
The first three bytes of the header are the file identifier and are always set to 66, 77, 70 (BMF). The fourth byte is the version which is currently 3.
After the header are a number of blocks based on the tags described above.
Block type 1: info
Field
Size
Type
Pos
Comment
fontsize
2
int
0
bitField
1
bits
2
bit 0:smooth bit 1:unicode bit 2:italic bit 3:bold bit 4:fixedHeight bits 5-7:reservered
charSet
1
uint
3
stretchH
2
uint
4
aa
1
uint
6
paddingUp
2
uint
7
paddingRight
1
uint
8
paddingDown
1
uint
9
paddingLeft
1
uint
10
spacingHoriz
1
uint
11
spacingVert
1
uint
12
outline
1
uint
13
fontName
n+1
string
14
null terminated string with length n
Block type 2: common
Field
Size
Type
Pos
Comment
lineHeight
2
uint
0
base
2
uint
2
scaleW
2
uint
4
scaleH
2
uint
6
pages
2
uint
8
bitField
1
bits
10
bits 0-6:reserved, bit 7:packed
Block type 3: pages
Field
Size
Type
Pos
Comment
pageNames
p*(n+1)
strings
0
null terminated strings, each with length n
Block type 4: chars
Field
Size
Type
Pos
Comment
id
4
uint
0+c*20
these fields are repeated until all characters have been described
x
2
uint
4+c*20
y
2
uint
6+c*20
width
2
uint
8+c*20
height
2
uint
10+c*20
xoffset
2
uint
12+c*20
yoffset
2
uint
14+c*20
xadvance
2
uint
16+c*20
page
1
uint
18+c*20
chnl
1
uint
19+c*20
The number of characters in the file can be calculated by taking the size of the block and dividing it with the size of the charInfo structure, i.e. numChars = charsBlock.blockSize/20