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