Font.cpp
1
2//
3// SFML - Simple and Fast Multimedia Library
4// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
26// Headers
28#include <SFML/Graphics/Font.hpp>
29#include <SFML/Graphics/FontLoader.hpp>
30#include <iostream>
31
32
33namespace sf
34{
36// Static member data
38Uint32 Font::ourDefaultCharset[] =
39{
40 // Printable characters in ASCII range
41 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
42 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
43 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
44 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
45 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
46 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
47
48 // Printable characters in extended ASCII range
49 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0x2A, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
50 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
51 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
52 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
53 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
54 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE,
55
56 // To make it a valid string
57 0x00
58};
59
60
65myCharSize(0)
66{
67
68}
69
70
74bool Font::LoadFromFile(const std::string& Filename, unsigned int CharSize, const Unicode::Text& Charset)
75{
76 // Clear the previous character map
77 myGlyphs.clear();
78
79 // Always add these special characters
80 Unicode::UTF32String UTFCharset = Charset;
81 if (UTFCharset.find(L' ') != Unicode::UTF32String::npos) UTFCharset += L' ';
82 if (UTFCharset.find(L'\n') != Unicode::UTF32String::npos) UTFCharset += L'\n';
83 if (UTFCharset.find(L'\v') != Unicode::UTF32String::npos) UTFCharset += L'\v';
84 if (UTFCharset.find(L'\t') != Unicode::UTF32String::npos) UTFCharset += L'\t';
85
86 return priv::FontLoader::GetInstance().LoadFontFromFile(Filename, CharSize, UTFCharset, *this);
87}
88
89
93bool Font::LoadFromMemory(const char* Data, std::size_t SizeInBytes, unsigned int CharSize, const Unicode::Text& Charset)
94{
95 // Clear the previous character map
96 myGlyphs.clear();
97
98 // Check parameters
99 if (!Data || (SizeInBytes == 0))
100 {
101 std::cerr << "Failed to load font from memory, no data provided" << std::endl;
102 return false;
103 }
104
105 // Always add these special characters
106 Unicode::UTF32String UTFCharset = Charset;
107 if (UTFCharset.find(L' ') != Unicode::UTF32String::npos) UTFCharset += L' ';
108 if (UTFCharset.find(L'\n') != Unicode::UTF32String::npos) UTFCharset += L'\n';
109 if (UTFCharset.find(L'\v') != Unicode::UTF32String::npos) UTFCharset += L'\v';
110 if (UTFCharset.find(L'\t') != Unicode::UTF32String::npos) UTFCharset += L'\t';
111
112 return priv::FontLoader::GetInstance().LoadFontFromMemory(Data, SizeInBytes, CharSize, UTFCharset, *this);
113}
114
115
120unsigned int Font::GetCharacterSize() const
121{
122 return myCharSize;
123}
124
125
130const Glyph& Font::GetGlyph(Uint32 CodePoint) const
131{
132 std::map<Uint32, Glyph>::const_iterator It = myGlyphs.find(CodePoint);
133 if (It != myGlyphs.end())
134 {
135 // Valid glyph
136 return It->second;
137 }
138 else
139 {
140 // Invalid glyph -- return an invalid glyph
141 static const Glyph InvalidGlyph;
142 return InvalidGlyph;
143 }
144}
145
146
150const Image& Font::GetImage() const
151{
152 return myTexture;
153}
154
155
160{
161#if defined(SFML_SYSTEM_WINDOWS) && defined(SFML_DYNAMIC)
162
163 // On Windows dynamic build, the default font causes a crash at global exit.
164 // This is a temporary workaround that turns the crash into a memory leak.
165 // Note that this bug doesn't exist anymore in SFML 2.
166 static Font* DefaultFontPtr = new Font;
167 Font& DefaultFont = *DefaultFontPtr;
168
169#else
170
171 static Font DefaultFont;
172
173#endif
174
175 // Get the raw data of the Arial font file into an array, so that we can load it into the font
176 static const char DefaultFontData[] =
177 {
178 #include <SFML/Graphics/Arial.hpp>
179 };
180
181 // Load the default font on first call
182 static bool DefaultFontLoaded = false;
183 if (!DefaultFontLoaded)
184 {
185 DefaultFont.LoadFromMemory(DefaultFontData, sizeof(DefaultFontData), 30);
186 DefaultFontLoaded = true;
187 }
188
189 return DefaultFont;
190}
191
192} // namespace sf
static const Font & GetDefaultFont()
Get the SFML default built-in font (Arial).
Definition Font.cpp:159
unsigned int GetCharacterSize() const
Get the base size of characters in the font; All glyphs dimensions are based on this value.
Definition Font.cpp:120
Font()
Default constructor.
Definition Font.cpp:64
const Glyph & GetGlyph(Uint32 CodePoint) const
Get the description of a glyph (character) given by its unicode value.
Definition Font.cpp:130
const Image & GetImage() const
Get the image containing the rendered characters (glyphs).
Definition Font.cpp:150
bool LoadFromFile(const std::string &Filename, unsigned int CharSize=30, const Unicode::Text &Charset=ourDefaultCharset)
Load the font from a file.
Definition Font.cpp:74
bool LoadFromMemory(const char *Data, std::size_t SizeInBytes, unsigned int CharSize=30, const Unicode::Text &Charset=ourDefaultCharset)
Load the font from a file in memory.
Definition Font.cpp:93
Structure describing a glyph (a visual character).
Definition Glyph.hpp:41
Image is the low-level class for loading and manipulating images.
Definition Image.hpp:47
This class is an abstract definition of a unicode text, it can be converted from and to any kind of s...
Definition Unicode.hpp:64