1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/font.cpp
3 // Purpose: wxFont class
4 // Author: David Webster
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
15 // ============================================================================
17 // ============================================================================
19 // ----------------------------------------------------------------------------
21 // ----------------------------------------------------------------------------
33 #include "wx/os2/private.h"
35 #include "wx/fontutil.h"
36 #include "wx/fontmap.h"
37 #include "wx/encinfo.h"
39 #include "wx/tokenzr.h"
43 // ----------------------------------------------------------------------------
44 // wxFontRefData - the internal description of the font
45 // ----------------------------------------------------------------------------
47 class WXDLLEXPORT wxFontRefData
: public wxGDIRefData
52 Init(-1, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
, false,
53 wxEmptyString
, wxFONTENCODING_DEFAULT
);
56 wxFontRefData( int nSize
61 ,const wxString
& sFaceName
62 ,wxFontEncoding vEncoding
75 wxFontRefData( const wxNativeFontInfo
& rInfo
86 wxFontRefData(const wxFontRefData
& rData
)
88 Init( rData
.m_nPointSize
96 m_nFontId
= rData
.m_nFontId
;
99 virtual ~wxFontRefData();
104 bool Alloc(wxFont
* pFont
);
108 // All wxFont accessors
110 inline int GetPointSize(void) const
113 // We don't use the actual native font point size since it is
114 // the chosen physical font, which is usually only and approximation
115 // of the desired outline font. The actual displayable point size
116 // is the one stored in the refData
121 inline wxFontFamily
GetFamily(void) const
126 inline wxFontStyle
GetStyle(void) const
128 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetStyle()
132 inline wxFontWeight
GetWeight(void) const
134 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetWeight()
138 inline bool GetUnderlined(void) const
140 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetUnderlined()
144 inline wxString
GetFaceName(void) const
148 if (m_bNativeFontInfoOk
)
149 sFaceName
= m_vNativeFontInfo
.GetFaceName();
151 sFaceName
= m_sFaceName
;
156 inline wxFontEncoding
GetEncoding(void) const
158 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetEncoding()
162 inline WXHFONT
GetHFONT(void) const { return m_hFont
; }
163 inline HPS
GetPS(void) const { return m_hPS
; }
164 inline PFONTMETRICS
GetFM(void) const { return m_pFM
; }
165 inline int GetNumFonts(void) const { return m_nNumFonts
; }
168 inline void SetPointSize(int nPointSize
)
170 if (m_bNativeFontInfoOk
)
171 m_vNativeFontInfo
.SetPointSize(nPointSize
);
173 m_nPointSize
= nPointSize
;
176 inline void SetFamily(wxFontFamily nFamily
)
181 inline void SetStyle(wxFontStyle nStyle
)
183 if (m_bNativeFontInfoOk
)
184 m_vNativeFontInfo
.SetStyle(nStyle
);
189 inline void SetWeight(wxFontWeight nWeight
)
191 if (m_bNativeFontInfoOk
)
192 m_vNativeFontInfo
.SetWeight(nWeight
);
197 inline bool SetFaceName(const wxString
& sFaceName
)
199 if (m_bNativeFontInfoOk
)
200 return m_vNativeFontInfo
.SetFaceName(sFaceName
);
202 m_sFaceName
= sFaceName
;
206 inline void SetUnderlined(bool bUnderlined
)
208 if (m_bNativeFontInfoOk
)
209 m_vNativeFontInfo
.SetUnderlined(bUnderlined
);
211 m_bUnderlined
= bUnderlined
;
214 inline void SetEncoding(wxFontEncoding vEncoding
)
216 if (m_bNativeFontInfoOk
)
217 m_vNativeFontInfo
.SetEncoding(vEncoding
);
219 m_vEncoding
= vEncoding
;
222 inline void SetPS(HPS hPS
)
227 inline void SetFM(PFONTMETRICS pFM
)
232 inline void SetNumFonts(int nNumFonts
)
234 m_nNumFonts
= nNumFonts
;
238 // Native font info tests
240 bool HasNativeFontInfo() const { return m_bNativeFontInfoOk
; }
242 const wxNativeFontInfo
& GetNativeFontInfo() const
243 { return m_vNativeFontInfo
; }
247 // Common part of all ctors
250 ,wxFontFamily nFamily
252 ,wxFontWeight nWeight
254 ,const wxString
& rsFaceName
255 ,wxFontEncoding vEncoding
258 void Init( const wxNativeFontInfo
& rInfo
263 // If true, the pointer to the actual font is temporary and SHOULD NOT BE
264 // DELETED by destructor
270 // Font characterstics
273 wxFontFamily m_nFamily
;
274 wxFontStyle m_nStyle
;
275 wxFontWeight m_nWeight
;
277 wxString m_sFaceName
;
278 wxFontEncoding m_vEncoding
;
284 wxNativeFontInfo m_vNativeFontInfo
;
285 bool m_bNativeFontInfoOk
;
288 // Some PM specific stuff
290 PFONTMETRICS m_pFM
; // array of FONTMETRICS structs
291 int m_nNumFonts
; // number of fonts in array
292 HPS m_hPS
; // PS handle this font belongs to
293 FATTRS m_vFattrs
; // Current fattrs struct
294 FACENAMEDESC m_vFname
; // Current facename struct
295 bool m_bInternalPS
; // Internally generated PS?
296 }; // end of CLASS wxFontRefData
298 #define M_FONTDATA ((wxFontRefData*)m_refData)
300 // ============================================================================
302 // ============================================================================
304 // ----------------------------------------------------------------------------
306 // ----------------------------------------------------------------------------
308 void wxFontRefData::Init(
310 , wxFontFamily nFamily
312 , wxFontWeight nWeight
314 , const wxString
& rsFaceName
315 , wxFontEncoding vEncoding
319 m_nPointSize
= nPointSize
;
323 m_bUnderlined
= bUnderlined
;
324 m_sFaceName
= rsFaceName
;
325 m_vEncoding
= vEncoding
;
328 m_bNativeFontInfoOk
= false;
331 m_bTemporary
= false;
332 m_pFM
= (PFONTMETRICS
)NULL
;
335 } // end of wxFontRefData::Init
337 void 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
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)
350 m_nFontId
= (int)hFont
;
352 m_bNativeFontInfoOk
= true;
353 m_vNativeFontInfo
= rInfo
;
355 if (hPS
== NULLHANDLE
)
357 m_hPS
= ::WinGetPS(HWND_DESKTOP
);
358 m_bInternalPS
= true;
364 m_bTemporary
= false;
365 m_pFM
= (PFONTMETRICS
)NULL
;
367 } // end of wxFontRefData::Init
369 wxFontRefData::~wxFontRefData()
374 bool wxFontRefData::Alloc( wxFont
* pFont
)
382 if (!m_bNativeFontInfoOk
)
384 wxFillLogFont( &m_vNativeFontInfo
.fa
385 ,&m_vNativeFontInfo
.fn
392 m_bNativeFontInfoOk
= true;
403 if((lRc
= ::GpiCreateLogFont( m_hPS
406 ,&m_vNativeFontInfo
.fa
409 m_hFont
= (WXHFONT
)flId
;
414 vError
= ::WinGetLastError(vHabmain
);
415 sError
= wxPMErrorToStr(vError
);
416 wxLogLastError(wxT("CreateFont"));
419 ::GpiSetCharSet(m_hPS
, flId
); // sets font for presentation space
420 ::GpiQueryFontMetrics(m_hPS
, sizeof(FONTMETRICS
), &m_vNativeFontInfo
.fm
);
423 // Set refData members with the results
425 memcpy(&m_vFattrs
, &m_vNativeFontInfo
.fa
, sizeof(m_vFattrs
));
426 memcpy(&m_vFname
, &m_vNativeFontInfo
.fn
, sizeof(m_vFname
));
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,
434 if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Times New Roman") == 0)
435 m_nFamily
= wxFONTFAMILY_ROMAN
;
436 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Times New Roman MT 30") == 0)
437 m_nFamily
= wxFONTFAMILY_ROMAN
;
438 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "@Times New Roman MT 30") == 0)
439 m_nFamily
= wxFONTFAMILY_ROMAN
;
440 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Tms Rmn") == 0)
441 m_nFamily
= wxFONTFAMILY_ROMAN
;
442 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "WarpSans") == 0)
443 m_nFamily
= wxFONTFAMILY_DECORATIVE
;
444 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Helvetica") == 0)
445 m_nFamily
= wxFONTFAMILY_SWISS
;
446 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Helv") == 0)
447 m_nFamily
= wxFONTFAMILY_SWISS
;
448 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Script") == 0)
449 m_nFamily
= wxFONTFAMILY_SCRIPT
;
450 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Courier New") == 0)
451 m_nFamily
= wxFONTFAMILY_TELETYPE
;
452 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Courier") == 0)
453 m_nFamily
= wxFONTFAMILY_TELETYPE
;
454 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System Monospaced") == 0)
455 m_nFamily
= wxFONTFAMILY_TELETYPE
;
456 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System VIO") == 0)
457 m_nFamily
= wxFONTFAMILY_MODERN
;
458 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System Proportional") == 0)
459 m_nFamily
= wxFONTFAMILY_MODERN
;
460 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Arial") == 0)
461 m_nFamily
= wxFONTFAMILY_SWISS
;
462 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Swiss") == 0)
463 m_nFamily
= wxFONTFAMILY_SWISS
;
465 m_nFamily
= wxFONTFAMILY_SWISS
;
467 if (m_vNativeFontInfo
.fa
.fsSelection
& FATTR_SEL_ITALIC
)
468 m_nStyle
= wxFONTSTYLE_ITALIC
;
470 m_nStyle
= wxFONTSTYLE_NORMAL
;
471 switch(m_vNativeFontInfo
.fn
.usWeightClass
)
473 case FWEIGHT_DONT_CARE
:
474 m_nWeight
= wxFONTWEIGHT_NORMAL
;
478 m_nWeight
= wxFONTWEIGHT_NORMAL
;
482 m_nWeight
= wxFONTWEIGHT_LIGHT
;
486 m_nWeight
= wxFONTWEIGHT_BOLD
;
489 case FWEIGHT_ULTRA_BOLD
:
490 m_nWeight
= wxFONTWEIGHT_MAX
;
494 m_nWeight
= wxFONTWEIGHT_NORMAL
;
496 m_bUnderlined
= ((m_vNativeFontInfo
.fa
.fsSelection
& FATTR_SEL_UNDERSCORE
) != 0);
497 m_sFaceName
= (wxChar
*)m_vNativeFontInfo
.fa
.szFacename
;
498 m_vEncoding
= wxGetFontEncFromCharSet(m_vNativeFontInfo
.fa
.usCodePage
);
501 // We don't actuall keep the font around if using a temporary PS
506 ::GpiDeleteSetId( m_hPS
510 ::WinReleasePS(m_hPS
);
514 // Select the font into the Presentation space
516 ::GpiSetCharSet(m_hPS
, flId
); // sets font for presentation space
518 } // end of wxFontRefData::Alloc
520 void wxFontRefData::Free()
524 m_pFM
= (PFONTMETRICS
)NULL
;
528 ::GpiDeleteSetId(m_hPS
, 1L); /* delete the logical font */
533 ::WinReleasePS(m_hPS
);
535 } // end of wxFontRefData::Free
537 // ----------------------------------------------------------------------------
539 // ----------------------------------------------------------------------------
541 void wxNativeFontInfo::Init()
543 memset(&fa
, '\0', sizeof(FATTRS
));
544 } // end of wxNativeFontInfo::Init
546 int wxNativeFontInfo::GetPointSize() const
549 } // end of wxNativeFontInfo::GetPointSize
551 wxFontStyle
wxNativeFontInfo::GetStyle() const
553 return fa
.fsSelection
& FATTR_SEL_ITALIC
? wxFONTSTYLE_ITALIC
: wxFONTSTYLE_NORMAL
;
554 } // end of wxNativeFontInfo::GetStyle
556 wxFontWeight
wxNativeFontInfo::GetWeight() const
558 switch(fn
.usWeightClass
)
560 case FWEIGHT_DONT_CARE
:
561 return wxFONTWEIGHT_NORMAL
;
564 return wxFONTWEIGHT_NORMAL
;
567 return wxFONTWEIGHT_LIGHT
;
570 return wxFONTWEIGHT_BOLD
;
572 case FWEIGHT_ULTRA_BOLD
:
573 return wxFONTWEIGHT_MAX
;
575 return wxFONTWEIGHT_NORMAL
;
576 } // end of wxNativeFontInfo::GetWeight
578 bool wxNativeFontInfo::GetUnderlined() const
580 return ((fa
.fsSelection
& FATTR_SEL_UNDERSCORE
) != 0);
581 } // end of wxNativeFontInfo::GetUnderlined
583 wxString
wxNativeFontInfo::GetFaceName() const
585 return (wxChar
*)fm
.szFacename
;
586 } // end of wxNativeFontInfo::GetFaceName
588 wxFontFamily
wxNativeFontInfo::GetFamily() const
593 // Extract family from facename
595 if (strcmp(fm
.szFamilyname
, "Times New Roman") == 0)
596 nFamily
= wxFONTFAMILY_ROMAN
;
597 else if (strcmp(fm
.szFamilyname
, "Times New Roman MT 30") == 0)
598 nFamily
= wxFONTFAMILY_ROMAN
;
599 else if (strcmp(fm
.szFamilyname
, "@Times New Roman MT 30") == 0)
600 nFamily
= wxFONTFAMILY_ROMAN
;
601 else if (strcmp(fm
.szFamilyname
, "Tms Rmn") == 0)
602 nFamily
= wxFONTFAMILY_ROMAN
;
603 else if (strcmp(fm
.szFamilyname
, "WarpSans") == 0)
604 nFamily
= wxFONTFAMILY_DECORATIVE
;
605 else if (strcmp(fm
.szFamilyname
, "Helvetica") == 0)
606 nFamily
= wxFONTFAMILY_SWISS
;
607 else if (strcmp(fm
.szFamilyname
, "Helv") == 0)
608 nFamily
= wxFONTFAMILY_SWISS
;
609 else if (strcmp(fm
.szFamilyname
, "Script") == 0)
610 nFamily
= wxFONTFAMILY_SCRIPT
;
611 else if (strcmp(fm
.szFamilyname
, "Courier New") == 0)
612 nFamily
= wxFONTFAMILY_TELETYPE
;
613 else if (strcmp(fm
.szFamilyname
, "Courier") == 0)
614 nFamily
= wxFONTFAMILY_TELETYPE
;
615 else if (strcmp(fm
.szFamilyname
, "System Monospaced") == 0)
616 nFamily
= wxFONTFAMILY_TELETYPE
;
617 else if (strcmp(fm
.szFamilyname
, "System VIO") == 0)
618 nFamily
= wxFONTFAMILY_MODERN
;
619 else if (strcmp(fm
.szFamilyname
, "System Proportional") == 0)
620 nFamily
= wxFONTFAMILY_MODERN
;
621 else if (strcmp(fm
.szFamilyname
, "Arial") == 0)
622 nFamily
= wxFONTFAMILY_SWISS
;
623 else if (strcmp(fm
.szFamilyname
, "Swiss") == 0)
624 nFamily
= wxFONTFAMILY_SWISS
;
626 nFamily
= wxFONTFAMILY_SWISS
;
627 return (wxFontFamily
)nFamily
;
628 } // end of wxNativeFontInfo::GetFamily
630 wxFontEncoding
wxNativeFontInfo::GetEncoding() const
632 return wxGetFontEncFromCharSet(fa
.usCodePage
);
633 } // end of wxNativeFontInfo::GetEncoding
635 void wxNativeFontInfo::SetPointSize(
639 fm
.lEmHeight
= (LONG
)nPointsize
;
640 } // end of wxNativeFontInfo::SetPointSize
642 void wxNativeFontInfo::SetStyle(
649 wxFAIL_MSG( wxT("unknown font style") );
652 case wxFONTSTYLE_NORMAL
:
655 case wxFONTSTYLE_ITALIC
:
656 case wxFONTSTYLE_SLANT
:
657 fa
.fsSelection
|= FATTR_SEL_ITALIC
;
660 } // end of wxNativeFontInfo::SetStyle
662 void wxNativeFontInfo::SetWeight(
669 wxFAIL_MSG( wxT("unknown font weight") );
672 case wxFONTWEIGHT_NORMAL
:
673 fn
.usWeightClass
= FWEIGHT_NORMAL
;
676 case wxFONTWEIGHT_LIGHT
:
677 fn
.usWeightClass
= FWEIGHT_LIGHT
;
680 case wxFONTWEIGHT_BOLD
:
681 fn
.usWeightClass
= FWEIGHT_BOLD
;
684 } // end of wxNativeFontInfo::SetWeight
686 void wxNativeFontInfo::SetUnderlined(
691 fa
.fsSelection
|= FATTR_SEL_UNDERSCORE
;
692 } // end of wxNativeFontInfo::SetUnderlined
694 bool wxNativeFontInfo::SetFaceName(
695 const wxString
& sFacename
698 wxStrlcpy((wxChar
*)fa
.szFacename
, sFacename
, WXSIZEOF(fa
.szFacename
));
700 } // end of wxNativeFontInfo::SetFaceName
702 void wxNativeFontInfo::SetFamily(
710 case wxFONTFAMILY_SCRIPT
:
711 sFacename
= wxT("Tms Rmn");
714 case wxFONTFAMILY_DECORATIVE
:
715 sFacename
= wxT("WarpSans");
718 case wxFONTFAMILY_ROMAN
:
719 sFacename
= wxT("Tms Rmn");
722 case wxFONTFAMILY_TELETYPE
:
723 sFacename
= wxT("Courier") ;
726 case wxFONTFAMILY_MODERN
:
727 sFacename
= wxT("System VIO") ;
730 case wxFONTFAMILY_SWISS
:
731 sFacename
= wxT("Helv") ;
734 case wxFONTFAMILY_DEFAULT
:
736 sFacename
= wxT("System VIO") ;
739 if (!wxStrlen((wxChar
*)fa
.szFacename
) )
741 SetFaceName(sFacename
);
743 } // end of wxNativeFontInfo::SetFamily
745 void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding
)
747 wxNativeEncodingInfo vInfo
;
749 if ( !wxGetNativeFontEncoding( eEncoding
753 if (wxFontMapper::Get()->GetAltForEncoding( eEncoding
757 if (!vInfo
.facename
.empty())
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
764 SetFaceName(vInfo
.facename
);
769 // unsupported encoding, replace with the default
773 fa
.usCodePage
= (USHORT
)vInfo
.charset
;
774 } // end of wxNativeFontInfo::SetFaceName
776 bool wxNativeFontInfo::FromString( const wxString
& rsStr
)
780 wxStringTokenizer
vTokenizer(rsStr
, wxT(";"));
785 wxString sToken
= vTokenizer
.GetNextToken();
787 if (sToken
!= wxT('0'))
790 sToken
= vTokenizer
.GetNextToken();
791 if (!sToken
.ToLong(&lVal
))
795 sToken
= vTokenizer
.GetNextToken();
796 if (!sToken
.ToLong(&lVal
))
798 fa
.lAveCharWidth
= lVal
;
800 sToken
= vTokenizer
.GetNextToken();
801 if (!sToken
.ToLong(&lVal
))
803 fa
.fsSelection
= (USHORT
)lVal
;
805 sToken
= vTokenizer
.GetNextToken();
806 if (!sToken
.ToLong(&lVal
))
808 fa
.fsType
= (USHORT
)lVal
;
810 sToken
= vTokenizer
.GetNextToken();
811 if (!sToken
.ToLong(&lVal
))
813 fa
.fsFontUse
= (USHORT
)lVal
;
815 sToken
= vTokenizer
.GetNextToken();
816 if (!sToken
.ToLong(&lVal
))
818 fa
.idRegistry
= (USHORT
)lVal
;
820 sToken
= vTokenizer
.GetNextToken();
821 if (!sToken
.ToLong(&lVal
))
823 fa
.usCodePage
= (USHORT
)lVal
;
825 sToken
= vTokenizer
.GetNextToken();
826 if (!sToken
.ToLong(&lVal
))
830 sToken
= vTokenizer
.GetNextToken();
831 if (!sToken
.ToLong(&lVal
))
833 fn
.usWeightClass
= (USHORT
)lVal
;
835 sToken
= vTokenizer
.GetNextToken();
838 wxStrcpy((wxChar
*)fa
.szFacename
, sToken
.c_str());
840 } // end of wxNativeFontInfo::FromString
842 wxString
wxNativeFontInfo::ToString() const
846 sStr
.Printf(wxT("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"),
847 0, // version, in case we want to change the format later
858 (char *)fa
.szFacename
);
860 } // end of wxNativeFontInfo::ToString
862 // ----------------------------------------------------------------------------
864 // ----------------------------------------------------------------------------
866 bool wxFont::Create( const wxNativeFontInfo
& rInfo
,
870 m_refData
= new wxFontRefData( rInfo
875 } // end of wxFont::Create
878 const wxString
& rsFontdesc
881 wxNativeFontInfo vInfo
;
883 if (vInfo
.FromString(rsFontdesc
))
885 } // end of wxFont::wxFont
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 // ----------------------------------------------------------------------------
891 bool wxFont::Create( int nPointSize
,
892 wxFontFamily nFamily
,
894 wxFontWeight nWeight
,
896 const wxString
& rsFaceName
,
897 wxFontEncoding vEncoding
)
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)
905 if (nPointSize
== wxDEFAULT
)
907 nPointSize
= wxNORMAL_FONT
->GetPointSize();
909 m_refData
= new wxFontRefData( nPointSize
919 } // end of wxFont::Create
923 } // end of wxFont::~wxFont
925 // ----------------------------------------------------------------------------
926 // real implementation
927 // Boris' Kovalenko comments:
928 // Because OS/2 fonts are associated with PS we cannot create the font
929 // here, but we may check that font definition is true
930 // ----------------------------------------------------------------------------
932 wxGDIRefData
*wxFont::CreateGDIRefData() const
934 return new wxFontRefData();
937 wxGDIRefData
*wxFont::CloneGDIRefData(const wxGDIRefData
*data
) const
939 return new wxFontRefData(*static_cast<const wxFontRefData
*>(data
));
942 bool wxFont::RealizeResource()
944 if ( GetResourceHandle() )
948 return M_FONTDATA
->Alloc(this);
949 } // end of wxFont::RealizeResource
951 bool wxFont::FreeResource( bool WXUNUSED(bForce
) )
953 if (GetResourceHandle())
959 } // end of wxFont::FreeResource
961 WXHANDLE
wxFont::GetResourceHandle() const
964 } // end of wxFont::GetResourceHandle
966 WXHFONT
wxFont::GetHFONT() const
968 return M_FONTDATA
? M_FONTDATA
->GetHFONT() : 0;
969 } // end of wxFont::GetHFONT
971 bool wxFont::IsFree() const
973 return M_FONTDATA
&& (M_FONTDATA
->GetHFONT() == 0);
974 } // end of wxFont::IsFree
976 // ----------------------------------------------------------------------------
977 // change font attribute: we recreate font when doing it
978 // ----------------------------------------------------------------------------
980 void wxFont::SetPointSize(
986 M_FONTDATA
->SetPointSize(nPointSize
);
989 } // end of wxFont::SetPointSize
991 void wxFont::SetFamily(
997 M_FONTDATA
->SetFamily(nFamily
);
1000 } // end of wxFont::SetFamily
1002 void wxFont::SetStyle(
1008 M_FONTDATA
->SetStyle(nStyle
);
1011 } // end of wxFont::SetStyle
1013 void wxFont::SetWeight(
1014 wxFontWeight nWeight
1019 M_FONTDATA
->SetWeight(nWeight
);
1022 } // end of wxFont::SetWeight
1024 bool wxFont::SetFaceName(
1025 const wxString
& rsFaceName
1030 bool refdataok
= M_FONTDATA
->SetFaceName(rsFaceName
);
1034 return refdataok
&& wxFontBase::SetFaceName(rsFaceName
);
1035 } // end of wxFont::SetFaceName
1037 void wxFont::SetUnderlined(
1043 M_FONTDATA
->SetUnderlined(bUnderlined
);
1046 } // end of wxFont::SetUnderlined
1048 void wxFont::SetEncoding(
1049 wxFontEncoding vEncoding
1054 M_FONTDATA
->SetEncoding(vEncoding
);
1057 } // end of wxFont::SetEncoding
1059 void wxFont::DoSetNativeFontInfo(
1060 const wxNativeFontInfo
& rInfo
1067 *M_FONTDATA
= wxFontRefData(rInfo
);
1072 // ----------------------------------------------------------------------------
1074 // ----------------------------------------------------------------------------
1076 int wxFont::GetPointSize() const
1078 wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
1080 return M_FONTDATA
->GetPointSize();
1081 } // end of wxFont::GetPointSize
1083 wxFontFamily
wxFont::DoGetFamily() const
1085 return M_FONTDATA
->GetFamily();
1086 } // end of wxFont::DoGetFamily
1088 wxFontStyle
wxFont::GetStyle() const
1090 wxCHECK_MSG( Ok(), wxFONTSTYLE_MAX
, wxT("invalid font") );
1092 return M_FONTDATA
->GetStyle();
1093 } // end of wxFont::GetStyle
1095 wxFontWeight
wxFont::GetWeight() const
1097 wxCHECK_MSG( Ok(), wxFONTWEIGHT_MAX
, wxT("invalid font") );
1099 return M_FONTDATA
->GetWeight();
1102 bool wxFont::GetUnderlined() const
1104 wxCHECK_MSG( Ok(), false, wxT("invalid font") );
1106 return M_FONTDATA
->GetUnderlined();
1107 } // end of wxFont::GetUnderlined
1109 wxString
wxFont::GetFaceName() const
1111 wxCHECK_MSG( Ok(), wxEmptyString
, wxT("invalid font") );
1113 return M_FONTDATA
->GetFaceName();
1114 } // end of wxFont::GetFaceName
1116 wxFontEncoding
wxFont::GetEncoding() const
1118 wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT
, wxT("invalid font") );
1120 return M_FONTDATA
->GetEncoding();
1121 } // end of wxFont::GetEncoding
1123 const wxNativeFontInfo
* wxFont::GetNativeFontInfo() const
1125 return M_FONTDATA
->HasNativeFontInfo() ? &(M_FONTDATA
->GetNativeFontInfo())
1127 } // end of wxFont::GetNativeFontInfo
1130 // Internal use only method to set the FONTMETRICS array
1132 void wxFont::SetFM( PFONTMETRICS pFM
, int nNumFonts
)
1134 M_FONTDATA
->SetFM(pFM
);
1135 M_FONTDATA
->SetNumFonts(nNumFonts
);
1136 } // end of wxFont::SetFM
1139 void wxFont::SetPS( HPS hPS
)
1143 M_FONTDATA
->SetPS(hPS
);
1146 } // end of wxFont::SetPS