]> git.saurik.com Git - wxWidgets.git/blame - src/os2/font.cpp
More RTL fixes.
[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 {
cc95f4f9 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
DW
299
300// ============================================================================
301// implementation
302// ============================================================================
303
304// ----------------------------------------------------------------------------
305// wxFontRefData
306// ----------------------------------------------------------------------------
307
e99762c0
DW
308void wxFontRefData::Init(
309 int nPointSize
310, int nFamily
311, int nStyle
312, int nWeight
313, bool bUnderlined
314, const wxString& rsFaceName
315, wxFontEncoding vEncoding
316)
0e320a79 317{
e99762c0
DW
318 m_nStyle = nStyle;
319 m_nPointSize = nPointSize;
320 m_nFamily = nFamily;
321 m_nStyle = nStyle;
322 m_nWeight = nWeight;
323 m_bUnderlined = bUnderlined;
324 m_sFaceName = rsFaceName;
325 m_vEncoding = vEncoding;
cc95f4f9
DW
326 m_hFont = 0;
327
8ecff181 328 m_bNativeFontInfoOk = false;
cc95f4f9 329
e99762c0 330 m_nFontId = 0;
8ecff181 331 m_bTemporary = false;
e99762c0
DW
332 m_pFM = (PFONTMETRICS)NULL;
333 m_hPS = NULLHANDLE;
334 m_nNumFonts = 0;
335} // end of wxFontRefData::Init
0e320a79 336
cc95f4f9
DW
337void wxFontRefData::Init(
338 const wxNativeFontInfo& rInfo
339, WXHFONT hFont //this is the FontId -- functions as the hFont for OS/2
340, WXHANDLE hPS // Presentation Space we are using
341)
342{
343 //
344 // hFont may be zero, or it be passed in case we really want to
345 // use the exact font created in the underlying system
346 // (for example where we can't guarantee conversion from HFONT
347 // to LOGFONT back to HFONT)
348 //
349 m_hFont = hFont;
350 m_nFontId = (int)hFont;
351
6670f564 352 m_bNativeFontInfoOk = true;
cc95f4f9
DW
353 m_vNativeFontInfo = rInfo;
354
a23692f0 355 if (hPS == NULLHANDLE)
cc95f4f9
DW
356 {
357 m_hPS = ::WinGetPS(HWND_DESKTOP);
6670f564 358 m_bInternalPS = true;
cc95f4f9
DW
359 }
360 else
361 m_hPS = (HPS)hPS;
a23692f0
DW
362
363 m_nFontId = 0;
8ecff181 364 m_bTemporary = false;
a23692f0
DW
365 m_pFM = (PFONTMETRICS)NULL;
366 m_nNumFonts = 0;
367} // end of wxFontRefData::Init
cc95f4f9 368
0e320a79 369wxFontRefData::~wxFontRefData()
cc95f4f9
DW
370{
371 Free();
372}
373
6670f564 374bool wxFontRefData::Alloc( wxFont* pFont )
cc95f4f9
DW
375{
376 wxString sFaceName;
828621c2 377 long flId = m_hFont;
e1146627 378 long lRc;
d697657f
DW
379 ERRORID vError;
380 wxString sError;
cc95f4f9
DW
381
382 if (!m_bNativeFontInfoOk)
383 {
384 wxFillLogFont( &m_vNativeFontInfo.fa
385 ,&m_vNativeFontInfo.fn
54ffa107 386 ,&m_hPS
828621c2 387 ,&m_bInternalPS
cc95f4f9
DW
388 ,&flId
389 ,sFaceName
390 ,pFont
391 );
6670f564 392 m_bNativeFontInfoOk = true;
cc95f4f9 393 }
07df68c8
DW
394 else
395 {
396 if (flId == 0L)
397 flId = 1L;
398 else
399 flId++;
400 if (flId > 254)
401 flId = 1L;
402 }
e1146627
DW
403 if((lRc = ::GpiCreateLogFont( m_hPS
404 ,NULL
405 ,flId
406 ,&m_vNativeFontInfo.fa
407 )) != GPI_ERROR)
408 {
828621c2
DW
409 m_hFont = (WXHFONT)flId;
410 m_nFontId = flId;
e1146627 411 }
cc95f4f9
DW
412 if (!m_hFont)
413 {
d697657f
DW
414 vError = ::WinGetLastError(vHabmain);
415 sError = wxPMErrorToStr(vError);
2173b18f 416 wxLogLastError(wxT("CreateFont"));
cc95f4f9
DW
417 }
418
e1146627 419 ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
cc95f4f9
DW
420 ::GpiQueryFontMetrics(m_hPS, sizeof(FONTMETRICS), &m_vNativeFontInfo.fm);
421
422 //
423 // Set refData members with the results
424 //
cc95f4f9
DW
425 memcpy(&m_vFattrs, &m_vNativeFontInfo.fa, sizeof(m_vFattrs));
426 memcpy(&m_vFname, &m_vNativeFontInfo.fn, sizeof(m_vFname));
2c1e8f2e
DW
427 //
428 // Going to leave the point size alone. Mostly we use outline fonts
429 // that can be set to any point size inside of Presentation Parameters,
430 // regardless of whether or not the actual font is registered in the system.
431 // The GpiCreateLogFont will do enough by selecting the right family,
432 // and face name.
433 //
07df68c8 434 if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman") == 0)
cc95f4f9 435 m_nFamily = wxROMAN;
07df68c8
DW
436 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman MT 30") == 0)
437 m_nFamily = wxROMAN;
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, "Tms Rmn") == 0)
441 m_nFamily = wxROMAN;
442 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "WarpSans") == 0)
443 m_nFamily = wxDECORATIVE;
a4353f07 444 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helvetica") == 0)
e1146627 445 m_nFamily = wxSWISS;
07df68c8 446 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helv") == 0)
e1146627 447 m_nFamily = wxSWISS;
07df68c8 448 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Script") == 0)
cc95f4f9 449 m_nFamily = wxSCRIPT;
07df68c8 450 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier New") == 0)
e1146627 451 m_nFamily = wxTELETYPE;
07df68c8 452 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier") == 0)
e1146627 453 m_nFamily = wxTELETYPE;
07df68c8
DW
454 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Monospaced") == 0)
455 m_nFamily = wxTELETYPE;
456 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System VIO") == 0)
1b75810c 457 m_nFamily = wxMODERN;
07df68c8
DW
458 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Proportional") == 0)
459 m_nFamily = wxMODERN;
460 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Arial") == 0)
a23692f0 461 m_nFamily = wxSWISS;
1b75810c
DW
462 else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Swiss") == 0)
463 m_nFamily = wxSWISS;
cc95f4f9
DW
464 else
465 m_nFamily = wxSWISS;
466
467 if (m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_ITALIC)
468 m_nStyle = wxFONTSTYLE_ITALIC;
469 else
470 m_nStyle = wxFONTSTYLE_NORMAL;
471 switch(m_vNativeFontInfo.fn.usWeightClass)
472 {
473 case FWEIGHT_DONT_CARE:
474 m_nWeight = wxFONTWEIGHT_NORMAL;
475 break;
476
477 case FWEIGHT_NORMAL:
478 m_nWeight = wxFONTWEIGHT_NORMAL;
479 break;
480
481 case FWEIGHT_LIGHT:
482 m_nWeight = wxFONTWEIGHT_LIGHT;
483 break;
484
485 case FWEIGHT_BOLD:
486 m_nWeight = wxFONTWEIGHT_BOLD;
487 break;
488
489 case FWEIGHT_ULTRA_BOLD:
490 m_nWeight = wxFONTWEIGHT_MAX;
491 break;
492
493 default:
494 m_nWeight = wxFONTWEIGHT_NORMAL;
495 }
496 m_bUnderlined = ((m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0);
0fba44b4 497 m_sFaceName = (wxChar*)m_vNativeFontInfo.fa.szFacename;
cc95f4f9 498 m_vEncoding = wxGetFontEncFromCharSet(m_vNativeFontInfo.fa.usCodePage);
828621c2
DW
499
500 //
501 // We don't actuall keep the font around if using a temporary PS
502 //
503 if (m_bInternalPS)
504 {
505 if(m_hFont)
506 ::GpiDeleteSetId( m_hPS
507 ,flId
508 );
509
510 ::WinReleasePS(m_hPS);
511 }
512 else
513 //
514 // Select the font into the Presentation space
515 //
516 ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
6670f564 517 return true;
cc95f4f9
DW
518} // end of wxFontRefData::Alloc
519
520void wxFontRefData::Free()
0e320a79 521{
e99762c0
DW
522 if (m_pFM)
523 delete [] m_pFM;
524 m_pFM = (PFONTMETRICS)NULL;
cc95f4f9
DW
525
526 if ( m_hFont )
527 {
cc95f4f9
DW
528 ::GpiDeleteSetId(m_hPS, 1L); /* delete the logical font */
529 m_nFontId = 0;
530 m_hFont = 0;
531 }
532 if (m_bInternalPS)
533 ::WinReleasePS(m_hPS);
534 m_hPS = NULLHANDLE;
535} // end of wxFontRefData::Free
0e320a79 536
21802234 537// ----------------------------------------------------------------------------
cc95f4f9 538// wxNativeFontInfo
21802234 539// ----------------------------------------------------------------------------
0e320a79 540
cc95f4f9
DW
541void wxNativeFontInfo::Init()
542{
543 memset(&fa, '\0', sizeof(FATTRS));
544} // end of wxNativeFontInfo::Init
545
546int wxNativeFontInfo::GetPointSize() const
547{
548 return fm.lEmHeight;
549} // end of wxNativeFontInfo::GetPointSize
550
551wxFontStyle wxNativeFontInfo::GetStyle() const
552{
553 return fa.fsSelection & FATTR_SEL_ITALIC ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL;
554} // end of wxNativeFontInfo::GetStyle
555
556wxFontWeight wxNativeFontInfo::GetWeight() const
557{
558 switch(fn.usWeightClass)
19193a2c 559 {
cc95f4f9
DW
560 case FWEIGHT_DONT_CARE:
561 return wxFONTWEIGHT_NORMAL;
562
563 case FWEIGHT_NORMAL:
564 return wxFONTWEIGHT_NORMAL;
19193a2c 565
cc95f4f9
DW
566 case FWEIGHT_LIGHT:
567 return wxFONTWEIGHT_LIGHT;
568
569 case FWEIGHT_BOLD:
570 return wxFONTWEIGHT_BOLD;
571
572 case FWEIGHT_ULTRA_BOLD:
573 return wxFONTWEIGHT_MAX;
19193a2c 574 }
cc95f4f9
DW
575 return wxFONTWEIGHT_NORMAL;
576} // end of wxNativeFontInfo::GetWeight
19193a2c 577
cc95f4f9
DW
578bool wxNativeFontInfo::GetUnderlined() const
579{
580 return ((fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0);
581} // end of wxNativeFontInfo::GetUnderlined
582
583wxString wxNativeFontInfo::GetFaceName() const
584{
0fba44b4 585 return (wxChar*)fm.szFacename;
cc95f4f9
DW
586} // end of wxNativeFontInfo::GetFaceName
587
588wxFontFamily wxNativeFontInfo::GetFamily() const
589{
590 int nFamily;
591
592 //
593 // Extract family from facename
594 //
07df68c8
DW
595 if (strcmp(fm.szFamilyname, "Times New Roman") == 0)
596 nFamily = wxROMAN;
597 else if (strcmp(fm.szFamilyname, "Times New Roman MT 30") == 0)
598 nFamily = wxROMAN;
599 else if (strcmp(fm.szFamilyname, "@Times New Roman MT 30") == 0)
cc95f4f9 600 nFamily = wxROMAN;
07df68c8
DW
601 else if (strcmp(fm.szFamilyname, "Tms Rmn") == 0)
602 nFamily = wxROMAN;
603 else if (strcmp(fm.szFamilyname, "WarpSans") == 0)
604 nFamily = wxDECORATIVE;
a4353f07 605 else if (strcmp(fm.szFamilyname, "Helvetica") == 0)
07df68c8
DW
606 nFamily = wxSWISS;
607 else if (strcmp(fm.szFamilyname, "Helv") == 0)
cc95f4f9 608 nFamily = wxSWISS;
07df68c8 609 else if (strcmp(fm.szFamilyname, "Script") == 0)
cc95f4f9 610 nFamily = wxSCRIPT;
07df68c8
DW
611 else if (strcmp(fm.szFamilyname, "Courier New") == 0)
612 nFamily = wxTELETYPE;
613 else if (strcmp(fm.szFamilyname, "Courier") == 0)
614 nFamily = wxTELETYPE;
615 else if (strcmp(fm.szFamilyname, "System Monospaced") == 0)
616 nFamily = wxTELETYPE;
617 else if (strcmp(fm.szFamilyname, "System VIO") == 0)
1b75810c 618 nFamily = wxMODERN;
07df68c8
DW
619 else if (strcmp(fm.szFamilyname, "System Proportional") == 0)
620 nFamily = wxMODERN;
621 else if (strcmp(fm.szFamilyname, "Arial") == 0)
a23692f0 622 nFamily = wxSWISS;
1b75810c
DW
623 else if (strcmp(fm.szFamilyname, "Swiss") == 0)
624 nFamily = wxSWISS;
cc95f4f9
DW
625 else
626 nFamily = wxSWISS;
627 return (wxFontFamily)nFamily;
628} // end of wxNativeFontInfo::GetFamily
629
630wxFontEncoding wxNativeFontInfo::GetEncoding() const
631{
632 return wxGetFontEncFromCharSet(fa.usCodePage);
633} // end of wxNativeFontInfo::GetEncoding
634
635void wxNativeFontInfo::SetPointSize(
636 int nPointsize
637)
638{
639 fm.lEmHeight = (LONG)nPointsize;
640} // end of wxNativeFontInfo::SetPointSize
641
642void wxNativeFontInfo::SetStyle(
643 wxFontStyle eStyle
644)
645{
646 switch (eStyle)
647 {
648 default:
649 wxFAIL_MSG( _T("unknown font style") );
650 // fall through
651
652 case wxFONTSTYLE_NORMAL:
653 break;
654
655 case wxFONTSTYLE_ITALIC:
656 case wxFONTSTYLE_SLANT:
657 fa.fsSelection |= FATTR_SEL_ITALIC;
658 break;
659 }
660} // end of wxNativeFontInfo::SetStyle
661
662void wxNativeFontInfo::SetWeight(
663 wxFontWeight eWeight
664)
665{
666 switch (eWeight)
667 {
668 default:
669 wxFAIL_MSG( _T("unknown font weight") );
670 // fall through
671
672 case wxFONTWEIGHT_NORMAL:
673 fn.usWeightClass = FWEIGHT_NORMAL;
674 break;
675
676 case wxFONTWEIGHT_LIGHT:
677 fn.usWeightClass = FWEIGHT_LIGHT;
678 break;
679
680 case wxFONTWEIGHT_BOLD:
681 fn.usWeightClass = FWEIGHT_BOLD;
682 break;
683 }
684} // end of wxNativeFontInfo::SetWeight
685
686void wxNativeFontInfo::SetUnderlined(
687 bool bUnderlined
688)
689{
690 if(bUnderlined)
691 fa.fsSelection |= FATTR_SEL_UNDERSCORE;
692} // end of wxNativeFontInfo::SetUnderlined
693
85ab460e 694bool wxNativeFontInfo::SetFaceName(
fbfb8bcc 695 const wxString& sFacename
cc95f4f9
DW
696)
697{
0fba44b4 698 wxStrncpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename));
85ab460e 699 return true;
cc95f4f9
DW
700} // end of wxNativeFontInfo::SetFaceName
701
702void wxNativeFontInfo::SetFamily(
703 wxFontFamily eFamily
704)
705{
706 wxString sFacename;
707
708 switch (eFamily)
709 {
710 case wxSCRIPT:
1b75810c 711 sFacename = wxT("Tms Rmn");
cc95f4f9
DW
712 break;
713
714 case wxDECORATIVE:
07df68c8 715 sFacename = wxT("WarpSans");
cc95f4f9
DW
716 break;
717
718 case wxROMAN:
1b75810c 719 sFacename = wxT("Tms Rmn");
cc95f4f9
DW
720 break;
721
722 case wxTELETYPE:
1b75810c 723 sFacename = wxT("Courier") ;
07df68c8
DW
724 break;
725
cc95f4f9 726 case wxMODERN:
1b75810c 727 sFacename = wxT("System VIO") ;
cc95f4f9
DW
728 break;
729
730 case wxSWISS:
07df68c8 731 sFacename = wxT("Helv") ;
cc95f4f9
DW
732 break;
733
734 case wxDEFAULT:
735 default:
a23692f0 736 sFacename = wxT("System VIO") ;
cc95f4f9
DW
737 }
738
0fba44b4 739 if (!wxStrlen((wxChar*)fa.szFacename) )
cc95f4f9
DW
740 {
741 SetFaceName(sFacename);
742 }
743} // end of wxNativeFontInfo::SetFamily
744
6670f564 745void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding )
cc95f4f9
DW
746{
747 wxNativeEncodingInfo vInfo;
748
749 if ( !wxGetNativeFontEncoding( eEncoding
750 ,&vInfo
751 ))
752 {
142b3bc2 753 if (wxFontMapper::Get()->GetAltForEncoding( eEncoding
cc95f4f9
DW
754 ,&vInfo
755 ))
756 {
757 if (!vInfo.facename.empty())
758 {
759 //
760 // If we have this encoding only in some particular facename, use
761 // the facename - it is better to show the correct characters in a
762 // wrong facename than unreadable text in a correct one
763 //
764 SetFaceName(vInfo.facename);
765 }
766 }
767 else
cc95f4f9
DW
768 {
769 // unsupported encoding, replace with the default
770 vInfo.charset = 850;
771 }
772 }
6670f564 773 fa.usCodePage = (USHORT)vInfo.charset;
cc95f4f9
DW
774} // end of wxNativeFontInfo::SetFaceName
775
6670f564 776bool wxNativeFontInfo::FromString( const wxString& rsStr )
cc95f4f9
DW
777{
778 long lVal;
779
780 wxStringTokenizer vTokenizer(rsStr, _T(";"));
781
782 //
783 // First the version
784 //
785 wxString sToken = vTokenizer.GetNextToken();
786
787 if (sToken != _T('0'))
8ecff181 788 return false;
cc95f4f9
DW
789
790 sToken = vTokenizer.GetNextToken();
791 if (!sToken.ToLong(&lVal))
8ecff181 792 return false;
cc95f4f9
DW
793 fm.lEmHeight = lVal;
794
795 sToken = vTokenizer.GetNextToken();
796 if (!sToken.ToLong(&lVal))
8ecff181 797 return false;
cc95f4f9
DW
798 fa.lAveCharWidth = lVal;
799
800 sToken = vTokenizer.GetNextToken();
801 if (!sToken.ToLong(&lVal))
8ecff181 802 return false;
cc95f4f9
DW
803 fa.fsSelection = (USHORT)lVal;
804
805 sToken = vTokenizer.GetNextToken();
806 if (!sToken.ToLong(&lVal))
8ecff181 807 return false;
cc95f4f9
DW
808 fa.fsType = (USHORT)lVal;
809
810 sToken = vTokenizer.GetNextToken();
811 if (!sToken.ToLong(&lVal))
8ecff181 812 return false;
cc95f4f9
DW
813 fa.fsFontUse = (USHORT)lVal;
814
815 sToken = vTokenizer.GetNextToken();
816 if (!sToken.ToLong(&lVal))
8ecff181 817 return false;
cc95f4f9
DW
818 fa.idRegistry = (USHORT)lVal;
819
820 sToken = vTokenizer.GetNextToken();
821 if (!sToken.ToLong(&lVal))
8ecff181 822 return false;
cc95f4f9
DW
823 fa.usCodePage = (USHORT)lVal;
824
825 sToken = vTokenizer.GetNextToken();
826 if (!sToken.ToLong(&lVal))
8ecff181 827 return false;
cc95f4f9
DW
828 fa.lMatch = lVal;
829
830 sToken = vTokenizer.GetNextToken();
831 if (!sToken.ToLong(&lVal))
8ecff181 832 return false;
cc95f4f9
DW
833 fn.usWeightClass = (USHORT)lVal;
834
835 sToken = vTokenizer.GetNextToken();
836 if(!sToken)
8ecff181 837 return false;
0fba44b4 838 wxStrcpy((wxChar*)fa.szFacename, sToken.c_str());
6670f564 839 return true;
cc95f4f9
DW
840} // end of wxNativeFontInfo::FromString
841
842wxString wxNativeFontInfo::ToString() const
843{
844 wxString sStr;
845
846 sStr.Printf(_T("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"),
847 0, // version, in case we want to change the format later
848 fm.lEmHeight,
849 fa.lAveCharWidth,
850 fa.lMaxBaselineExt,
851 fa.fsSelection,
852 fa.fsType,
853 fa.fsFontUse,
854 fa.idRegistry,
855 fa.usCodePage,
856 fa.lMatch,
857 fn.usWeightClass,
858 fa.szFacename);
859 return sStr;
860} // end of wxNativeFontInfo::ToString
861
862// ----------------------------------------------------------------------------
863// wxFont
864// ----------------------------------------------------------------------------
19193a2c 865
6670f564
WS
866bool wxFont::Create( const wxNativeFontInfo& rInfo,
867 WXHFONT hFont )
cc95f4f9
DW
868{
869 UnRef();
870 m_refData = new wxFontRefData( rInfo
871 ,hFont
872 );
873 RealizeResource();
6670f564 874 return true;
cc95f4f9
DW
875} // end of wxFont::Create
876
877wxFont::wxFont(
878 const wxString& rsFontdesc
879)
880{
881 wxNativeFontInfo vInfo;
882
883 if (vInfo.FromString(rsFontdesc))
884 (void)Create(vInfo);
885} // end of wxFont::wxFont
0e320a79 886
e99762c0
DW
887// ----------------------------------------------------------------------------
888// Constructor for a font. Note that the real construction is done
889// in wxDC::SetFont, when information is available about scaling etc.
890// ----------------------------------------------------------------------------
6670f564
WS
891bool wxFont::Create( int nPointSize,
892 int nFamily,
893 int nStyle,
894 int nWeight,
895 bool bUnderlined,
896 const wxString& rsFaceName,
897 wxFontEncoding vEncoding )
0e320a79
DW
898{
899 UnRef();
cc95f4f9
DW
900
901 //
902 // wxDEFAULT is a valid value for the font size too so we must treat it
903 // specially here (otherwise the size would be 70 == wxDEFAULT value)
904 //
905 if (nPointSize == wxDEFAULT)
906 {
907 nPointSize = wxNORMAL_FONT->GetPointSize();
908 }
e99762c0
DW
909 m_refData = new wxFontRefData( nPointSize
910 ,nFamily
911 ,nStyle
912 ,nWeight
913 ,bUnderlined
914 ,rsFaceName
915 ,vEncoding
916 );
0e320a79 917 RealizeResource();
6670f564 918 return true;
e99762c0 919} // end of wxFont::Create
0e320a79
DW
920
921wxFont::~wxFont()
922{
e99762c0 923} // end of wxFont::~wxFont
0e320a79 924
21802234
DW
925// ----------------------------------------------------------------------------
926// real implementation
f6bcfd97
BP
927// Boris' Kovalenko comments:
928// Because OS/2 fonts are associated with PS we can not create the font
929// here, but we may check that font definition is true
21802234
DW
930// ----------------------------------------------------------------------------
931
0e320a79
DW
932bool wxFont::RealizeResource()
933{
21802234
DW
934 if ( GetResourceHandle() )
935 {
6670f564 936 return true;
21802234 937 }
cc95f4f9 938 return M_FONTDATA->Alloc(this);
e99762c0 939} // end of wxFont::RealizeResource
21802234 940
6670f564 941bool wxFont::FreeResource( bool WXUNUSED(bForce) )
21802234 942{
e99762c0 943 if (GetResourceHandle())
21802234 944 {
cc95f4f9 945 M_FONTDATA->Free();
6670f564 946 return true;
21802234 947 }
6670f564 948 return false;
e99762c0 949} // end of wxFont::FreeResource
0e320a79 950
5fd2b2c6
DW
951WXHANDLE wxFont::GetResourceHandle()
952{
953 return GetHFONT();
e99762c0 954} // end of wxFont::GetResourceHandle
21802234 955
cc95f4f9
DW
956WXHFONT wxFont::GetHFONT() const
957{
958 return M_FONTDATA ? M_FONTDATA->GetHFONT() : 0;
959} // end of wxFont::GetHFONT
960
21802234
DW
961bool wxFont::IsFree() const
962{
cc95f4f9 963 return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
e99762c0 964} // end of wxFont::IsFree
21802234 965
0e320a79
DW
966void wxFont::Unshare()
967{
21802234
DW
968 // Don't change shared data
969 if ( !m_refData )
0e320a79 970 {
21802234
DW
971 m_refData = new wxFontRefData();
972 }
0e320a79
DW
973 else
974 {
21802234
DW
975 wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
976 UnRef();
977 m_refData = ref;
978 }
e99762c0 979} // end of wxFont::Unshare
0e320a79 980
21802234
DW
981// ----------------------------------------------------------------------------
982// change font attribute: we recreate font when doing it
983// ----------------------------------------------------------------------------
984
e99762c0
DW
985void wxFont::SetPointSize(
986 int nPointSize
987)
0e320a79
DW
988{
989 Unshare();
990
cc95f4f9 991 M_FONTDATA->SetPointSize(nPointSize);
0e320a79
DW
992
993 RealizeResource();
e99762c0 994} // end of wxFont::SetPointSize
0e320a79 995
e99762c0
DW
996void wxFont::SetFamily(
997 int nFamily
998)
0e320a79
DW
999{
1000 Unshare();
1001
cc95f4f9 1002 M_FONTDATA->SetFamily(nFamily);
0e320a79
DW
1003
1004 RealizeResource();
e99762c0 1005} // end of wxFont::SetFamily
0e320a79 1006
e99762c0
DW
1007void wxFont::SetStyle(
1008 int nStyle
1009)
0e320a79
DW
1010{
1011 Unshare();
1012
cc95f4f9 1013 M_FONTDATA->SetStyle(nStyle);
0e320a79
DW
1014
1015 RealizeResource();
e99762c0 1016} // end of wxFont::SetStyle
0e320a79 1017
e99762c0
DW
1018void wxFont::SetWeight(
1019 int nWeight
1020)
0e320a79
DW
1021{
1022 Unshare();
1023
cc95f4f9 1024 M_FONTDATA->SetWeight(nWeight);
0e320a79
DW
1025
1026 RealizeResource();
e99762c0 1027} // end of wxFont::SetWeight
0e320a79 1028
85ab460e 1029bool wxFont::SetFaceName(
e99762c0
DW
1030 const wxString& rsFaceName
1031)
0e320a79
DW
1032{
1033 Unshare();
1034
85ab460e 1035 bool refdataok = M_FONTDATA->SetFaceName(rsFaceName);
0e320a79
DW
1036
1037 RealizeResource();
85ab460e
VZ
1038
1039 return refdataok && wxFontBase::SetFaceName(rsFaceName);
e99762c0 1040} // end of wxFont::SetFaceName
0e320a79 1041
e99762c0
DW
1042void wxFont::SetUnderlined(
1043 bool bUnderlined
1044)
0e320a79
DW
1045{
1046 Unshare();
1047
cc95f4f9 1048 M_FONTDATA->SetUnderlined(bUnderlined);
0e320a79
DW
1049
1050 RealizeResource();
e99762c0 1051} // end of wxFont::SetUnderlined
0e320a79 1052
e99762c0
DW
1053void wxFont::SetEncoding(
1054 wxFontEncoding vEncoding
1055)
0e320a79 1056{
21802234
DW
1057 Unshare();
1058
cc95f4f9 1059 M_FONTDATA->SetEncoding(vEncoding);
21802234
DW
1060
1061 RealizeResource();
e99762c0
DW
1062} // end of wxFont::SetEncoding
1063
9045ad9d 1064void wxFont::DoSetNativeFontInfo(
cc95f4f9 1065 const wxNativeFontInfo& rInfo
e99762c0
DW
1066)
1067{
1068 Unshare();
1069
cc95f4f9 1070 FreeResource();
e99762c0 1071
cc95f4f9 1072 *M_FONTDATA = wxFontRefData(rInfo);
e99762c0 1073
cc95f4f9
DW
1074 RealizeResource();
1075}
0e320a79 1076
21802234
DW
1077// ----------------------------------------------------------------------------
1078// accessors
1079// ----------------------------------------------------------------------------
1080
1081int wxFont::GetPointSize() const
0e320a79 1082{
cc95f4f9 1083 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
7e99520b 1084
cc95f4f9 1085 return M_FONTDATA->GetPointSize();
e99762c0 1086} // end of wxFont::GetPointSize
0e320a79 1087
21802234 1088int wxFont::GetFamily() const
0e320a79 1089{
cc95f4f9 1090 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
21802234 1091
cc95f4f9
DW
1092 return M_FONTDATA->GetFamily();
1093} // end of wxFont::GetFamily
21802234
DW
1094
1095int wxFont::GetStyle() const
1096{
cc95f4f9
DW
1097 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1098
1099 return M_FONTDATA->GetStyle();
e99762c0 1100} // end of wxFont::GetStyle
21802234
DW
1101
1102int wxFont::GetWeight() const
1103{
cc95f4f9
DW
1104 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1105
1106 return M_FONTDATA->GetWeight();
21802234
DW
1107}
1108
1109bool wxFont::GetUnderlined() const
1110{
8ecff181 1111 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
cc95f4f9
DW
1112
1113 return M_FONTDATA->GetUnderlined();
e99762c0 1114} // end of wxFont::GetUnderlined
21802234
DW
1115
1116wxString wxFont::GetFaceName() const
1117{
521bf4ff 1118 wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
e99762c0 1119
cc95f4f9 1120 return M_FONTDATA->GetFaceName();
e99762c0 1121} // end of wxFont::GetFaceName
21802234
DW
1122
1123wxFontEncoding wxFont::GetEncoding() const
1124{
cc95f4f9 1125 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
e99762c0 1126
cc95f4f9
DW
1127 return M_FONTDATA->GetEncoding();
1128} // end of wxFont::GetEncoding
0e320a79 1129
3bf5a59b 1130const wxNativeFontInfo* wxFont::GetNativeFontInfo() const
cc95f4f9 1131{
3bf5a59b
VZ
1132 return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
1133 : NULL;
cc95f4f9
DW
1134} // end of wxFont::GetNativeFontInfo
1135
1136//
1137// Internal use only method to set the FONTMETRICS array
1138//
48a1108e 1139void wxFont::SetFM( PFONTMETRICS pFM, int nNumFonts )
cc95f4f9
DW
1140{
1141 M_FONTDATA->SetFM(pFM);
1142 M_FONTDATA->SetNumFonts(nNumFonts);
1143} // end of wxFont::SetFM
e99762c0
DW
1144
1145
48a1108e 1146void wxFont::SetPS( HPS hPS )
d0a6b279
DW
1147{
1148 Unshare();
1149
1150 M_FONTDATA->SetPS(hPS);
1151
1152 RealizeResource();
47df2b8c 1153} // end of wxFont::SetPS