]> git.saurik.com Git - wxWidgets.git/blame - src/mac/classic/font.cpp
Stop crash when wxVSCROLL is specified for native OS X wxListCtrl.
[wxWidgets.git] / src / mac / classic / font.cpp
CommitLineData
2646f485 1/////////////////////////////////////////////////////////////////////////////
18f3decb 2// Name: src/mac/classic/font.cpp
2646f485
SC
3// Purpose: wxFont class
4// Author: Stefan Csomor
5// Modified by:
6// Created: 1998-01-01
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
65571936 9// Licence: wxWindows licence
2646f485
SC
10/////////////////////////////////////////////////////////////////////////////
11
18f3decb
WS
12#include "wx/wxprec.h"
13
14#ifdef __BORLANDC__
15 #pragma hdrstop
16#endif
17
2646f485 18#include "wx/font.h"
df91131c
WS
19
20#ifndef WX_PRECOMP
21 #include "wx/string.h"
de6185e2 22 #include "wx/utils.h"
dd05139a 23 #include "wx/gdicmn.h"
df91131c
WS
24#endif
25
2646f485 26#include "wx/fontutil.h"
2646f485
SC
27
28#include "wx/fontutil.h"
29
30#include "wx/mac/private.h"
31#include <ATSUnicode.h>
32
2646f485 33IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
2646f485
SC
34
35class WXDLLEXPORT wxFontRefData: public wxGDIRefData
36{
37 friend class WXDLLEXPORT wxFont;
38public:
39 wxFontRefData()
40 : m_fontId(0)
41 , m_pointSize(10)
42 , m_family(wxDEFAULT)
43 , m_style(wxNORMAL)
44 , m_weight(wxNORMAL)
18f3decb 45 , m_underlined(false)
2646f485
SC
46 , m_faceName(wxT("Geneva"))
47 , m_encoding(wxFONTENCODING_DEFAULT)
48 , m_macFontNum(0)
49 , m_macFontSize(0)
50 , m_macFontStyle(0)
51 , m_macATSUFontID()
52 {
18f3decb 53 Init(10, wxDEFAULT, wxNORMAL, wxNORMAL, false,
2646f485
SC
54 wxT("Geneva"), wxFONTENCODING_DEFAULT);
55 }
56
57 wxFontRefData(const wxFontRefData& data)
58 : wxGDIRefData()
59 , m_fontId(data.m_fontId)
60 , m_pointSize(data.m_pointSize)
61 , m_family(data.m_family)
62 , m_style(data.m_style)
63 , m_weight(data.m_weight)
64 , m_underlined(data.m_underlined)
65 , m_faceName(data.m_faceName)
66 , m_encoding(data.m_encoding)
67 , m_macFontNum(data.m_macFontNum)
68 , m_macFontSize(data.m_macFontSize)
69 , m_macFontStyle(data.m_macFontStyle)
70 , m_macATSUFontID(data.m_macATSUFontID)
71 {
72 Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
73 data.m_underlined, data.m_faceName, data.m_encoding);
74 }
75
76 wxFontRefData(int size,
77 int family,
78 int style,
79 int weight,
80 bool underlined,
81 const wxString& faceName,
82 wxFontEncoding encoding)
83 : m_fontId(0)
84 , m_pointSize(size)
85 , m_family(family)
86 , m_style(style)
87 , m_weight(weight)
88 , m_underlined(underlined)
89 , m_faceName(faceName)
90 , m_encoding(encoding)
91 , m_macFontNum(0)
92 , m_macFontSize(0)
93 , m_macFontStyle(0)
94 , m_macATSUFontID(0)
95 {
96 Init(size, family, style, weight, underlined, faceName, encoding);
97 }
98
99 virtual ~wxFontRefData();
18f3decb 100 void SetNoAntiAliasing( bool no = true ) { m_noAA = no; }
da0a6b01 101 bool GetNoAntiAliasing() const { return m_noAA; }
18f3decb 102
2646f485
SC
103protected:
104 // common part of all ctors
105 void Init(int size,
106 int family,
107 int style,
108 int weight,
109 bool underlined,
110 const wxString& faceName,
111 wxFontEncoding encoding);
112
113 // font characterstics
114 int m_fontId;
115 int m_pointSize;
116 int m_family;
117 int m_style;
118 int m_weight;
119 bool m_underlined;
120 wxString m_faceName;
121 wxFontEncoding m_encoding;
18f3decb
WS
122 bool m_noAA; // No anti-aliasing
123
2646f485
SC
124public:
125 short m_macFontNum;
126 short m_macFontSize;
127 unsigned char m_macFontStyle;
128 wxUint32 m_macATSUFontID;
129
130 wxNativeFontInfo m_info;
131
132public:
133 void MacFindFont() ;
134};
873fd4af 135
68c95704 136#define M_FONTDATA ((wxFontRefData*)m_refData)
873fd4af 137
2646f485
SC
138// ============================================================================
139// implementation
140// ============================================================================
141
142// ----------------------------------------------------------------------------
143// wxFontRefData
144// ----------------------------------------------------------------------------
145
146void wxFontRefData::Init(int pointSize,
147 int family,
148 int style,
149 int weight,
150 bool underlined,
151 const wxString& faceName,
152 wxFontEncoding encoding)
153{
154 m_style = style;
155 m_pointSize = pointSize;
156 m_family = family;
157 m_style = style;
158 m_weight = weight;
159 m_underlined = underlined;
160 m_faceName = faceName;
161 m_encoding = encoding;
162
163 m_macFontNum = 0 ;
164 m_macFontSize = 0;
165 m_macFontStyle = 0;
166 m_fontId = 0;
18f3decb 167 m_noAA = false;
2646f485
SC
168}
169
170wxFontRefData::~wxFontRefData()
171{
172}
173
174void wxFontRefData::MacFindFont()
175{
df91131c 176 if( m_faceName.empty() )
2646f485
SC
177 {
178 switch( m_family )
179 {
180 case wxDEFAULT :
181 m_macFontNum = ::GetAppFont() ;
182 break ;
183 case wxDECORATIVE :
184 ::GetFNum( "\pTimes" , &m_macFontNum) ;
185 break ;
186 case wxROMAN :
187 ::GetFNum( "\pTimes" , &m_macFontNum) ;
188 break ;
189 case wxSCRIPT :
190 ::GetFNum( "\pTimes" , &m_macFontNum) ;
191 break ;
192 case wxSWISS :
193 ::GetFNum( "\pGeneva" , &m_macFontNum) ;
194 break ;
195 case wxMODERN :
196 ::GetFNum( "\pMonaco" , &m_macFontNum) ;
197 break ;
198 }
199 Str255 name ;
200 GetFontName( m_macFontNum , name ) ;
201 m_faceName = wxMacMakeStringFromPascal( name ) ;
202 }
203 else
204 {
205 if ( m_faceName == wxT("systemfont") )
206 m_macFontNum = ::GetSysFont() ;
207 else if ( m_faceName == wxT("applicationfont") )
208 m_macFontNum = ::GetAppFont() ;
209 else
210 {
211 Str255 fontname ;
212 wxMacStringToPascal( m_faceName , fontname ) ;
213 ::GetFNum( fontname, &m_macFontNum);
214 }
215 }
216
217 m_macFontStyle = 0;
218 if (m_weight == wxBOLD)
219 m_macFontStyle |= bold;
18f3decb 220 if (m_style == wxITALIC || m_style == wxSLANT)
2646f485 221 m_macFontStyle |= italic;
18f3decb 222 if (m_underlined)
2646f485
SC
223 m_macFontStyle |= underline;
224 m_macFontSize = m_pointSize ;
18f3decb 225
2646f485
SC
226 //TODO:if we supply the style as an additional parameter we must make a testing
227 //sequence in order to degrade gracefully while trying to maintain most of the style
228 //information, meanwhile we just take the normal font and apply the features after
229#ifdef __WXDEBUG__
230 OSStatus status =
231#endif // __WXDEBUG__
18f3decb 232 ::ATSUFONDtoFontID(m_macFontNum, normal /*qdStyle*/, (UInt32*)&m_macATSUFontID);
2646f485
SC
233 /*
234 status = ATSUFindFontFromName ( (Ptr) m_faceName , strlen( m_faceName ) ,
235 kFontFullName, kFontMacintoshPlatform, kFontRomanScript , kFontNoLanguage , (UInt32*)&m_macATSUFontID ) ;
236 */
237 wxASSERT_MSG( status == noErr , wxT("couldn't retrieve font identifier") ) ;
238}
239
240// ----------------------------------------------------------------------------
241// wxFont
242// ----------------------------------------------------------------------------
2646f485
SC
243}
244
245bool wxFont::Create(const wxNativeFontInfo& info)
246{
247 return Create(info.pointSize, info.family, info.style, info.weight,
248 info.underlined, info.faceName, info.encoding);
249}
250
251wxFont::wxFont(const wxString& fontdesc)
252{
253 wxNativeFontInfo info;
254 if ( info.FromString(fontdesc) )
255 (void)Create(info);
256}
257
258bool wxFont::Create(int pointSize,
259 int family,
260 int style,
261 int weight,
262 bool underlined,
263 const wxString& faceName,
264 wxFontEncoding encoding)
265{
266 UnRef();
267 m_refData = new wxFontRefData(pointSize, family, style, weight,
268 underlined, faceName, encoding);
269
270 RealizeResource();
271
18f3decb 272 return true;
2646f485
SC
273}
274
275wxFont::~wxFont()
276{
277}
278
279bool wxFont::RealizeResource()
280{
281 M_FONTDATA->MacFindFont() ;
18f3decb 282 return true;
2646f485
SC
283}
284
285void wxFont::SetEncoding(wxFontEncoding encoding)
286{
287 Unshare();
288
289 M_FONTDATA->m_encoding = encoding;
290
291 RealizeResource();
292}
293
294void wxFont::Unshare()
295{
296 // Don't change shared data
297 if (!m_refData)
298 {
299 m_refData = new wxFontRefData();
300 }
301 else
302 {
303 wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData);
304 UnRef();
305 m_refData = ref;
306 }
307}
308
309void wxFont::SetPointSize(int pointSize)
310{
311 Unshare();
312
313 M_FONTDATA->m_pointSize = pointSize;
314
315 RealizeResource();
316}
317
318void wxFont::SetFamily(int family)
319{
320 Unshare();
321
322 M_FONTDATA->m_family = family;
323
324 RealizeResource();
325}
326
327void wxFont::SetStyle(int style)
328{
329 Unshare();
330
331 M_FONTDATA->m_style = style;
332
333 RealizeResource();
334}
335
336void wxFont::SetWeight(int weight)
337{
338 Unshare();
339
340 M_FONTDATA->m_weight = weight;
341
342 RealizeResource();
343}
344
85ab460e 345bool wxFont::SetFaceName(const wxString& faceName)
2646f485
SC
346{
347 Unshare();
348
349 M_FONTDATA->m_faceName = faceName;
350
351 RealizeResource();
85ab460e
VZ
352
353 return wxFontBase::SetFaceName(faceName);
2646f485
SC
354}
355
356void wxFont::SetUnderlined(bool underlined)
357{
358 Unshare();
359
360 M_FONTDATA->m_underlined = underlined;
361
362 RealizeResource();
363}
364
365void wxFont::SetNoAntiAliasing( bool no )
366{
367 Unshare();
368
369 M_FONTDATA->SetNoAntiAliasing( no );
370
371 RealizeResource();
372}
373
374// ----------------------------------------------------------------------------
375// accessors
376// ----------------------------------------------------------------------------
377
378// TODO: insert checks everywhere for M_FONTDATA == NULL!
379
380int wxFont::GetPointSize() const
381{
382 return M_FONTDATA->m_pointSize;
383}
384
385int wxFont::GetFamily() const
386{
387 return M_FONTDATA->m_family;
388}
389
390int wxFont::GetStyle() const
391{
392 return M_FONTDATA->m_style;
393}
394
395int wxFont::GetWeight() const
396{
397 return M_FONTDATA->m_weight;
398}
399
400bool wxFont::GetUnderlined() const
401{
402 return M_FONTDATA->m_underlined;
403}
404
405wxString wxFont::GetFaceName() const
406{
407 wxString str;
408 if ( M_FONTDATA )
409 str = M_FONTDATA->m_faceName ;
410 return str;
411}
412
413wxFontEncoding wxFont::GetEncoding() const
414{
415 return M_FONTDATA->m_encoding;
416}
417
da0a6b01 418bool wxFont::GetNoAntiAliasing() const
2646f485
SC
419{
420 return M_FONTDATA->m_noAA;
421}
422
423short wxFont::GetMacFontNum() const
424{
425 return M_FONTDATA->m_macFontNum;
426}
427
428short wxFont::GetMacFontSize() const
429{
430 return M_FONTDATA->m_macFontSize;
431}
432
433wxByte wxFont::GetMacFontStyle() const
434{
435 return M_FONTDATA->m_macFontStyle;
436}
437
438wxUint32 wxFont::GetMacATSUFontID() const
439{
440 return M_FONTDATA->m_macATSUFontID;
441}
442
443const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
444{
445 wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );
446
447 M_FONTDATA->m_info.InitFromFont(*this);
448
449 return &(M_FONTDATA->m_info);
450}