0031079: Visualization - embed minimal fallback font
[occt.git] / src / Font / Font_FontMgr.hxx
1 // Created on: 2008-01-20
2 // Created by: Alexander A. BORODIN
3 // Copyright (c) 2008-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_FontMgr_HeaderFile
17 #define _Font_FontMgr_HeaderFile
18
19 #include <Standard.hxx>
20 #include <Standard_Transient.hxx>
21 #include <Standard_Type.hxx>
22 #include <Font_FontAspect.hxx>
23 #include <Font_NListOfSystemFont.hxx>
24 #include <Font_StrictLevel.hxx>
25 #include <Font_UnicodeSubset.hxx>
26 #include <NCollection_DataMap.hxx>
27 #include <NCollection_IndexedMap.hxx>
28 #include <NCollection_Shared.hxx>
29 #include <TColStd_SequenceOfHAsciiString.hxx>
30
31 class Font_SystemFont;
32 class TCollection_HAsciiString;
33
34 DEFINE_STANDARD_HANDLE(Font_FontMgr, Standard_Transient)
35
36 //! Collects and provides information about available fonts in system.
37 class Font_FontMgr : public Standard_Transient
38 {
39   DEFINE_STANDARD_RTTIEXT(Font_FontMgr, Standard_Transient)
40 public:
41
42   //! Return global instance of font manager.
43   Standard_EXPORT static Handle(Font_FontMgr) GetInstance();
44
45   //! Return font aspect as string.
46   static const char* FontAspectToString (Font_FontAspect theAspect)
47   {
48     switch (theAspect)
49     {
50       case Font_FontAspect_UNDEFINED:  return "undefined";
51       case Font_FontAspect_Regular:    return "regular";
52       case Font_FontAspect_Bold:       return "bold";
53       case Font_FontAspect_Italic:     return "italic";
54       case Font_FontAspect_BoldItalic: return "bold-italic";
55     }
56     return "invalid";
57   }
58
59   //! Return flag to use fallback fonts in case if used font does not include symbols from specific Unicode subset; TRUE by default.
60   Standard_EXPORT static Standard_Boolean& ToUseUnicodeSubsetFallback();
61
62 public:
63
64   //! Return the list of available fonts.
65   void AvailableFonts (Font_NListOfSystemFont& theList) const
66   {
67     for (Font_FontMap::Iterator aFontIter (myFontMap); aFontIter.More(); aFontIter.Next())
68     {
69       theList.Append (aFontIter.Value());
70     }
71   }
72
73   //! Return the list of available fonts.
74   Font_NListOfSystemFont GetAvailableFonts() const
75   {
76     Font_NListOfSystemFont aList;
77     AvailableFonts (aList);
78     return aList;
79   }
80
81   //! Returns sequence of available fonts names
82   Standard_EXPORT void GetAvailableFontsNames (TColStd_SequenceOfHAsciiString& theFontsNames) const;
83   
84   //! Returns font that match given parameters.
85   //! If theFontName is empty string returned font can have any FontName.
86   //! If theFontAspect is Font_FA_Undefined returned font can have any FontAspect.
87   //! If theFontSize is "-1" returned font can have any FontSize.
88   Standard_EXPORT Handle(Font_SystemFont) GetFont (const Handle(TCollection_HAsciiString)& theFontName, const Font_FontAspect theFontAspect, const Standard_Integer theFontSize) const;
89
90   //! Returns font that match given name or NULL if such font family is NOT registered.
91   //! Note that unlike FindFont(), this method ignores font aliases and does not look for fall-back.
92   Standard_EXPORT Handle(Font_SystemFont) GetFont (const TCollection_AsciiString& theFontName) const;
93
94   //! Tries to find font by given parameters.
95   //! If the specified font is not found tries to use font names mapping.
96   //! If the requested family name not found -> search for any font family with given aspect and height.
97   //! If the font is still not found, returns any font available in the system.
98   //! Returns NULL in case when the fonts are not found in the system.
99   //! @param theFontName    [in]       font family to find or alias name
100   //! @param theStrictLevel [in]       search strict level for using aliases and fallback
101   //! @param theFontAspect  [in] [out] font aspect to find (considered only if family name is not found);
102   //!                                  can be modified if specified font alias refers to another style (compatibility with obsolete aliases)
103   //! @param theDoFailMsg   [in]       put error message on failure into default messenger
104   Standard_EXPORT Handle(Font_SystemFont) FindFont (const TCollection_AsciiString& theFontName,
105                                                     Font_StrictLevel theStrictLevel,
106                                                     Font_FontAspect& theFontAspect,
107                                                     Standard_Boolean theDoFailMsg = Standard_True) const;
108
109   //! Tries to find font by given parameters.
110   Handle(Font_SystemFont) FindFont (const TCollection_AsciiString& theFontName,
111                                     Font_FontAspect& theFontAspect) const
112   {
113     return FindFont (theFontName, Font_StrictLevel_Any, theFontAspect);
114   }
115
116   //! Tries to find fallback font for specified Unicode subset.
117   //! Returns NULL in case when fallback font is not found in the system.
118   //! @param theSubset     [in] Unicode subset
119   //! @param theFontAspect [in] font aspect to find
120   Standard_EXPORT Handle(Font_SystemFont) FindFallbackFont (Font_UnicodeSubset theSubset,
121                                                             Font_FontAspect theFontAspect) const;
122
123   //! Read font file and retrieve information from it.
124   Standard_EXPORT Handle(Font_SystemFont) CheckFont (const Standard_CString theFontPath) const;
125   
126   //! Register new font.
127   //! If there is existing entity with the same name and properties but different path
128   //! then font will be overridden or ignored depending on theToOverride flag.
129   Standard_EXPORT Standard_Boolean RegisterFont (const Handle(Font_SystemFont)& theFont, const Standard_Boolean theToOverride);
130
131   //! Return flag for tracing font aliases usage via Message_Trace messages; TRUE by default.
132   Standard_Boolean ToTraceAliases() const { return myToTraceAliases; }
133
134   //! Set flag for tracing font alias usage; useful to trace which fonts are actually used.
135   //! Can be disabled to avoid redundant messages with Message_Trace level.
136   void SetTraceAliases (Standard_Boolean theToTrace) { myToTraceAliases = theToTrace; }
137
138   //! Collects available fonts paths.
139   Standard_EXPORT void InitFontDataBase();
140
141   //! Clear registry. Can be used for testing purposes.
142   Standard_EXPORT void ClearFontDataBase();
143
144 private:
145   
146   //! Creates empty font manager object
147   Standard_EXPORT Font_FontMgr();
148
149 private:
150
151   //! Map storing registered fonts.
152   class Font_FontMap : public NCollection_IndexedMap<Handle(Font_SystemFont), Font_SystemFont>
153   {
154   public:
155     //! Empty constructor.
156     Font_FontMap() {}
157
158     //! Try finding font with specified parameters or the closest one.
159     //! @param theFontName [in] font family to find (or empty string if family name can be ignored)
160     //! @return best match font or NULL if not found
161     Handle(Font_SystemFont) Find (const TCollection_AsciiString& theFontName) const;
162
163   public:
164     //! Computes a hash code for the system font, in the range [1, theUpperBound]. Based on Font Family, so that the
165     //! whole family with different aspects can be found within the same bucket of some map
166     //! @param theHExtendedString the handle referred to extended string which hash code is to be computed
167     //! @param theUpperBound the upper bound of the range a computing hash code must be within
168     //! @return a computed hash code, in the range [1, theUpperBound]
169     static Standard_Integer HashCode (const Handle (Font_SystemFont) & theSystemFont,
170                                       const Standard_Integer           theUpperBound)
171     {
172       return ::HashCode (theSystemFont->FontKey(), theUpperBound);
173     }
174
175     //! Matching two instances, for Map interface.
176     static bool IsEqual (const Handle(Font_SystemFont)& theFont1,
177                          const Handle(Font_SystemFont)& theFont2)
178     {
179       return theFont1->IsEqual (theFont2);
180     }
181
182   };
183
184   //! Structure defining font alias.
185   struct Font_FontAlias
186   {
187     TCollection_AsciiString FontName;
188     Font_FontAspect         FontAspect;
189
190     Font_FontAlias (const TCollection_AsciiString& theFontName, Font_FontAspect theFontAspect = Font_FontAspect_UNDEFINED) : FontName (theFontName), FontAspect (theFontAspect) {}
191     Font_FontAlias() : FontAspect (Font_FontAspect_UNDEFINED) {}
192   };
193
194   //! Sequence of font aliases.
195   typedef NCollection_Shared< NCollection_Sequence<Font_FontAlias> > Font_FontAliasSequence;
196
197   //! Register font alias.
198   void addFontAlias (const TCollection_AsciiString& theAliasName,
199                      const Handle(Font_FontAliasSequence)& theAliases,
200                      Font_FontAspect theAspect = Font_FontAspect_UNDEFINED);
201
202 private:
203
204   Font_FontMap myFontMap;
205   NCollection_DataMap<TCollection_AsciiString, Handle(Font_FontAliasSequence)> myFontAliases;
206   Handle(Font_FontAliasSequence) myFallbackAlias;
207   Standard_Boolean myToTraceAliases;
208
209 };
210
211 #endif // _Font_FontMgr_HeaderFile