- Main Page
- Namespaces
- Classes
- Files

- File List

# Font.cpp

    00001
    00002 //
    00003 // SFML - Simple and Fast Multimedia Library
    00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
    00005 //
    00006 // This software is provided 'as-is', without any express or implied warranty.
    00007 // In no event will the authors be held liable for any damages arising from the use of this software.
    00008 //
    00009 // Permission is granted to anyone to use this software for any purpose,
    00010 // including commercial applications, and to alter it and redistribute it freely,
    00011 // subject to the following restrictions:
    00012 //
    00013 // 1. The origin of this software must not be misrepresented;
    00014 //    you must not claim that you wrote the original software.
    00015 //    If you use this software in a product, an acknowledgment
    00016 //    in the product documentation would be appreciated but is not required.
    00017 //
    00018 // 2. Altered source versions must be plainly marked as such,
    00019 //    and must not be misrepresented as being the original software.
    00020 //
    00021 // 3. This notice may not be removed or altered from any source distribution.
    00022 //
    00024
    00026 // Headers
    00028 #include <SFML/Graphics/Font.hpp>
    00029 #include <SFML/Graphics/FontLoader.hpp>
    00030 #include <iostream>
    00031
    00032
    00033 namespace sf
    00034 {
    00036 // Static member data
    00038 Uint32 Font::ourDefaultCharset[] =
    00039 {
    00040     // Printable characters in ASCII range
    00041     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
    00042     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
    00043     0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
    00044     0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
    00045     0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
    00046     0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
    00047
    00048     // Printable characters in extended ASCII range
    00049     0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0x2A, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
    00050     0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
    00051     0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
    00052     0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
    00053     0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
    00054     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE,
    00055
    00056     // To make it a valid string
    00057     0x00
    00058 };
    00059
    00060
    00064 Font::Font() :
    00065 myCharSize(0)
    00066 {
    00067
    00068 }
    00069
    00070
    00074 bool Font::LoadFromFile(const std::string& Filename, unsigned int CharSize, const Unicode::Text& Charset)
    00075 {
    00076     // Clear the previous character map
    00077     myGlyphs.clear();
    00078
    00079     // Always add these special characters
    00080     Unicode::UTF32String UTFCharset = Charset;
    00081     if (UTFCharset.find(L' ')  != Unicode::UTF32String::npos) UTFCharset += L' ';
    00082     if (UTFCharset.find(L'\n') != Unicode::UTF32String::npos) UTFCharset += L'\n';
    00083     if (UTFCharset.find(L'\v') != Unicode::UTF32String::npos) UTFCharset += L'\v';
    00084     if (UTFCharset.find(L'\t') != Unicode::UTF32String::npos) UTFCharset += L'\t';
    00085
    00086     return priv::FontLoader::GetInstance().LoadFontFromFile(Filename, CharSize, UTFCharset, *this);
    00087 }
    00088
    00089
    00093 bool Font::LoadFromMemory(const char* Data, std::size_t SizeInBytes, unsigned int CharSize, const Unicode::Text& Charset)
    00094 {
    00095     // Clear the previous character map
    00096     myGlyphs.clear();
    00097
    00098     // Check parameters
    00099     if (!Data || (SizeInBytes == 0))
    00100     {
    00101         std::cerr << "Failed to load font from memory, no data provided" << std::endl;
    00102         return false;
    00103     }
    00104
    00105     // Always add these special characters
    00106     Unicode::UTF32String UTFCharset = Charset;
    00107     if (UTFCharset.find(L' ')  != Unicode::UTF32String::npos) UTFCharset += L' ';
    00108     if (UTFCharset.find(L'\n') != Unicode::UTF32String::npos) UTFCharset += L'\n';
    00109     if (UTFCharset.find(L'\v') != Unicode::UTF32String::npos) UTFCharset += L'\v';
    00110     if (UTFCharset.find(L'\t') != Unicode::UTF32String::npos) UTFCharset += L'\t';
    00111
    00112     return priv::FontLoader::GetInstance().LoadFontFromMemory(Data, SizeInBytes, CharSize, UTFCharset, *this);
    00113 }
    00114
    00115
    00120 unsigned int Font::GetCharacterSize() const
    00121 {
    00122     return myCharSize;
    00123 }
    00124
    00125
    00130 const Glyph& Font::GetGlyph(Uint32 CodePoint) const
    00131 {
    00132     std::map<Uint32, Glyph>::const_iterator It = myGlyphs.find(CodePoint);
    00133     if (It != myGlyphs.end())
    00134     {
    00135         // Valid glyph
    00136         return It->second;
    00137     }
    00138     else
    00139     {
    00140         // Invalid glyph -- return an invalid glyph
    00141         static const Glyph InvalidGlyph;
    00142         return InvalidGlyph;
    00143     }
    00144 }
    00145
    00146
    00150 const Image& Font::GetImage() const
    00151 {
    00152     return myTexture;
    00153 }
    00154
    00155
    00159 const Font& Font::GetDefaultFont()
    00160 {
    00161 #if defined(SFML_SYSTEM_WINDOWS) && defined(SFML_DYNAMIC)
    00162
    00163     // On Windows dynamic build, the default font causes a crash at global exit.
    00164     // This is a temporary workaround that turns the crash into a memory leak.
    00165     // Note that this bug doesn't exist anymore in SFML 2.
    00166     static Font* DefaultFontPtr = new Font;
    00167     Font& DefaultFont = *DefaultFontPtr;
    00168
    00169 #else
    00170
    00171     static Font DefaultFont;
    00172
    00173 #endif
    00174
    00175     // Get the raw data of the Arial font file into an array, so that we can load it into the font
    00176     static const char DefaultFontData[] =
    00177     {
    00178         #include <SFML/Graphics/Arial.hpp>
    00179     };
    00180
    00181     // Load the default font on first call
    00182     static bool DefaultFontLoaded = false;
    00183     if (!DefaultFontLoaded)
    00184     {
    00185         DefaultFont.LoadFromMemory(DefaultFontData, sizeof(DefaultFontData), 30);
    00186         DefaultFontLoaded = true;
    00187     }
    00188
    00189     return DefaultFont;
    00190 }
    00191
    00192 } // namespace sf

:: Copyright © 2007-2008 Laurent Gomila, all rights reserved :: Documentation generated by doxygen 1.5.2 ::