1 // Created on: 2013-09-16
2 // Copyright (c) 2013-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14 
15 #ifndef _StdPrs_BRepFont_H__
16 #define _StdPrs_BRepFont_H__
17 
18 #include <Adaptor3d_CurveOnSurface.hxx>
19 #include <BRep_Builder.hxx>
20 #include <Font_FTFont.hxx>
21 #include <Font_TextFormatter.hxx>
22 #include <Geom2dAdaptor_Curve.hxx>
23 #include <Geom2dConvert_CompCurveToBSplineCurve.hxx>
24 #include <gp_Ax3.hxx>
25 #include <gp_XY.hxx>
26 #include <gp_XYZ.hxx>
27 #include <NCollection_DataMap.hxx>
28 #include <NCollection_String.hxx>
29 #include <Standard_Mutex.hxx>
30 #include <TColgp_Array1OfPnt2d.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopoDS_Face.hxx>
33 #include <TopTools_SequenceOfShape.hxx>
34 
35 DEFINE_STANDARD_HANDLE(StdPrs_BRepFont, Standard_Transient)
36 
37 //! This tool provides basic services for rendering of vectorized text glyphs as BRep shapes.
38 //! Single instance initialize single font for sequential glyphs rendering with implicit caching of already rendered glyphs.
39 //! Thus position of each glyph in the text is specified by shape location.
40 //!
41 //! Please notice that this implementation uses mutex for thread-safety access,
42 //! thus may lead to performance penalties in case of concurrent access.
43 //! Although caching should eliminate this issue after rendering of sufficient number of glyphs.
44 class StdPrs_BRepFont : public Standard_Transient
45 {
46   DEFINE_STANDARD_RTTIEXT(StdPrs_BRepFont, Standard_Transient)
47 public:
48 
49   //! Find the font Initialize the font.
50   //! @param theFontName    the font name
51   //! @param theFontAspect  the font style
52   //! @param theSize        the face size in model units
53   //! @param theStrictLevel search strict level for using aliases and fallback
54   //! @return true on success
55   Standard_EXPORT static Handle(StdPrs_BRepFont) FindAndCreate (const TCollection_AsciiString& theFontName,
56                                                                 const Font_FontAspect     theFontAspect,
57                                                                 const Standard_Real       theSize,
58                                                                 const Font_StrictLevel    theStrictLevel = Font_StrictLevel_Any);
59 
60   //! Empty constructor
61   Standard_EXPORT StdPrs_BRepFont();
62 
63   //! Constructor with initialization.
64   //! @param theFontPath FULL path to the font
65   //! @param theSize     the face size in model units
66   //! @param theFaceId   face id within the file (0 by default)
67   Standard_EXPORT StdPrs_BRepFont (const NCollection_String& theFontPath,
68                                    const Standard_Real       theSize,
69                                    const Standard_Integer    theFaceId = 0);
70 
71   //! Constructor with initialization.
72   //! @param theFontName    the font name
73   //! @param theFontAspect  the font style
74   //! @param theSize        the face size in model units
75   //! @param theStrictLevel search strict level for using aliases and fallback
76   Standard_EXPORT StdPrs_BRepFont (const NCollection_String& theFontName,
77                                    const Font_FontAspect     theFontAspect,
78                                    const Standard_Real       theSize,
79                                    const Font_StrictLevel    theStrictLevel = Font_StrictLevel_Any);
80 
81   //! Release currently loaded font.
82   Standard_EXPORT virtual void Release();
83 
84   //! Initialize the font.
85   //! @param theFontPath FULL path to the font
86   //! @param theSize     the face size in model units
87   //! @param theFaceId   face id within the file (0 by default)
88   //! @return true on success
89   Standard_EXPORT bool Init (const NCollection_String& theFontPath,
90                              const Standard_Real       theSize,
91                              const Standard_Integer    theFaceId);
92 
93   //! Find (using Font_FontMgr) and initialize the font from the given name.
94   //! Please take into account that size is specified NOT in typography points (pt.).
95   //! If you need to specify size in points, value should be converted.
96   //! Formula for pt. -> m conversion:
97   //!   aSizeMeters = 0.0254 * theSizePt / 72.0
98   //! @param theFontName   the font name
99   //! @param theFontAspect the font style
100   //! @param theSize       the face size in model units
101   //! @param theStrictLevel search strict level for using aliases and fallback
102   //! @return true on success
103   Standard_EXPORT bool FindAndInit (const TCollection_AsciiString& theFontName,
104                                     const Font_FontAspect  theFontAspect,
105                                     const Standard_Real    theSize,
106                                     const Font_StrictLevel theStrictLevel = Font_StrictLevel_Any);
107 
108   //! Return wrapper over FreeType font.
Handle(Font_FTFont)109   const Handle(Font_FTFont)& FTFont() const { return myFTFont; }
110 
111   //! Render single glyph as TopoDS_Shape.
112   //! @param theChar glyph identifier
113   //! @return rendered glyph within cache, might be NULL shape
114   Standard_EXPORT TopoDS_Shape RenderGlyph (const Standard_Utf32Char& theChar);
115 
116   //! Setup glyph geometry construction mode.
117   //! By default algorithm creates independent TopoDS_Edge
118   //! for each original curve in the glyph (line segment or Bezie curve).
119   //! Algorithm might optionally create composite BSpline curve for each contour
120   //! which reduces memory footprint but limits curve class to C0.
121   //! Notice that altering this flag clears currently accumulated cache!
122   Standard_EXPORT void SetCompositeCurveMode (const Standard_Boolean theToConcatenate);
123 
124   //! Setup glyph scaling along X-axis.
125   //! By default glyphs are not scaled (scaling factor = 1.0)
SetWidthScaling(const float theScaleFactor)126   void SetWidthScaling (const float theScaleFactor)
127   {
128     myFTFont->SetWidthScaling (theScaleFactor);
129   }
130 
131 public:
132 
133   //! @return vertical distance from the horizontal baseline to the highest character coordinate.
Ascender() const134   Standard_Real Ascender() const
135   {
136     return myScaleUnits * Standard_Real(myFTFont->Ascender());
137   }
138 
139   //! @return vertical distance from the horizontal baseline to the lowest character coordinate.
Descender() const140   Standard_Real Descender() const
141   {
142     return myScaleUnits * Standard_Real(myFTFont->Descender());
143   }
144 
145   //! @return default line spacing (the baseline-to-baseline distance).
LineSpacing() const146   Standard_Real LineSpacing() const
147   {
148     return myScaleUnits * Standard_Real(myFTFont->LineSpacing());
149   }
150 
151   //! Configured point size
PointSize() const152   Standard_Real PointSize() const
153   {
154     return myScaleUnits * Standard_Real(myFTFont->PointSize());
155   }
156 
157   //! Compute advance to the next character with kerning applied when applicable.
158   //! Assuming text rendered horizontally.
AdvanceX(const Standard_Utf32Char theUCharNext)159   Standard_Real AdvanceX (const Standard_Utf32Char theUCharNext)
160   {
161     return myScaleUnits * Standard_Real(myFTFont->AdvanceX (theUCharNext));
162   }
163 
164   //! Compute advance to the next character with kerning applied when applicable.
165   //! Assuming text rendered horizontally.
AdvanceX(const Standard_Utf32Char theUChar,const Standard_Utf32Char theUCharNext)166   Standard_Real AdvanceX (const Standard_Utf32Char theUChar,
167                           const Standard_Utf32Char theUCharNext)
168   {
169     return myScaleUnits * Standard_Real(myFTFont->AdvanceX (theUChar, theUCharNext));
170   }
171 
172   //! Compute advance to the next character with kerning applied when applicable.
173   //! Assuming text rendered vertically.
AdvanceY(const Standard_Utf32Char theUCharNext)174   Standard_Real AdvanceY (const Standard_Utf32Char theUCharNext)
175   {
176     return myScaleUnits * Standard_Real(myFTFont->AdvanceY (theUCharNext));
177   }
178 
179   //! Compute advance to the next character with kerning applied when applicable.
180   //! Assuming text rendered vertically.
AdvanceY(const Standard_Utf32Char theUChar,const Standard_Utf32Char theUCharNext)181   Standard_Real AdvanceY (const Standard_Utf32Char theUChar,
182                           const Standard_Utf32Char theUCharNext)
183   {
184     return myScaleUnits * Standard_Real(myFTFont->AdvanceY (theUChar, theUCharNext));
185   }
186 
187   //! Returns scaling factor for current font size.
Scale() const188   Standard_Real Scale() const
189   {
190     return myScaleUnits;
191   }
192 
193   //! Returns mutex.
Mutex()194   Standard_Mutex& Mutex()
195   {
196     return myMutex;
197   }
198 
199 public:
200 
201   //! Find (using Font_FontMgr) and initialize the font from the given name.
202   //! Alias for FindAndInit() for backward compatibility.
Init(const NCollection_String & theFontName,const Font_FontAspect theFontAspect,const Standard_Real theSize)203   bool Init (const NCollection_String& theFontName,
204              const Font_FontAspect     theFontAspect,
205              const Standard_Real       theSize)
206   {
207     return FindAndInit (theFontName.ToCString(), theFontAspect, theSize, Font_StrictLevel_Any);
208   }
209 
210 protected:
211 
212   //! Render single glyph as TopoDS_Shape. This method does not lock the mutex.
213   //! @param theChar  glyph identifier
214   //! @param theShape rendered glyph within cache, might be NULL shape
215   //! @return true if glyph's geometry is available
216   Standard_EXPORT Standard_Boolean renderGlyph (const Standard_Utf32Char theChar,
217                                                 TopoDS_Shape&            theShape);
218 
219 private:
220 
221   //! Initialize class fields
222   void init();
223 
224   //! Auxiliary method to create 3D curve
225   bool to3d (const Handle(Geom2d_Curve)& theCurve2d,
226              const GeomAbs_Shape        theContinuity,
227              Handle(Geom_Curve)&        theCurve3d);
228 
229   //! Auxiliary method for creation faces from sequence of wires.
230   //! Splits to few faces (if it is needed) and updates orientation of wires.
231   Standard_Boolean buildFaces (const NCollection_Sequence<TopoDS_Wire>& theWires,
232                                TopoDS_Shape& theRes);
233 
234 protected: //! @name Protected fields
235 
236   Handle(Font_FTFont) myFTFont;            //!< wrapper over FreeType font
237   NCollection_DataMap<Standard_Utf32Char, TopoDS_Shape>
238                        myCache;            //!< glyphs cache
239   Standard_Mutex       myMutex;            //!< lock for thread-safety
240   Handle(Geom_Surface) mySurface;          //!< surface to place glyphs on to
241   Standard_Real        myPrecision;        //!< algorithm precision
242   Standard_Real        myScaleUnits;       //!< scale font rendering units into model units
243   Standard_Boolean     myIsCompositeCurve; //!< flag to merge C1 curves of each contour into single C0 curve, OFF by default
244 
245 protected: //! @name Shared temporary variables for glyph construction
246 
247   Adaptor3d_CurveOnSurface myCurvOnSurf;
248   Handle(Geom2dAdaptor_Curve) myCurve2dAdaptor;
249   Geom2dConvert_CompCurveToBSplineCurve myConcatMaker;
250   TColgp_Array1OfPnt2d     my3Poles;
251   TColgp_Array1OfPnt2d     my4Poles;
252   BRep_Builder             myBuilder;
253 
254 };
255 
256 #endif // _StdPrs_BRepFont_H__
257