use C++ wrappers around DirectFB API for easier use
[wxWidgets.git] / src / dfb / font.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/dfb/font.cpp
3 // Purpose: wxFont implementation
4 // Author: Vaclav Slavik
5 // Created: 2006-08-08
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006 REA Elektronik GmbH
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #include "wx/font.h"
27
28 #ifndef WX_PRECOMP
29 #include "wx/app.h"
30 #endif
31
32 #include "wx/fontutil.h"
33 #include "wx/dfb/private.h"
34
35 // ----------------------------------------------------------------------------
36 // wxFontRefData
37 // ----------------------------------------------------------------------------
38
39 // FIXME: for now, always use single font
40 static wxIDirectFBFontPtr gs_font = NULL;
41 static unsigned gs_fontRefCnt = 0;
42
43 class wxFontRefData : public wxObjectRefData
44 {
45 public:
46 wxFontRefData(int size = wxDEFAULT,
47 int family = wxDEFAULT,
48 int style = wxDEFAULT,
49 int weight = wxDEFAULT,
50 bool underlined = false,
51 const wxString& faceName = wxEmptyString,
52 wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
53 {
54 if ( family == wxDEFAULT )
55 family = wxSWISS;
56 if ( style == wxDEFAULT )
57 style = wxNORMAL;
58 if ( weight == wxDEFAULT )
59 weight = wxNORMAL;
60 if ( size == wxDEFAULT )
61 size = 12;
62
63 m_info.family = (wxFontFamily)family;
64 m_info.faceName = faceName;
65 m_info.style = (wxFontStyle)style;
66 m_info.weight = (wxFontWeight)weight;
67 m_info.pointSize = size;
68 m_info.underlined = underlined;
69 m_info.encoding = encoding;
70
71 // FIXME: always use default font for now
72 if ( !gs_font )
73 {
74 DFBFontDescription desc;
75 desc.flags = (DFBFontDescriptionFlags)0;
76 wxIDirectFBFontPtr f(wxIDirectFB::Get()->CreateFont(NULL, &desc));
77 if ( f )
78 gs_font = f;
79 }
80 if ( gs_font ) // the above may fail
81 {
82 gs_fontRefCnt++;
83 m_font = gs_font;
84 }
85 }
86
87 wxFontRefData(const wxFontRefData& data)
88 {
89 m_info = data.m_info;
90 m_font = data.m_font;
91 }
92
93 ~wxFontRefData()
94 {
95 if ( m_font )
96 {
97 m_font.Reset();
98 // FIXME
99 if ( --gs_fontRefCnt == 0 )
100 gs_font = NULL;
101 }
102 }
103
104 wxNativeFontInfo m_info;
105 wxIDirectFBFontPtr m_font;
106 };
107
108
109 // ----------------------------------------------------------------------------
110 // wxFont
111 // ----------------------------------------------------------------------------
112
113 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
114
115 bool wxFont::Create(const wxNativeFontInfo& info)
116 {
117 return Create(info.pointSize, info.family, info.style, info.weight,
118 info.underlined, info.faceName, info.encoding);
119 }
120
121 bool wxFont::Create(int pointSize,
122 int family,
123 int style,
124 int weight,
125 bool underlined,
126 const wxString& face,
127 wxFontEncoding encoding)
128 {
129 m_refData = new wxFontRefData(pointSize, family, style, weight,
130 underlined, face, encoding);
131 return true;
132 }
133
134 wxObjectRefData *wxFont::CreateRefData() const
135 {
136 return new wxFontRefData;
137 }
138
139 wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
140 {
141 return new wxFontRefData(*(wxFontRefData *)data);
142 }
143
144
145 // ----------------------------------------------------------------------------
146 // accessors
147 // ----------------------------------------------------------------------------
148
149 wxIDirectFBFontPtr wxFont::GetDirectFBFont() const
150 {
151 wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
152
153 return M_FONTDATA->m_font;
154 }
155
156 int wxFont::GetPointSize() const
157 {
158 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
159
160 return M_FONTDATA->m_info.pointSize;
161 }
162
163 wxString wxFont::GetFaceName() const
164 {
165 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
166
167 return M_FONTDATA->m_info.faceName;
168 }
169
170 int wxFont::GetFamily() const
171 {
172 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
173
174 return M_FONTDATA->m_info.family;
175 }
176
177 int wxFont::GetStyle() const
178 {
179 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
180
181 return M_FONTDATA->m_info.style;
182 }
183
184 int wxFont::GetWeight() const
185 {
186 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
187
188 return M_FONTDATA->m_info.weight;
189 }
190
191 bool wxFont::GetUnderlined() const
192 {
193 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
194
195 return M_FONTDATA->m_info.underlined;
196 }
197
198
199 wxFontEncoding wxFont::GetEncoding() const
200 {
201 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
202
203 return M_FONTDATA->m_info.encoding;
204 }
205
206 bool wxFont::IsFixedWidth() const
207 {
208 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
209
210 return true; // FIXME_DFB
211 }
212
213 const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
214 {
215 wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
216
217 return &(M_FONTDATA->m_info);
218 }
219
220 // ----------------------------------------------------------------------------
221 // change font attributes
222 // ----------------------------------------------------------------------------
223
224 void wxFont::SetPointSize(int pointSize)
225 {
226 AllocExclusive();
227
228 M_FONTDATA->m_info.pointSize = pointSize;
229 }
230
231 void wxFont::SetFamily(int family)
232 {
233 AllocExclusive();
234
235 M_FONTDATA->m_info.family = (wxFontFamily)family;
236 }
237
238 void wxFont::SetStyle(int style)
239 {
240 AllocExclusive();
241
242 M_FONTDATA->m_info.style = (wxFontStyle)style;
243 }
244
245 void wxFont::SetWeight(int weight)
246 {
247 AllocExclusive();
248
249 M_FONTDATA->m_info.weight = (wxFontWeight)weight;
250 }
251
252 bool wxFont::SetFaceName(const wxString& faceName)
253 {
254 AllocExclusive();
255
256 M_FONTDATA->m_info.faceName = faceName;
257
258 return wxFontBase::SetFaceName(faceName);
259 }
260
261 void wxFont::SetUnderlined(bool underlined)
262 {
263 AllocExclusive();
264
265 M_FONTDATA->m_info.underlined = underlined;
266 }
267
268 void wxFont::SetEncoding(wxFontEncoding encoding)
269 {
270 AllocExclusive();
271
272 M_FONTDATA->m_info.encoding = encoding;
273 }