Difference between revisions of "Dynamic Fonts"

From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
Jump to: navigation, search
m (Robot: Cosmetic changes)
 
Line 1: Line 1:
 
{{VersionBadge|0.5}} {{VersionBadge|0.6}}
 
{{VersionBadge|0.5}} {{VersionBadge|0.6}}
  
===Introduction===
+
=== 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:
 
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:
 
<source lang="cpp">
 
<source lang="cpp">
Line 11: Line 11:
 
Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13350 DynamicFont]
 
Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13350 DynamicFont]
  
===Files===
+
=== Files ===
  
====DynamicFont.h====
+
==== DynamicFont.h ====
 
<source lang="cpp">
 
<source lang="cpp">
 
#ifndef _DynamicFont_h_
 
#ifndef _DynamicFont_h_
Line 170: Line 170:
 
</source>
 
</source>
  
====main.cpp====
+
==== main.cpp ====
 
<source lang="cpp">
 
<source lang="cpp">
 
#if defined( __WIN32__ ) || defined( _WIN32 )
 
#if defined( __WIN32__ ) || defined( _WIN32 )
Line 191: Line 191:
 
</source>
 
</source>
  
====DynamicFont.layout====
+
==== DynamicFont.layout ====
 
<source lang="xml">
 
<source lang="xml">
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>

Latest revision as of 17:39, 4 March 2011

Written for CEGUI 0.5


Works with versions 0.5.x (obsolete)

Written for CEGUI 0.6


Works with versions 0.6.x (obsolete)

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.

Please post comments or questions on the message board thread for the DynamicFont

Files

DynamicFont.h

#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");
			if(!FontManager::getSingleton().isFontPresent("Commonwealth-10"))
				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

#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>