This is a native Direct3D 11 implementation of a bitmap font renderer, similar to the SpriteFont type from XNA Game Studio, plus a command line tool (MakeSpriteFont) for building fonts into bitmap format. It is less fully featured than Direct2D and DirectWrite, but may be useful for those who want something simpler and lighter weight.
SpriteFont is particularly useful for the Windows phone 8.0 and Xbox One XDK platforms that lack support for Direct2D and DirectWrite
![SpriteFontExample.jpg SpriteFontExample.jpg]()
For exception safety, it is recommended you make use of the C++ RAII pattern and use a std::unique_ptr or std::shared_ptr
The Draw method has several overloads with parameters controlling color, rotation, origin point, scaling, horizontal or vertical mirroring, and layer depth. These work the same way as the equivalent SpriteBatch::Draw parameters.
http://ascii-table.com/ascii-extended-pc-list.php
http://en.wikipedia.org/wiki/Code_page_437
http://blogs.msdn.com/b/shawnhar/archive/2011/01/12/spritebatch-billboards-in-a-3d-world.aspx
SpriteFont is particularly useful for the Windows phone 8.0 and Xbox One XDK platforms that lack support for Direct2D and DirectWrite
Header
#include <SpriteFont.h>
Initialization
The SpriteFont class requires a SpriteBatch instance and a .spritefont bitmap file.std::unique_ptr<SpriteBatch> spriteBatch(new SpriteBatch(deviceContext)); std::unique_ptr<SpriteFont> spriteFont(new SpriteFont(device, L"myfile.spritefont"));
Simple drawing
spriteBatch->Begin();
spriteFont->DrawString(spriteBatch.get(), L"Hello, world!", XMFLOAT2(x, y));
spriteBatch->End();
Constructors
SpriteFont has three constructors:- Pass a filename string to read a binary file created by MakeSpriteFont
- Pass a buffer containing a MakeSpriteFont binary that was already loaded some other way
- Pass an array of Glyph structs if you prefer to entirely bypass MakeSpriteFont
Helpers
In addition to DrawString with various overloads, SpriteFont includes the following helpers:- MeasureString which returns the size of the given string in pixels
- ContainsCharacter tests to see if a given character is defined in the font
Default character
If you try to draw or call MeasureString with a character that is not included in the font, by default you will get an exception. Use SetDefaultCharacter to specify some other character that will be automatically substituted in place of any that are missing. You can also use GetDefaultCharacter to obtain the current default which is also defined as part of the font.Localization
This implementation supports sparse fonts, so if you are localizing into languages such as Chinese, Japanese, or Korean, you can build a spritefont including only the specific characters needed by your program. This is usually a good idea for CJK languages, as a complete CJK character set is too large to fit in a Direct3D texture! If you need full CJK support, DrectWrite would be a better choice if available on your target platform. SpriteFont does not support combining characters or right-to-left (RTL) layout, so it will not work for languages with complex layout requirements such as Arabic or Thai.Extended ASCII
If you are wanting to render an 'extended ASCII' string with SpriteFont, you need to capture the full set of characters which are not contiguous in Unicode (see MakeSpriteFont for details). You then need to convert your 'extended ASCII' string to Unicode before calling DrawString.char ascii[...]; wchar_t unicode[...]; if (!MultiByteToWideChar(437, MB_PRECOMPOSED, ascii, length-of-ascii-string, unicode, length-of-unicode-string)) { // Error }
http://ascii-table.com/ascii-extended-pc-list.php
http://en.wikipedia.org/wiki/Code_page_437
Feature Levels
The Sprite Font implementation is compatible with all feature levels. The primary limitation is on the size of the sprite sheet texture which should fit into the limits for known feature levels (i.e. to support all feature levels, it should be no larger than 2048 x 2048).Further reading
http://blogs.msdn.com/b/shawnhar/archive/2007/04/26/bitmap-fonts-in-xna.aspxhttp://blogs.msdn.com/b/shawnhar/archive/2011/01/12/spritebatch-billboards-in-a-3d-world.aspx