MyGUI  3.2.1
MyGUI_ResourceTrueTypeFont.h
Go to the documentation of this file.
00001 /*
00002  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
00003  * Distributed under the MIT License
00004  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
00005  */
00006 
00007 #ifndef __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__
00008 #define __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__
00009 
00010 #include "MyGUI_Prerequest.h"
00011 #include "MyGUI_ITexture.h"
00012 #include "MyGUI_IFont.h"
00013 
00014 #ifdef MYGUI_USE_FREETYPE
00015 #   include <ft2build.h>
00016 #   include FT_FREETYPE_H
00017 #endif // MYGUI_USE_FREETYPE
00018 
00019 namespace MyGUI
00020 {
00021 
00022     class MYGUI_EXPORT ResourceTrueTypeFont :
00023         public IFont
00024     {
00025         MYGUI_RTTI_DERIVED( ResourceTrueTypeFont )
00026 
00027     public:
00028         ResourceTrueTypeFont();
00029         virtual ~ResourceTrueTypeFont();
00030 
00031         virtual void deserialization(xml::ElementPtr _node, Version _version);
00032 
00033         // Returns the glyph info for the specified code point, or the glyph info for a substitute glyph if the code point does not
00034         // exist in this font. Returns nullptr if there is a problem with the font.
00035         virtual GlyphInfo* getGlyphInfo(Char _id);
00036 
00037         virtual ITexture* getTextureFont();
00038 
00039         // получившаяся высота при генерации в пикселях
00040         virtual int getDefaultHeight();
00041 
00042         // Returns a collection of code-point ranges that are supported by this font. Each range is specified as [first, second];
00043         // for example, a range containing a single code point will have the same value for both first and second.
00044         std::vector<std::pair<Char, Char> > getCodePointRanges() const;
00045 
00046         // Returns the code point that is used as a substitute for code points that don't exist in the font. The default substitute
00047         // code point is FontCodeType::NotDefined, but it can be customized in the font definition file.
00048         Char getSubstituteCodePoint() const;
00049 
00050         // создаение ресурса по текущим значениям
00051         void initialise();
00052 
00053         void setSource(const std::string& _value);
00054         void setSize(float _value);
00055         void setResolution(uint _value);
00056         void setHinting(const std::string& _value);
00057         void setAntialias(bool _value);
00058         void setTabWidth(float _value);
00059         void setOffsetHeight(int _value);
00060         void setSubstituteCode(int _value);
00061         void setDistance(int _value);
00062 
00063         void addCodePointRange(Char _first, Char _second);
00064         void removeCodePointRange(Char _first, Char _second);
00065 
00066 #ifdef MYGUI_USE_FREETYPE
00067     private:
00068         enum Hinting
00069         {
00070             HintingUseNative,
00071             HintingForceAuto,
00072             HintingDisableAuto,
00073             HintingDisableAll
00074         };
00075 
00076         void addCodePoint(Char _codePoint);
00077         void removeCodePoint(Char _codePoint);
00078 
00079         void clearCodePoints();
00080 
00081         // The following variables are set directly from values specified by the user.
00082         std::string mSource; // Source (filename) of the font.
00083         float mSize; // Size of the font, in points (there are 72 points per inch).
00084         uint mResolution; // Resolution of the font, in pixels per inch.
00085         Hinting mHinting; // What type of hinting to use when rendering the font.
00086         bool mAntialias; // Whether or not to anti-alias the font by copying its alpha channel to its luminance channel.
00087         float mSpaceWidth; // The width of a "Space" character, in pixels. If zero, the default width is used.
00088         int mGlyphSpacing; // How far apart the glyphs are placed from each other in the font texture, in pixels.
00089         float mTabWidth; // The width of the "Tab" special character, in pixels.
00090         int mOffsetHeight; // How far up to nudge text rendered in this font, in pixels. May be negative to nudge text down.
00091         Char mSubstituteCodePoint; // The code point to use as a substitute for code points that don't exist in the font.
00092 
00093         // The following variables are calculated automatically.
00094         int mDefaultHeight; // The nominal height of the font in pixels.
00095         GlyphInfo* mSubstituteGlyphInfo; // The glyph info to use as a substitute for code points that don't exist in the font.
00096         MyGUI::ITexture* mTexture; // The texture that contains all of the rendered glyphs in the font.
00097 
00098         // The following constants used to be mutable, but they no longer need to be. Do not modify their values!
00099         static const int mDefaultGlyphSpacing; // How far apart the glyphs are placed from each other in the font texture, in pixels.
00100         static const float mDefaultTabWidth; // Default "Tab" width, used only when tab width is no specified.
00101         static const float mSelectedWidth; // The width of the "Selected" and "SelectedBack" special characters, in pixels.
00102         static const float mCursorWidth; // The width of the "Cursor" special character, in pixels.
00103 
00104     private:
00105         // A map of code points to glyph indices.
00106         typedef std::map<Char, FT_UInt> CharMap;
00107 
00108         // A map of glyph indices to glyph info objects.
00109         typedef std::map<FT_UInt, GlyphInfo> GlyphMap;
00110 
00111         // A map of glyph heights to the set of paired glyph indices and glyph info objects that are of that height.
00112         typedef std::map<FT_Pos, std::map<FT_UInt, GlyphInfo*> > GlyphHeightMap;
00113 
00114         template<bool LAMode, bool Antialias>
00115         void initialiseFreeType();
00116 
00117         // Loads the font face as specified by mSource, mSize, and mResolution. Automatically adjusts code-point ranges according
00118         // to the capabilities of the font face.
00119         // Returns a handle to the FreeType face object for the face, or nullptr if the face could not be loaded.
00120         // Keeps the font file loaded in memory and stores its location in _fontBuffer. The caller is responsible for freeing this
00121         // buffer when it is done using the face by calling delete[] on the buffer after calling FT_Done_Face() on the face itself.
00122         FT_Face loadFace(const FT_Library& _ftLibrary, uint8*& _fontBuffer);
00123 
00124         // Wraps the current texture coordinates _texX and _texY to the beginning of the next line if the specified glyph width
00125         // doesn't fit at the end of the current line. Automatically takes the glyph spacing into account.
00126         void autoWrapGlyphPos(int _glyphWidth, int _texWidth, int _lineHeight, int& _texX, int& _texY);
00127 
00128         // Creates a GlyphInfo object using the specified information.
00129         GlyphInfo createFaceGlyphInfo(Char _codePoint, int _fontAscent, FT_GlyphSlot _glyph);
00130 
00131         // Creates a glyph with the specified glyph index and assigns it to the specified code point.
00132         // Automatically updates _glyphHeightMap, mCharMap, and mGlyphMap with data from the new glyph..
00133         int createGlyph(FT_UInt _glyphIndex, const GlyphInfo& _glyphInfo, GlyphHeightMap& _glyphHeightMap);
00134 
00135         // Creates a glyph with the specified index from the specified font face and assigns it to the specified code point.
00136         // Automatically updates _glyphHeightMap with data from the newly created glyph.
00137         int createFaceGlyph(FT_UInt _glyphIndex, Char _codePoint, int _fontAscent, const FT_Face& _ftFace, FT_Int32 _ftLoadFlags, GlyphHeightMap& _glyphHeightMap);
00138 
00139         // Renders all of the glyphs in _glyphHeightMap into the specified texture buffer using data from the specified font face.
00140         template<bool LAMode, bool Antialias>
00141         void renderGlyphs(const GlyphHeightMap& _glyphHeightMap, const FT_Library& _ftLibrary, const FT_Face& _ftFace, FT_Int32 _ftLoadFlags, uint8* _texBuffer, int _texWidth, int _texHeight);
00142 
00143         // Renders the glyph described by the specified glyph info according to the specified parameters.
00144         // Supports two types of rendering, depending on the value of UseBuffer: Texture block transfer and rectangular color fill.
00145         // The _luminance0 value is used for even-numbered columns (from zero), while _luminance1 is used for odd-numbered ones.
00146         template<bool LAMode, bool UseBuffer, bool Antialias>
00147         void renderGlyph(GlyphInfo& _info, uint8 _luminance0, uint8 _luminance1, uint8 _alpha, int _lineHeight, uint8* _texBuffer, int _texWidth, int _texHeight, int& _texX, int& _texY, uint8* _glyphBuffer = nullptr);
00148 
00149         CharMap mCharMap; // A map of code points to glyph indices.
00150         GlyphMap mGlyphMap; // A map of glyph indices to glyph info objects.
00151 
00152 #endif // MYGUI_USE_FREETYPE
00153 
00154     };
00155 
00156 } // namespace MyGUI
00157 
00158 #endif // __MYGUI_RESOURCE_TRUE_TYPE_FONT_H__