/* * Copyright 2010 Inalogic® Inc. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License, as * published by the Free Software Foundation; either version 2.1 or 3.0 * of the License. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License along with this program. If not, see * * Authored by: Jay Taoko * */ #ifndef FONTTEXTURE_H #define FONTTEXTURE_H class IOpenGLPixelShader; namespace nux { typedef enum _TextAlignment { eAlignTextNone = 0, eAlignTextLeft = 1, eAlignTextRight = 2, eAlignTextCenter = 3, } TextAlignment; class StringBBox { public: StringBBox() { x = 0; y = 0; width = 0; height = 0; ybearing = 0; downline = 0; }; ~StringBBox() {}; int x; int y; int width; int height; int ybearing; // max ybearing of the string int downline; // max downline of the string(max space below the baseline) }; class PageBBox { public: PageBBox() { xmin = 0; ymin = 0; xmax = 0; ymax = 0; x_margin = 0; y_margin = 0; }; ~PageBBox() {}; INT xmin; INT ymin; INT xmax; INT ymax; INT x_margin; INT y_margin; }; /////////////////////////////////////////////////////////////////////////////////////////////////////// struct CharDescriptor { //clean 16 bytes unsigned short x; unsigned short y; unsigned short Width; unsigned short Height; short XOffset; short YOffset; unsigned short page; short XAdvance; short abcA; short abcB; short abcC; CharDescriptor() : x( 0 ) , y( 0 ) , Width( 0 ) , Height( 0 ) , XOffset( 0 ) , YOffset( 0 ) , page( 0 ) , XAdvance( 0 ) , abcA( 0 ) , abcB( 0 ) , abcC( 0 ) { } }; struct KerningPair { unsigned short first; unsigned short second; short amount; KerningPair() : first(0), second(0), amount(0) {} }; struct Charset { bool italic; bool bold; unsigned short LineHeight; unsigned short Base; unsigned short Width, Height; unsigned short Pages; unsigned short FontHeight; unsigned short Ascent; unsigned short Descent; int AvgCharWidth; int MaxCharWidth; int InternalLeading; int ExternalLeading; unsigned short NumChar; CharDescriptor Chars[256]; unsigned short NumKerningPairs; KerningPair *Kerning; Charset() : italic(false), bold(false), LineHeight(0), Base(0), Width(0), Height(0) , Pages(0), FontHeight(0), Ascent(0), Descent(0), AvgCharWidth(0) , MaxCharWidth(0), InternalLeading(0), ExternalLeading(0) , NumChar(0), NumKerningPairs(0), Kerning(NULL) {} ~Charset() { delete [] Kerning; } }; // Information about a glyph. Tex_y2 can be calculated from tex_y1 // and _tex_line_height(see below). Advance is the width of the // glyph in screen space. struct Glyph { float tex_x1, tex_y1, tex_x2; int advance; }; class FontRenderer; //////////////////////////////////////////////////////////////////////////////////////////////////// // This font system loads in a custom file containing a gray scale // texture(used as alpha texture) with all the letters on it, and // information about what glyph is where. class FontTexture: public Object { public: NUX_DECLARE_OBJECT_TYPE(FontTexture, Object); FontTexture(const char *FontFile, NUX_FILE_LINE_PROTO); FontTexture(INT width, INT height, BYTE *Texture); ~FontTexture(); // The line height is a constant; int GetLineHeight() const { return m_Charset.FontHeight; } // Knowing the width of a character or a string can be useful if you // want your UI to look good at all. int GetCharWidth(const char &c) const; int GetStringWidth(const NString &str) const; int GetCharStringWidth(const char *str) const; int GetStringWidth(const NString &str, int num_char_to_compute) const; int GetCharStringWidth(const char *str, int num_char_to_compute) const; int GetFontHeight(); // CursorPosToX(similar to ScriptStringCPtoX from microsoft UniScript) // The CursorPosToX function returns the x-coordinate for the leading or trailing edge of a character position. // Parameters // icp // [in] Character position in the string. // fTrailing // [in] Indicates the edge of the icp that corresponds to the x coordinate. If TRUE, it indicates the trailing edge. If FALSE, it indicates the leading edge. // pX // [out] Pointer to a variable that receives the corresponding x coordinate for the icp. // // Return Values // If the function succeeds, it returns S_OK. // If the function fails, it returns an HRESULT. // The return value can be tested with the SUCCEEDED and FAILED macros. bool CursorPosToX(const NString &Str, int icp, bool fTrailing, int *pX); // XToCursorPosition(similar to ScriptStringXtoCP from microsoft UniScript) // The XToCursorPosition function converts an x-coordinate to a character position. // // Parameters // iX // [in] Specifies the x coordinate. // FirstVisibleCharIndex, // [in] Index of the first visible character in the text box // piCh // [out] Pointer to a variable that receives the character position corresponding to iX. // piTrailing // [out] Pointer to a variable that receives an indicator whether the position is the leading or trailing edge of the character. // // Return Values // If the function is successful, it returns S_OK. // If the function fails, it returns an HRESULT. // The return value can be tested with the SUCCEEDED and FAILED macros. bool XToCursorPosition(const NString &Str, int iX, unsigned int FirstVisibleCharIndex, int *piCh, int *piTrailing); bool BMFontParseFNT( std::istream &Stream); const Charset &GetFontInfo() const; std::vector TextureArray; private: INT _RefCount; INT _textureBMF; std::vector m_gl_texture_id; Charset m_Charset; friend class FontRenderer; }; } #endif //FONTTEXTURE_H