]> git.saurik.com Git - wxWidgets.git/blame - src/msw/font.cpp
no_rtti fix was not having correct eval order
[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:
609 ff_family = FF_SWISS;
610 facename = _T("MS Sans Serif");
611 }
612
5c519b6c 613 lf.lfPitchAndFamily = (BYTE)(DEFAULT_PITCH) | ff_family;
7936354d
VZ
614
615 if ( !wxStrlen(lf.lfFaceName) )
616 {
617 SetFaceName(facename);
618 }
619}
620
a9249b2e
VZ
621void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
622{
623 wxNativeEncodingInfo info;
624 if ( !wxGetNativeFontEncoding(encoding, &info) )
625 {
bff67a6a 626#if wxUSE_FONTMAP
142b3bc2 627 if ( wxFontMapper::Get()->GetAltForEncoding(encoding, &info) )
e7e52b6d
VZ
628 {
629 if ( !info.facename.empty() )
630 {
631 // if we have this encoding only in some particular facename, use
632 // the facename - it is better to show the correct characters in a
633 // wrong facename than unreadable text in a correct one
634 SetFaceName(info.facename);
635 }
636 }
637 else
bff67a6a
VZ
638#endif // wxUSE_FONTMAP
639 {
640 // unsupported encoding, replace with the default
9cf8de4c 641 info.charset = DEFAULT_CHARSET;
bff67a6a 642 }
a9249b2e
VZ
643 }
644
373a5fb3 645 lf.lfCharSet = (BYTE)info.charset;
a9249b2e
VZ
646}
647
09fcd889
VZ
648bool wxNativeFontInfo::FromString(const wxString& s)
649{
650 long l;
651
652 wxStringTokenizer tokenizer(s, _T(";"));
653
a9249b2e 654 // first the version
09fcd889 655 wxString token = tokenizer.GetNextToken();
a9249b2e 656 if ( token != _T('0') )
cbe874bd 657 return false;
09fcd889
VZ
658
659 token = tokenizer.GetNextToken();
660 if ( !token.ToLong(&l) )
cbe874bd 661 return false;
09fcd889
VZ
662 lf.lfHeight = l;
663
664 token = tokenizer.GetNextToken();
665 if ( !token.ToLong(&l) )
cbe874bd 666 return false;
09fcd889
VZ
667 lf.lfWidth = l;
668
669 token = tokenizer.GetNextToken();
670 if ( !token.ToLong(&l) )
cbe874bd 671 return false;
09fcd889
VZ
672 lf.lfEscapement = l;
673
674 token = tokenizer.GetNextToken();
675 if ( !token.ToLong(&l) )
cbe874bd 676 return false;
09fcd889
VZ
677 lf.lfOrientation = l;
678
679 token = tokenizer.GetNextToken();
680 if ( !token.ToLong(&l) )
cbe874bd 681 return false;
09fcd889
VZ
682 lf.lfWeight = l;
683
684 token = tokenizer.GetNextToken();
685 if ( !token.ToLong(&l) )
cbe874bd 686 return false;
33ac7e6f 687 lf.lfItalic = (BYTE)l;
09fcd889
VZ
688
689 token = tokenizer.GetNextToken();
690 if ( !token.ToLong(&l) )
cbe874bd 691 return false;
33ac7e6f 692 lf.lfUnderline = (BYTE)l;
09fcd889
VZ
693
694 token = tokenizer.GetNextToken();
695 if ( !token.ToLong(&l) )
cbe874bd 696 return false;
33ac7e6f 697 lf.lfStrikeOut = (BYTE)l;
09fcd889
VZ
698
699 token = tokenizer.GetNextToken();
700 if ( !token.ToLong(&l) )
cbe874bd 701 return false;
33ac7e6f 702 lf.lfCharSet = (BYTE)l;
09fcd889
VZ
703
704 token = tokenizer.GetNextToken();
705 if ( !token.ToLong(&l) )
cbe874bd 706 return false;
33ac7e6f 707 lf.lfOutPrecision = (BYTE)l;
09fcd889
VZ
708
709 token = tokenizer.GetNextToken();
710 if ( !token.ToLong(&l) )
cbe874bd 711 return false;
33ac7e6f 712 lf.lfClipPrecision = (BYTE)l;
09fcd889
VZ
713
714 token = tokenizer.GetNextToken();
715 if ( !token.ToLong(&l) )
cbe874bd 716 return false;
33ac7e6f 717 lf.lfQuality = (BYTE)l;
09fcd889
VZ
718
719 token = tokenizer.GetNextToken();
720 if ( !token.ToLong(&l) )
cbe874bd 721 return false;
33ac7e6f 722 lf.lfPitchAndFamily = (BYTE)l;
09fcd889
VZ
723
724 token = tokenizer.GetNextToken();
725 if(!token)
cbe874bd 726 return false;
09fcd889
VZ
727 wxStrcpy(lf.lfFaceName, token.c_str());
728
cbe874bd 729 return true;
09fcd889
VZ
730}
731
732wxString wxNativeFontInfo::ToString() const
733{
734 wxString s;
735
4244c20b 736 s.Printf(_T("%d;%ld;%ld;%ld;%ld;%ld;%d;%d;%d;%d;%d;%d;%d;%d;%s"),
09fcd889
VZ
737 0, // version, in case we want to change the format later
738 lf.lfHeight,
739 lf.lfWidth,
740 lf.lfEscapement,
741 lf.lfOrientation,
742 lf.lfWeight,
743 lf.lfItalic,
744 lf.lfUnderline,
745 lf.lfStrikeOut,
746 lf.lfCharSet,
747 lf.lfOutPrecision,
748 lf.lfClipPrecision,
749 lf.lfQuality,
750 lf.lfPitchAndFamily,
751 lf.lfFaceName);
752
753 return s;
754}
755
0c5d3e1c
VZ
756// ----------------------------------------------------------------------------
757// wxFont
758// ----------------------------------------------------------------------------
759
760void wxFont::Init()
2bda0e17 761{
2bda0e17
KB
762}
763
04ef50df 764bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
76e23cdb 765{
09fcd889
VZ
766 UnRef();
767
04ef50df 768 m_refData = new wxFontRefData(info, hFont);
09fcd889
VZ
769
770 RealizeResource();
771
cbe874bd 772 return true;
76e23cdb
VZ
773}
774
775wxFont::wxFont(const wxString& fontdesc)
776{
777 wxNativeFontInfo info;
778 if ( info.FromString(fontdesc) )
779 (void)Create(info);
780}
781
2bda0e17
KB
782/* Constructor for a font. Note that the real construction is done
783 * in wxDC::SetFont, when information is available about scaling etc.
784 */
df455719
VZ
785bool wxFont::DoCreate(int pointSize,
786 const wxSize& pixelSize,
787 bool sizeUsingPixels,
788 int family,
789 int style,
790 int weight,
791 bool underlined,
792 const wxString& faceName,
793 wxFontEncoding encoding)
2bda0e17 794{
0c5d3e1c 795 UnRef();
3ca6a5f0
BP
796
797 // wxDEFAULT is a valid value for the font size too so we must treat it
798 // specially here (otherwise the size would be 70 == wxDEFAULT value)
799 if ( pointSize == wxDEFAULT )
a9249b2e
VZ
800 {
801 pointSize = wxNORMAL_FONT->GetPointSize();
802 }
3ca6a5f0 803
544229d1
VZ
804 m_refData = new wxFontRefData(pointSize, pixelSize, sizeUsingPixels,
805 family, style, weight,
0c5d3e1c 806 underlined, faceName, encoding);
2bda0e17 807
0c5d3e1c 808 RealizeResource();
2bda0e17 809
cbe874bd 810 return true;
2bda0e17
KB
811}
812
813wxFont::~wxFont()
814{
2bda0e17
KB
815}
816
0c5d3e1c
VZ
817// ----------------------------------------------------------------------------
818// real implementation
819// ----------------------------------------------------------------------------
820
821bool wxFont::RealizeResource()
2bda0e17 822{
0c5d3e1c
VZ
823 if ( GetResourceHandle() )
824 {
cbe874bd 825 // VZ: the old code returned false in this case, but it doesn't seem
0c5d3e1c 826 // to make sense because the font _was_ created
cbe874bd 827 return true;
0c5d3e1c
VZ
828 }
829
a9249b2e 830 return M_FONTDATA->Alloc(this);
2bda0e17
KB
831}
832
33ac7e6f 833bool wxFont::FreeResource(bool WXUNUSED(force))
2bda0e17 834{
0c5d3e1c
VZ
835 if ( GetResourceHandle() )
836 {
a9249b2e 837 M_FONTDATA->Free();
0c5d3e1c 838
cbe874bd 839 return true;
0c5d3e1c 840 }
a9249b2e 841
cbe874bd 842 return false;
2bda0e17
KB
843}
844
2b5f62a0 845WXHANDLE wxFont::GetResourceHandle() const
f6bcfd97 846{
2b5f62a0 847 return (WXHANDLE)GetHFONT();
f6bcfd97
BP
848}
849
850WXHFONT wxFont::GetHFONT() const
2bda0e17 851{
a9249b2e 852 return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
2bda0e17
KB
853}
854
e90babdf 855bool wxFont::IsFree() const
2bda0e17 856{
a9249b2e 857 return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
2bda0e17
KB
858}
859
b823f5a1
JS
860void wxFont::Unshare()
861{
b9b3ccd9
VZ
862 // Don't change shared data
863 if ( !m_refData )
b823f5a1 864 {
b9b3ccd9
VZ
865 m_refData = new wxFontRefData();
866 }
b823f5a1
JS
867 else
868 {
b9b3ccd9
VZ
869 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
870 UnRef();
871 m_refData = ref;
872 }
b823f5a1
JS
873}
874
0c5d3e1c
VZ
875// ----------------------------------------------------------------------------
876// change font attribute: we recreate font when doing it
877// ----------------------------------------------------------------------------
878
debe6624 879void wxFont::SetPointSize(int pointSize)
2bda0e17 880{
b823f5a1
JS
881 Unshare();
882
a9249b2e 883 M_FONTDATA->SetPointSize(pointSize);
b823f5a1
JS
884
885 RealizeResource();
2bda0e17
KB
886}
887
544229d1
VZ
888void wxFont::SetPixelSize(const wxSize& pixelSize)
889{
890 Unshare();
891
892 M_FONTDATA->SetPixelSize(pixelSize);
893
894 RealizeResource();
895}
896
debe6624 897void wxFont::SetFamily(int family)
2bda0e17 898{
b823f5a1
JS
899 Unshare();
900
a9249b2e 901 M_FONTDATA->SetFamily(family);
b823f5a1
JS
902
903 RealizeResource();
2bda0e17
KB
904}
905
debe6624 906void wxFont::SetStyle(int style)
2bda0e17 907{
b823f5a1
JS
908 Unshare();
909
a9249b2e 910 M_FONTDATA->SetStyle(style);
b823f5a1
JS
911
912 RealizeResource();
2bda0e17
KB
913}
914
debe6624 915void wxFont::SetWeight(int weight)
2bda0e17 916{
b823f5a1
JS
917 Unshare();
918
a9249b2e 919 M_FONTDATA->SetWeight(weight);
b823f5a1
JS
920
921 RealizeResource();
2bda0e17
KB
922}
923
924void wxFont::SetFaceName(const wxString& faceName)
925{
b823f5a1
JS
926 Unshare();
927
a9249b2e 928 M_FONTDATA->SetFaceName(faceName);
b823f5a1
JS
929
930 RealizeResource();
2bda0e17
KB
931}
932
debe6624 933void wxFont::SetUnderlined(bool underlined)
2bda0e17 934{
b823f5a1
JS
935 Unshare();
936
a9249b2e 937 M_FONTDATA->SetUnderlined(underlined);
b823f5a1
JS
938
939 RealizeResource();
2bda0e17
KB
940}
941
0c5d3e1c 942void wxFont::SetEncoding(wxFontEncoding encoding)
2bda0e17 943{
0c5d3e1c
VZ
944 Unshare();
945
a9249b2e 946 M_FONTDATA->SetEncoding(encoding);
09fcd889
VZ
947
948 RealizeResource();
949}
950
9045ad9d 951void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
09fcd889
VZ
952{
953 Unshare();
789034a0
VZ
954
955 FreeResource();
09fcd889 956
a9249b2e 957 *M_FONTDATA = wxFontRefData(info);
0c5d3e1c
VZ
958
959 RealizeResource();
960}
961
962// ----------------------------------------------------------------------------
963// accessors
964// ----------------------------------------------------------------------------
965
966int wxFont::GetPointSize() const
967{
789034a0
VZ
968 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
969
a9249b2e 970 return M_FONTDATA->GetPointSize();
0c5d3e1c
VZ
971}
972
544229d1
VZ
973wxSize wxFont::GetPixelSize() const
974{
975 return M_FONTDATA->GetPixelSize();
976}
977
978bool wxFont::IsUsingSizeInPixels() const
979{
980 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
981
982 return M_FONTDATA->IsUsingSizeInPixels();
983}
984
0c5d3e1c
VZ
985int wxFont::GetFamily() const
986{
789034a0
VZ
987 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
988
a9249b2e 989 return M_FONTDATA->GetFamily();
2bda0e17
KB
990}
991
0c5d3e1c 992int wxFont::GetStyle() const
2bda0e17 993{
789034a0
VZ
994 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
995
a9249b2e 996 return M_FONTDATA->GetStyle();
2bda0e17
KB
997}
998
0c5d3e1c 999int wxFont::GetWeight() const
2bda0e17 1000{
789034a0
VZ
1001 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1002
a9249b2e 1003 return M_FONTDATA->GetWeight();
2bda0e17
KB
1004}
1005
0c5d3e1c
VZ
1006bool wxFont::GetUnderlined() const
1007{
cbe874bd 1008 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
789034a0 1009
a9249b2e 1010 return M_FONTDATA->GetUnderlined();
0c5d3e1c
VZ
1011}
1012
1013wxString wxFont::GetFaceName() const
1014{
fda7962d 1015 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
789034a0 1016
a9249b2e 1017 return M_FONTDATA->GetFaceName();
0c5d3e1c
VZ
1018}
1019
1020wxFontEncoding wxFont::GetEncoding() const
1021{
789034a0
VZ
1022 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
1023
a9249b2e 1024 return M_FONTDATA->GetEncoding();
0c5d3e1c 1025}
a1d58ddc 1026
3bf5a59b 1027const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
1e6feb95 1028{
3bf5a59b
VZ
1029 return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
1030 : NULL;
09fcd889
VZ
1031}
1032
9cf8de4c
VZ
1033bool wxFont::IsFixedWidth() const
1034{
1035 if ( M_FONTDATA->HasNativeFontInfo() )
1036 {
1037 // the two low-order bits specify the pitch of the font, the rest is
1038 // family
907173e5
WS
1039 BYTE pitch =
1040 (BYTE)(M_FONTDATA->GetNativeFontInfo().lf.lfPitchAndFamily & PITCH_MASK);
9cf8de4c
VZ
1041
1042 return pitch == FIXED_PITCH;
1043 }
1044
1045 return wxFontBase::IsFixedWidth();
1046}
1047