Jump to content
  • Advertisement
Sign in to follow this  

Problems reading BMFont binary format

This topic is 2998 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

So I've been trying to use BMFont (v1.12) for the past few days, and I'm having some problems reading the characters block. I'm using C++ to read the block, and I can retrieve the number of characters without problems - this number matches the number of characters I'd selected in the BMFont program. When I read in the characters block into a std::vector, I see that the first 10 or so characters are fine - the character ids are probably correct, and they each have x/y positions etc. However the characters after the first 10 or so are completely filled with 0s.

Here's my code to read in the blocks:
    InfoBlock info;
CommonBlock common;
std::string pageName;
std::vector<std::string> pageNames;
int numChars;
CharsBlock charsBlock;
std::vector<CharsBlock> chars;

while ( !ss.eof() )
BlockHeader bheader;
ss.read (reinterpret_cast<char *>(&bheader), sizeof (bheader));

switch ( bheader.type )
case BT_INFO:
ReadInfoBlock (bheader.size, info, ss);

ss.read (reinterpret_cast<char *>(&common), bheader.size);

case BT_PAGES:
pageName.resize (bheader.size);
for ( int i = 0; i < common.pages; i++ )
ss.read (&pageName[0], bheader.size);
pageNames.push_back (pageName);

case BT_CHARS:
numChars = bheader.size / sizeof (CharsBlock);
chars.resize (numChars);
ss.read (reinterpret_cast<char *>(&chars[0]), bheader.size);

ss.seekg (bheader.size, std::ios::cur);

Here's the struct I've created for CharsBlock:
struct CharsBlock
unsigned int id;
unsigned short x;
unsigned short y;
unsigned short width;
unsigned short height;
short xoffset;
short yoffset;
short xadvance;
unsigned char page;
unsigned char channel;

(The struct has 1-byte alignment)

Here's a screenshot of the contents of the chars variable.

And yes, I am using a debug build! :P

Does anyone have any ideas what could be causing the problem?

EDIT: I should add that outputting a plain text format .fnt file, I can see that all the characters are exported correctly.

Share this post

Link to post
Share on other sites
I don't see any obvious errors in your code. Have you checked that the ss.read call actually reads the number of bytes it should?

You can also have a look at my own implementation of the font loader if you wish: acgfx_font.cpp (look for the CFontLoaderBinaryFormat class).


Share this post

Link to post
Share on other sites
So I found the problem: I forgot to add the binary flag to the ifstream constructor. So it does do something! Thanks for the help though WitchLord, and great work on an excellent little utility :)

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!