0025703: Visualization - Decrease number of samplers used in ray-tracing mode
[occt.git] / src / OpenGl / OpenGl_Font.hxx
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_H__
17 #define _OpenGl_Font_H__
18
19 #include <OpenGl_Texture.hxx>
20 #include <OpenGl_Vec.hxx>
21
22 #include <Font_FTFont.hxx>
23
24 #include <NCollection_DataMap.hxx>
25 #include <NCollection_Vector.hxx>
26 #include <TCollection_AsciiString.hxx>
27
28 //! Texture font.
29 class OpenGl_Font : public OpenGl_Resource
30 {
31
32 public:
33
34   //! Simple structure stores tile rectangle.
35   struct Tile
36   {
37     Font_FTFont::Rect uv;      //!< UV coordinates in texture
38     Font_FTFont::Rect px;      //!< pixel displacement coordinates
39     GLuint            texture; //!< GL texture ID
40   };
41
42   struct RectI
43   {
44     Standard_Integer Left;
45     Standard_Integer Right;
46     Standard_Integer Top;
47     Standard_Integer Bottom;
48   };
49
50 public:
51
52   //! Main constructor.
53   Standard_EXPORT OpenGl_Font (const Handle(Font_FTFont)&     theFont,
54                                const TCollection_AsciiString& theKey = "");
55
56   //! Destroy object.
57   Standard_EXPORT virtual ~OpenGl_Font();
58
59   //! Destroy object - will release GPU memory if any
60   Standard_EXPORT virtual void Release (OpenGl_Context* theCtx);
61
62   //! @return key of shared resource
63   inline const TCollection_AsciiString& ResourceKey() const
64   {
65     return myKey;
66   }
67
68   //! @return FreeType font instance specified on construction.
69   inline const Handle(Font_FTFont)& FTFont() const
70   {
71     return myFont;
72   }
73
74   //! @return true if font was loaded successfully.
75   inline bool IsValid() const
76   {
77     return !myTextures.IsEmpty() && myTextures.First()->IsValid();
78   }
79
80   //! Notice that this method doesn't return initialization success state.
81   //! Use IsValid() instead.
82   //! @return true if initialization was already called.
83   inline bool WasInitialized() const
84   {
85     return !myTextures.IsEmpty();
86   }
87
88   //! Initialize GL resources.
89   //! FreeType font instance should be already initialized!
90   Standard_EXPORT bool Init (const Handle(OpenGl_Context)& theCtx);
91
92   //! Compute advance to the next character with kerning applied when applicable.
93   //! Assuming text rendered horizontally.
94   inline float AdvanceX (const Standard_Utf32Char theUChar,
95                          const Standard_Utf32Char theUCharNext)
96   {
97     return myFont->AdvanceX (theUChar, theUCharNext);
98   }
99
100   //! @return vertical distance from the horizontal baseline to the highest character coordinate
101   inline float Ascender() const
102   {
103     return myAscender;
104   }
105
106   //! @return vertical distance from the horizontal baseline to the lowest character coordinate
107   inline float Descender() const
108   {
109     return myDescender;
110   }
111
112   //! @return default line spacing (the baseline-to-baseline distance)
113   inline float LineSpacing() const
114   {
115     return myLineSpacing;
116   }
117
118   //! Compute glyph rectangle at specified pen position (on baseline)
119   //! and render it to texture if not already.
120   //! @param theCtx       active context
121   //! @param theUChar     unicode symbol to render
122   //! @param theUCharNext next symbol to compute advance with kerning when available
123   //! @param theGlyph     computed glyph position rectangle, texture ID and UV coordinates
124   //! @param thePen       pen position on baseline to place new glyph
125   Standard_EXPORT void RenderGlyph (const Handle(OpenGl_Context)& theCtx,
126                                     const Standard_Utf32Char      theUChar,
127                                     const Standard_Utf32Char      theUCharNext,
128                                     Tile&                         theGlyph,
129                                     OpenGl_Vec2&                  thePen);
130
131 protected:
132
133   //! Render new glyph to the texture.
134   bool renderGlyph (const Handle(OpenGl_Context)& theCtx,
135                     const Standard_Utf32Char      theChar);
136
137   //! Allocate new texture.
138   bool createTexture (const Handle(OpenGl_Context)& theCtx);
139
140 protected:
141
142   TCollection_AsciiString myKey;           //!< key of shared resource
143   Handle(Font_FTFont)     myFont;          //!< FreeType font instance
144   Standard_ShortReal      myAscender;      //!< ascender     provided my FT font
145   Standard_ShortReal      myDescender;     //!< descender    provided my FT font
146   Standard_ShortReal      myLineSpacing;   //!< line spacing provided my FT font
147   Standard_Integer        myTileSizeX;     //!< tile width
148   Standard_Integer        myTileSizeY;     //!< tile height
149   Standard_Integer        myLastTileId;    //!< id of last tile
150   RectI                   myLastTilePx;
151   Standard_Integer        myTextureFormat; //!< texture format
152
153   NCollection_Vector<Handle(OpenGl_Texture)> myTextures; //!< array of textures
154   NCollection_Vector<Tile>                   myTiles;    //!< array of loaded tiles
155
156   NCollection_DataMap<Standard_Utf32Char, Standard_Integer> myGlyphMap;
157
158 public:
159
160   DEFINE_STANDARD_RTTI(OpenGl_Font) // Type definition
161
162 };
163
164 DEFINE_STANDARD_HANDLE(OpenGl_Font, OpenGl_Resource)
165
166 #endif // _OpenGl_Font_H__