a174a3c5 |
1 | // Created on: 2013-01-29 |
2 | // Created by: Kirill GAVRILOV |
d5f74e42 |
3 | // Copyright (c) 2013-2014 OPEN CASCADE SAS |
a174a3c5 |
4 | // |
973c2be1 |
5 | // This file is part of Open CASCADE Technology software library. |
a174a3c5 |
6 | // |
d5f74e42 |
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 |
973c2be1 |
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. |
a174a3c5 |
12 | // |
973c2be1 |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
a174a3c5 |
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 (const 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__ |