1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/os2/font.cpp
3 // Purpose: wxFont class
4 // Author: David Webster
7 // Copyright: (c) David Webster
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
14 // ============================================================================
16 // ============================================================================
18 // ----------------------------------------------------------------------------
20 // ----------------------------------------------------------------------------
32 #include "wx/os2/private.h"
34 #include "wx/fontutil.h"
35 #include "wx/fontmap.h"
36 #include "wx/encinfo.h"
38 #include "wx/tokenzr.h"
42 // ----------------------------------------------------------------------------
43 // wxFontRefData - the internal description of the font
44 // ----------------------------------------------------------------------------
46 class WXDLLEXPORT wxFontRefData
: public wxGDIRefData
51 Init(-1, wxFONTFAMILY_DEFAULT
, wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
, false,
52 wxEmptyString
, wxFONTENCODING_DEFAULT
);
55 wxFontRefData( int nSize
60 ,const wxString
& sFaceName
61 ,wxFontEncoding vEncoding
74 wxFontRefData( const wxNativeFontInfo
& rInfo
85 wxFontRefData(const wxFontRefData
& rData
)
87 Init( rData
.m_nPointSize
95 m_nFontId
= rData
.m_nFontId
;
98 virtual ~wxFontRefData();
103 bool Alloc(wxFont
* pFont
);
107 // All wxFont accessors
109 inline int GetPointSize(void) const
112 // We don't use the actual native font point size since it is
113 // the chosen physical font, which is usually only and approximation
114 // of the desired outline font. The actual displayable point size
115 // is the one stored in the refData
120 inline wxFontFamily
GetFamily(void) const
125 inline wxFontStyle
GetStyle(void) const
127 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetStyle()
131 inline wxFontWeight
GetWeight(void) const
133 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetWeight()
137 inline bool GetUnderlined(void) const
139 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetUnderlined()
143 inline wxString
GetFaceName(void) const
147 if (m_bNativeFontInfoOk
)
148 sFaceName
= m_vNativeFontInfo
.GetFaceName();
150 sFaceName
= m_sFaceName
;
155 inline wxFontEncoding
GetEncoding(void) const
157 return m_bNativeFontInfoOk
? m_vNativeFontInfo
.GetEncoding()
161 inline WXHFONT
GetHFONT(void) const { return m_hFont
; }
162 inline HPS
GetPS(void) const { return m_hPS
; }
163 inline PFONTMETRICS
GetFM(void) const { return m_pFM
; }
164 inline int GetNumFonts(void) const { return m_nNumFonts
; }
167 inline void SetPointSize(int nPointSize
)
169 if (m_bNativeFontInfoOk
)
170 m_vNativeFontInfo
.SetPointSize(nPointSize
);
172 m_nPointSize
= nPointSize
;
175 inline void SetFamily(wxFontFamily nFamily
)
180 inline void SetStyle(wxFontStyle nStyle
)
182 if (m_bNativeFontInfoOk
)
183 m_vNativeFontInfo
.SetStyle(nStyle
);
188 inline void SetWeight(wxFontWeight nWeight
)
190 if (m_bNativeFontInfoOk
)
191 m_vNativeFontInfo
.SetWeight(nWeight
);
196 inline bool SetFaceName(const wxString
& sFaceName
)
198 if (m_bNativeFontInfoOk
)
199 return m_vNativeFontInfo
.SetFaceName(sFaceName
);
201 m_sFaceName
= sFaceName
;
205 inline void SetUnderlined(bool bUnderlined
)
207 if (m_bNativeFontInfoOk
)
208 m_vNativeFontInfo
.SetUnderlined(bUnderlined
);
210 m_bUnderlined
= bUnderlined
;
213 inline void SetEncoding(wxFontEncoding vEncoding
)
215 if (m_bNativeFontInfoOk
)
216 m_vNativeFontInfo
.SetEncoding(vEncoding
);
218 m_vEncoding
= vEncoding
;
221 inline void SetPS(HPS hPS
)
226 inline void SetFM(PFONTMETRICS pFM
)
231 inline void SetNumFonts(int nNumFonts
)
233 m_nNumFonts
= nNumFonts
;
237 // Native font info tests
239 bool HasNativeFontInfo() const { return m_bNativeFontInfoOk
; }
241 const wxNativeFontInfo
& GetNativeFontInfo() const
242 { return m_vNativeFontInfo
; }
246 // Common part of all ctors
249 ,wxFontFamily nFamily
251 ,wxFontWeight nWeight
253 ,const wxString
& rsFaceName
254 ,wxFontEncoding vEncoding
257 void Init( const wxNativeFontInfo
& rInfo
262 // If true, the pointer to the actual font is temporary and SHOULD NOT BE
263 // DELETED by destructor
269 // Font characterstics
272 wxFontFamily m_nFamily
;
273 wxFontStyle m_nStyle
;
274 wxFontWeight m_nWeight
;
276 wxString m_sFaceName
;
277 wxFontEncoding m_vEncoding
;
283 wxNativeFontInfo m_vNativeFontInfo
;
284 bool m_bNativeFontInfoOk
;
287 // Some PM specific stuff
289 PFONTMETRICS m_pFM
; // array of FONTMETRICS structs
290 int m_nNumFonts
; // number of fonts in array
291 HPS m_hPS
; // PS handle this font belongs to
292 FATTRS m_vFattrs
; // Current fattrs struct
293 FACENAMEDESC m_vFname
; // Current facename struct
294 bool m_bInternalPS
; // Internally generated PS?
295 }; // end of CLASS wxFontRefData
297 #define M_FONTDATA ((wxFontRefData*)m_refData)
299 // ============================================================================
301 // ============================================================================
303 // ----------------------------------------------------------------------------
305 // ----------------------------------------------------------------------------
307 void wxFontRefData::Init(
309 , wxFontFamily nFamily
311 , wxFontWeight nWeight
313 , const wxString
& rsFaceName
314 , wxFontEncoding vEncoding
318 m_nPointSize
= nPointSize
;
322 m_bUnderlined
= bUnderlined
;
323 m_sFaceName
= rsFaceName
;
324 m_vEncoding
= vEncoding
;
327 m_bNativeFontInfoOk
= false;
330 m_bTemporary
= false;
331 m_pFM
= (PFONTMETRICS
)NULL
;
334 } // end of wxFontRefData::Init
336 void wxFontRefData::Init(
337 const wxNativeFontInfo
& rInfo
338 , WXHFONT hFont
//this is the FontId -- functions as the hFont for OS/2
339 , WXHANDLE hPS
// Presentation Space we are using
343 // hFont may be zero, or it be passed in case we really want to
344 // use the exact font created in the underlying system
345 // (for example where we can't guarantee conversion from HFONT
346 // to LOGFONT back to HFONT)
349 m_nFontId
= (int)hFont
;
351 m_bNativeFontInfoOk
= true;
352 m_vNativeFontInfo
= rInfo
;
354 if (hPS
== NULLHANDLE
)
356 m_hPS
= ::WinGetPS(HWND_DESKTOP
);
357 m_bInternalPS
= true;
363 m_bTemporary
= false;
364 m_pFM
= (PFONTMETRICS
)NULL
;
366 } // end of wxFontRefData::Init
368 wxFontRefData::~wxFontRefData()
373 bool wxFontRefData::Alloc( wxFont
* pFont
)
381 if (!m_bNativeFontInfoOk
)
383 wxFillLogFont( &m_vNativeFontInfo
.fa
384 ,&m_vNativeFontInfo
.fn
391 m_bNativeFontInfoOk
= true;
402 if((lRc
= ::GpiCreateLogFont( m_hPS
405 ,&m_vNativeFontInfo
.fa
408 m_hFont
= (WXHFONT
)flId
;
413 vError
= ::WinGetLastError(vHabmain
);
414 sError
= wxPMErrorToStr(vError
);
415 wxLogLastError(wxT("CreateFont"));
418 ::GpiSetCharSet(m_hPS
, flId
); // sets font for presentation space
419 ::GpiQueryFontMetrics(m_hPS
, sizeof(FONTMETRICS
), &m_vNativeFontInfo
.fm
);
422 // Set refData members with the results
424 memcpy(&m_vFattrs
, &m_vNativeFontInfo
.fa
, sizeof(m_vFattrs
));
425 memcpy(&m_vFname
, &m_vNativeFontInfo
.fn
, sizeof(m_vFname
));
427 // Going to leave the point size alone. Mostly we use outline fonts
428 // that can be set to any point size inside of Presentation Parameters,
429 // regardless of whether or not the actual font is registered in the system.
430 // The GpiCreateLogFont will do enough by selecting the right family,
433 if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Times New Roman") == 0)
434 m_nFamily
= wxFONTFAMILY_ROMAN
;
435 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Times New Roman MT 30") == 0)
436 m_nFamily
= wxFONTFAMILY_ROMAN
;
437 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "@Times New Roman MT 30") == 0)
438 m_nFamily
= wxFONTFAMILY_ROMAN
;
439 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Tms Rmn") == 0)
440 m_nFamily
= wxFONTFAMILY_ROMAN
;
441 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "WarpSans") == 0)
442 m_nFamily
= wxFONTFAMILY_DECORATIVE
;
443 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Helvetica") == 0)
444 m_nFamily
= wxFONTFAMILY_SWISS
;
445 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Helv") == 0)
446 m_nFamily
= wxFONTFAMILY_SWISS
;
447 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Script") == 0)
448 m_nFamily
= wxFONTFAMILY_SCRIPT
;
449 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Courier New") == 0)
450 m_nFamily
= wxFONTFAMILY_TELETYPE
;
451 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Courier") == 0)
452 m_nFamily
= wxFONTFAMILY_TELETYPE
;
453 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System Monospaced") == 0)
454 m_nFamily
= wxFONTFAMILY_TELETYPE
;
455 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System VIO") == 0)
456 m_nFamily
= wxFONTFAMILY_MODERN
;
457 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "System Proportional") == 0)
458 m_nFamily
= wxFONTFAMILY_MODERN
;
459 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Arial") == 0)
460 m_nFamily
= wxFONTFAMILY_SWISS
;
461 else if (strcmp(m_vNativeFontInfo
.fm
.szFamilyname
, "Swiss") == 0)
462 m_nFamily
= wxFONTFAMILY_SWISS
;
464 m_nFamily
= wxFONTFAMILY_SWISS
;
466 if (m_vNativeFontInfo
.fa
.fsSelection
& FATTR_SEL_ITALIC
)
467 m_nStyle
= wxFONTSTYLE_ITALIC
;
469 m_nStyle
= wxFONTSTYLE_NORMAL
;
470 switch(m_vNativeFontInfo
.fn
.usWeightClass
)
472 case FWEIGHT_DONT_CARE
:
473 m_nWeight
= wxFONTWEIGHT_NORMAL
;
477 m_nWeight
= wxFONTWEIGHT_NORMAL
;
481 m_nWeight
= wxFONTWEIGHT_LIGHT
;
485 m_nWeight
= wxFONTWEIGHT_BOLD
;
488 case FWEIGHT_ULTRA_BOLD
:
489 m_nWeight
= wxFONTWEIGHT_MAX
;
493 m_nWeight
= wxFONTWEIGHT_NORMAL
;
495 m_bUnderlined
= ((m_vNativeFontInfo
.fa
.fsSelection
& FATTR_SEL_UNDERSCORE
) != 0);
496 m_sFaceName
= (wxChar
*)m_vNativeFontInfo
.fa
.szFacename
;
497 m_vEncoding
= wxGetFontEncFromCharSet(m_vNativeFontInfo
.fa
.usCodePage
);
500 // We don't actuall keep the font around if using a temporary PS
505 ::GpiDeleteSetId( m_hPS
509 ::WinReleasePS(m_hPS
);
513 // Select the font into the Presentation space
515 ::GpiSetCharSet(m_hPS
, flId
); // sets font for presentation space
517 } // end of wxFontRefData::Alloc
519 void wxFontRefData::Free()
523 m_pFM
= (PFONTMETRICS
)NULL
;
527 ::GpiDeleteSetId(m_hPS
, 1L); /* delete the logical font */
532 ::WinReleasePS(m_hPS
);
534 } // end of wxFontRefData::Free
536 // ----------------------------------------------------------------------------
538 // ----------------------------------------------------------------------------
540 void wxNativeFontInfo::Init()
542 memset(&fa
, '\0', sizeof(FATTRS
));
543 } // end of wxNativeFontInfo::Init
545 int wxNativeFontInfo::GetPointSize() const
548 } // end of wxNativeFontInfo::GetPointSize
550 wxFontStyle
wxNativeFontInfo::GetStyle() const
552 return fa
.fsSelection
& FATTR_SEL_ITALIC
? wxFONTSTYLE_ITALIC
: wxFONTSTYLE_NORMAL
;
553 } // end of wxNativeFontInfo::GetStyle
555 wxFontWeight
wxNativeFontInfo::GetWeight() const
557 switch(fn
.usWeightClass
)
559 case FWEIGHT_DONT_CARE
:
560 return wxFONTWEIGHT_NORMAL
;
563 return wxFONTWEIGHT_NORMAL
;
566 return wxFONTWEIGHT_LIGHT
;
569 return wxFONTWEIGHT_BOLD
;
571 case FWEIGHT_ULTRA_BOLD
:
572 return wxFONTWEIGHT_MAX
;
574 return wxFONTWEIGHT_NORMAL
;
575 } // end of wxNativeFontInfo::GetWeight
577 bool wxNativeFontInfo::GetUnderlined() const
579 return ((fa
.fsSelection
& FATTR_SEL_UNDERSCORE
) != 0);
580 } // end of wxNativeFontInfo::GetUnderlined
582 wxString
wxNativeFontInfo::GetFaceName() const
584 return (wxChar
*)fm
.szFacename
;
585 } // end of wxNativeFontInfo::GetFaceName
587 wxFontFamily
wxNativeFontInfo::GetFamily() const
592 // Extract family from facename
594 if (strcmp(fm
.szFamilyname
, "Times New Roman") == 0)
595 nFamily
= wxFONTFAMILY_ROMAN
;
596 else if (strcmp(fm
.szFamilyname
, "Times New Roman MT 30") == 0)
597 nFamily
= wxFONTFAMILY_ROMAN
;
598 else if (strcmp(fm
.szFamilyname
, "@Times New Roman MT 30") == 0)
599 nFamily
= wxFONTFAMILY_ROMAN
;
600 else if (strcmp(fm
.szFamilyname
, "Tms Rmn") == 0)
601 nFamily
= wxFONTFAMILY_ROMAN
;
602 else if (strcmp(fm
.szFamilyname
, "WarpSans") == 0)
603 nFamily
= wxFONTFAMILY_DECORATIVE
;
604 else if (strcmp(fm
.szFamilyname
, "Helvetica") == 0)
605 nFamily
= wxFONTFAMILY_SWISS
;
606 else if (strcmp(fm
.szFamilyname
, "Helv") == 0)
607 nFamily
= wxFONTFAMILY_SWISS
;
608 else if (strcmp(fm
.szFamilyname
, "Script") == 0)
609 nFamily
= wxFONTFAMILY_SCRIPT
;
610 else if (strcmp(fm
.szFamilyname
, "Courier New") == 0)
611 nFamily
= wxFONTFAMILY_TELETYPE
;
612 else if (strcmp(fm
.szFamilyname
, "Courier") == 0)
613 nFamily
= wxFONTFAMILY_TELETYPE
;
614 else if (strcmp(fm
.szFamilyname
, "System Monospaced") == 0)
615 nFamily
= wxFONTFAMILY_TELETYPE
;
616 else if (strcmp(fm
.szFamilyname
, "System VIO") == 0)
617 nFamily
= wxFONTFAMILY_MODERN
;
618 else if (strcmp(fm
.szFamilyname
, "System Proportional") == 0)
619 nFamily
= wxFONTFAMILY_MODERN
;
620 else if (strcmp(fm
.szFamilyname
, "Arial") == 0)
621 nFamily
= wxFONTFAMILY_SWISS
;
622 else if (strcmp(fm
.szFamilyname
, "Swiss") == 0)
623 nFamily
= wxFONTFAMILY_SWISS
;
625 nFamily
= wxFONTFAMILY_SWISS
;
626 return (wxFontFamily
)nFamily
;
627 } // end of wxNativeFontInfo::GetFamily
629 wxFontEncoding
wxNativeFontInfo::GetEncoding() const
631 return wxGetFontEncFromCharSet(fa
.usCodePage
);
632 } // end of wxNativeFontInfo::GetEncoding
634 void wxNativeFontInfo::SetPointSize(
638 fm
.lEmHeight
= (LONG
)nPointsize
;
639 } // end of wxNativeFontInfo::SetPointSize
641 void wxNativeFontInfo::SetStyle(
648 wxFAIL_MSG( wxT("unknown font style") );
651 case wxFONTSTYLE_NORMAL
:
654 case wxFONTSTYLE_ITALIC
:
655 case wxFONTSTYLE_SLANT
:
656 fa
.fsSelection
|= FATTR_SEL_ITALIC
;
659 } // end of wxNativeFontInfo::SetStyle
661 void wxNativeFontInfo::SetWeight(
668 wxFAIL_MSG( wxT("unknown font weight") );
671 case wxFONTWEIGHT_NORMAL
:
672 fn
.usWeightClass
= FWEIGHT_NORMAL
;
675 case wxFONTWEIGHT_LIGHT
:
676 fn
.usWeightClass
= FWEIGHT_LIGHT
;
679 case wxFONTWEIGHT_BOLD
:
680 fn
.usWeightClass
= FWEIGHT_BOLD
;
683 } // end of wxNativeFontInfo::SetWeight
685 void wxNativeFontInfo::SetUnderlined(
690 fa
.fsSelection
|= FATTR_SEL_UNDERSCORE
;
691 } // end of wxNativeFontInfo::SetUnderlined
693 bool wxNativeFontInfo::SetFaceName(
694 const wxString
& sFacename
697 wxStrlcpy((wxChar
*)fa
.szFacename
, sFacename
, WXSIZEOF(fa
.szFacename
));
699 } // end of wxNativeFontInfo::SetFaceName
701 void wxNativeFontInfo::SetFamily(
709 case wxFONTFAMILY_SCRIPT
:
710 sFacename
= wxT("Tms Rmn");
713 case wxFONTFAMILY_DECORATIVE
:
714 sFacename
= wxT("WarpSans");
717 case wxFONTFAMILY_ROMAN
:
718 sFacename
= wxT("Tms Rmn");
721 case wxFONTFAMILY_TELETYPE
:
722 sFacename
= wxT("Courier") ;
725 case wxFONTFAMILY_MODERN
:
726 sFacename
= wxT("System VIO") ;
729 case wxFONTFAMILY_SWISS
:
730 sFacename
= wxT("Helv") ;
733 case wxFONTFAMILY_DEFAULT
:
735 sFacename
= wxT("System VIO") ;
738 if (!wxStrlen((wxChar
*)fa
.szFacename
) )
740 SetFaceName(sFacename
);
742 } // end of wxNativeFontInfo::SetFamily
744 void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding
)
746 wxNativeEncodingInfo vInfo
;
748 if ( !wxGetNativeFontEncoding( eEncoding
752 if (wxFontMapper::Get()->GetAltForEncoding( eEncoding
756 if (!vInfo
.facename
.empty())
759 // If we have this encoding only in some particular facename, use
760 // the facename - it is better to show the correct characters in a
761 // wrong facename than unreadable text in a correct one
763 SetFaceName(vInfo
.facename
);
768 // unsupported encoding, replace with the default
772 fa
.usCodePage
= (USHORT
)vInfo
.charset
;
773 } // end of wxNativeFontInfo::SetFaceName
775 bool wxNativeFontInfo::FromString( const wxString
& rsStr
)
779 wxStringTokenizer
vTokenizer(rsStr
, wxT(";"));
784 wxString sToken
= vTokenizer
.GetNextToken();
786 if (sToken
!= wxT('0'))
789 sToken
= vTokenizer
.GetNextToken();
790 if (!sToken
.ToLong(&lVal
))
794 sToken
= vTokenizer
.GetNextToken();
795 if (!sToken
.ToLong(&lVal
))
797 fa
.lAveCharWidth
= lVal
;
799 sToken
= vTokenizer
.GetNextToken();
800 if (!sToken
.ToLong(&lVal
))
802 fa
.fsSelection
= (USHORT
)lVal
;
804 sToken
= vTokenizer
.GetNextToken();
805 if (!sToken
.ToLong(&lVal
))
807 fa
.fsType
= (USHORT
)lVal
;
809 sToken
= vTokenizer
.GetNextToken();
810 if (!sToken
.ToLong(&lVal
))
812 fa
.fsFontUse
= (USHORT
)lVal
;
814 sToken
= vTokenizer
.GetNextToken();
815 if (!sToken
.ToLong(&lVal
))
817 fa
.idRegistry
= (USHORT
)lVal
;
819 sToken
= vTokenizer
.GetNextToken();
820 if (!sToken
.ToLong(&lVal
))
822 fa
.usCodePage
= (USHORT
)lVal
;
824 sToken
= vTokenizer
.GetNextToken();
825 if (!sToken
.ToLong(&lVal
))
829 sToken
= vTokenizer
.GetNextToken();
830 if (!sToken
.ToLong(&lVal
))
832 fn
.usWeightClass
= (USHORT
)lVal
;
834 sToken
= vTokenizer
.GetNextToken();
837 wxStrcpy((wxChar
*)fa
.szFacename
, sToken
.c_str());
839 } // end of wxNativeFontInfo::FromString
841 wxString
wxNativeFontInfo::ToString() const
845 sStr
.Printf(wxT("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"),
846 0, // version, in case we want to change the format later
857 (char *)fa
.szFacename
);
859 } // end of wxNativeFontInfo::ToString
861 // ----------------------------------------------------------------------------
863 // ----------------------------------------------------------------------------
865 bool wxFont::Create( const wxNativeFontInfo
& rInfo
,
869 m_refData
= new wxFontRefData( rInfo
874 } // end of wxFont::Create
877 const wxString
& rsFontdesc
880 wxNativeFontInfo vInfo
;
882 if (vInfo
.FromString(rsFontdesc
))
884 } // end of wxFont::wxFont
886 // ----------------------------------------------------------------------------
887 // Constructor for a font. Note that the real construction is done
888 // in wxDC::SetFont, when information is available about scaling etc.
889 // ----------------------------------------------------------------------------
890 bool wxFont::Create( int nPointSize
,
891 wxFontFamily nFamily
,
893 wxFontWeight nWeight
,
895 const wxString
& rsFaceName
,
896 wxFontEncoding vEncoding
)
901 // wxDEFAULT is a valid value for the font size too so we must treat it
902 // specially here (otherwise the size would be 70 == wxDEFAULT value)
904 if (nPointSize
== wxDEFAULT
)
906 nPointSize
= wxNORMAL_FONT
->GetPointSize();
908 m_refData
= new wxFontRefData( nPointSize
918 } // end of wxFont::Create
922 } // end of wxFont::~wxFont
924 // ----------------------------------------------------------------------------
925 // real implementation
926 // Boris' Kovalenko comments:
927 // Because OS/2 fonts are associated with PS we cannot create the font
928 // here, but we may check that font definition is true
929 // ----------------------------------------------------------------------------
931 wxGDIRefData
*wxFont::CreateGDIRefData() const
933 return new wxFontRefData();
936 wxGDIRefData
*wxFont::CloneGDIRefData(const wxGDIRefData
*data
) const
938 return new wxFontRefData(*static_cast<const wxFontRefData
*>(data
));
941 bool wxFont::RealizeResource()
943 if ( GetResourceHandle() )
947 return M_FONTDATA
->Alloc(this);
948 } // end of wxFont::RealizeResource
950 bool wxFont::FreeResource( bool WXUNUSED(bForce
) )
952 if (GetResourceHandle())
958 } // end of wxFont::FreeResource
960 WXHANDLE
wxFont::GetResourceHandle() const
963 } // end of wxFont::GetResourceHandle
965 WXHFONT
wxFont::GetHFONT() const
967 return M_FONTDATA
? M_FONTDATA
->GetHFONT() : 0;
968 } // end of wxFont::GetHFONT
970 bool wxFont::IsFree() const
972 return M_FONTDATA
&& (M_FONTDATA
->GetHFONT() == 0);
973 } // end of wxFont::IsFree
975 // ----------------------------------------------------------------------------
976 // change font attribute: we recreate font when doing it
977 // ----------------------------------------------------------------------------
979 void wxFont::SetPointSize(
985 M_FONTDATA
->SetPointSize(nPointSize
);
988 } // end of wxFont::SetPointSize
990 void wxFont::SetFamily(
996 M_FONTDATA
->SetFamily(nFamily
);
999 } // end of wxFont::SetFamily
1001 void wxFont::SetStyle(
1007 M_FONTDATA
->SetStyle(nStyle
);
1010 } // end of wxFont::SetStyle
1012 void wxFont::SetWeight(
1013 wxFontWeight nWeight
1018 M_FONTDATA
->SetWeight(nWeight
);
1021 } // end of wxFont::SetWeight
1023 bool wxFont::SetFaceName(
1024 const wxString
& rsFaceName
1029 bool refdataok
= M_FONTDATA
->SetFaceName(rsFaceName
);
1033 return refdataok
&& wxFontBase::SetFaceName(rsFaceName
);
1034 } // end of wxFont::SetFaceName
1036 void wxFont::SetUnderlined(
1042 M_FONTDATA
->SetUnderlined(bUnderlined
);
1045 } // end of wxFont::SetUnderlined
1047 void wxFont::SetEncoding(
1048 wxFontEncoding vEncoding
1053 M_FONTDATA
->SetEncoding(vEncoding
);
1056 } // end of wxFont::SetEncoding
1058 void wxFont::DoSetNativeFontInfo(
1059 const wxNativeFontInfo
& rInfo
1066 *M_FONTDATA
= wxFontRefData(rInfo
);
1071 // ----------------------------------------------------------------------------
1073 // ----------------------------------------------------------------------------
1075 int wxFont::GetPointSize() const
1077 wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
1079 return M_FONTDATA
->GetPointSize();
1080 } // end of wxFont::GetPointSize
1082 wxFontFamily
wxFont::DoGetFamily() const
1084 return M_FONTDATA
->GetFamily();
1085 } // end of wxFont::DoGetFamily
1087 wxFontStyle
wxFont::GetStyle() const
1089 wxCHECK_MSG( IsOk(), wxFONTSTYLE_MAX
, wxT("invalid font") );
1091 return M_FONTDATA
->GetStyle();
1092 } // end of wxFont::GetStyle
1094 wxFontWeight
wxFont::GetWeight() const
1096 wxCHECK_MSG( IsOk(), wxFONTWEIGHT_MAX
, wxT("invalid font") );
1098 return M_FONTDATA
->GetWeight();
1101 bool wxFont::GetUnderlined() const
1103 wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
1105 return M_FONTDATA
->GetUnderlined();
1106 } // end of wxFont::GetUnderlined
1108 wxString
wxFont::GetFaceName() const
1110 wxCHECK_MSG( IsOk(), wxEmptyString
, wxT("invalid font") );
1112 return M_FONTDATA
->GetFaceName();
1113 } // end of wxFont::GetFaceName
1115 wxFontEncoding
wxFont::GetEncoding() const
1117 wxCHECK_MSG( IsOk(), wxFONTENCODING_DEFAULT
, wxT("invalid font") );
1119 return M_FONTDATA
->GetEncoding();
1120 } // end of wxFont::GetEncoding
1122 const wxNativeFontInfo
* wxFont::GetNativeFontInfo() const
1124 return M_FONTDATA
->HasNativeFontInfo() ? &(M_FONTDATA
->GetNativeFontInfo())
1126 } // end of wxFont::GetNativeFontInfo
1129 // Internal use only method to set the FONTMETRICS array
1131 void wxFont::SetFM( PFONTMETRICS pFM
, int nNumFonts
)
1133 M_FONTDATA
->SetFM(pFM
);
1134 M_FONTDATA
->SetNumFonts(nNumFonts
);
1135 } // end of wxFont::SetFM
1138 void wxFont::SetPS( HPS hPS
)
1142 M_FONTDATA
->SetPS(hPS
);
1145 } // end of wxFont::SetPS