1 // Created on: 2013-01-29 2 // Created by: Kirill GAVRILOV 3 // Copyright (c) 2013-2014 OPEN CASCADE SAS 4 // 5 // This file is part of Open CASCADE Technology software library. 6 // 7 // This library is free software; you can redistribute it and/or modify it under 8 // the terms of the GNU Lesser General Public License version 2.1 as published 9 // by the Free Software Foundation, with special exception defined in the file 10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT 11 // distribution for complete text of the license and disclaimer of any warranty. 12 // 13 // Alternatively, this file may be used under the terms of Open CASCADE 14 // commercial license or contractual agreement. 15 16 #ifndef OpenGl_Font_HeaderFile 17 #define OpenGl_Font_HeaderFile 18 19 #include <OpenGl_Texture.hxx> 20 #include <OpenGl_Vec.hxx> 21 22 #include <Font_Rect.hxx> 23 24 #include <NCollection_DataMap.hxx> 25 #include <NCollection_Vector.hxx> 26 #include <TCollection_AsciiString.hxx> 27 28 class Font_FTFont; 29 30 //! Texture font. 31 class OpenGl_Font : public OpenGl_Resource 32 { 33 34 public: 35 36 //! Simple structure stores tile rectangle. 37 struct Tile 38 { 39 Font_Rect uv; //!< UV coordinates in texture 40 Font_Rect px; //!< pixel displacement coordinates 41 GLuint texture; //!< GL texture ID 42 }; 43 44 struct RectI 45 { 46 Standard_Integer Left; 47 Standard_Integer Right; 48 Standard_Integer Top; 49 Standard_Integer Bottom; 50 }; 51 52 public: 53 54 //! Main constructor. 55 Standard_EXPORT OpenGl_Font (const Handle(Font_FTFont)& theFont, 56 const TCollection_AsciiString& theKey = ""); 57 58 //! Destroy object. 59 Standard_EXPORT virtual ~OpenGl_Font(); 60 61 //! Destroy object - will release GPU memory if any 62 Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE; 63 64 //! Returns estimated GPU memory usage. 65 Standard_EXPORT virtual Standard_Size EstimatedDataSize() const Standard_OVERRIDE; 66 67 //! @return key of shared resource ResourceKey() const68 inline const TCollection_AsciiString& ResourceKey() const 69 { 70 return myKey; 71 } 72 73 //! @return FreeType font instance specified on construction. Handle(Font_FTFont)74 inline const Handle(Font_FTFont)& FTFont() const 75 { 76 return myFont; 77 } 78 79 //! @return true if font was loaded successfully. IsValid() const80 inline bool IsValid() const 81 { 82 return !myTextures.IsEmpty() && myTextures.First()->IsValid(); 83 } 84 85 //! Notice that this method doesn't return initialization success state. 86 //! Use IsValid() instead. 87 //! @return true if initialization was already called. WasInitialized() const88 inline bool WasInitialized() const 89 { 90 return !myTextures.IsEmpty(); 91 } 92 93 //! Initialize GL resources. 94 //! FreeType font instance should be already initialized! 95 Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx); 96 97 //! @return vertical distance from the horizontal baseline to the highest character coordinate Ascender() const98 inline float Ascender() const 99 { 100 return myAscender; 101 } 102 103 //! @return vertical distance from the horizontal baseline to the lowest character coordinate Descender() const104 inline float Descender() const 105 { 106 return myDescender; 107 } 108 109 //! Render glyph to texture if not already. 110 //! @param theCtx active context 111 //! @param theUChar unicode symbol to render 112 //! @param theGlyph computed glyph position rectangle, texture ID and UV coordinates 113 Standard_EXPORT bool RenderGlyph (const Handle(OpenGl_Context)& theCtx, 114 const Standard_Utf32Char theUChar, 115 Tile& theGlyph); 116 117 //! @return first texture. Handle(OpenGl_Texture)118 const Handle(OpenGl_Texture)& Texture() const 119 { 120 return myTextures.First(); 121 } 122 123 protected: 124 125 //! Render new glyph to the texture. 126 bool renderGlyph (const Handle(OpenGl_Context)& theCtx, 127 const Standard_Utf32Char theChar); 128 129 //! Allocate new texture. 130 bool createTexture (const Handle(OpenGl_Context)& theCtx); 131 132 protected: 133 134 TCollection_AsciiString myKey; //!< key of shared resource 135 Handle(Font_FTFont) myFont; //!< FreeType font instance 136 Standard_ShortReal myAscender; //!< ascender provided my FT font 137 Standard_ShortReal myDescender; //!< descender provided my FT font 138 Standard_Integer myTileSizeY; //!< tile height 139 Standard_Integer myLastTileId; //!< id of last tile 140 RectI myLastTilePx; 141 Standard_Integer myTextureFormat; //!< texture format 142 143 NCollection_Vector<Handle(OpenGl_Texture)> myTextures; //!< array of textures 144 NCollection_Vector<Tile> myTiles; //!< array of loaded tiles 145 146 NCollection_DataMap<Standard_Utf32Char, Standard_Integer> myGlyphMap; 147 148 public: 149 150 DEFINE_STANDARD_RTTIEXT(OpenGl_Font,OpenGl_Resource) // Type definition 151 152 }; 153 154 DEFINE_STANDARD_HANDLE(OpenGl_Font, OpenGl_Resource) 155 156 #endif // _OpenGl_Font_H__ 157