1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/private/fontmgr.h
3 // Purpose:     font management for ports that don't have their own
4 // Author:      Vaclav Slavik
5 // Created:     2006-11-18
6 // RCS-ID:      $Id: fontmgr.h 43855 2006-12-07 08:57:44Z PC $
7 // Copyright:   (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
8 //              (c) 2006 REA Elektronik GmbH
9 // Licence:     wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef _WX_PRIVATE_FONTMGR_H_
13 #define _WX_PRIVATE_FONTMGR_H_
14 
15 #include "wx/list.h"
16 #include "wx/fontutil.h"
17 
18 class wxFontsManager;
19 class wxFontInstance;
20 class wxFontInstanceList;
21 class wxFontFace;
22 class wxFontBundle;
23 class wxFontBundleHash;
24 class wxFontMgrFontRefData;
25 
26 WX_DECLARE_LIST(wxFontBundle, wxFontBundleList);
27 
28 /**
29     This class represents single font face with set parameters (point size,
30     antialiasing).
31  */
32 class wxFontInstanceBase
33 {
34 protected:
wxFontInstanceBase(float ptSize,bool aa)35     wxFontInstanceBase(float ptSize, bool aa) : m_ptSize(ptSize), m_aa(aa) {}
~wxFontInstanceBase()36     virtual ~wxFontInstanceBase() {}
37 
38 public:
GetPointSize()39     float GetPointSize() const { return m_ptSize; }
IsAntiAliased()40     bool IsAntiAliased() const { return m_aa; }
41 
42 protected:
43     float m_ptSize;
44     bool m_aa;
45 };
46 
47 
48 /// This class represents loaded font face (bundle+weight+italics).
49 class wxFontFaceBase
50 {
51 protected:
52     /// Ctor. Creates object with reference count = 0, Acquire() must be
53     /// called after the object is created.
54     wxFontFaceBase();
55     virtual ~wxFontFaceBase();
56 
57 public:
58     /// Increases reference count of the face
59     virtual void Acquire();
60 
61     /**
62         Decreases reference count of the face. Call this when you no longer
63         use the object returned by wxFontBundle. Note that this doesn't destroy
64         the object, but only optionally shuts it down, so it's possible to
65         call Acquire() and Release() more than once.
66      */
67     virtual void Release();
68 
69     /**
70         Returns instance of the font at given size.
71 
72         @param ptSize   point size of the font to create; note that this is
73                         a float and not integer, it should be wxFont's point
74                         size multipled by wxDC's scale factor
75         @param aa       should the font be antialiased?
76      */
77     virtual wxFontInstance *GetFontInstance(float ptSize, bool aa);
78 
79 protected:
80     /// Called to create a new instance of the font by GetFontInstance() if
81     /// it wasn't found it cache.
82     virtual wxFontInstance *CreateFontInstance(float ptSize, bool aa) = 0;
83 
84 protected:
85     unsigned m_refCnt;
86     wxFontInstanceList *m_instances;
87 };
88 
89 /**
90     This class represents font bundle. Font bundle is set of faces that have
91     the same name, but differ in weight and italics.
92  */
93 class wxFontBundleBase
94 {
95 public:
96     wxFontBundleBase();
97     virtual ~wxFontBundleBase();
98 
99     /// Returns name of the bundle
100     virtual wxString GetName() const = 0;
101 
102     /// Returns true if the font is fixe-width
103     virtual bool IsFixed() const = 0;
104 
105     /// Type of faces in the bundle
106     enum FaceType
107     {
108         // NB: values of these constants are set so that it's possible to
109         //     make OR-combinations of them and still get valid enum element
110         FaceType_Regular       = 0,
111         FaceType_Italic        = 1,
112         FaceType_Bold          = 2,
113         FaceType_BoldItalic    = FaceType_Italic | FaceType_Bold,
114 
115         FaceType_Max
116     };
117 
118     /// Returns true if the given face is available
HasFace(FaceType type)119     bool HasFace(FaceType type) const { return m_faces[type] != NULL; }
120 
121     /**
122         Returns font face object that can be used to render font of given type.
123 
124         Note that this method can only be called if HasFace(type) returns true.
125 
126         Acquire() was called on the returned object, you must call Release()
127         when you stop using it.
128      */
129     wxFontFace *GetFace(FaceType type) const;
130 
131     /**
132         Returns font face object that can be used to render given font.
133 
134         Acquire() was called on the returned object, you must call Release()
135         when you stop using it.
136      */
137     wxFontFace *GetFaceForFont(const wxFontMgrFontRefData& font) const;
138 
139 protected:
140     wxFontFace *m_faces[FaceType_Max];
141 };
142 
143 
144 /**
145     Base class for wxFontsManager class, which manages the list of all
146     available fonts and their loaded instances.
147  */
148 class wxFontsManagerBase
149 {
150 protected:
151     wxFontsManagerBase();
152     virtual ~wxFontsManagerBase();
153 
154 public:
155     /// Returns the font manager singleton, creating it if it doesn't exist
156     static wxFontsManager *Get();
157 
158     /// Called by wxApp to shut down the manager
159     static void CleanUp();
160 
161     /// Returns list of all available font bundles
GetBundles()162     const wxFontBundleList& GetBundles() const { return *m_list; }
163 
164     /**
165         Returns object representing font bundle with the given name.
166 
167         The returned object is owned by wxFontsManager, you must not delete it.
168      */
169     wxFontBundle *GetBundle(const wxString& name) const;
170 
171     /**
172         Returns object representing font bundle that can be used to render
173         given font.
174 
175         The returned object is owned by wxFontsManager, you must not delete it.
176      */
177     wxFontBundle *GetBundleForFont(const wxFontMgrFontRefData& font) const;
178 
179     /// This method must be called by derived
180     void AddBundle(wxFontBundle *bundle);
181 
182     /// Returns default facename for given wxFont family
183     virtual wxString GetDefaultFacename(wxFontFamily family) const = 0;
184 
185 private:
186     wxFontBundleHash *m_hash;
187     wxFontBundleList *m_list;
188 
189 protected:
190     static wxFontsManager *ms_instance;
191 };
192 
193 
194 
195 #if defined(__WXMGL__)
196     #include "wx/mgl/private/fontmgr.h"
197 #elif defined(__WXDFB__)
198     #include "wx/dfb/private/fontmgr.h"
199 #endif
200 
201 
202 
203 /// wxFontMgrFontRefData implementation using wxFontsManager classes
204 class wxFontMgrFontRefData : public wxObjectRefData
205 {
206 public:
207     wxFontMgrFontRefData(int size = wxDEFAULT,
208                   int family = wxDEFAULT,
209                   int style = wxDEFAULT,
210                   int weight = wxDEFAULT,
211                   bool underlined = false,
212                   const wxString& faceName = wxEmptyString,
213                   wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
214     wxFontMgrFontRefData(const wxFontMgrFontRefData& data);
215     ~wxFontMgrFontRefData();
216 
217     wxFontBundle *GetFontBundle() const;
218     wxFontInstance *GetFontInstance(float scale, bool antialiased) const;
219 
IsFixedWidth()220     bool IsFixedWidth() const { return GetFontBundle()->IsFixed(); }
221 
GetNativeFontInfo()222     const wxNativeFontInfo *GetNativeFontInfo() const { return &m_info; }
223 
GetPointSize()224     int GetPointSize() const { return m_info.pointSize; }
GetFaceName()225     wxString GetFaceName() const { return m_info.faceName; }
GetFamily()226     int GetFamily() const { return m_info.family; }
GetStyle()227     int GetStyle() const { return m_info.style; }
GetWeight()228     int GetWeight() const { return m_info.weight; }
GetUnderlined()229     bool GetUnderlined() const { return m_info.underlined; }
GetEncoding()230     wxFontEncoding GetEncoding() const { return m_info.encoding; }
231 
232     void SetPointSize(int pointSize);
233     void SetFamily(int family);
234     void SetStyle(int style);
235     void SetWeight(int weight);
236     void SetFaceName(const wxString& faceName);
237     void SetUnderlined(bool underlined);
238     void SetEncoding(wxFontEncoding encoding);
239 
240     // Unofficial API, don't use
241     void SetNoAntiAliasing(bool no);
GetNoAntiAliasing()242     bool GetNoAntiAliasing() const { return m_noAA; }
243 
244 private:
245     void EnsureValidFont();
246 
247     wxNativeFontInfo  m_info;
248     bool              m_noAA;
249 
250     wxFontFace       *m_fontFace;
251     wxFontBundle     *m_fontBundle;
252     bool              m_fontValid;
253 };
254 
255 #endif // _WX_PRIVATE_FONTMGR_H_
256