MyGUI
3.2.1
|
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__