]> git.saurik.com Git - wxWidgets.git/blame - src/msw/font.cpp
added InitCommandEventWithItems() and call it from wxChoice and wxComboBox code to...
[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
04ef50df 763bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
76e23cdb 764{
09fcd889
VZ
765 UnRef();
766
04ef50df 767 m_refData = new wxFontRefData(info, hFont);
09fcd889
VZ
768
769 RealizeResource();
770
cbe874bd 771 return true;
76e23cdb
VZ
772}
773
774wxFont::wxFont(const wxString& fontdesc)
775{
776 wxNativeFontInfo info;
777 if ( info.FromString(fontdesc) )
778 (void)Create(info);
779}
780
2bda0e17
KB
781/* Constructor for a font. Note that the real construction is done
782 * in wxDC::SetFont, when information is available about scaling etc.
783 */
df455719
VZ
784bool wxFont::DoCreate(int pointSize,
785 const wxSize& pixelSize,
786 bool sizeUsingPixels,
787 int family,
788 int style,
789 int weight,
790 bool underlined,
791 const wxString& faceName,
792 wxFontEncoding encoding)
2bda0e17 793{
0c5d3e1c 794 UnRef();
3ca6a5f0
BP
795
796 // wxDEFAULT is a valid value for the font size too so we must treat it
797 // specially here (otherwise the size would be 70 == wxDEFAULT value)
798 if ( pointSize == wxDEFAULT )
a9249b2e
VZ
799 {
800 pointSize = wxNORMAL_FONT->GetPointSize();
801 }
3ca6a5f0 802
544229d1
VZ
803 m_refData = new wxFontRefData(pointSize, pixelSize, sizeUsingPixels,
804 family, style, weight,
0c5d3e1c 805 underlined, faceName, encoding);
2bda0e17 806
0c5d3e1c 807 RealizeResource();
2bda0e17 808
cbe874bd 809 return true;
2bda0e17
KB
810}
811
812wxFont::~wxFont()
813{
2bda0e17
KB
814}
815
0c5d3e1c
VZ
816// ----------------------------------------------------------------------------
817// real implementation
818// ----------------------------------------------------------------------------
819
820bool wxFont::RealizeResource()
2bda0e17 821{
0c5d3e1c
VZ
822 if ( GetResourceHandle() )
823 {
cbe874bd 824 // VZ: the old code returned false in this case, but it doesn't seem
0c5d3e1c 825 // to make sense because the font _was_ created
cbe874bd 826 return true;
0c5d3e1c
VZ
827 }
828
a9249b2e 829 return M_FONTDATA->Alloc(this);
2bda0e17
KB
830}
831
33ac7e6f 832bool wxFont::FreeResource(bool WXUNUSED(force))
2bda0e17 833{
0c5d3e1c
VZ
834 if ( GetResourceHandle() )
835 {
a9249b2e 836 M_FONTDATA->Free();
0c5d3e1c 837
cbe874bd 838 return true;
0c5d3e1c 839 }
a9249b2e 840
cbe874bd 841 return false;
2bda0e17
KB
842}
843
2b5f62a0 844WXHANDLE wxFont::GetResourceHandle() const
f6bcfd97 845{
2b5f62a0 846 return (WXHANDLE)GetHFONT();
f6bcfd97
BP
847}
848
849WXHFONT wxFont::GetHFONT() const
2bda0e17 850{
a9249b2e 851 return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
2bda0e17
KB
852}
853
e90babdf 854bool wxFont::IsFree() const
2bda0e17 855{
a9249b2e 856 return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
2bda0e17
KB
857}
858
b823f5a1
JS
859void wxFont::Unshare()
860{
b9b3ccd9
VZ
861 // Don't change shared data
862 if ( !m_refData )
b823f5a1 863 {
b9b3ccd9
VZ
864 m_refData = new wxFontRefData();
865 }
b823f5a1
JS
866 else
867 {
b9b3ccd9
VZ
868 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
869 UnRef();
870 m_refData = ref;
871 }
b823f5a1
JS
872}
873
0c5d3e1c
VZ
874// ----------------------------------------------------------------------------
875// change font attribute: we recreate font when doing it
876// ----------------------------------------------------------------------------
877
debe6624 878void wxFont::SetPointSize(int pointSize)
2bda0e17 879{
b823f5a1
JS
880 Unshare();
881
a9249b2e 882 M_FONTDATA->SetPointSize(pointSize);
b823f5a1
JS
883
884 RealizeResource();
2bda0e17
KB
885}
886
544229d1
VZ
887void wxFont::SetPixelSize(const wxSize& pixelSize)
888{
889 Unshare();
890
891 M_FONTDATA->SetPixelSize(pixelSize);
892
893 RealizeResource();
894}
895
debe6624 896void wxFont::SetFamily(int family)
2bda0e17 897{
b823f5a1
JS
898 Unshare();
899
a9249b2e 900 M_FONTDATA->SetFamily(family);
b823f5a1
JS
901
902 RealizeResource();
2bda0e17
KB
903}
904
debe6624 905void wxFont::SetStyle(int style)
2bda0e17 906{
b823f5a1
JS
907 Unshare();
908
a9249b2e 909 M_FONTDATA->SetStyle(style);
b823f5a1
JS
910
911 RealizeResource();
2bda0e17
KB
912}
913
debe6624 914void wxFont::SetWeight(int weight)
2bda0e17 915{
b823f5a1
JS
916 Unshare();
917
a9249b2e 918 M_FONTDATA->SetWeight(weight);
b823f5a1
JS
919
920 RealizeResource();
2bda0e17
KB
921}
922
923void wxFont::SetFaceName(const wxString& faceName)
924{
b823f5a1
JS
925 Unshare();
926
a9249b2e 927 M_FONTDATA->SetFaceName(faceName);
b823f5a1
JS
928
929 RealizeResource();
2bda0e17
KB
930}
931
debe6624 932void wxFont::SetUnderlined(bool underlined)
2bda0e17 933{
b823f5a1
JS
934 Unshare();
935
a9249b2e 936 M_FONTDATA->SetUnderlined(underlined);
b823f5a1
JS
937
938 RealizeResource();
2bda0e17
KB
939}
940
0c5d3e1c 941void wxFont::SetEncoding(wxFontEncoding encoding)
2bda0e17 942{
0c5d3e1c
VZ
943 Unshare();
944
a9249b2e 945 M_FONTDATA->SetEncoding(encoding);
09fcd889
VZ
946
947 RealizeResource();
948}
949
9045ad9d 950void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
09fcd889
VZ
951{
952 Unshare();
789034a0
VZ
953
954 FreeResource();
09fcd889 955
a9249b2e 956 *M_FONTDATA = wxFontRefData(info);
0c5d3e1c
VZ
957
958 RealizeResource();
959}
960
961// ----------------------------------------------------------------------------
962// accessors
963// ----------------------------------------------------------------------------
964
965int wxFont::GetPointSize() const
966{
789034a0
VZ
967 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
968
a9249b2e 969 return M_FONTDATA->GetPointSize();
0c5d3e1c
VZ
970}
971
544229d1
VZ
972wxSize wxFont::GetPixelSize() const
973{
974 return M_FONTDATA->GetPixelSize();
975}
976
977bool wxFont::IsUsingSizeInPixels() const
978{
979 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
980
981 return M_FONTDATA->IsUsingSizeInPixels();
982}
983
0c5d3e1c
VZ
984int wxFont::GetFamily() const
985{
789034a0
VZ
986 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
987
a9249b2e 988 return M_FONTDATA->GetFamily();
2bda0e17
KB
989}
990
0c5d3e1c 991int wxFont::GetStyle() const
2bda0e17 992{
789034a0
VZ
993 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
994
a9249b2e 995 return M_FONTDATA->GetStyle();
2bda0e17
KB
996}
997
0c5d3e1c 998int wxFont::GetWeight() const
2bda0e17 999{
789034a0
VZ
1000 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1001
a9249b2e 1002 return M_FONTDATA->GetWeight();
2bda0e17
KB
1003}
1004
0c5d3e1c
VZ
1005bool wxFont::GetUnderlined() const
1006{
cbe874bd 1007 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
789034a0 1008
a9249b2e 1009 return M_FONTDATA->GetUnderlined();
0c5d3e1c
VZ
1010}
1011
1012wxString wxFont::GetFaceName() const
1013{
fda7962d 1014 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
789034a0 1015
a9249b2e 1016 return M_FONTDATA->GetFaceName();
0c5d3e1c
VZ
1017}
1018
1019wxFontEncoding wxFont::GetEncoding() const
1020{
789034a0
VZ
1021 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
1022
a9249b2e 1023 return M_FONTDATA->GetEncoding();
0c5d3e1c 1024}
a1d58ddc 1025
3bf5a59b 1026const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
1e6feb95 1027{
3bf5a59b
VZ
1028 return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
1029 : NULL;
09fcd889
VZ
1030}
1031
9cf8de4c
VZ
1032bool wxFont::IsFixedWidth() const
1033{
1034 if ( M_FONTDATA->HasNativeFontInfo() )
1035 {
1036 // the two low-order bits specify the pitch of the font, the rest is
1037 // family
907173e5
WS
1038 BYTE pitch =
1039 (BYTE)(M_FONTDATA->GetNativeFontInfo().lf.lfPitchAndFamily & PITCH_MASK);
9cf8de4c
VZ
1040
1041 return pitch == FIXED_PITCH;
1042 }
1043
1044 return wxFontBase::IsFixedWidth();
1045}