X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/54ffa10747e51b9fa8c52b7f864e187e82fd4919..5f480c0bf140db144e00993b060af28e45cd9c94:/src/os2/font.cpp diff --git a/src/os2/font.cpp b/src/os2/font.cpp index c6a9b75646..eae1b4f880 100644 --- a/src/os2/font.cpp +++ b/src/os2/font.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: font.cpp +// Name: src/os2/font.cpp // Purpose: wxFont class // Author: David Webster // Modified by: @@ -9,6 +9,9 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + // ============================================================================ // declarations // ============================================================================ @@ -17,26 +20,26 @@ // headers // ---------------------------------------------------------------------------- - #include -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" +#include "wx/font.h" #ifndef WX_PRECOMP #include - #include "wx/setup.h" #include "wx/list.h" #include "wx/utils.h" #include "wx/app.h" - #include "wx/font.h" + #include "wx/log.h" #endif // WX_PRECOMP #include "wx/os2/private.h" #include "wx/fontutil.h" #include "wx/fontmap.h" +#include "wx/encinfo.h" #include "wx/tokenzr.h" +#include + IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) // ---------------------------------------------------------------------------- @@ -48,14 +51,14 @@ class WXDLLEXPORT wxFontRefData: public wxGDIRefData public: wxFontRefData() { - Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, FALSE, - "", wxFONTENCODING_DEFAULT); + Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, + wxEmptyString, wxFONTENCODING_DEFAULT); } wxFontRefData( int nSize - ,int nFamily - ,int nStyle - ,int nWeight + ,wxFontFamily nFamily + ,wxFontStyle nStyle + ,wxFontWeight nWeight ,bool bUnderlined ,const wxString& sFaceName ,wxFontEncoding vEncoding @@ -108,22 +111,27 @@ public: // inline int GetPointSize(void) const { - return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetPointSize() - : m_nPointSize; + // + // We don't use the actual native font point size since it is + // the chosen physical font, which is usually only and approximation + // of the desired outline font. The actual displayable point size + // is the one stored in the refData + // + return m_nPointSize; } - inline int GetFamily(void) const + inline wxFontFamily GetFamily(void) const { return m_nFamily; } - inline int GetStyle(void) const + inline wxFontStyle GetStyle(void) const { return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetStyle() : m_nStyle; } - inline int GetWeight(void) const + inline wxFontWeight GetWeight(void) const { return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetWeight() : m_nWeight; @@ -167,33 +175,34 @@ public: m_nPointSize = nPointSize; } - inline void SetFamily(int nFamily) + inline void SetFamily(wxFontFamily nFamily) { m_nFamily = nFamily; } - inline void SetStyle(int nStyle) + inline void SetStyle(wxFontStyle nStyle) { if (m_bNativeFontInfoOk) - m_vNativeFontInfo.SetStyle((wxFontStyle)nStyle); + m_vNativeFontInfo.SetStyle(nStyle); else m_nStyle = nStyle; } - inline void SetWeight(int nWeight) + inline void SetWeight(wxFontWeight nWeight) { if (m_bNativeFontInfoOk) - m_vNativeFontInfo.SetWeight((wxFontWeight)nWeight); + m_vNativeFontInfo.SetWeight(nWeight); else m_nWeight = nWeight; } - inline void SetFaceName(const wxString& sFaceName) + inline bool SetFaceName(const wxString& sFaceName) { if (m_bNativeFontInfoOk) - m_vNativeFontInfo.SetFaceName(sFaceName); + return m_vNativeFontInfo.SetFaceName(sFaceName); else m_sFaceName = sFaceName; + return true; } inline void SetUnderlined(bool bUnderlined) @@ -240,9 +249,9 @@ protected: // Common part of all ctors // void Init( int nSize - ,int nFamily - ,int nStyle - ,int nWeight + ,wxFontFamily nFamily + ,wxFontStyle nStyle + ,wxFontWeight nWeight ,bool bUnderlined ,const wxString& rsFaceName ,wxFontEncoding vEncoding @@ -253,7 +262,7 @@ protected: ,WXHANDLE hPS = 0 ); // - // If TRUE, the pointer to the actual font is temporary and SHOULD NOT BE + // If true, the pointer to the actual font is temporary and SHOULD NOT BE // DELETED by destructor // bool m_bTemporary; @@ -263,9 +272,9 @@ protected: // Font characterstics // int m_nPointSize; - int m_nFamily; - int m_nStyle; - int m_nWeight; + wxFontFamily m_nFamily; + wxFontStyle m_nStyle; + wxFontWeight m_nWeight; bool m_bUnderlined; wxString m_sFaceName; wxFontEncoding m_vEncoding; @@ -288,6 +297,8 @@ protected: bool m_bInternalPS; // Internally generated PS? }; // end of CLASS wxFontRefData +#define M_FONTDATA ((wxFontRefData*)m_refData) + // ============================================================================ // implementation // ============================================================================ @@ -298,9 +309,9 @@ protected: void wxFontRefData::Init( int nPointSize -, int nFamily -, int nStyle -, int nWeight +, wxFontFamily nFamily +, wxFontStyle nStyle +, wxFontWeight nWeight , bool bUnderlined , const wxString& rsFaceName , wxFontEncoding vEncoding @@ -316,10 +327,10 @@ void wxFontRefData::Init( m_vEncoding = vEncoding; m_hFont = 0; - m_bNativeFontInfoOk = FALSE; + m_bNativeFontInfoOk = false; m_nFontId = 0; - m_bTemporary = FALSE; + m_bTemporary = false; m_pFM = (PFONTMETRICS)NULL; m_hPS = NULLHANDLE; m_nNumFonts = 0; @@ -340,95 +351,120 @@ void wxFontRefData::Init( m_hFont = hFont; m_nFontId = (int)hFont; - m_bNativeFontInfoOk = TRUE; + m_bNativeFontInfoOk = true; m_vNativeFontInfo = rInfo; - if (m_hPS == NULLHANDLE) + if (hPS == NULLHANDLE) { m_hPS = ::WinGetPS(HWND_DESKTOP); - m_bInternalPS; + m_bInternalPS = true; } else m_hPS = (HPS)hPS; -} + + m_nFontId = 0; + m_bTemporary = false; + m_pFM = (PFONTMETRICS)NULL; + m_nNumFonts = 0; +} // end of wxFontRefData::Init wxFontRefData::~wxFontRefData() { Free(); } -bool wxFontRefData::Alloc( - wxFont* pFont -) +bool wxFontRefData::Alloc( wxFont* pFont ) { wxString sFaceName; - long flId; + long flId = m_hFont; + long lRc; + ERRORID vError; + wxString sError; if (!m_bNativeFontInfoOk) { wxFillLogFont( &m_vNativeFontInfo.fa ,&m_vNativeFontInfo.fn ,&m_hPS + ,&m_bInternalPS ,&flId ,sFaceName ,pFont ); - m_bNativeFontInfoOk = TRUE; + m_bNativeFontInfoOk = true; } - - if(::GpiCreateLogFont( m_hPS - ,NULL - ,flId - ,&m_vNativeFontInfo.fa - ) != GPI_ERROR) - m_hFont = (WXHFONT)1; - - // - // We don't actuall keep the font around if using a temporary PS - // - if (m_bInternalPS) + else { - if(m_hFont) - ::GpiDeleteSetId( m_hPS - ,flId - ); - - ::WinReleasePS(m_hPS); + if (flId == 0L) + flId = 1L; + else + flId++; + if (flId > 254) + flId = 1L; + } + if((lRc = ::GpiCreateLogFont( m_hPS + ,NULL + ,flId + ,&m_vNativeFontInfo.fa + )) != GPI_ERROR) + { + m_hFont = (WXHFONT)flId; + m_nFontId = flId; } - else - // - // Select the font into the Presentation space - // - ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space if (!m_hFont) { - wxLogLastError("CreateFont"); + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogLastError(wxT("CreateFont")); } - // - // Query for the actual metrics of the current font being used - // + ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space ::GpiQueryFontMetrics(m_hPS, sizeof(FONTMETRICS), &m_vNativeFontInfo.fm); // // Set refData members with the results // - m_hFont = (WXHFONT)m_nFontId; memcpy(&m_vFattrs, &m_vNativeFontInfo.fa, sizeof(m_vFattrs)); memcpy(&m_vFname, &m_vNativeFontInfo.fn, sizeof(m_vFname)); - m_nPointSize = m_vNativeFontInfo.fm.lEmHeight; - if (strcmp(m_vNativeFontInfo.fa.szFacename, "Times New Roman") == 0) - m_nFamily = wxROMAN; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "WarpSans") == 0) - m_nFamily = wxSWISS; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Script") == 0) - m_nFamily = wxSCRIPT; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Courier New") == 0) - m_nFamily = wxMODERN; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Courier") == 0) - m_nFamily = wxMODERN; + // + // Going to leave the point size alone. Mostly we use outline fonts + // that can be set to any point size inside of Presentation Parameters, + // regardless of whether or not the actual font is registered in the system. + // The GpiCreateLogFont will do enough by selecting the right family, + // and face name. + // + if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman") == 0) + m_nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman MT 30") == 0) + m_nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "@Times New Roman MT 30") == 0) + m_nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Tms Rmn") == 0) + m_nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "WarpSans") == 0) + m_nFamily = wxFONTFAMILY_DECORATIVE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helvetica") == 0) + m_nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helv") == 0) + m_nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Script") == 0) + m_nFamily = wxFONTFAMILY_SCRIPT; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier New") == 0) + m_nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier") == 0) + m_nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Monospaced") == 0) + m_nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System VIO") == 0) + m_nFamily = wxFONTFAMILY_MODERN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Proportional") == 0) + m_nFamily = wxFONTFAMILY_MODERN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Arial") == 0) + m_nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Swiss") == 0) + m_nFamily = wxFONTFAMILY_SWISS; else - m_nFamily = wxSWISS; + m_nFamily = wxFONTFAMILY_SWISS; if (m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_ITALIC) m_nStyle = wxFONTSTYLE_ITALIC; @@ -460,9 +496,27 @@ bool wxFontRefData::Alloc( m_nWeight = wxFONTWEIGHT_NORMAL; } m_bUnderlined = ((m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0); - m_sFaceName = m_vNativeFontInfo.fa.szFacename; + m_sFaceName = (wxChar*)m_vNativeFontInfo.fa.szFacename; m_vEncoding = wxGetFontEncFromCharSet(m_vNativeFontInfo.fa.usCodePage); - return TRUE; + + // + // We don't actuall keep the font around if using a temporary PS + // + if (m_bInternalPS) + { + if(m_hFont) + ::GpiDeleteSetId( m_hPS + ,flId + ); + + ::WinReleasePS(m_hPS); + } + else + // + // Select the font into the Presentation space + // + ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space + return true; } // end of wxFontRefData::Alloc void wxFontRefData::Free() @@ -473,10 +527,6 @@ void wxFontRefData::Free() if ( m_hFont ) { - if (!::GpiSetCharSet(m_hPS, LCID_DEFAULT)) - { - wxLogLastError(wxT("DeleteObject(font)")); - } ::GpiDeleteSetId(m_hPS, 1L); /* delete the logical font */ m_nFontId = 0; m_hFont = 0; @@ -534,7 +584,7 @@ bool wxNativeFontInfo::GetUnderlined() const wxString wxNativeFontInfo::GetFaceName() const { - return fm.szFacename; + return (wxChar*)fm.szFacename; } // end of wxNativeFontInfo::GetFaceName wxFontFamily wxNativeFontInfo::GetFamily() const @@ -544,16 +594,38 @@ wxFontFamily wxNativeFontInfo::GetFamily() const // // Extract family from facename // - if (strcmp(fa.szFacename, "Times New Roman") == 0) - nFamily = wxROMAN; - else if (strcmp(fa.szFacename, "WarpSans") == 0) - nFamily = wxSWISS; - else if (strcmp(fa.szFacename, "Script") == 0) - nFamily = wxSCRIPT; - else if (strcmp(fa.szFacename, "Courier New") == 0) - nFamily = wxMODERN; + if (strcmp(fm.szFamilyname, "Times New Roman") == 0) + nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(fm.szFamilyname, "Times New Roman MT 30") == 0) + nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(fm.szFamilyname, "@Times New Roman MT 30") == 0) + nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(fm.szFamilyname, "Tms Rmn") == 0) + nFamily = wxFONTFAMILY_ROMAN; + else if (strcmp(fm.szFamilyname, "WarpSans") == 0) + nFamily = wxFONTFAMILY_DECORATIVE; + else if (strcmp(fm.szFamilyname, "Helvetica") == 0) + nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(fm.szFamilyname, "Helv") == 0) + nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(fm.szFamilyname, "Script") == 0) + nFamily = wxFONTFAMILY_SCRIPT; + else if (strcmp(fm.szFamilyname, "Courier New") == 0) + nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(fm.szFamilyname, "Courier") == 0) + nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(fm.szFamilyname, "System Monospaced") == 0) + nFamily = wxFONTFAMILY_TELETYPE; + else if (strcmp(fm.szFamilyname, "System VIO") == 0) + nFamily = wxFONTFAMILY_MODERN; + else if (strcmp(fm.szFamilyname, "System Proportional") == 0) + nFamily = wxFONTFAMILY_MODERN; + else if (strcmp(fm.szFamilyname, "Arial") == 0) + nFamily = wxFONTFAMILY_SWISS; + else if (strcmp(fm.szFamilyname, "Swiss") == 0) + nFamily = wxFONTFAMILY_SWISS; else - nFamily = wxSWISS; + nFamily = wxFONTFAMILY_SWISS; return (wxFontFamily)nFamily; } // end of wxNativeFontInfo::GetFamily @@ -576,7 +648,7 @@ void wxNativeFontInfo::SetStyle( switch (eStyle) { default: - wxFAIL_MSG( _T("unknown font style") ); + wxFAIL_MSG( wxT("unknown font style") ); // fall through case wxFONTSTYLE_NORMAL: @@ -596,7 +668,7 @@ void wxNativeFontInfo::SetWeight( switch (eWeight) { default: - wxFAIL_MSG( _T("unknown font weight") ); + wxFAIL_MSG( wxT("unknown font weight") ); // fall through case wxFONTWEIGHT_NORMAL: @@ -621,11 +693,12 @@ void wxNativeFontInfo::SetUnderlined( fa.fsSelection |= FATTR_SEL_UNDERSCORE; } // end of wxNativeFontInfo::SetUnderlined -void wxNativeFontInfo::SetFaceName( - wxString sFacename +bool wxNativeFontInfo::SetFaceName( + const wxString& sFacename ) { - wxStrncpy(fa.szFacename, sFacename, WXSIZEOF(fa.szFacename)); + wxStrlcpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename)); + return true; } // end of wxNativeFontInfo::SetFaceName void wxNativeFontInfo::SetFamily( @@ -636,41 +709,42 @@ void wxNativeFontInfo::SetFamily( switch (eFamily) { - case wxSCRIPT: - sFacename = _T("Script"); + case wxFONTFAMILY_SCRIPT: + sFacename = wxT("Tms Rmn"); break; - case wxDECORATIVE: - sFacename = _T("Times New Roman"); + case wxFONTFAMILY_DECORATIVE: + sFacename = wxT("WarpSans"); break; - case wxROMAN: - sFacename = _T("Times New Roman"); + case wxFONTFAMILY_ROMAN: + sFacename = wxT("Tms Rmn"); break; - case wxTELETYPE: - case wxMODERN: - sFacename = _T("Courier New"); + case wxFONTFAMILY_TELETYPE: + sFacename = wxT("Courier") ; break; - case wxSWISS: - sFacename = _T("WarpSans"); + case wxFONTFAMILY_MODERN: + sFacename = wxT("System VIO") ; break; - case wxDEFAULT: + case wxFONTFAMILY_SWISS: + sFacename = wxT("Helv") ; + break; + + case wxFONTFAMILY_DEFAULT: default: - sFacename = _T("Helv"); + sFacename = wxT("System VIO") ; } - if (!wxStrlen(fa.szFacename) ) + if (!wxStrlen((wxChar*)fa.szFacename) ) { SetFaceName(sFacename); } } // end of wxNativeFontInfo::SetFamily -void wxNativeFontInfo::SetEncoding( - wxFontEncoding eEncoding -) +void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding ) { wxNativeEncodingInfo vInfo; @@ -678,8 +752,7 @@ void wxNativeFontInfo::SetEncoding( ,&vInfo )) { -#if wxUSE_FONTMAP - if (wxTheFontMapper->GetAltForEncoding( eEncoding + if (wxFontMapper::Get()->GetAltForEncoding( eEncoding ,&vInfo )) { @@ -694,88 +767,85 @@ void wxNativeFontInfo::SetEncoding( } } else -#endif // wxUSE_FONTMAP { // unsupported encoding, replace with the default vInfo.charset = 850; } } - fa.usCodePage = vInfo.charset; + fa.usCodePage = (USHORT)vInfo.charset; } // end of wxNativeFontInfo::SetFaceName -bool wxNativeFontInfo::FromString( - const wxString& rsStr -) +bool wxNativeFontInfo::FromString( const wxString& rsStr ) { long lVal; - wxStringTokenizer vTokenizer(rsStr, _T(";")); + wxStringTokenizer vTokenizer(rsStr, wxT(";")); // // First the version // wxString sToken = vTokenizer.GetNextToken(); - if (sToken != _T('0')) - return FALSE; + if (sToken != wxT('0')) + return false; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fm.lEmHeight = lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.lAveCharWidth = lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.fsSelection = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.fsType = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.fsFontUse = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.idRegistry = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.usCodePage = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fa.lMatch = lVal; sToken = vTokenizer.GetNextToken(); if (!sToken.ToLong(&lVal)) - return FALSE; + return false; fn.usWeightClass = (USHORT)lVal; sToken = vTokenizer.GetNextToken(); if(!sToken) - return FALSE; - wxStrcpy(fa.szFacename, sToken.c_str()); - return TRUE; + return false; + wxStrcpy((wxChar*)fa.szFacename, sToken.c_str()); + return true; } // end of wxNativeFontInfo::FromString wxString wxNativeFontInfo::ToString() const { wxString sStr; - sStr.Printf(_T("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"), + sStr.Printf(wxT("%d;%ld;%ld;%ld;%d;%d;%d;%d;%d;%ld;%d;%s"), 0, // version, in case we want to change the format later fm.lEmHeight, fa.lAveCharWidth, @@ -787,7 +857,7 @@ wxString wxNativeFontInfo::ToString() const fa.usCodePage, fa.lMatch, fn.usWeightClass, - fa.szFacename); + (char *)fa.szFacename); return sStr; } // end of wxNativeFontInfo::ToString @@ -795,21 +865,15 @@ wxString wxNativeFontInfo::ToString() const // wxFont // ---------------------------------------------------------------------------- -void wxFont::Init() -{ -} // end of wxFont::Init - -bool wxFont::Create( - const wxNativeFontInfo& rInfo -, WXHFONT hFont -) +bool wxFont::Create( const wxNativeFontInfo& rInfo, + WXHFONT hFont ) { UnRef(); m_refData = new wxFontRefData( rInfo ,hFont ); RealizeResource(); - return TRUE; + return true; } // end of wxFont::Create wxFont::wxFont( @@ -826,15 +890,13 @@ wxFont::wxFont( // Constructor for a font. Note that the real construction is done // in wxDC::SetFont, when information is available about scaling etc. // ---------------------------------------------------------------------------- -bool wxFont::Create( - int nPointSize -, int nFamily -, int nStyle -, int nWeight -, bool bUnderlined -, const wxString& rsFaceName -, wxFontEncoding vEncoding -) +bool wxFont::Create( int nPointSize, + wxFontFamily nFamily, + wxFontStyle nStyle, + wxFontWeight nWeight, + bool bUnderlined, + const wxString& rsFaceName, + wxFontEncoding vEncoding ) { UnRef(); @@ -855,7 +917,7 @@ bool wxFont::Create( ,vEncoding ); RealizeResource(); - return TRUE; + return true; } // end of wxFont::Create wxFont::~wxFont() @@ -869,28 +931,36 @@ wxFont::~wxFont() // here, but we may check that font definition is true // ---------------------------------------------------------------------------- +wxGDIRefData *wxFont::CreateGDIRefData() const +{ + return new wxFontRefData(); +} + +wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const +{ + return new wxFontRefData(*static_cast(data)); +} + bool wxFont::RealizeResource() { if ( GetResourceHandle() ) { - return TRUE; + return true; } return M_FONTDATA->Alloc(this); } // end of wxFont::RealizeResource -bool wxFont::FreeResource( - bool bForce -) +bool wxFont::FreeResource( bool WXUNUSED(bForce) ) { if (GetResourceHandle()) { M_FONTDATA->Free(); - return TRUE; + return true; } - return FALSE; + return false; } // end of wxFont::FreeResource -WXHANDLE wxFont::GetResourceHandle() +WXHANDLE wxFont::GetResourceHandle() const { return GetHFONT(); } // end of wxFont::GetResourceHandle @@ -905,21 +975,6 @@ bool wxFont::IsFree() const return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0); } // end of wxFont::IsFree -void wxFont::Unshare() -{ - // Don't change shared data - if ( !m_refData ) - { - m_refData = new wxFontRefData(); - } - else - { - wxFontRefData* ref = new wxFontRefData(*M_FONTDATA); - UnRef(); - m_refData = ref; - } -} // end of wxFont::Unshare - // ---------------------------------------------------------------------------- // change font attribute: we recreate font when doing it // ---------------------------------------------------------------------------- @@ -928,7 +983,7 @@ void wxFont::SetPointSize( int nPointSize ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetPointSize(nPointSize); @@ -936,10 +991,10 @@ void wxFont::SetPointSize( } // end of wxFont::SetPointSize void wxFont::SetFamily( - int nFamily + wxFontFamily nFamily ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetFamily(nFamily); @@ -947,10 +1002,10 @@ void wxFont::SetFamily( } // end of wxFont::SetFamily void wxFont::SetStyle( - int nStyle + wxFontStyle nStyle ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetStyle(nStyle); @@ -958,32 +1013,34 @@ void wxFont::SetStyle( } // end of wxFont::SetStyle void wxFont::SetWeight( - int nWeight + wxFontWeight nWeight ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetWeight(nWeight); RealizeResource(); } // end of wxFont::SetWeight -void wxFont::SetFaceName( +bool wxFont::SetFaceName( const wxString& rsFaceName ) { - Unshare(); + AllocExclusive(); - M_FONTDATA->SetFaceName(rsFaceName); + bool refdataok = M_FONTDATA->SetFaceName(rsFaceName); RealizeResource(); + + return refdataok && wxFontBase::SetFaceName(rsFaceName); } // end of wxFont::SetFaceName void wxFont::SetUnderlined( bool bUnderlined ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetUnderlined(bUnderlined); @@ -994,18 +1051,18 @@ void wxFont::SetEncoding( wxFontEncoding vEncoding ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetEncoding(vEncoding); RealizeResource(); } // end of wxFont::SetEncoding -void wxFont::SetNativeFontInfo( +void wxFont::DoSetNativeFontInfo( const wxNativeFontInfo& rInfo ) { - Unshare(); + AllocExclusive(); FreeResource(); @@ -1025,37 +1082,35 @@ int wxFont::GetPointSize() const return M_FONTDATA->GetPointSize(); } // end of wxFont::GetPointSize -int wxFont::GetFamily() const +wxFontFamily wxFont::DoGetFamily() const { - wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); - return M_FONTDATA->GetFamily(); -} // end of wxFont::GetFamily +} // end of wxFont::DoGetFamily -int wxFont::GetStyle() const +wxFontStyle wxFont::GetStyle() const { - wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + wxCHECK_MSG( Ok(), wxFONTSTYLE_MAX, wxT("invalid font") ); return M_FONTDATA->GetStyle(); } // end of wxFont::GetStyle -int wxFont::GetWeight() const +wxFontWeight wxFont::GetWeight() const { - wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + wxCHECK_MSG( Ok(), wxFONTWEIGHT_MAX, wxT("invalid font") ); return M_FONTDATA->GetWeight(); } bool wxFont::GetUnderlined() const { - wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") ); + wxCHECK_MSG( Ok(), false, wxT("invalid font") ); return M_FONTDATA->GetUnderlined(); } // end of wxFont::GetUnderlined wxString wxFont::GetFaceName() const { - wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") ); + wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") ); return M_FONTDATA->GetFaceName(); } // end of wxFont::GetFaceName @@ -1067,34 +1122,27 @@ wxFontEncoding wxFont::GetEncoding() const return M_FONTDATA->GetEncoding(); } // end of wxFont::GetEncoding -wxNativeFontInfo* wxFont::GetNativeFontInfo() const +const wxNativeFontInfo* wxFont::GetNativeFontInfo() const { - if (M_FONTDATA->HasNativeFontInfo()) - return new wxNativeFontInfo(M_FONTDATA->GetNativeFontInfo()); - return 0; + return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo()) + : NULL; } // end of wxFont::GetNativeFontInfo // // Internal use only method to set the FONTMETRICS array // -void wxFont::SetFM( - PFONTMETRICS pFM -, int nNumFonts -) +void wxFont::SetFM( PFONTMETRICS pFM, int nNumFonts ) { M_FONTDATA->SetFM(pFM); M_FONTDATA->SetNumFonts(nNumFonts); } // end of wxFont::SetFM -void wxFont::SetPS( - HPS hPS -) +void wxFont::SetPS( HPS hPS ) { - Unshare(); + AllocExclusive(); M_FONTDATA->SetPS(hPS); RealizeResource(); -} // end of wxFont::SetUnderlined - +} // end of wxFont::SetPS