Dynamic Fonts
Introduction
The datafiles\fonts folder contains static font definitions such as Commonwealth-10.font. The XML contents of that file specify one particular font, mainly a logical name (Commonwealth-10), a filename (Commonv2c.ttf), and a size (10). To load this static font definition you'd write the following line of code:
CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font");
This works well, but sometimes you need to display a same font in various sizes. One approach is to create multiple .font files, one per font size. But there is a better approach, a way to dynamically create fonts.
Files
DynamicFont.h
</cpp>
- ifndef _DynamicFont_h_
- define _DynamicFont_h_
- include "CEGuiSample.h"
- include "CEGUI.h"
- include "CEGUIXMLAttributes.h"
class DemoSample : public CEGuiSample { public:
bool initialiseSample()
{ using namespace CEGUI; try { // Retrieve the window manager WindowManager& winMgr = WindowManager::getSingleton();
// Load the TaharezLook scheme and set up the default mouse cursor and font SchemeManager::getSingleton().loadScheme("TaharezLook.scheme"); System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow"); FontManager::getSingleton().createFont("Commonwealth-10.font");
// Set the GUI Sheet Window* sheet = winMgr.createWindow("DefaultWindow", "root_wnd"); System::getSingleton().setGUISheet(sheet);
// Load a layout Window* guiLayout = winMgr.loadWindowLayout("DynamicFont.layout"); sheet->addChildWindow(guiLayout);
// Configure the event for the list of created fonts CEGUI::Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); existingFonts->subscribeEvent(CEGUI::Combobox::EventListSelectionAccepted, CEGUI::Event::Subscriber(&DemoSample::eventSelectExistingFont, this));
// Configure the event for the add button CEGUI::PushButton* add = static_cast<CEGUI::PushButton*>(winMgr.getWindow("DynamicFont/Add")); add->subscribeEvent(CEGUI::PushButton::EventMouseClick, CEGUI::Event::Subscriber(&DemoSample::eventAddFont, this));
// Add the font previously created addExistingFont("Commonwealth-10"); } catch(Exception &e) { #if defined( __WIN32__ ) || defined( _WIN32 ) MessageBox(NULL, e.getMessage().c_str(), "Error initializing the demo", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else std::cerr << "Error initializing the demo:" << e.getMessage().c_str() << "\n"; #endif }
return true; }
void cleanupSample(void) { }
bool eventAddFont(const CEGUI::EventArgs& args) { // Add a font from the specified parameters using namespace CEGUI;
WindowManager& winMgr = WindowManager::getSingleton(); Window* nameText = winMgr.getWindow("DynamicFont/Name"); Window* filenameText = winMgr.getWindow("DynamicFont/Filename"); Window* sizeText = winMgr.getWindow("DynamicFont/Size");
setFont(nameText->getText(), filenameText->getText(), sizeText->getText()); return true; }
void addExistingFont(const CEGUI::String& pName) { // Once a font has been created we add it to the combobox of fonts using namespace CEGUI; WindowManager& winMgr = WindowManager::getSingleton();
Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); ListboxTextItem* itemCombobox = new ListboxTextItem(pName); itemCombobox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush"); itemCombobox->setSelected(true); existingFonts->addItem(itemCombobox); }
bool eventSelectExistingFont(const CEGUI::EventArgs& args) { // Use an already created font using namespace CEGUI; WindowManager& winMgr = WindowManager::getSingleton(); Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); setFont(existingFonts->getText(), "", ""); return true; }
void setFont(const CEGUI::String& pName, const CEGUI::String& pFilename, const CEGUI::String& pSize) { // Set the font displayed within the multiline editbox using namespace CEGUI;
String sampleText(pName);
WindowManager& winMgr = WindowManager::getSingleton(); CEGUI::Window* text = winMgr.getWindow("DynamicFont/Text"); Font* font;
if(FontManager::getSingleton().isFontPresent(pName)) { // Select a previously created font font = FontManager::getSingleton().getFont(pName); } else { // Dynamically create a new font XMLAttributes xmlAttributes;
// Attributes specified within CEGUIFont.cpp xmlAttributes.add("Name", pName); xmlAttributes.add("Filename", pFilename); xmlAttributes.add("ResourceGroup", ""); xmlAttributes.add("AutoScaled", "true"); xmlAttributes.add("NativeHorzRes", "800"); xmlAttributes.add("NativeVertRes", "600");
// Attributes specified within CEGUIXMLAttributes.cpp xmlAttributes.add("Size", pSize); xmlAttributes.add("AntiAlias", "true");
try { font = FontManager::getSingleton().createFont("FreeType", xmlAttributes); if(font) { font->load(); // This function must be used addExistingFont(pName); } } catch(Exception &e) { // Display the error message sampleText = e.getMessage(); } }
text->setFont(font); text->setText(sampleText); }
private: };
- endif // _DynamicFont_h_
main.cpp
</cpp>
- if defined( __WIN32__ ) || defined( _WIN32 )
#define WIN32_LEAN_AND_MEAN #define NOMINMAX #include "windows.h"
- endif
- include "DynamicFont.h"
- if defined( __WIN32__ ) || defined( _WIN32 )
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)
- else
int main(int argc, char *argv[])
- endif
{
DemoSample app; return app.run();
}
DynamicFont.layout
<?xml version="1.0" encoding="UTF-8"?> <GUILayout > <Window Type="TaharezLook/FrameWindow" Name="DynamicFont" > <Property Name="Text" Value="Dynamic Font" /> <Property Name="TitlebarFont" Value="Commonwealth-10" /> <Property Name="InheritsAlpha" Value="False" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="TitlebarEnabled" Value="True" /> <Property Name="UnifiedAreaRect" Value="{{0.02,0},{0.054167,0},{0.98,0},{0.781251,0}}" /> <Window Type="TaharezLook/MultiLineEditbox" Name="DynamicFont/Text" > <Property Name="Text" > </Property> <Property Name="ReadOnly" Value="True" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.01,0},{0.075,0},{0.99,0},{0.715617,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/NameLabel" > <Property Name="Text" Value="Name:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.018409,0},{0.881661,0},{0.0809004,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Name" > <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.0809,0},{0.881661,0},{0.328819,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/FilenameLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Filename:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.347544,0},{0.881661,0},{0.438807,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Filename" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.438807,0},{0.881661,0},{0.713682,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/SizeLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Size:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.731982,0},{0.881661,0},{0.793499,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Size" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.793499,0},{0.881661,0},{0.858294,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Button" Name="DynamicFont/Add" > <Property Name="Text" Value="Add" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.867109,0},{0.881661,0},{0.974324,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/FontsLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Fonts:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.018409,0},{0.768338,0},{0.0859395,0},{0.855015,0}}" /> </Window> <Window Type="TaharezLook/Combobox" Name="DynamicFont/Fonts" > <Property Name="ReadOnly" Value="True" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.085939,0},{0.768338,0},{0.974324,0},{0.994412,0}}" /> <Property Name="MaxEditTextLength" Value="1073741823" /> </Window> </Window> </GUILayout>