440 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			440 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////
 | 
						|
//
 | 
						|
// SFML - Simple and Fast Multimedia Library
 | 
						|
// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
 | 
						|
//
 | 
						|
// This software is provided 'as-is', without any express or implied warranty.
 | 
						|
// In no event will the authors be held liable for any damages arising from the use of this software.
 | 
						|
//
 | 
						|
// Permission is granted to anyone to use this software for any purpose,
 | 
						|
// including commercial applications, and to alter it and redistribute it freely,
 | 
						|
// subject to the following restrictions:
 | 
						|
//
 | 
						|
// 1. The origin of this software must not be misrepresented;
 | 
						|
//    you must not claim that you wrote the original software.
 | 
						|
//    If you use this software in a product, an acknowledgment
 | 
						|
//    in the product documentation would be appreciated but is not required.
 | 
						|
//
 | 
						|
// 2. Altered source versions must be plainly marked as such,
 | 
						|
//    and must not be misrepresented as being the original software.
 | 
						|
//
 | 
						|
// 3. This notice may not be removed or altered from any source distribution.
 | 
						|
//
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef SFML_FONT_HPP
 | 
						|
#define SFML_FONT_HPP
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
// Headers
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
#include <SFML/Graphics/Export.hpp>
 | 
						|
#include <SFML/Graphics/Glyph.hpp>
 | 
						|
#include <SFML/Graphics/Texture.hpp>
 | 
						|
#include <SFML/Graphics/Rect.hpp>
 | 
						|
#include <SFML/System/Vector2.hpp>
 | 
						|
#include <SFML/System/String.hpp>
 | 
						|
#include <map>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
 | 
						|
