]> git.saurik.com Git - wxWidgets.git/blame - src/msw/font.cpp
Further steps towards media control support in WinCE (Ryan Norton)
[wxWidgets.git] / src / msw / font.cpp
CommitLineData
2bda0e17 1/////////////////////////////////////////////////////////////////////////////
a9249b2e 2// Name: src/msw/font.cpp
2bda0e17
KB
3// Purpose: wxFont class
4// Author: Julian Smart
5// Modified by:
6// Created: 01/02/97
7// RCS-ID: $Id$
77ffb593 8// Copyright: (c) wxWidgets team
65571936 9// Licence: wxWindows licence
2bda0e17
KB
10/////////////////////////////////////////////////////////////////////////////
11
0c5d3e1c
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
2bda0e17
KB
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
0c5d3e1c 24 #pragma hdrstop
2bda0e17
KB
25#endif
26
27#ifndef WX_PRECOMP
0c5d3e1c
VZ
28 #include "wx/list.h"
29 #include "wx/utils.h"
30 #include "wx/app.h"
31 #include "wx/font.h"
f94dfb38 32 #include "wx/log.h"
e4ffab29 33 #include "wx/encinfo.h"
0c5d3e1c 34#endif // WX_PRECOMP
2bda0e17 35
bff67a6a
VZ
36#include "wx/msw/private.h"
37
76e23cdb 38#include "wx/fontutil.h"
bff67a6a 39#include "wx/fontmap.h"
76e23cdb 40
1e6feb95 41#include "wx/tokenzr.h"
2bda0e17 42
066f1b7a
SC
43#if wxUSE_EXTENDED_RTTI
44
3ff066a4 45wxBEGIN_ENUM( wxFontFamily )
cbe874bd
WS
46 wxENUM_MEMBER( wxDEFAULT )
47 wxENUM_MEMBER( wxDECORATIVE )
48 wxENUM_MEMBER( wxROMAN )
49 wxENUM_MEMBER( wxSCRIPT )
50 wxENUM_MEMBER( wxSWISS )
51 wxENUM_MEMBER( wxMODERN )
52 wxENUM_MEMBER( wxTELETYPE )
3ff066a4
SC
53wxEND_ENUM( wxFontFamily )
54
55wxBEGIN_ENUM( wxFontStyle )
cbe874bd
WS
56 wxENUM_MEMBER( wxNORMAL )
57 wxENUM_MEMBER( wxITALIC )
58 wxENUM_MEMBER( wxSLANT )
3ff066a4
SC
59wxEND_ENUM( wxFontStyle )
60
61wxBEGIN_ENUM( wxFontWeight )
cbe874bd
WS
62 wxENUM_MEMBER( wxNORMAL )
63 wxENUM_MEMBER( wxLIGHT )
64 wxENUM_MEMBER( wxBOLD )
3ff066a4 65wxEND_ENUM( wxFontWeight )
066f1b7a
SC
66
67IMPLEMENT_DYNAMIC_CLASS_WITH_COPY_XTI(wxFont, wxGDIObject,"wx/font.h")
68
3ff066a4 69wxBEGIN_PROPERTIES_TABLE(wxFont)
cbe874bd
WS
70 wxPROPERTY( Size,int, SetPointSize, GetPointSize, 12 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
71 wxPROPERTY( Family, int , SetFamily, GetFamily, (int)wxDEFAULT , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontFamily
72 wxPROPERTY( Style, int , SetStyle, GetStyle, (int)wxNORMAL , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontStyle
73 wxPROPERTY( Weight, int , SetWeight, GetWeight, (int)wxNORMAL , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // wxFontWeight
74 wxPROPERTY( Underlined, bool , SetUnderlined, GetUnderlined, false , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
75 wxPROPERTY( Face, wxString , SetFaceName, GetFaceName, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
76 wxPROPERTY( Encoding, wxFontEncoding , SetEncoding, GetEncoding, wxFONTENCODING_DEFAULT , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
3ff066a4 77wxEND_PROPERTIES_TABLE()
066f1b7a 78
cbe874bd 79wxCONSTRUCTOR_6( wxFont , int , Size , int , Family , int , Style , int , Weight , bool , Underlined , wxString , Face )
066f1b7a 80
3ff066a4
SC
81wxBEGIN_HANDLERS_TABLE(wxFont)
82wxEND_HANDLERS_TABLE()
066f1b7a
SC
83
84#else
cbe874bd 85 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
066f1b7a
SC
86#endif
87
2bda0e17 88
3ca6a5f0
BP
89// ----------------------------------------------------------------------------
90// constants
91// ----------------------------------------------------------------------------
92
9cf8de4c
VZ
93// the mask used to extract the pitch from LOGFONT::lfPitchAndFamily field
94static const int PITCH_MASK = FIXED_PITCH | VARIABLE_PITCH;
95
0c5d3e1c
VZ
96// ----------------------------------------------------------------------------
97// wxFontRefData - the internal description of the font
98// ----------------------------------------------------------------------------
2bda0e17 99
0c5d3e1c 100class WXDLLEXPORT wxFontRefData: public wxGDIRefData
2bda0e17 101{
0c5d3e1c 102public:
a9249b2e 103 // constructors
0c5d3e1c
VZ
104 wxFontRefData()
105 {
c47addef 106 Init(-1, wxSize(0,0), false, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL,
8b5d5223 107 wxFONTWEIGHT_NORMAL, false, wxEmptyString,
544229d1 108 wxFONTENCODING_DEFAULT);
0c5d3e1c
VZ
109 }
110
111 wxFontRefData(int size,
544229d1
VZ
112 const wxSize& pixelSize,
113 bool sizeUsingPixels,
0c5d3e1c
VZ
114 int family,
115 int style,
116 int weight,
117 bool underlined,
118 const wxString& faceName,
119 wxFontEncoding encoding)
120 {
544229d1
VZ
121 Init(size, pixelSize, sizeUsingPixels, family, style, weight,
122 underlined, faceName, encoding);
0c5d3e1c 123 }
2bda0e17 124
04ef50df 125 wxFontRefData(const wxNativeFontInfo& info, WXHFONT hFont = 0)
09fcd889 126 {
04ef50df 127 Init(info, hFont);
09fcd889
VZ
128 }
129
04a18b0d 130 wxFontRefData(const wxFontRefData& data) : wxGDIRefData()
a9249b2e
VZ
131 {
132 if ( data.m_nativeFontInfoOk )
133 {
134 Init(data.m_nativeFontInfo);
135 }
136 else
137 {
544229d1
VZ
138 Init(data.m_pointSize, data.m_pixelSize, data.m_sizeUsingPixels,
139 data.m_family, data.m_style, data.m_weight,
a9249b2e
VZ
140 data.m_underlined, data.m_faceName, data.m_encoding);
141 }
142 }
143
0c5d3e1c
VZ
144 virtual ~wxFontRefData();
145
a9249b2e
VZ
146 // operations
147 bool Alloc(wxFont *font);
148
149 void Free();
150
151 // all wxFont accessors
152 int GetPointSize() const
153 {
154 return m_nativeFontInfoOk ? m_nativeFontInfo.GetPointSize()
155 : m_pointSize;
156 }
157
544229d1
VZ
158 wxSize GetPixelSize() const
159 {
160 return m_nativeFontInfoOk ? m_nativeFontInfo.GetPixelSize()
161 : m_pixelSize;
162 }
907173e5 163
544229d1
VZ
164 bool IsUsingSizeInPixels() const
165 {
907173e5 166 return m_nativeFontInfoOk ? true : m_sizeUsingPixels;
544229d1
VZ
167 }
168
a9249b2e
VZ
169 int GetFamily() const
170 {
171 return m_family;
172 }
173
174 int GetStyle() const
175 {
176 return m_nativeFontInfoOk ? m_nativeFontInfo.GetStyle()
177 : m_style;
178 }
179
180 int GetWeight() const
181 {
182 return m_nativeFontInfoOk ? m_nativeFontInfo.GetWeight()
183 : m_weight;
184 }
185
186 bool GetUnderlined() const
187 {
188 return m_nativeFontInfoOk ? m_nativeFontInfo.GetUnderlined()
189 : m_underlined;
190 }
191
192 wxString GetFaceName() const
193 {
194 wxString s;
195 if ( m_nativeFontInfoOk )
196 s = m_nativeFontInfo.GetFaceName();
197 else
198 s = m_faceName;
199
200 return s;
201 }
202
203 wxFontEncoding GetEncoding() const
204 {
205 return m_nativeFontInfoOk ? m_nativeFontInfo.GetEncoding()
206 : m_encoding;
207 }
208
209 WXHFONT GetHFONT() const { return m_hFont; }
210
211 // ... and setters
212 void SetPointSize(int pointSize)
213 {
214 if ( m_nativeFontInfoOk )
544229d1 215 {
a9249b2e 216 m_nativeFontInfo.SetPointSize(pointSize);
544229d1 217 }
a9249b2e 218 else
544229d1 219 {
a9249b2e 220 m_pointSize = pointSize;
8b5d5223 221 m_sizeUsingPixels = false;
544229d1
VZ
222 }
223 }
224
225 void SetPixelSize(const wxSize& pixelSize)
226 {
227 if ( m_nativeFontInfoOk )
228 {
229 m_nativeFontInfo.SetPixelSize(pixelSize);
230 }
231 else
232 {
233 m_pixelSize = pixelSize;
8b5d5223 234 m_sizeUsingPixels = true;
544229d1 235 }
a9249b2e
VZ
236 }
237
238 void SetFamily(int family)
239 {
240 m_family = family;
241 }
242
243 void SetStyle(int style)
244 {
245 if ( m_nativeFontInfoOk )
246 m_nativeFontInfo.SetStyle((wxFontStyle)style);
247 else
248 m_style = style;
249 }
250
251 void SetWeight(int weight)
252 {
253 if ( m_nativeFontInfoOk )
254 m_nativeFontInfo.SetWeight((wxFontWeight)weight);
255 else
256 m_weight = weight;
257 }
258
259 void SetFaceName(const wxString& faceName)
260 {
261 if ( m_nativeFontInfoOk )
262 m_nativeFontInfo.SetFaceName(faceName);
263 else
264 m_faceName = faceName;
265 }
266
267 void SetUnderlined(bool underlined)
268 {
269 if ( m_nativeFontInfoOk )
270 m_nativeFontInfo.SetUnderlined(underlined);
271 else
272 m_underlined = underlined;
273 }
274
275 void SetEncoding(wxFontEncoding encoding)
276 {
277 if ( m_nativeFontInfoOk )
278 m_nativeFontInfo.SetEncoding(encoding);
279 else
280 m_encoding = encoding;
281 }
282
283 // native font info tests
284 bool HasNativeFontInfo() const { return m_nativeFontInfoOk; }
285
286 const wxNativeFontInfo& GetNativeFontInfo() const
287 { return m_nativeFontInfo; }
288
0c5d3e1c
VZ
289protected:
290 // common part of all ctors
291 void Init(int size,
544229d1
VZ
292 const wxSize& pixelSize,
293 bool sizeUsingPixels,
0c5d3e1c
VZ
294 int family,
295 int style,
296 int weight,
297 bool underlined,
298 const wxString& faceName,
299 wxFontEncoding encoding);
300
04ef50df 301 void Init(const wxNativeFontInfo& info, WXHFONT hFont = 0);
09fcd889 302
0c5d3e1c
VZ
303 // font characterstics
304 int m_pointSize;
544229d1
VZ
305 wxSize m_pixelSize;
306 bool m_sizeUsingPixels;
0c5d3e1c
VZ
307 int m_family;
308 int m_style;
309 int m_weight;
310 bool m_underlined;
311 wxString m_faceName;
312 wxFontEncoding m_encoding;
313
314 // Windows font handle
315 WXHFONT m_hFont;
789034a0 316
09fcd889
VZ
317 // Native font info
318 wxNativeFontInfo m_nativeFontInfo;
319 bool m_nativeFontInfoOk;
0c5d3e1c
VZ
320};
321
322// ============================================================================
323// implementation
324// ============================================================================
325
326// ----------------------------------------------------------------------------
327// wxFontRefData
328// ----------------------------------------------------------------------------
329
330void wxFontRefData::Init(int pointSize,
544229d1
VZ
331 const wxSize& pixelSize,
332 bool sizeUsingPixels,
0c5d3e1c
VZ
333 int family,
334 int style,
335 int weight,
336 bool underlined,
337 const wxString& faceName,
338 wxFontEncoding encoding)
b823f5a1 339{
b9b3ccd9 340 m_style = style;
a9249b2e 341 m_pointSize = pointSize == -1 ? wxNORMAL_FONT->GetPointSize() : pointSize;
544229d1
VZ
342 m_pixelSize = pixelSize;
343 m_sizeUsingPixels = sizeUsingPixels;
b9b3ccd9
VZ
344 m_family = family;
345 m_style = style;
346 m_weight = weight;
347 m_underlined = underlined;
348 m_faceName = faceName;
0c5d3e1c
VZ
349 m_encoding = encoding;
350
b9b3ccd9 351 m_hFont = 0;
789034a0 352
cbe874bd 353 m_nativeFontInfoOk = false;
09fcd889
VZ
354}
355
04ef50df 356void wxFontRefData::Init(const wxNativeFontInfo& info, WXHFONT hFont)
09fcd889 357{
04ef50df
JS
358 // hFont may be zero, or it be passed in case we really want to
359 // use the exact font created in the underlying system
360 // (for example where we can't guarantee conversion from HFONT
361 // to LOGFONT back to HFONT)
362 m_hFont = hFont;
789034a0 363
cbe874bd 364 m_nativeFontInfoOk = true;
09fcd889 365 m_nativeFontInfo = info;
93692400
JS
366 // This is the best we can do since we don't have the
367 // correct information at this point.
368 m_family = wxSWISS;
b823f5a1
JS
369}
370
0c5d3e1c 371wxFontRefData::~wxFontRefData()
a9249b2e
VZ
372{
373 Free();
374}
375
376bool wxFontRefData::Alloc(wxFont *font)
377{
378 if ( !m_nativeFontInfoOk )
379 {
380 wxFillLogFont(&m_nativeFontInfo.lf, font);
cbe874bd 381 m_nativeFontInfoOk = true;
a9249b2e
VZ
382 }
383
384 HFONT hfont = ::CreateFontIndirect(&m_nativeFontInfo.lf);
385 if ( !hfont )
386 {
387 wxLogLastError(wxT("CreateFont"));
388
cbe874bd 389 return false;
a9249b2e
VZ
390 }
391
392 m_hFont = (WXHFONT)hfont;
393
cbe874bd 394 return true;
a9249b2e
VZ
395}
396
397void wxFontRefData::Free()
2bda0e17 398{
b9b3ccd9 399 if ( m_hFont )
0c5d3e1c 400 {
b9b3ccd9 401 if ( !::DeleteObject((HFONT) m_hFont) )
0c5d3e1c 402 {
f6bcfd97 403 wxLogLastError(wxT("DeleteObject(font)"));
0c5d3e1c 404 }
a9249b2e
VZ
405
406 m_hFont = 0;
0c5d3e1c 407 }
2bda0e17
KB
408}
409
09fcd889
VZ
410// ----------------------------------------------------------------------------
411// wxNativeFontInfo
412// ----------------------------------------------------------------------------
413
a9249b2e
VZ
414void wxNativeFontInfo::Init()
415{
416 wxZeroMemory(lf);
417}
418
419int wxNativeFontInfo::GetPointSize() const
420{
7936354d
VZ
421 // FIXME: using the screen here results in incorrect font size calculation
422 // for printing!
a9249b2e
VZ
423 const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
424
425 return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5);
426}
427
544229d1
VZ
428wxSize wxNativeFontInfo::GetPixelSize() const
429{
430 wxSize ret;
431 ret.SetHeight(lf.lfHeight);
432 ret.SetWidth(lf.lfWidth);
433 return ret;
434}
435
a9249b2e
VZ
436wxFontStyle wxNativeFontInfo::GetStyle() const
437{
438 return lf.lfItalic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL;
439}
440
441wxFontWeight wxNativeFontInfo::GetWeight() const
442{
443 if ( lf.lfWeight <= 300 )
444 return wxFONTWEIGHT_LIGHT;
445
446 if ( lf.lfWeight >= 600 )
447 return wxFONTWEIGHT_BOLD;
448
449 return wxFONTWEIGHT_NORMAL;
450}
451
452bool wxNativeFontInfo::GetUnderlined() const
453{
454 return lf.lfUnderline != 0;
455}
456
457wxString wxNativeFontInfo::GetFaceName() const
458{
459 return lf.lfFaceName;
460}
461
36e2bb4e
RD
462wxFontFamily wxNativeFontInfo::GetFamily() const
463{
9cf8de4c 464 wxFontFamily family;
36e2bb4e 465
9cf8de4c
VZ
466 // extract family from pitch-and-family
467 switch ( lf.lfPitchAndFamily & ~PITCH_MASK )
36e2bb4e
RD
468 {
469 case FF_ROMAN:
9cf8de4c 470 family = wxFONTFAMILY_ROMAN;
36e2bb4e
RD
471 break;
472
9cf8de4c
VZ
473 default:
474 wxFAIL_MSG( _T("unknown LOGFONT::lfFamily value") );
475 // fall through
476
36e2bb4e 477 case FF_SWISS:
9cf8de4c 478 family = wxFONTFAMILY_SWISS;
36e2bb4e
RD
479 break;
480
481 case FF_SCRIPT:
9cf8de4c 482 family = wxFONTFAMILY_SCRIPT;
36e2bb4e
RD
483 break;
484
485 case FF_MODERN:
9cf8de4c 486 family = wxFONTFAMILY_MODERN;
36e2bb4e
RD
487 break;
488
489 case FF_DECORATIVE:
9cf8de4c 490 family = wxFONTFAMILY_DECORATIVE;
36e2bb4e 491 break;
36e2bb4e 492 }
9cf8de4c
VZ
493
494 return family;
36e2bb4e
RD
495}
496
a9249b2e
VZ
497wxFontEncoding wxNativeFontInfo::GetEncoding() const
498{
499 return wxGetFontEncFromCharSet(lf.lfCharSet);
500}
501
502void wxNativeFontInfo::SetPointSize(int pointsize)
503{
7936354d
VZ
504 // FIXME: using the screen here results in incorrect font size calculation
505 // for printing!
a9249b2e
VZ
506 const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
507
508 lf.lfHeight = -(int)((pointsize*((double)ppInch)/72.0) + 0.5);
509}
510
544229d1
VZ
511void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
512{
513 lf.lfHeight = pixelSize.GetHeight();
514 lf.lfWidth = pixelSize.GetWidth();
515}
516
517
a9249b2e
VZ
518void wxNativeFontInfo::SetStyle(wxFontStyle style)
519{
520 switch ( style )
521 {
522 default:
523 wxFAIL_MSG( _T("unknown font style") );
524 // fall through
525
526 case wxFONTSTYLE_NORMAL:
a38d0585 527 lf.lfItalic = FALSE;
a9249b2e
VZ
528 break;
529
530 case wxFONTSTYLE_ITALIC:
531 case wxFONTSTYLE_SLANT:
532 lf.lfItalic = TRUE;
533 break;
534 }
535}
536
537void wxNativeFontInfo::SetWeight(wxFontWeight weight)
538{
539 switch ( weight )
540 {
541 default:
542 wxFAIL_MSG( _T("unknown font weight") );
543 // fall through
544
545 case wxFONTWEIGHT_NORMAL:
546 lf.lfWeight = FW_NORMAL;
547 break;
548
549 case wxFONTWEIGHT_LIGHT:
550 lf.lfWeight = FW_LIGHT;
551 break;
552
553 case wxFONTWEIGHT_BOLD:
554 lf.lfWeight = FW_BOLD;
555 break;
556 }
557}
558
559void wxNativeFontInfo::SetUnderlined(bool underlined)
560{
561 lf.lfUnderline = underlined;
562}
563
fbfb8bcc 564void wxNativeFontInfo::SetFaceName(const wxString& facename)
a9249b2e 565{
49eb2344 566 wxStrncpy(lf.lfFaceName, facename, WXSIZEOF(lf.lfFaceName));
a9249b2e
VZ
567}
568
7936354d
VZ
569void wxNativeFontInfo::SetFamily(wxFontFamily family)
570{
373a5fb3 571 BYTE ff_family;
7936354d
VZ
572 wxString facename;
573
574 switch ( family )
575 {
576 case wxSCRIPT:
577 ff_family = FF_SCRIPT;
578 facename = _T("Script");
579 break;
580
581 case wxDECORATIVE:
582 ff_family = FF_DECORATIVE;
5e968b74 583 facename = _T("Old English Text MT");
7936354d
VZ
584 break;
585
586 case wxROMAN:
587 ff_family = FF_ROMAN;
588 facename = _T("Times New Roman");
589 break;
590
591 case wxTELETYPE:
592 case wxMODERN:
593 ff_family = FF_MODERN;
594 facename = _T("Courier New");
595 break;
596
597 case wxSWISS:
598 ff_family = FF_SWISS;
599 facename = _T("Arial");
600 break;
601
602 case wxDEFAULT:
603 default:
b4772c24
JS
604 {
605 // We want Windows 2000 or later to have new fonts even MS Shell Dlg
606 // is returned as default GUI font for compatibility
607 int verMaj;
7936354d 608 ff_family = FF_SWISS;
b4772c24
JS
609 if(wxGetOsVersion(&verMaj) == wxWINDOWS_NT && verMaj >= 5)
610 facename = _T("MS Shell Dlg 2");
611 else
612 facename = _T("MS Shell Dlg");
613 }
7936354d
VZ
614 }
615
5c519b6c 616 lf.lfPitchAndFamily = (BYTE)(DEFAULT_PITCH) | ff_family;
7936354d
VZ
617
618 if ( !wxStrlen(lf.lfFaceName) )
619 {
620 SetFaceName(facename);
621 }
622}
623
a9249b2e
VZ
624void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
625{
626 wxNativeEncodingInfo info;
627 if ( !wxGetNativeFontEncoding(encoding, &info) )
628 {
bff67a6a 629#if wxUSE_FONTMAP
142b3bc2 630 if ( wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
e7e52b6d
VZ
631 {
632 if ( !info.facename.empty() )
633 {
634 // if we have this encoding only in some particular facename, use
635 // the facename - it is better to show the correct characters in a
636 // wrong facename than unreadable text in a correct one
637 SetFaceName(info.facename);
638 }
639 }
640 else
bff67a6a
VZ
641#endif // wxUSE_FONTMAP
642 {
643 // unsupported encoding, replace with the default
9cf8de4c 644 info.charset = DEFAULT_CHARSET;
bff67a6a 645 }
a9249b2e
VZ
646 }
647
373a5fb3 648 lf.lfCharSet = (BYTE)info.charset;
a9249b2e
VZ
649}
650
09fcd889
VZ
651bool wxNativeFontInfo::FromString(const wxString& s)
652{
653 long l;
654
655 wxStringTokenizer tokenizer(s, _T(";"));
656
a9249b2e 657 // first the version
09fcd889 658 wxString token = tokenizer.GetNextToken();
a9249b2e 659 if ( token != _T('0') )
cbe874bd 660 return false;
09fcd889
VZ
661
662 token = tokenizer.GetNextToken();
663 if ( !token.ToLong(&l) )
cbe874bd 664 return false;
09fcd889
VZ
665 lf.lfHeight = l;
666
667 token = tokenizer.GetNextToken();
668 if ( !token.ToLong(&l) )
cbe874bd 669 return false;
09fcd889
VZ
670 lf.lfWidth = l;
671
672 token = tokenizer.GetNextToken();
673 if ( !token.ToLong(&l) )
cbe874bd 674 return false;
09fcd889
VZ
675 lf.lfEscapement = l;
676
677 token = tokenizer.GetNextToken();
678 if ( !token.ToLong(&l) )
cbe874bd 679 return false;
09fcd889
VZ
680 lf.lfOrientation = l;
681
682 token = tokenizer.GetNextToken();
683 if ( !token.ToLong(&l) )
cbe874bd 684 return false;
09fcd889
VZ
685 lf.lfWeight = l;
686
687 token = tokenizer.GetNextToken();
688 if ( !token.ToLong(&l) )
cbe874bd 689 return false;
33ac7e6f 690 lf.lfItalic = (BYTE)l;
09fcd889
VZ
691
692 token = tokenizer.GetNextToken();
693 if ( !token.ToLong(&l) )
cbe874bd 694 return false;
33ac7e6f 695 lf.lfUnderline = (BYTE)l;
09fcd889
VZ
696
697 token = tokenizer.GetNextToken();
698 if ( !token.ToLong(&l) )
cbe874bd 699 return false;
33ac7e6f 700 lf.lfStrikeOut = (BYTE)l;
09fcd889
VZ
701
702 token = tokenizer.GetNextToken();
703 if ( !token.ToLong(&l) )
cbe874bd 704 return false;
33ac7e6f 705 lf.lfCharSet = (BYTE)l;
09fcd889
VZ
706
707 token = tokenizer.GetNextToken();
708 if ( !token.ToLong(&l) )
cbe874bd 709 return false;
33ac7e6f 710 lf.lfOutPrecision = (BYTE)l;
09fcd889
VZ
711
712 token = tokenizer.GetNextToken();
713 if ( !token.ToLong(&l) )
cbe874bd 714 return false;
33ac7e6f 715 lf.lfClipPrecision = (BYTE)l;
09fcd889
VZ
716
717 token = tokenizer.GetNextToken();
718 if ( !token.ToLong(&l) )
cbe874bd 719 return false;
33ac7e6f 720 lf.lfQuality = (BYTE)l;
09fcd889
VZ
721
722 token = tokenizer.GetNextToken();
723 if ( !token.ToLong(&l) )
cbe874bd 724 return false;
33ac7e6f 725 lf.lfPitchAndFamily = (BYTE)l;
09fcd889
VZ
726
727 token = tokenizer.GetNextToken();
728 if(!token)
cbe874bd 729 return false;
09fcd889
VZ
730 wxStrcpy(lf.lfFaceName, token.c_str());
731
cbe874bd 732 return true;
09fcd889
VZ
733}
734
735wxString wxNativeFontInfo::ToString() const
736{
737 wxString s;
738
4244c20b 739 s.Printf(_T("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"),
09fcd889
VZ
740 0, // version, in case we want to change the format later
741 lf.lfHeight,
742 lf.lfWidth,
743 lf.lfEscapement,
744 lf.lfOrientation,
745 lf.lfWeight,
746 lf.lfItalic,
747 lf.lfUnderline,
748 lf.lfStrikeOut,
749 lf.lfCharSet,
750 lf.lfOutPrecision,
751 lf.lfClipPrecision,
752 lf.lfQuality,
753 lf.lfPitchAndFamily,
754 lf.lfFaceName);
755
756 return s;
757}
758
0c5d3e1c
VZ
759// ----------------------------------------------------------------------------
760// wxFont
761// ----------------------------------------------------------------------------
762
763void wxFont::Init()
2bda0e17 764{
2bda0e17
KB
765}
766
04ef50df 767bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
76e23cdb 768{
09fcd889
VZ
769 UnRef();
770
04ef50df 771 m_refData = new wxFontRefData(info, hFont);
09fcd889
VZ
772
773 RealizeResource();
774
cbe874bd 775 return true;
76e23cdb
VZ
776}
777
778wxFont::wxFont(const wxString& fontdesc)
779{
780 wxNativeFontInfo info;
781 if ( info.FromString(fontdesc) )
782 (void)Create(info);
783}
784
2bda0e17
KB
785/* Constructor for a font. Note that the real construction is done
786 * in wxDC::SetFont, when information is available about scaling etc.
787 */
df455719
VZ
788bool wxFont::DoCreate(int pointSize,
789 const wxSize& pixelSize,
790 bool sizeUsingPixels,
791 int family,
792 int style,
793 int weight,
794 bool underlined,
795 const wxString& faceName,
796 wxFontEncoding encoding)
2bda0e17 797{
0c5d3e1c 798 UnRef();
3ca6a5f0
BP
799
800 // wxDEFAULT is a valid value for the font size too so we must treat it
801 // specially here (otherwise the size would be 70 == wxDEFAULT value)
802 if ( pointSize == wxDEFAULT )
a9249b2e
VZ
803 {
804 pointSize = wxNORMAL_FONT->GetPointSize();
805 }
3ca6a5f0 806
544229d1
VZ
807 m_refData = new wxFontRefData(pointSize, pixelSize, sizeUsingPixels,
808 family, style, weight,
0c5d3e1c 809 underlined, faceName, encoding);
2bda0e17 810
0c5d3e1c 811 RealizeResource();
2bda0e17 812
cbe874bd 813 return true;
2bda0e17
KB
814}
815
816wxFont::~wxFont()
817{
2bda0e17
KB
818}
819
0c5d3e1c
VZ
820// ----------------------------------------------------------------------------
821// real implementation
822// ----------------------------------------------------------------------------
823
824bool wxFont::RealizeResource()
2bda0e17 825{
0c5d3e1c
VZ
826 if ( GetResourceHandle() )
827 {
cbe874bd 828 // VZ: the old code returned false in this case, but it doesn't seem
0c5d3e1c 829 // to make sense because the font _was_ created
cbe874bd 830 return true;
0c5d3e1c
VZ
831 }
832
a9249b2e 833 return M_FONTDATA->Alloc(this);
2bda0e17
KB
834}
835
33ac7e6f 836bool wxFont::FreeResource(bool WXUNUSED(force))
2bda0e17 837{
0c5d3e1c
VZ
838 if ( GetResourceHandle() )
839 {
a9249b2e 840 M_FONTDATA->Free();
0c5d3e1c 841
cbe874bd 842 return true;
0c5d3e1c 843 }
a9249b2e 844
cbe874bd 845 return false;
2bda0e17
KB
846}
847
2b5f62a0 848WXHANDLE wxFont::GetResourceHandle() const
f6bcfd97 849{
2b5f62a0 850 return (WXHANDLE)GetHFONT();
f6bcfd97
BP
851}
852
853WXHFONT wxFont::GetHFONT() const
2bda0e17 854{
a9249b2e 855 return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
2bda0e17
KB
856}
857
e90babdf 858bool wxFont::IsFree() const
2bda0e17 859{
a9249b2e 860 return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
2bda0e17
KB
861}
862
b823f5a1
JS
863void wxFont::Unshare()
864{
b9b3ccd9
VZ
865 // Don't change shared data
866 if ( !m_refData )
b823f5a1 867 {
b9b3ccd9
VZ
868 m_refData = new wxFontRefData();
869 }
b823f5a1
JS
870 else
871 {
b9b3ccd9
VZ
872 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
873 UnRef();
874 m_refData = ref;
875 }
b823f5a1
JS
876}
877
0c5d3e1c
VZ
878// ----------------------------------------------------------------------------
879// change font attribute: we recreate font when doing it
880// ----------------------------------------------------------------------------
881
debe6624 882void wxFont::SetPointSize(int pointSize)
2bda0e17 883{
b823f5a1
JS
884 Unshare();
885
a9249b2e 886 M_FONTDATA->SetPointSize(pointSize);
b823f5a1
JS
887
888 RealizeResource();
2bda0e17
KB
889}
890
544229d1
VZ
891void wxFont::SetPixelSize(const wxSize& pixelSize)
892{
893 Unshare();
894
895 M_FONTDATA->SetPixelSize(pixelSize);
896
897 RealizeResource();
898}
899
debe6624 900void wxFont::SetFamily(int family)
2bda0e17 901{
b823f5a1
JS
902 Unshare();
903
a9249b2e 904 M_FONTDATA->SetFamily(family);
b823f5a1
JS
905
906 RealizeResource();
2bda0e17
KB
907}
908
debe6624 909void wxFont::SetStyle(int style)
2bda0e17 910{
b823f5a1
JS
911 Unshare();
912
a9249b2e 913 M_FONTDATA->SetStyle(style);
b823f5a1
JS
914
915 RealizeResource();
2bda0e17
KB
916}
917
debe6624 918void wxFont::SetWeight(int weight)
2bda0e17 919{
b823f5a1
JS
920 Unshare();
921
a9249b2e 922 M_FONTDATA->SetWeight(weight);
b823f5a1
JS
923
924 RealizeResource();
2bda0e17
KB
925}
926
927void wxFont::SetFaceName(const wxString& faceName)
928{
b823f5a1
JS
929 Unshare();
930
a9249b2e 931 M_FONTDATA->SetFaceName(faceName);
b823f5a1
JS
932
933 RealizeResource();
2bda0e17
KB
934}
935
debe6624 936void wxFont::SetUnderlined(bool underlined)
2bda0e17 937{
b823f5a1
JS
938 Unshare();
939
a9249b2e 940 M_FONTDATA->SetUnderlined(underlined);
b823f5a1
JS
941
942 RealizeResource();
2bda0e17
KB
943}
944
0c5d3e1c 945void wxFont::SetEncoding(wxFontEncoding encoding)
2bda0e17 946{
0c5d3e1c
VZ
947 Unshare();
948
a9249b2e 949 M_FONTDATA->SetEncoding(encoding);
09fcd889
VZ
950
951 RealizeResource();
952}
953
9045ad9d 954void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
09fcd889
VZ
955{
956 Unshare();
789034a0
VZ
957
958 FreeResource();
09fcd889 959
a9249b2e 960 *M_FONTDATA = wxFontRefData(info);
0c5d3e1c
VZ
961
962 RealizeResource();
963}
964
965// ----------------------------------------------------------------------------
966// accessors
967// ----------------------------------------------------------------------------
968
969int wxFont::GetPointSize() const
970{
789034a0
VZ
971 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
972
a9249b2e 973 return M_FONTDATA->GetPointSize();
0c5d3e1c
VZ
974}
975
544229d1
VZ
976wxSize wxFont::GetPixelSize() const
977{
978 return M_FONTDATA->GetPixelSize();
979}
980
981bool wxFont::IsUsingSizeInPixels() const
982{
983 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
984
985 return M_FONTDATA->IsUsingSizeInPixels();
986}
987
0c5d3e1c
VZ
988int wxFont::GetFamily() const
989{
789034a0
VZ
990 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
991
a9249b2e 992 return M_FONTDATA->GetFamily();
2bda0e17
KB
993}
994
0c5d3e1c 995int wxFont::GetStyle() const
2bda0e17 996{
789034a0
VZ
997 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
998
a9249b2e 999 return M_FONTDATA->GetStyle();
2bda0e17
KB
1000}
1001
0c5d3e1c 1002int wxFont::GetWeight() const
2bda0e17 1003{
789034a0
VZ
1004 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1005
a9249b2e 1006 return M_FONTDATA->GetWeight();
2bda0e17
KB
1007}
1008
0c5d3e1c
VZ
1009bool wxFont::GetUnderlined() const
1010{
cbe874bd 1011 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
789034a0 1012
a9249b2e 1013 return M_FONTDATA->GetUnderlined();
0c5d3e1c
VZ
1014}
1015
1016wxString wxFont::GetFaceName() const
1017{
fda7962d 1018 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
789034a0 1019
a9249b2e 1020 return M_FONTDATA->GetFaceName();
0c5d3e1c
VZ
1021}
1022
1023wxFontEncoding wxFont::GetEncoding() const
1024{
789034a0
VZ
1025 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
1026
a9249b2e 1027 return M_FONTDATA->GetEncoding();
0c5d3e1c 1028}
a1d58ddc 1029
3bf5a59b 1030const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
1e6feb95 1031{
3bf5a59b
VZ
1032 return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
1033 : NULL;
09fcd889
VZ
1034}
1035
9cf8de4c
VZ
1036bool wxFont::IsFixedWidth() const
1037{
1038 if ( M_FONTDATA->HasNativeFontInfo() )
1039 {
1040 // the two low-order bits specify the pitch of the font, the rest is
1041 // family
907173e5
WS
1042 BYTE pitch =
1043 (BYTE)(M_FONTDATA->GetNativeFontInfo().lf.lfPitchAndFamily & PITCH_MASK);
9cf8de4c
VZ
1044
1045 return pitch == FIXED_PITCH;
1046 }
1047
1048 return wxFontBase::IsFixedWidth();
1049}