]> git.saurik.com Git - wxWidgets.git/blame - src/os2/font.cpp
implemented wxPopupWindow for wxDFB; added wxNonOwnedWindow as base class for wxTopLe...
[wxWidgets.git] / src / os2 / font.cpp
CommitLineData
0e320a79 1/////////////////////////////////////////////////////////////////////////////
521bf4ff 2// Name: src/os2/font.cpp
0e320a79 3// Purpose: wxFont class
21802234 4// Author: David Webster
0e320a79 5// Modified by:
21802234 6// Created: 10/06/99
0e320a79 7// RCS-ID: $Id$
21802234 8// Copyright: (c) David Webster
65571936 9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
6670f564
WS
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
21802234
DW
15// ============================================================================
16// declarations
17// ============================================================================
18
19// ----------------------------------------------------------------------------
20// headers
21// ----------------------------------------------------------------------------
22
48a1108e
WS
23#include "wx/font.h"
24
21802234
DW
25#ifndef WX_PRECOMP
26 #include <stdio.h>
21802234
DW
27 #include "wx/list.h"
28 #include "wx/utils.h"
29 #include "wx/app.h"
6eb280e9 30 #include "wx/log.h"
21802234
DW
31#endif // WX_PRECOMP
32
33#include "wx/os2/private.h"
0e320a79 34
cc95f4f9
DW
35#include "wx/fontutil.h"
36#include "wx/fontmap.h"
bd6685b3 37#include "wx/encinfo.h"
cc95f4f9
DW
38
39#include "wx/tokenzr.h"
21802234 40
6670f564
WS
41#include <malloc.h>
42
cc95f4f9 43IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
0e320a79 44
21802234
DW
45// ----------------------------------------------------------------------------
46// wxFontRefData - the internal description of the font
47// ----------------------------------------------------------------------------
48
49class WXDLLEXPORT wxFontRefData: public wxGDIRefData
0e320a79 50{
21802234
DW
51public:
52 wxFontRefData()
53 {
17b1d76b 54 Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false,
0fba44b4 55 wxEmptyString, wxFONTENCODING_DEFAULT);
21802234
DW
56 }
57
e99762c0
DW
58 wxFontRefData( int nSize
59 ,int nFamily
60 ,int nStyle
61 ,int nWeight
62 ,bool bUnderlined
63 ,const wxString& sFaceName
64 ,wxFontEncoding vEncoding
65 )
21802234 66 {
cc95f4f9
DW
67 Init( nSize
68 ,nFamily
69 ,nStyle
70 ,nWeight
71 ,bUnderlined
72 ,sFaceName
73 ,vEncoding
74 );
75 }
76
77 wxFontRefData( const wxNativeFontInfo& rInfo
78 ,WXHFONT hFont = 0
79 ,WXHANDLE hPS = 0
80 )
81 {
82 Init( rInfo
83 ,hFont
84 ,hPS
85 );
86 }
87
88 wxFontRefData(const wxFontRefData& rData)
89 {
90 Init( rData.m_nPointSize
91 ,rData.m_nFamily
92 ,rData.m_nStyle
93 ,rData.m_nWeight
94 ,rData.m_bUnderlined
95 ,rData.m_sFaceName
96 ,rData.m_vEncoding
97 );
98 m_nFontId = rData.m_nFontId;
21802234 99 }
0e320a79 100
21802234
DW
101 virtual ~wxFontRefData();
102
cc95f4f9
DW
103 //
104 // Operations
105 //
106 bool Alloc(wxFont* pFont);
107 void Free(void);
108
109 //
110 // All wxFont accessors
111 //
112 inline int GetPointSize(void) const
113 {
2c1e8f2e
DW
114 //
115 // We don't use the actual native font point size since it is
116 // the chosen physical font, which is usually only and approximation
117 // of the desired outline font. The actual displayable point size
118 // is the one stored in the refData
119 //
120 return m_nPointSize;
cc95f4f9
DW
121 }
122
123 inline int GetFamily(void) const
124 {
125 return m_nFamily;
126 }
127
128 inline int GetStyle(void) const
129 {
130 return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetStyle()
131 : m_nStyle;
132 }
133
134 inline int GetWeight(void) const
135 {
136 return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetWeight()
137 : m_nWeight;
138 }
139
140 inline bool GetUnderlined(void) const
141 {
142 return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetUnderlined()
143 : m_bUnderlined;
144 }
145
146 inline wxString GetFaceName(void) const
147 {
148 wxString sFaceName;
149
150 if (m_bNativeFontInfoOk)
151 sFaceName = m_vNativeFontInfo.GetFaceName();
152 else
153 sFaceName = m_sFaceName;
154
155 return sFaceName;
156 }
157
158 inline wxFontEncoding GetEncoding(void) const
159 {
160 return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetEncoding()
161 : m_vEncoding;
162 }
163
164 inline WXHFONT GetHFONT(void) const { return m_hFont; }
165 inline HPS GetPS(void) const { return m_hPS; }
166 inline PFONTMETRICS GetFM(void) const { return m_pFM; }
167 inline int GetNumFonts(void) const { return m_nNumFonts; }
168
169 // ... and setters
170 inline void SetPointSize(int nPointSize)
171 {
172 if (m_bNativeFontInfoOk)
173 m_vNativeFontInfo.SetPointSize(nPointSize);
174 else
175 m_nPointSize = nPointSize;
176 }
177
178 inline void SetFamily(int nFamily)
179 {
180 m_nFamily = nFamily;
181 }
182
183 inline void SetStyle(int nStyle)
184 {
185 if (m_bNativeFontInfoOk)
186 m_vNativeFontInfo.SetStyle((wxFontStyle)nStyle);
187 else
188 m_nStyle = nStyle;
189 }
190
191 inline void SetWeight(int nWeight)
192 {
193 if (m_bNativeFontInfoOk)
194 m_vNativeFontInfo.SetWeight((wxFontWeight)nWeight);
195 else
196 m_nWeight = nWeight;
197 }
198
85ab460e 199 inline bool SetFaceName(const wxString& sFaceName)
cc95f4f9
DW
200 {
201 if (m_bNativeFontInfoOk)
85ab460e 202 return m_vNativeFontInfo.SetFaceName(sFaceName);
cc95f4f9
DW
203 else
204 m_sFaceName = sFaceName;
85ab460e 205 return true;
cc95f4f9
DW
206 }
207
208 inline void SetUnderlined(bool bUnderlined)
209 {
210 if (m_bNativeFontInfoOk)
211 m_vNativeFontInfo.SetUnderlined(bUnderlined);
212 else
213 m_bUnderlined = bUnderlined;
214 }
215
216 inline void SetEncoding(wxFontEncoding vEncoding)
217 {
218 if (m_bNativeFontInfoOk)
219 m_vNativeFontInfo.SetEncoding(vEncoding);
220 else
221 m_vEncoding = vEncoding;
222 }
223
224 inline void SetPS(HPS hPS)
225 {
226 m_hPS = hPS;
227 }
228
229 inline void SetFM(PFONTMETRICS pFM)
230 {
231 m_pFM = pFM;
232 }
233
234 inline void SetNumFonts(int nNumFonts)
235 {
236 m_nNumFonts = nNumFonts;
237 }
238
239 //
240 // Native font info tests
241 //
242 bool HasNativeFontInfo() const { return m_bNativeFontInfoOk; }
243
244 const wxNativeFontInfo& GetNativeFontInfo() const
245 { return m_vNativeFontInfo; }
246
21802234 247protected:
cc95f4f9
DW
248 //
249 // Common part of all ctors
250 //
e99762c0
DW
251 void Init( int nSize
252 ,int nFamily
253 ,int nStyle
254 ,int nWeight
255 ,bool bUnderlined
256 ,const wxString& rsFaceName
257 ,wxFontEncoding vEncoding
258 );
259
cc95f4f9
DW
260 void Init( const wxNativeFontInfo& rInfo
261 ,WXHFONT hFont = 0
262 ,WXHANDLE hPS = 0
263 );
e99762c0 264 //
6670f564 265 // If true, the pointer to the actual font is temporary and SHOULD NOT BE
21802234 266 // DELETED by destructor
e99762c0
DW
267 //
268 bool m_bTemporary;
269 int m_nFontId;
270
271 //
272 // Font characterstics
273 //
274 int m_nPointSize;
275 int m_nFamily;
276 int m_nStyle;
277 int m_nWeight;
278 bool m_bUnderlined;
279 wxString m_sFaceName;
280 wxFontEncoding m_vEncoding;
cc95f4f9
DW
281 WXHFONT m_hFont;
282
283 //
284 // Native font info
285 //
286 wxNativeFontInfo m_vNativeFontInfo;
287 bool m_bNativeFontInfoOk;
e99762c0
DW
288
289 //
290 // Some PM specific stuff
291 //
cc95f4f9
DW
292 PFONTMETRICS m_pFM; // array of FONTMETRICS structs
293 int m_nNumFonts; // number of fonts in array
294 HPS m_hPS; // PS handle this font belongs to
295 FATTRS m_vFattrs; // Current fattrs struct
296 FACENAMEDESC m_vFname; // Current facename struct
297 bool m_bInternalPS; // Internally generated PS?
e99762c0 298}; // end of CLASS wxFontRefData
21802234 299
68c95704 300#define M_FONTDATA ((wxFontRefData*)m_refData)
873fd4af 301
21802234
DW
302// ============================================================================
303// implementation
304// ============================================================================
305
306// ----------------------------------------------------------------------------
307// wxFontRefData
308// ----------------------------------------------------------------------------
309
e99762c0
DW
310void wxFontRefData::Init(
311 int nPointSize
312, int nFamily
313, int nStyle
314, int nWeight
315, bool bUnderlined
316, const wxString& rsFaceName
317, wxFontEncoding vEncoding
318)
0e320a79 319{
e99762c0
DW
320 m_nStyle = nStyle;
321 m_nPointSize = nPointSize;
322 m_nFamily = nFamily;
323 m_nStyle = nStyle;
324 m_nWeight = nWeight;
325 m_bUnderlined = bUnderlined;
326 m_sFaceName = rsFaceName;
327 m_vEncoding = vEncoding;
cc95f4f9
DW
328 m_hFont = 0;
329
8ecff181 330 m_bNativeFontInfoOk = false;
cc95f4f9 331
e99762c0 332 m_nFontId = 0;
8ecff181 333 m_bTemporary = false;
e99762c0
DW
334 m_pFM = (PFONTMETRICS)NULL;
335 m_hPS = NULLHANDLE;
336 m_nNumFonts = 0;
337} // end of wxFontRefData::Init
0e320a79 338
cc95f4f9
DW
339void wxFontRefData::Init(
340 const wxNativeFontInfo& rInfo
341, WXHFONT hFont //this is the FontId -- functions as the hFont for OS/2
342, WXHANDLE hPS // Presentation Space we are using
343)
344{
345 //
346 // hFont may be zero, or it be passed in case we really want to
347 // use the exact font created in the underlying system
348 // (for example where we can't guarantee conversion from HFONT
349 // to LOGFONT back to HFONT)
350 //
351 m_hFont = hFont;
352 m_nFontId = (int)hFont;
353
6670f564 354 m_bNativeFontInfoOk = true;
cc95f4f9
DW
355 m_vNativeFontInfo = rInfo;
356
a23692f0 357 if (hPS == NULLHANDLE)
cc95f4f9
DW
358 {
359 m_hPS = ::WinGetPS(HWND_DESKTOP);
6670f564 360 m_bInternalPS = true;
cc95f4f9
DW
361 }
362 else
363 m_hPS = (HPS)hPS;
a23692f0
DW
364
365 m_nFontId = 0;
8ecff181 366 m_bTemporary = false;
a23692f0
DW
367 m_pFM = (PFONTMETRICS)NULL;
368 m_nNumFonts = 0;
369} // end of wxFontRefData::Init
cc95f4f9 370
0e320a79 371wxFontRefData::~wxFontRefData()
cc95f4f9
DW
372{
373 Free();
374}
375
6670f564 376bool wxFontRefData::Alloc( wxFont* pFont )
cc95f4f9
DW
377{
378 wxString sFaceName;
828621c2 379 long flId = m_hFont;
e1146627 380 long lRc;
d697657f
DW
381 ERRORID vError;
382 wxString sError;
cc95f4f9
DW
383
384 if (!m_bNativeFontInfoOk)
385 {
386 wxFillLogFont( &m_vNativeFontInfo.fa
387 ,&m_vNativeFontInfo.fn
54ffa107 388 ,&m_hPS
828621c2 389 ,&m_bInternalPS
cc95f4f9
DW
390 ,&flId
391 ,sFaceName
392 ,pFont
393 );
6670f564 394 m_bNativeFontInfoOk = true;
cc95f4f9 395 }
07df68c8
DW
396 else
397 {
398 if (flId == 0L)
399 flId = 1L;
400 else
401 flId++;
402 if (flId > 254)
403 flId = 1L;
404 }
e1146627
DW
405 if((lRc = ::GpiCreateLogFont( m_hPS
406 ,NULL
407 ,flId
408 ,&m_vNativeFontInfo.fa
409 )) != GPI_ERROR)
410 {
828621c2
DW
411 m_hFont = (WXHFONT)flId;
412 m_nFontId = flId;
e1146627 413 }
cc95f4f9
DW
414 if (!m_hFont)
415 {
d697657f
DW
416 vError = ::WinGetLastError(vHabmain);
417 sError = wxPMErrorToStr(vError);
2173b18f 418 wxLogLastError(wxT("CreateFont"));
cc95f4f9
DW
419 }
420
e1146627 421 ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
cc95f4f9
DW
422 ::GpiQueryFontMetrics(m_hPS, sizeof(FONTMETRICS), &m_vNativeFontInfo.fm);
423
424 //
425 // Set refData members with the results
426 //
cc95f4f9
DW
427 memcpy(&m_vFattrs, &m_vNativeFontInfo.fa, sizeof(m_vFattrs));
428 memcpy(&m_vFname, &m_vNativeFontInfo.fn, sizeof(m_vFname));
2c1e8f2e
DW
429 //
430 // Going to leave the point size alone. Mostly we use outline fonts
431 // that can be set to any point size inside of Presentation Parameters,
432 // regardless of whether or not the actual font is registered in the system.
433 // The GpiCreateLogFont will do enough by selecting the right family,
434 // and face name.
435 //
07df68c8 436 if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman") == 0)
cc95f4f9 437 m_nFamily = wxROMAN;
07df68c8
DW
438 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman MT 30") == 0)
439 m_nFamily = wxROMAN;
440 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "@Times New Roman MT 30") == 0)
441 m_nFamily = wxROMAN;
442 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Tms Rmn") == 0)
443 m_nFamily = wxROMAN;
444 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "WarpSans") == 0)
445 m_nFamily = wxDECORATIVE;
a4353f07 446 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helvetica") == 0)
e1146627 447 m_nFamily = wxSWISS;
07df68c8 448 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helv") == 0)
e1146627 449 m_nFamily = wxSWISS;
07df68c8 450 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Script") == 0)
cc95f4f9 451 m_nFamily = wxSCRIPT;
07df68c8 452 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier New") == 0)
e1146627 453 m_nFamily = wxTELETYPE;
07df68c8 454 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier") == 0)
e1146627 455 m_nFamily = wxTELETYPE;
07df68c8
DW
456 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Monospaced") == 0)
457 m_nFamily = wxTELETYPE;
458 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System VIO") == 0)
1b75810c 459 m_nFamily = wxMODERN;
07df68c8
DW
460 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Proportional") == 0)
461 m_nFamily = wxMODERN;
462 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Arial") == 0)
a23692f0 463 m_nFamily = wxSWISS;
1b75810c
DW
464 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Swiss") == 0)
465 m_nFamily = wxSWISS;
cc95f4f9
DW
466 else
467 m_nFamily = wxSWISS;
468
469 if (m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_ITALIC)
470 m_nStyle = wxFONTSTYLE_ITALIC;
471 else
472 m_nStyle = wxFONTSTYLE_NORMAL;
473 switch(m_vNativeFontInfo.fn.usWeightClass)
474 {
475 case FWEIGHT_DONT_CARE:
476 m_nWeight = wxFONTWEIGHT_NORMAL;
477 break;
478
479 case FWEIGHT_NORMAL:
480 m_nWeight = wxFONTWEIGHT_NORMAL;
481 break;
482
483 case FWEIGHT_LIGHT:
484 m_nWeight = wxFONTWEIGHT_LIGHT;
485 break;
486
487 case FWEIGHT_BOLD:
488 m_nWeight = wxFONTWEIGHT_BOLD;
489 break;
490
491 case FWEIGHT_ULTRA_BOLD:
492 m_nWeight = wxFONTWEIGHT_MAX;
493 break;
494
495 default:
496 m_nWeight = wxFONTWEIGHT_NORMAL;
497 }
498 m_bUnderlined = ((m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0);
0fba44b4 499 m_sFaceName = (wxChar*)m_vNativeFontInfo.fa.szFacename;
cc95f4f9 500 m_vEncoding = wxGetFontEncFromCharSet(m_vNativeFontInfo.fa.usCodePage);
828621c2
DW
501
502 //
503 // We don't actuall keep the font around if using a temporary PS
504 //
505 if (m_bInternalPS)
506 {
507 if(m_hFont)
508 ::GpiDeleteSetId( m_hPS
509 ,flId
510 );
511
512 ::WinReleasePS(m_hPS);
513 }
514 else
515 //
516 // Select the font into the Presentation space
517 //
518 ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
6670f564 519 return true;
cc95f4f9
DW
520} // end of wxFontRefData::Alloc
521
522void wxFontRefData::Free()
0e320a79 523{
e99762c0
DW
524 if (m_pFM)
525 delete [] m_pFM;
526 m_pFM = (PFONTMETRICS)NULL;
cc95f4f9
DW
527
528 if ( m_hFont )
529 {
cc95f4f9
DW
530 ::GpiDeleteSetId(m_hPS, 1L); /* delete the logical font */
531 m_nFontId = 0;
532 m_hFont = 0;
533 }
534 if (m_bInternalPS)
535 ::WinReleasePS(m_hPS);
536 m_hPS = NULLHANDLE;
537} // end of wxFontRefData::Free
0e320a79 538
21802234 539// ----------------------------------------------------------------------------
cc95f4f9 540// wxNativeFontInfo
21802234 541// ----------------------------------------------------------------------------
0e320a79 542
cc95f4f9
DW
543void wxNativeFontInfo::Init()
544{
545 memset(&fa, '\0', sizeof(FATTRS));
546} // end of wxNativeFontInfo::Init
547
548int wxNativeFontInfo::GetPointSize() const
549{
550 return fm.lEmHeight;
551} // end of wxNativeFontInfo::GetPointSize
552
553wxFontStyle wxNativeFontInfo::GetStyle() const
554{
555 return fa.fsSelection & FATTR_SEL_ITALIC ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL;
556} // end of wxNativeFontInfo::GetStyle
557
558wxFontWeight wxNativeFontInfo::GetWeight() const
559{
560 switch(fn.usWeightClass)
19193a2c 561 {
cc95f4f9
DW
562 case FWEIGHT_DONT_CARE:
563 return wxFONTWEIGHT_NORMAL;
564
565 case FWEIGHT_NORMAL:
566 return wxFONTWEIGHT_NORMAL;
19193a2c 567
cc95f4f9
DW
568 case FWEIGHT_LIGHT:
569 return wxFONTWEIGHT_LIGHT;
570
571 case FWEIGHT_BOLD:
572 return wxFONTWEIGHT_BOLD;
573
574 case FWEIGHT_ULTRA_BOLD:
575 return wxFONTWEIGHT_MAX;
19193a2c 576 }
cc95f4f9
DW
577 return wxFONTWEIGHT_NORMAL;
578} // end of wxNativeFontInfo::GetWeight
19193a2c 579
cc95f4f9
DW
580bool wxNativeFontInfo::GetUnderlined() const
581{
582 return ((fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0);
583} // end of wxNativeFontInfo::GetUnderlined
584
585wxString wxNativeFontInfo::GetFaceName() const
586{
0fba44b4 587 return (wxChar*)fm.szFacename;
cc95f4f9
DW
588} // end of wxNativeFontInfo::GetFaceName
589
590wxFontFamily wxNativeFontInfo::GetFamily() const
591{
592 int nFamily;
593
594 //
595 // Extract family from facename
596 //
07df68c8
DW
597 if (strcmp(fm.szFamilyname, "Times New Roman") == 0)
598 nFamily = wxROMAN;
599 else if (strcmp(fm.szFamilyname, "Times New Roman MT 30") == 0)
600 nFamily = wxROMAN;
601 else if (strcmp(fm.szFamilyname, "@Times New Roman MT 30") == 0)
cc95f4f9 602 nFamily = wxROMAN;
07df68c8
DW
603 else if (strcmp(fm.szFamilyname, "Tms Rmn") == 0)
604 nFamily = wxROMAN;
605 else if (strcmp(fm.szFamilyname, "WarpSans") == 0)
606 nFamily = wxDECORATIVE;
a4353f07 607 else if (strcmp(fm.szFamilyname, "Helvetica") == 0)
07df68c8
DW
608 nFamily = wxSWISS;
609 else if (strcmp(fm.szFamilyname, "Helv") == 0)
cc95f4f9 610 nFamily = wxSWISS;
07df68c8 611 else if (strcmp(fm.szFamilyname, "Script") == 0)
cc95f4f9 612 nFamily = wxSCRIPT;
07df68c8
DW
613 else if (strcmp(fm.szFamilyname, "Courier New") == 0)
614 nFamily = wxTELETYPE;
615 else if (strcmp(fm.szFamilyname, "Courier") == 0)
616 nFamily = wxTELETYPE;
617 else if (strcmp(fm.szFamilyname, "System Monospaced") == 0)
618 nFamily = wxTELETYPE;
619 else if (strcmp(fm.szFamilyname, "System VIO") == 0)
1b75810c 620 nFamily = wxMODERN;
07df68c8
DW
621 else if (strcmp(fm.szFamilyname, "System Proportional") == 0)
622 nFamily = wxMODERN;
623 else if (strcmp(fm.szFamilyname, "Arial") == 0)
a23692f0 624 nFamily = wxSWISS;
1b75810c
DW
625 else if (strcmp(fm.szFamilyname, "Swiss") == 0)
626 nFamily = wxSWISS;
cc95f4f9
DW
627 else
628 nFamily = wxSWISS;
629 return (wxFontFamily)nFamily;
630} // end of wxNativeFontInfo::GetFamily
631
632wxFontEncoding wxNativeFontInfo::GetEncoding() const
633{
634 return wxGetFontEncFromCharSet(fa.usCodePage);
635} // end of wxNativeFontInfo::GetEncoding
636
637void wxNativeFontInfo::SetPointSize(
638 int nPointsize
639)
640{
641 fm.lEmHeight = (LONG)nPointsize;
642} // end of wxNativeFontInfo::SetPointSize
643
644void wxNativeFontInfo::SetStyle(
645 wxFontStyle eStyle
646)
647{
648 switch (eStyle)
649 {
650 default:
651 wxFAIL_MSG( _T("unknown font style") );
652 // fall through
653
654 case wxFONTSTYLE_NORMAL:
655 break;
656
657 case wxFONTSTYLE_ITALIC:
658 case wxFONTSTYLE_SLANT:
659 fa.fsSelection |= FATTR_SEL_ITALIC;
660 break;
661 }
662} // end of wxNativeFontInfo::SetStyle
663
664void wxNativeFontInfo::SetWeight(
665 wxFontWeight eWeight
666)
667{
668 switch (eWeight)
669 {
670 default:
671 wxFAIL_MSG( _T("unknown font weight") );
672 // fall through
673
674 case wxFONTWEIGHT_NORMAL:
675 fn.usWeightClass = FWEIGHT_NORMAL;
676 break;
677
678 case wxFONTWEIGHT_LIGHT:
679 fn.usWeightClass = FWEIGHT_LIGHT;
680 break;
681
682 case wxFONTWEIGHT_BOLD:
683 fn.usWeightClass = FWEIGHT_BOLD;
684 break;
685 }
686} // end of wxNativeFontInfo::SetWeight
687
688void wxNativeFontInfo::SetUnderlined(
689 bool bUnderlined
690)
691{
692 if(bUnderlined)
693 fa.fsSelection |= FATTR_SEL_UNDERSCORE;
694} // end of wxNativeFontInfo::SetUnderlined
695
85ab460e 696bool wxNativeFontInfo::SetFaceName(
fbfb8bcc 697 const wxString& sFacename
cc95f4f9
DW
698)
699{
0fba44b4 700 wxStrncpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename));
85ab460e 701 return true;
cc95f4f9
DW
702} // end of wxNativeFontInfo::SetFaceName
703
704void wxNativeFontInfo::SetFamily(
705 wxFontFamily eFamily
706)
707{
708 wxString sFacename;
709
710 switch (eFamily)
711 {
712 case wxSCRIPT:
1b75810c 713 sFacename = wxT("Tms Rmn");
cc95f4f9
DW
714 break;
715
716 case wxDECORATIVE:
07df68c8 717 sFacename = wxT("WarpSans");
cc95f4f9
DW
718 break;
719
720 case wxROMAN:
1b75810c 721 sFacename = wxT("Tms Rmn");
cc95f4f9
DW
722 break;
723
724 case wxTELETYPE:
1b75810c 725 sFacename = wxT("Courier") ;
07df68c8
DW
726 break;
727
cc95f4f9 728 case wxMODERN:
1b75810c 729 sFacename = wxT("System VIO") ;
cc95f4f9
DW
730 break;
731
732 case wxSWISS:
07df68c8 733 sFacename = wxT("Helv") ;
cc95f4f9
DW
734 break;
735
736 case wxDEFAULT:
737 default:
a23692f0 738 sFacename = wxT("System VIO") ;
cc95f4f9
DW
739 }
740
0fba44b4 741 if (!wxStrlen((wxChar*)fa.szFacename) )
cc95f4f9
DW
742 {
743 SetFaceName(sFacename);
744 }
745} // end of wxNativeFontInfo::SetFamily
746
6670f564 747void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding )
cc95f4f9
DW
748{
749 wxNativeEncodingInfo vInfo;
750
751 if ( !wxGetNativeFontEncoding( eEncoding
752 ,&vInfo
753 ))
754 {
142b3bc2 755 if (wxFontMapper::Get()->GetAltForEncoding( eEncoding
cc95f4f9
DW
756 ,&vInfo
757 ))
758 {
759 if (!vInfo.facename.empty())
760 {
761 //
762 // If we have this encoding only in some particular facename, use
763 // the facename - it is better to show the correct characters in a
764 // wrong facename than unreadable text in a correct one
765 //
766 SetFaceName(vInfo.facename);
767 }
768 }
769 else
cc95f4f9
DW
770 {
771 // unsupported encoding, replace with the default
772 vInfo.charset = 850;
773 }
774 }
6670f564 775 fa.usCodePage = (USHORT)vInfo.charset;
cc95f4f9
DW
776} // end of wxNativeFontInfo::SetFaceName
777
6670f564 778bool wxNativeFontInfo::FromString( const wxString& rsStr )
cc95f4f9
DW
779{
780 long lVal;
781
782 wxStringTokenizer vTokenizer(rsStr, _T(";"));
783
784 //
785 // First the version
786 //
787 wxString sToken = vTokenizer.GetNextToken();
788
789 if (sToken != _T('0'))
8ecff181 790 return false;
cc95f4f9
DW
791
792 sToken = vTokenizer.GetNextToken();
793 if (!sToken.ToLong(&lVal))
8ecff181 794 return false;
cc95f4f9
DW
795 fm.lEmHeight = lVal;
796
797 sToken = vTokenizer.GetNextToken();
798 if (!sToken.ToLong(&lVal))
8ecff181 799 return false;
cc95f4f9
DW
800 fa.lAveCharWidth = lVal;
801
802 sToken = vTokenizer.GetNextToken();
803 if (!sToken.ToLong(&lVal))
8ecff181 804 return false;
cc95f4f9
DW
805 fa.fsSelection = (USHORT)lVal;
806
807 sToken = vTokenizer.GetNextToken();
808 if (!sToken.ToLong(&lVal))
8ecff181 809 return false;
cc95f4f9
DW
810 fa.fsType = (USHORT)lVal;
811
812 sToken = vTokenizer.GetNextToken();
813 if (!sToken.ToLong(&lVal))
8ecff181 814 return false;
cc95f4f9
DW
815 fa.fsFontUse = (USHORT)lVal;
816
817 sToken = vTokenizer.GetNextToken();
818 if (!sToken.ToLong(&lVal))
8ecff181 819 return false;
cc95f4f9
DW
820 fa.idRegistry = (USHORT)lVal;
821
822 sToken = vTokenizer.GetNextToken();
823 if (!sToken.ToLong(&lVal))
8ecff181 824 return false;
cc95f4f9
DW
825 fa.usCodePage = (USHORT)lVal;
826
827 sToken = vTokenizer.GetNextToken();
828 if (!sToken.ToLong(&lVal))
8ecff181 829 return false;
cc95f4f9
DW
830 fa.lMatch = lVal;
831
832 sToken = vTokenizer.GetNextToken();
833 if (!sToken.ToLong(&lVal))
8ecff181 834 return false;
cc95f4f9
DW
835 fn.usWeightClass = (USHORT)lVal;
836
837 sToken = vTokenizer.GetNextToken();
838 if(!sToken)
8ecff181 839 return false;
0fba44b4 840 wxStrcpy((wxChar*)fa.szFacename, sToken.c_str());
6670f564 841 return true;
cc95f4f9
DW
842} // end of wxNativeFontInfo::FromString
843
844wxString wxNativeFontInfo::ToString() const
845{
846 wxString sStr;
847
848 sStr.Printf(_T("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"),
849 0, // version, in case we want to change the format later
850 fm.lEmHeight,
851 fa.lAveCharWidth,
852 fa.lMaxBaselineExt,
853 fa.fsSelection,
854 fa.fsType,
855 fa.fsFontUse,
856 fa.idRegistry,
857 fa.usCodePage,
858 fa.lMatch,
859 fn.usWeightClass,
860 fa.szFacename);
861 return sStr;
862} // end of wxNativeFontInfo::ToString
863
864// ----------------------------------------------------------------------------
865// wxFont
866// ----------------------------------------------------------------------------
19193a2c 867
6670f564
WS
868bool wxFont::Create( const wxNativeFontInfo& rInfo,
869 WXHFONT hFont )
cc95f4f9
DW
870{
871 UnRef();
872 m_refData = new wxFontRefData( rInfo
873 ,hFont
874 );
875 RealizeResource();
6670f564 876 return true;
cc95f4f9
DW
877} // end of wxFont::Create
878
879wxFont::wxFont(
880 const wxString& rsFontdesc
881)
882{
883 wxNativeFontInfo vInfo;
884
885 if (vInfo.FromString(rsFontdesc))
886 (void)Create(vInfo);
887} // end of wxFont::wxFont
0e320a79 888
e99762c0
DW
889// ----------------------------------------------------------------------------
890// Constructor for a font. Note that the real construction is done
891// in wxDC::SetFont, when information is available about scaling etc.
892// ----------------------------------------------------------------------------
6670f564
WS
893bool wxFont::Create( int nPointSize,
894 int nFamily,
895 int nStyle,
896 int nWeight,
897 bool bUnderlined,
898 const wxString& rsFaceName,
899 wxFontEncoding vEncoding )
0e320a79
DW
900{
901 UnRef();
cc95f4f9
DW
902
903 //
904 // wxDEFAULT is a valid value for the font size too so we must treat it
905 // specially here (otherwise the size would be 70 == wxDEFAULT value)
906 //
907 if (nPointSize == wxDEFAULT)
908 {
909 nPointSize = wxNORMAL_FONT->GetPointSize();
910 }
e99762c0
DW
911 m_refData = new wxFontRefData( nPointSize
912 ,nFamily
913 ,nStyle
914 ,nWeight
915 ,bUnderlined
916 ,rsFaceName
917 ,vEncoding
918 );
0e320a79 919 RealizeResource();
6670f564 920 return true;
e99762c0 921} // end of wxFont::Create
0e320a79
DW
922
923wxFont::~wxFont()
924{
e99762c0 925} // end of wxFont::~wxFont
0e320a79 926
21802234
DW
927// ----------------------------------------------------------------------------
928// real implementation
f6bcfd97
BP
929// Boris' Kovalenko comments:
930// Because OS/2 fonts are associated with PS we can not create the font
931// here, but we may check that font definition is true
21802234
DW
932// ----------------------------------------------------------------------------
933
0e320a79
DW
934bool wxFont::RealizeResource()
935{
21802234
DW
936 if ( GetResourceHandle() )
937 {
6670f564 938 return true;
21802234 939 }
cc95f4f9 940 return M_FONTDATA->Alloc(this);
e99762c0 941} // end of wxFont::RealizeResource
21802234 942
6670f564 943bool wxFont::FreeResource( bool WXUNUSED(bForce) )
21802234 944{
e99762c0 945 if (GetResourceHandle())
21802234 946 {
cc95f4f9 947 M_FONTDATA->Free();
6670f564 948 return true;
21802234 949 }
6670f564 950 return false;
e99762c0 951} // end of wxFont::FreeResource
0e320a79 952
17b1d76b 953WXHANDLE wxFont::GetResourceHandle() const
5fd2b2c6
DW
954{
955 return GetHFONT();
e99762c0 956} // end of wxFont::GetResourceHandle
21802234 957
cc95f4f9
DW
958WXHFONT wxFont::GetHFONT() const
959{
960 return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
961} // end of wxFont::GetHFONT
962
21802234
DW
963bool wxFont::IsFree() const
964{
cc95f4f9 965 return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
e99762c0 966} // end of wxFont::IsFree
21802234 967
0e320a79
DW
968void wxFont::Unshare()
969{
21802234
DW
970 // Don't change shared data
971 if ( !m_refData )
0e320a79 972 {
21802234
DW
973 m_refData = new wxFontRefData();
974 }
0e320a79
DW
975 else
976 {
21802234
DW
977 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
978 UnRef();
979 m_refData = ref;
980 }
e99762c0 981} // end of wxFont::Unshare
0e320a79 982
21802234
DW
983// ----------------------------------------------------------------------------
984// change font attribute: we recreate font when doing it
985// ----------------------------------------------------------------------------
986
e99762c0
DW
987void wxFont::SetPointSize(
988 int nPointSize
989)
0e320a79
DW
990{
991 Unshare();
992
cc95f4f9 993 M_FONTDATA->SetPointSize(nPointSize);
0e320a79
DW
994
995 RealizeResource();
e99762c0 996} // end of wxFont::SetPointSize
0e320a79 997
e99762c0
DW
998void wxFont::SetFamily(
999 int nFamily
1000)
0e320a79
DW
1001{
1002 Unshare();
1003
cc95f4f9 1004 M_FONTDATA->SetFamily(nFamily);
0e320a79
DW
1005
1006 RealizeResource();
e99762c0 1007} // end of wxFont::SetFamily
0e320a79 1008
e99762c0
DW
1009void wxFont::SetStyle(
1010 int nStyle
1011)
0e320a79
DW
1012{
1013 Unshare();
1014
cc95f4f9 1015 M_FONTDATA->SetStyle(nStyle);
0e320a79
DW
1016
1017 RealizeResource();
e99762c0 1018} // end of wxFont::SetStyle
0e320a79 1019
e99762c0
DW
1020void wxFont::SetWeight(
1021 int nWeight
1022)
0e320a79
DW
1023{
1024 Unshare();
1025
cc95f4f9 1026 M_FONTDATA->SetWeight(nWeight);
0e320a79
DW
1027
1028 RealizeResource();
e99762c0 1029} // end of wxFont::SetWeight
0e320a79 1030
85ab460e 1031bool wxFont::SetFaceName(
e99762c0
DW
1032 const wxString& rsFaceName
1033)
0e320a79
DW
1034{
1035 Unshare();
1036
85ab460e 1037 bool refdataok = M_FONTDATA->SetFaceName(rsFaceName);
0e320a79
DW
1038
1039 RealizeResource();
85ab460e
VZ
1040
1041 return refdataok && wxFontBase::SetFaceName(rsFaceName);
e99762c0 1042} // end of wxFont::SetFaceName
0e320a79 1043
e99762c0
DW
1044void wxFont::SetUnderlined(
1045 bool bUnderlined
1046)
0e320a79
DW
1047{
1048 Unshare();
1049
cc95f4f9 1050 M_FONTDATA->SetUnderlined(bUnderlined);
0e320a79
DW
1051
1052 RealizeResource();
e99762c0 1053} // end of wxFont::SetUnderlined
0e320a79 1054
e99762c0
DW
1055void wxFont::SetEncoding(
1056 wxFontEncoding vEncoding
1057)
0e320a79 1058{
21802234
DW
1059 Unshare();
1060
cc95f4f9 1061 M_FONTDATA->SetEncoding(vEncoding);
21802234
DW
1062
1063 RealizeResource();
e99762c0
DW
1064} // end of wxFont::SetEncoding
1065
9045ad9d 1066void wxFont::DoSetNativeFontInfo(
cc95f4f9 1067 const wxNativeFontInfo& rInfo
e99762c0
DW
1068)
1069{
1070 Unshare();
1071
cc95f4f9 1072 FreeResource();
e99762c0 1073
cc95f4f9 1074 *M_FONTDATA = wxFontRefData(rInfo);
e99762c0 1075
cc95f4f9
DW
1076 RealizeResource();
1077}
0e320a79 1078
21802234
DW
1079// ----------------------------------------------------------------------------
1080// accessors
1081// ----------------------------------------------------------------------------
1082
1083int wxFont::GetPointSize() const
0e320a79 1084{
cc95f4f9 1085 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
7e99520b 1086
cc95f4f9 1087 return M_FONTDATA->GetPointSize();
e99762c0 1088} // end of wxFont::GetPointSize
0e320a79 1089
21802234 1090int wxFont::GetFamily() const
0e320a79 1091{
cc95f4f9 1092 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
21802234 1093
cc95f4f9
DW
1094 return M_FONTDATA->GetFamily();
1095} // end of wxFont::GetFamily
21802234
DW
1096
1097int wxFont::GetStyle() const
1098{
cc95f4f9
DW
1099 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1100
1101 return M_FONTDATA->GetStyle();
e99762c0 1102} // end of wxFont::GetStyle
21802234
DW
1103
1104int wxFont::GetWeight() const
1105{
cc95f4f9
DW
1106 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1107
1108 return M_FONTDATA->GetWeight();
21802234
DW
1109}
1110
1111bool wxFont::GetUnderlined() const
1112{
8ecff181 1113 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
cc95f4f9
DW
1114
1115 return M_FONTDATA->GetUnderlined();
e99762c0 1116} // end of wxFont::GetUnderlined
21802234
DW
1117
1118wxString wxFont::GetFaceName() const
1119{
521bf4ff 1120 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
e99762c0 1121
cc95f4f9 1122 return M_FONTDATA->GetFaceName();
e99762c0 1123} // end of wxFont::GetFaceName
21802234
DW
1124
1125wxFontEncoding wxFont::GetEncoding() const
1126{
cc95f4f9 1127 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
e99762c0 1128
cc95f4f9
DW
1129 return M_FONTDATA->GetEncoding();
1130} // end of wxFont::GetEncoding
0e320a79 1131
3bf5a59b 1132const wxNativeFontInfo* wxFont::GetNativeFontInfo() const
cc95f4f9 1133{
3bf5a59b
VZ
1134 return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
1135 : NULL;
cc95f4f9
DW
1136} // end of wxFont::GetNativeFontInfo
1137
1138//
1139// Internal use only method to set the FONTMETRICS array
1140//
48a1108e 1141void wxFont::SetFM( PFONTMETRICS pFM, int nNumFonts )
cc95f4f9
DW
1142{
1143 M_FONTDATA->SetFM(pFM);
1144 M_FONTDATA->SetNumFonts(nNumFonts);
1145} // end of wxFont::SetFM
e99762c0
DW
1146
1147
48a1108e 1148void wxFont::SetPS( HPS hPS )
d0a6b279
DW
1149{
1150 Unshare();
1151
1152 M_FONTDATA->SetPS(hPS);
1153
1154 RealizeResource();
47df2b8c 1155} // end of wxFont::SetPS