namespace sf
 | 
						|
{
 | 
						|
class InputStream;
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
/// \brief Class for loading and manipulating character fonts
 | 
						|
///
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
class SFML_GRAPHICS_API Font
 | 
						|
{
 | 
						|
public:
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Holds various information about a font
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    struct Info
 | 
						|
    {
 | 
						|
        std::string family; ///< The font family
 | 
						|
    };
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Default constructor
 | 
						|
    ///
 | 
						|
    /// This constructor defines an empty font
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    Font();
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Copy constructor
 | 
						|
    ///
 | 
						|
    /// \param copy Instance to copy
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    Font(const Font& copy);
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Destructor
 | 
						|
    ///
 | 
						|
    /// Cleans up all the internal resources used by the font
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    ~Font();
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Load the font from a file
 | 
						|
    ///
 | 
						|
    /// The supported font formats are: TrueType, Type 1, CFF,
 | 
						|
    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.
 | 
						|
    /// Note that this function knows nothing about the standard
 | 
						|
    /// fonts installed on the user's system, thus you can't
 | 
						|
    /// load them directly.
 | 
						|
    ///
 | 
						|
    /// \warning SFML cannot preload all the font data in this
 | 
						|
    /// function, so the file has to remain accessible until
 | 
						|
    /// the sf::Font object loads a new font or is destroyed.
 | 
						|
    ///
 | 
						|
    /// \param filename Path of the font file to load
 | 
						|
    ///
 | 
						|
    /// \return True if loading succeeded, false if it failed
 | 
						|
    ///
 | 
						|
    /// \see loadFromMemory, loadFromStream
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    bool loadFromFile(const std::string& filename);
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Load the font from a file in memory
 | 
						|
    ///
 | 
						|
    /// The supported font formats are: TrueType, Type 1, CFF,
 | 
						|
    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.
 | 
						|
    ///
 | 
						|
    /// \warning SFML cannot preload all the font data in this
 | 
						|
    /// function, so the buffer pointed by \a data has to remain
 | 
						|
    /// valid until the sf::Font object loads a new font or
 | 
						|
    /// is destroyed.
 | 
						|
    ///
 | 
						|
    /// \param data        Pointer to the file data in memory
 | 
						|
    /// \param sizeInBytes Size of the data to load, in bytes
 | 
						|
    ///
 | 
						|
    /// \return True if loading succeeded, false if it failed
 | 
						|
    ///
 | 
						|
    /// \see loadFromFile, loadFromStream
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    bool loadFromMemory(const void* data, std::size_t sizeInBytes);
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Load the font from a custom stream
 | 
						|
    ///
 | 
						|
    /// The supported font formats are: TrueType, Type 1, CFF,
 | 
						|
    /// OpenType, SFNT, X11 PCF, Windows FNT, BDF, PFR and Type 42.
 | 
						|
    /// Warning: SFML cannot preload all the font data in this
 | 
						|
    /// function, so the contents of \a stream have to remain
 | 
						|
    /// valid as long as the font is used.
 | 
						|
    ///
 | 
						|
    /// \warning SFML cannot preload all the font data in this
 | 
						|
    /// function, so the stream has to remain accessible until
 | 
						|
    /// the sf::Font object loads a new font or is destroyed.
 | 
						|
    ///
 | 
						|
    /// \param stream Source stream to read from
 | 
						|
    ///
 | 
						|
    /// \return True if loading succeeded, false if it failed
 | 
						|
    ///
 | 
						|
    /// \see loadFromFile, loadFromMemory
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    bool loadFromStream(InputStream& stream);
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Get the font information
 | 
						|
    ///
 | 
						|
    /// \return A structure that holds the font information
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    const Info& getInfo() const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Retrieve a glyph of the font
 | 
						|
    ///
 | 
						|
    /// If the font is a bitmap font, not all character sizes
 | 
						|
    /// might be available. If the glyph is not available at the
 | 
						|
    /// requested size, an empty glyph is returned.
 | 
						|
    ///
 | 
						|
    /// Be aware that using a negative value for the outline
 | 
						|
    /// thickness will cause distorted rendering.
 | 
						|
    ///
 | 
						|
    /// \param codePoint        Unicode code point of the character to get
 | 
						|
    /// \param characterSize    Reference character size
 | 
						|
    /// \param bold             Retrieve the bold version or the regular one?
 | 
						|
    /// \param outlineThickness Thickness of outline (when != 0 the glyph will not be filled)
 | 
						|
    ///
 | 
						|
    /// \return The glyph corresponding to \a codePoint and \a characterSize
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    const Glyph& getGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness = 0) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Get the kerning offset of two glyphs
 | 
						|
    ///
 | 
						|
    /// The kerning is an extra offset (negative) to apply between two
 | 
						|
    /// glyphs when rendering them, to make the pair look more "natural".
 | 
						|
    /// For example, the pair "AV" have a special kerning to make them
 | 
						|
    /// closer than other characters. Most of the glyphs pairs have a
 | 
						|
    /// kerning offset of zero, though.
 | 
						|
    ///
 | 
						|
    /// \param first         Unicode code point of the first character
 | 
						|
    /// \param second        Unicode code point of the second character
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return Kerning value for \a first and \a second, in pixels
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    float getKerning(Uint32 first, Uint32 second, unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Get the line spacing
 | 
						|
    ///
 | 
						|
    /// Line spacing is the vertical offset to apply between two
 | 
						|
    /// consecutive lines of text.
 | 
						|
    ///
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return Line spacing, in pixels
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    float getLineSpacing(unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Get the position of the underline
 | 
						|
    ///
 | 
						|
    /// Underline position is the vertical offset to apply between the
 | 
						|
    /// baseline and the underline.
 | 
						|
    ///
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return Underline position, in pixels
 | 
						|
    ///
 | 
						|
    /// \see getUnderlineThickness
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    float getUnderlinePosition(unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Get the thickness of the underline
 | 
						|
    ///
 | 
						|
    /// Underline thickness is the vertical size of the underline.
 | 
						|
    ///
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return Underline thickness, in pixels
 | 
						|
    ///
 | 
						|
    /// \see getUnderlinePosition
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    float getUnderlineThickness(unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Retrieve the texture containing the loaded glyphs of a certain size
 | 
						|
    ///
 | 
						|
    /// The contents of the returned texture changes as more glyphs
 | 
						|
    /// are requested, thus it is not very relevant. It is mainly
 | 
						|
    /// used internally by sf::Text.
 | 
						|
    ///
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return Texture containing the glyphs of the requested size
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    const Texture& getTexture(unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Overload of assignment operator
 | 
						|
    ///
 | 
						|
    /// \param right Instance to assign
 | 
						|
    ///
 | 
						|
    /// \return Reference to self
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    Font& operator =(const Font& right);
 | 
						|
 | 
						|
private:
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Structure defining a row of glyphs
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    struct Row
 | 
						|
    {
 | 
						|
        Row(unsigned int rowTop, unsigned int rowHeight) : width(0), top(rowTop), height(rowHeight) {}
 | 
						|
 | 
						|
        unsigned int width;  ///< Current width of the row
 | 
						|
        unsigned int top;    ///< Y position of the row into the texture
 | 
						|
        unsigned int height; ///< Height of the row
 | 
						|
    };
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    // Types
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    typedef std::map<Uint64, Glyph> GlyphTable; ///< Table mapping a codepoint to its glyph
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Structure defining a page of glyphs
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    struct Page
 | 
						|
    {
 | 
						|
        Page();
 | 
						|
 | 
						|
        GlyphTable       glyphs;  ///< Table mapping code points to their corresponding glyph
 | 
						|
        Texture          texture; ///< Texture containing the pixels of the glyphs
 | 
						|
        unsigned int     nextRow; ///< Y position of the next new row in the texture
 | 
						|
        std::vector<Row> rows;    ///< List containing the position of all the existing rows
 | 
						|
    };
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Free all the internal resources
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    void cleanup();
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Load a new glyph and store it in the cache
 | 
						|
    ///
 | 
						|
    /// \param codePoint        Unicode code point of the character to load
 | 
						|
    /// \param characterSize    Reference character size
 | 
						|
    /// \param bold             Retrieve the bold version or the regular one?
 | 
						|
    /// \param outlineThickness Thickness of outline (when != 0 the glyph will not be filled)
 | 
						|
    ///
 | 
						|
    /// \return The glyph corresponding to \a codePoint and \a characterSize
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    Glyph loadGlyph(Uint32 codePoint, unsigned int characterSize, bool bold, float outlineThickness) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Find a suitable rectangle within the texture for a glyph
 | 
						|
    ///
 | 
						|
    /// \param page   Page of glyphs to search in
 | 
						|
    /// \param width  Width of the rectangle
 | 
						|
    /// \param height Height of the rectangle
 | 
						|
    ///
 | 
						|
    /// \return Found rectangle within the texture
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    IntRect findGlyphRect(Page& page, unsigned int width, unsigned int height) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    /// \brief Make sure that the given size is the current one
 | 
						|
    ///
 | 
						|
    /// \param characterSize Reference character size
 | 
						|
    ///
 | 
						|
    /// \return True on success, false if any error happened
 | 
						|
    ///
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    bool setCurrentSize(unsigned int characterSize) const;
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    // Types
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    typedef std::map<unsigned int, Page> PageTable; ///< Table mapping a character size to its page (texture)
 | 
						|
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    // Member data
 | 
						|
    ////////////////////////////////////////////////////////////
 | 
						|
    void*                      m_library;     ///< Pointer to the internal library interface (it is typeless to avoid exposing implementation details)
 | 
						|
    void*                      m_face;        ///< Pointer to the internal font face (it is typeless to avoid exposing implementation details)
 | 
						|
    void*                      m_streamRec;   ///< Pointer to the stream rec instance (it is typeless to avoid exposing implementation details)
 | 
						|
    void*                      m_stroker;     ///< Pointer to the stroker (it is typeless to avoid exposing implementation details)
 | 
						|
    int*                       m_refCount;    ///< Reference counter used by implicit sharing
 | 
						|
    Info                       m_info;        ///< Information about the font
 | 
						|
    mutable PageTable          m_pages;       ///< Table containing the glyphs pages by character size
 | 
						|
    mutable std::vector<Uint8> m_pixelBuffer; ///< Pixel buffer holding a glyph's pixels before being written to the texture
 | 
						|
    #ifdef SFML_SYSTEM_ANDROID
 | 
						|
    void*                      m_stream; ///< Asset file streamer (if loaded from file)
 | 
						|
    #endif
 | 
						|
};
 | 
						|
 | 
						|
} // namespace sf
 | 
						|
 | 
						|
 | 
						|
#endif // SFML_FONT_HPP
 | 
						|
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////
 | 
						|
/// \class sf::Font
 | 
						|
/// \ingroup graphics
 | 
						|
///
 | 
						|
/// Fonts can be loaded from a file, from memory or from a custom
 | 
						|
/// stream, and supports the most common types of fonts. See
 | 
						|
/// the loadFromFile function for the complete list of supported formats.
 | 
						|
///
 | 
						|
/// Once it is loaded, a sf::Font instance provides three
 | 
						|
/// types of information about the font:
 | 
						|
/// \li Global metrics, such as the line spacing
 | 
						|
/// \li Per-glyph metrics, such as bounding box or kerning
 | 
						|
/// \li Pixel representation of glyphs
 | 
						|
///
 | 
						|
/// Fonts alone are not very useful: they hold the font data
 | 
						|
/// but cannot make anything useful of it. To do so you need to
 | 
						|
/// use the sf::Text class, which is able to properly output text
 | 
						|
/// with several options such as character size, style, color,
 | 
						|
/// position, rotation, etc.
 | 
						|
/// This separation allows more flexibility and better performances:
 | 
						|
/// indeed a sf::Font is a heavy resource, and any operation on it
 | 
						|
/// is slow (often too slow for real-time applications). On the other
 | 
						|
/// side, a sf::Text is a lightweight object which can combine the
 | 
						|
/// glyphs data and metrics of a sf::Font to display any text on a
 | 
						|
/// render target.
 | 
						|
/// Note that it is also possible to bind several sf::Text instances
 | 
						|
/// to the same sf::Font.
 | 
						|
///
 | 
						|
/// It is important to note that the sf::Text instance doesn't
 | 
						|
/// copy the font that it uses, it only keeps a reference to it.
 | 
						|
/// Thus, a sf::Font must not be destructed while it is
 | 
						|
/// used by a sf::Text (i.e. never write a function that
 | 
						|
/// uses a local sf::Font instance for creating a text).
 | 
						|
///
 | 
						|
/// Usage example:
 | 
						|
/// \code
 | 
						|
/// // Declare a new font
 | 
						|
/// sf::Font font;
 | 
						|
///
 | 
						|
/// // Load it from a file
 | 
						|
/// if (!font.loadFromFile("arial.ttf"))
 | 
						|
/// {
 | 
						|
///     // error...
 | 
						|
/// }
 | 
						|
///
 | 
						|
/// // Create a text which uses our font
 | 
						|
/// sf::Text text1;
 | 
						|
/// text1.setFont(font);
 | 
						|
/// text1.setCharacterSize(30);
 | 
						|
/// text1.setStyle(sf::Text::Regular);
 | 
						|
///
 | 
						|
/// // Create another text using the same font, but with different parameters
 | 
						|
/// sf::Text text2;
 | 
						|
/// text2.setFont(font);
 | 
						|
/// text2.setCharacterSize(50);
 | 
						|
/// text2.setStyle(sf::Text::Italic);
 | 
						|
/// \endcode
 | 
						|
///
 | 
						|
/// Apart from loading font files, and passing them to instances
 | 
						|
/// of sf::Text, you should normally not have to deal directly
 | 
						|
/// with this class. However, it may be useful to access the
 | 
						|
/// font metrics or rasterized glyphs for advanced usage.
 | 
						|
///
 | 
						|
/// Note that if the font is a bitmap font, it is not scalable,
 | 
						|
/// thus not all requested sizes will be available to use. This
 | 
						|
/// needs to be taken into consideration when using sf::Text.
 | 
						|
/// If you need to display text of a certain size, make sure the
 | 
						|
/// corresponding bitmap font that supports that size is used.
 | 
						|
///
 | 
						|
/// \see sf::Text
 | 
						|
///
 | 
						|
////////////////////////////////////////////////////////////
 |