I got fed up one day, and wrote a simple bitmap font renderer, BMFontRenderer. It parses bitmap font data from a generator like BMFont or Hiero (link on middle right of sidebar) and renders text of your choosing to a BitmapData.
BMFontRenderer is under the MIT license, so you can use it as you like.
Here’s an example:
// Load the font. var bmfont:BMFont = new BMFont(); bmfont.parseFont(font); bmfont.addSheet(0, (new fontSheet()).bitmapData); // OK, draw some text! var out:BitmapData = new BitmapData(200, 100, true, 0x0); bmfont.drawString(out, 0, 0, "Hello, world!");
(You can see the complete example in BMFontRenderer’s GitHub page.)
Great. So – why would you want to use this, given TextField is right there, waiting for you? (Translation: why did you get fed up, Ben?)
It comes down to control. TextField has a TON of knobs and buttons you can set. They all do semi-obscure things which are, in and of themselves, very exciting, but confusing to work with if you aren’t a font expert. Worst of all, it pulls font data from hard-to-inspect places that are populated by mxmlc at compile time or located on the user’s system, so you get different visual results depending on who is running your app, where and when you compiled it, and maybe even what browser it’s in.
The Flash IDE does a good job of hiding all this, and for beautiful animated vector text created by an expert in the tool, there is a great workflow. But when I need to show a high score at an artist-selected size in an artist-selected-and-provided font that has artist-approved antialiasing so it looks good on top of the artist-created background, it can be a lot easier to let the artist export the exact characters they want, how they want them to look, to a PNG. Then all I have to do is copy pixels around.
Fonts are less restrictive about licensing if you ship pixels instead of TrueType/vector data. Shipping raster data can save you a couple grand in license fees, nevermind cut down on your download quite nicely.
Doing it this way also puts 100% of the font handling code under your control. There are no parts you can’t debug, analyze, optimize, timeslice, or otherwise fiddle with. Never underestimate the value of this when you have a deadline. This is why I love libraries like Sean Barrett’s stb_truetype.h, which is a self-contained TrueType font renderer in a single C file.
There’s another fantastic bonus. Once an artist has characters in a PNG, they can open them up and tweak them – distress them, add glows or cutouts, or anything else that Photoshop can do. That’s a big realm of possibilities, and a lot easier than learning a font authoring tool.
To be sure, Flash’s built in font rendering has solid uses. If you need to dynamically animate, scale, or rotate text, you need vectors, and Flash has got you covered. If you want to display fully arbitrary unicode text, you may need to fall back on system fonts to fit in your download budget (PushButton Engine has a nice glyph cache for speeding up rendering, though). Or if you are working with people who are very comfortable in the Flash IDE, why not use a system they are familiar with?
For everything else, there’s BMFontRenderer. Enjoy!
2 thoughts on “Fast Bitmap Fonts in Flash”
I think Torque could fill the bill as well. Just not as easy to port to different platforms as unity is right now in my opinion.
Hey, Ben. Very cool stuff here. I think you are right about flash being a declining asset. You can spend a lifetime learning and mastering any one particular technology. The trick is picking the one that will survive the longest.
Frankly I think that technology, for what we want to do is something like getting the source to unity. A basic browser based plug in that gives us full control over a real 3d game environment.
Comments are closed.