0028915: Configuration, Font_BRepFont - do not include FreeType headers within OCCT...
[occt.git] / src / Font / Font_FTFont.hxx
1 // Created on: 2013-01-28
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 _Font_FTFont_H__
17 #define _Font_FTFont_H__
18
19 #include <Font_FontAspect.hxx>
20 #include <Font_Rect.hxx>
21 #include <Graphic3d_HorizontalTextAlignment.hxx>
22 #include <Graphic3d_VerticalTextAlignment.hxx>
23 #include <Image_PixMap.hxx>
24 #include <NCollection_String.hxx>
25
26 // forward declarations to avoid including of FreeType headers
27 typedef struct FT_FaceRec_* FT_Face;
28 typedef struct FT_Vector_   FT_Vector;
29 class Font_FTLibrary;
30
31 //! Wrapper over FreeType font.
32 //! Notice that this class uses internal buffers for loaded glyphs
33 //! and it is absolutely UNSAFE to load/read glyph from concurrent threads!
34 class Font_FTFont : public Standard_Transient
35 {
36 public:
37
38   //! Create uninitialized instance.
39   Standard_EXPORT Font_FTFont (const Handle(Font_FTLibrary)& theFTLib = Handle(Font_FTLibrary)());
40
41   //! Destructor.
42   Standard_EXPORT virtual ~Font_FTFont();
43
44   //! @return true if font is loaded
45   inline bool IsValid() const
46   {
47     return myFTFace != NULL;
48   }
49
50   //! @return image plane for currently rendered glyph
51   inline const Image_PixMap& GlyphImage() const
52   {
53     return myGlyphImg;
54   }
55
56   //! Initialize the font.
57   //! @param theFontPath   path to the font
58   //! @param thePointSize  the face size in points (1/72 inch)
59   //! @param theResolution the resolution of the target device in dpi
60   //! @return true on success
61   Standard_EXPORT bool Init (const NCollection_String& theFontPath,
62                              const unsigned int        thePointSize,
63                              const unsigned int        theResolution);
64
65   //! Initialize the font.
66   //! @param theFontName   the font name
67   //! @param theFontAspect the font style
68   //! @param thePointSize  the face size in points (1/72 inch)
69   //! @param theResolution the resolution of the target device in dpi
70   //! @return true on success
71   Standard_EXPORT bool Init (const NCollection_String& theFontName,
72                              const Font_FontAspect     theFontAspect,
73                              const unsigned int        thePointSize,
74                              const unsigned int        theResolution);
75
76   //! Release currently loaded font.
77   Standard_EXPORT virtual void Release();
78
79   //! Render specified glyph into internal buffer (bitmap).
80   Standard_EXPORT bool RenderGlyph (const Standard_Utf32Char theChar);
81
82   //! @return maximal glyph width in pixels (rendered to bitmap).
83   Standard_EXPORT unsigned int GlyphMaxSizeX() const;
84
85   //! @return maximal glyph height in pixels (rendered to bitmap).
86   Standard_EXPORT unsigned int GlyphMaxSizeY() const;
87
88   //! @return vertical distance from the horizontal baseline to the highest character coordinate.
89   Standard_EXPORT float Ascender() const;
90
91   //! @return vertical distance from the horizontal baseline to the lowest character coordinate.
92   Standard_EXPORT float Descender() const;
93
94   //! @return default line spacing (the baseline-to-baseline distance).
95   Standard_EXPORT float LineSpacing() const;
96
97   //! Configured point size
98   unsigned int PointSize() const
99   {
100     return myPointSize;
101   }
102
103   //! Compute advance to the next character with kerning applied when applicable.
104   //! Assuming text rendered horizontally.
105   Standard_EXPORT float AdvanceX (const Standard_Utf32Char theUCharNext);
106
107   //! Compute advance to the next character with kerning applied when applicable.
108   //! Assuming text rendered horizontally.
109   Standard_EXPORT float AdvanceX (const Standard_Utf32Char theUChar,
110                                   const Standard_Utf32Char theUCharNext);
111
112   //! Compute advance to the next character with kerning applied when applicable.
113   //! Assuming text rendered vertically.
114   Standard_EXPORT float AdvanceY (const Standard_Utf32Char theUCharNext);
115
116   //! Compute advance to the next character with kerning applied when applicable.
117   //! Assuming text rendered vertically.
118   Standard_EXPORT float AdvanceY (const Standard_Utf32Char theUChar,
119                                   const Standard_Utf32Char theUCharNext);
120
121   //! @return glyphs number in this font.
122   Standard_EXPORT Standard_Integer GlyphsNumber() const;
123
124   //! Retrieve glyph bitmap rectangle
125   Standard_EXPORT void GlyphRect (Font_Rect& theRect) const;
126
127   //! Computes bounding box of the given text using plain-text formatter (Font_TextFormatter).
128   //! Note that bounding box takes into account the text alignment options.
129   //! Its corners are relative to the text alignment anchor point, their coordinates can be negative.
130   Standard_EXPORT Font_Rect BoundingBox (const NCollection_String&               theString,
131                                          const Graphic3d_HorizontalTextAlignment theAlignX,
132                                          const Graphic3d_VerticalTextAlignment   theAlignY);
133
134 protected:
135
136   //! Convert value to 26.6 fixed-point format for FT library API.
137   template <typename theInput_t>
138   int32_t toFTPoints (const theInput_t thePointSize) const
139   {
140     return (int32_t)thePointSize * 64;
141   }
142
143   //! Convert value from 26.6 fixed-point format for FT library API.
144   template <typename theReturn_t, typename theFTUnits_t>
145   inline theReturn_t fromFTPoints (const theFTUnits_t theFTUnits) const
146   {
147     return (theReturn_t)theFTUnits / 64.0f;
148   }
149
150 protected:
151
152   //! Load glyph without rendering it.
153   Standard_EXPORT bool loadGlyph (const Standard_Utf32Char theUChar);
154
155 protected:
156
157   Handle(Font_FTLibrary) myFTLib;       //!< handle to the FT library object
158   FT_Face                myFTFace;      //!< FT face object
159   NCollection_String     myFontPath;    //!< font path
160   unsigned int           myPointSize;   //!< point size set by FT_Set_Char_Size
161   int32_t                myLoadFlags;   //!< default load flags
162
163   Image_PixMap           myGlyphImg;    //!< cached glyph plane
164   FT_Vector*             myKernAdvance; //!< buffer variable
165   Standard_Utf32Char     myUChar;       //!< currently loaded unicode character
166
167 public:
168
169   DEFINE_STANDARD_RTTIEXT(Font_FTFont,Standard_Transient) // Type definition
170
171 };
172
173 DEFINE_STANDARD_HANDLE(Font_FTFont, Standard_Transient)
174
175 #endif // _Font_FTFont_H__