Font.cpp
1 //
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 
33 namespace sf
34 {
36 // Static member data
38 Uint32 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 
65 myCharSize(0)
66 {
67 
68 }
69 
70 
74 bool 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 
93 bool 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 
120 unsigned int Font::GetCharacterSize() const
121 {
122  return myCharSize;
123 }
124 
125 
130 const 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 
150 const 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
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
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
const Image & GetImage() const
Get the image containing the rendered characters (glyphs)
Definition: Font.cpp:150
Font is the low-level class for loading and manipulating character fonts.
Definition: Font.hpp:54
const Glyph & GetGlyph(Uint32 CodePoint) const
Get the description of a glyph (character) given by its unicode value.
Definition: Font.cpp:130
This class is an abstract definition of a unicode text, it can be converted from and to any kind of s...
Definition: Unicode.hpp:63
Image is the low-level class for loading and manipulating images.
Definition: Image.hpp:46
Font()
Default constructor.
Definition: Font.cpp:64
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
Structure describing a glyph (a visual character)
Definition: Glyph.hpp:40
static const Font & GetDefaultFont()
Get the SFML default built-in font (Arial)
Definition: Font.cpp:159