diff --git a/src/mac/carbon/font.cpp b/src/mac/carbon/font.cpp index 3bdf7473d7..517f232e70 100644 --- a/src/mac/carbon/font.cpp +++ b/src/mac/carbon/font.cpp @@ -16,19 +16,22 @@ #include "wx/fontutil.h" #include "wx/gdicmn.h" #include "wx/utils.h" - #include "wx/fontutil.h" #include "wx/mac/private.h" + #ifndef __DARWIN__ #include #endif + IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) + class WXDLLEXPORT wxFontRefData: public wxGDIRefData { friend class WXDLLEXPORT wxFont; + public: wxFontRefData() : m_fontId(0) @@ -94,9 +97,15 @@ public: } virtual ~wxFontRefData(); - void SetNoAntiAliasing( bool no = TRUE ) { m_noAA = no; } - bool GetNoAntiAliasing() const { return m_noAA; } - + + void SetNoAntiAliasing( bool no = true ) + { m_noAA = no; } + + bool GetNoAntiAliasing() const + { return m_noAA; } + + void MacFindFont() ; + protected: // common part of all ctors void Init(int size, @@ -117,14 +126,14 @@ protected: wxString m_faceName; wxFontEncoding m_encoding; bool m_noAA; // No anti-aliasing - + public: short m_macFontNum; short m_macFontSize; Style m_macFontStyle; - + // ATSU Font Information - + // this is split into an ATSU font id that may // contain some styles (special bold fonts etc) and // these are the additional qd styles that are not @@ -132,16 +141,15 @@ public: ATSUStyle m_macATSUStyle ; ATSUFontID m_macATSUFontID; Style m_macATSUAdditionalQDStyles ; - + // for true themeing support we must store the correct font // information here, as this speeds up and optimizes rendering ThemeFontID m_macThemeFontID ; - - wxNativeFontInfo m_info; -public: - void MacFindFont() ; + wxNativeFontInfo m_info; }; + + // ============================================================================ // implementation // ============================================================================ @@ -151,12 +159,12 @@ public: // ---------------------------------------------------------------------------- void wxFontRefData::Init(int pointSize, - int family, - int style, - int weight, - bool underlined, - const wxString& faceName, - wxFontEncoding encoding) + int family, + int style, + int weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) { m_style = style; m_pointSize = pointSize; @@ -173,9 +181,9 @@ void wxFontRefData::Init(int pointSize, m_macATSUFontID = 0; m_macATSUAdditionalQDStyles = 0 ; m_macATSUStyle = NULL ; - + m_macThemeFontID = kThemeCurrentPortFont ; - m_noAA = FALSE; + m_noAA = false; } wxFontRefData::~wxFontRefData() @@ -189,10 +197,11 @@ wxFontRefData::~wxFontRefData() void wxFontRefData::MacFindFont() { - if ( m_macThemeFontID != kThemeCurrentPortFont ) + if ( m_macThemeFontID != kThemeCurrentPortFont ) { Str255 fontName ; - GetThemeFont(m_macThemeFontID , GetApplicationScript() , fontName , &m_macFontSize , &m_macFontStyle ) ; + + GetThemeFont( m_macThemeFontID, GetApplicationScript(), fontName, &m_macFontSize, &m_macFontStyle ); m_faceName = wxMacMakeStringFromPascal( fontName ) ; if ( m_macFontStyle & bold ) m_weight = wxBOLD ; @@ -202,42 +211,41 @@ void wxFontRefData::MacFindFont() m_style = wxITALIC ; if ( m_macFontStyle & underline ) m_underlined = true ; - ::GetFNum( fontName, &m_macFontNum); + ::GetFNum( fontName, &m_macFontNum ); m_pointSize = m_macFontSize ; } else { - if( m_faceName.Length() == 0 ) + if ( m_faceName.Length() == 0 ) { - switch( m_family ) + switch ( m_family ) { case wxDEFAULT : - m_macFontNum = ::GetAppFont() ; + m_macFontNum = ::GetAppFont(); break ; + case wxSCRIPT : case wxROMAN : case wxDECORATIVE : -#ifdef __WXMAC_OSX__ - ::GetFNum( "\pTimes" , &m_macFontNum) ; -#else - ::GetFNum( "\pTimes" , &m_macFontNum) ; -#endif + ::GetFNum( "\pTimes", &m_macFontNum ); break ; + case wxSWISS : #ifdef __WXMAC_OSX__ - ::GetFNum( "\pLucida Grande" , &m_macFontNum) ; + ::GetFNum( "\pLucida Grande", &m_macFontNum ); #else - ::GetFNum( "\pGeneva" , &m_macFontNum) ; + ::GetFNum( "\pGeneva", &m_macFontNum ); #endif break ; + case wxMODERN : -#ifdef __WXMAC_OSX__ - ::GetFNum( "\pMonaco" , &m_macFontNum) ; -#else - ::GetFNum( "\pMonaco" , &m_macFontNum) ; -#endif + ::GetFNum( "\pMonaco", &m_macFontNum ); + break ; + + default: break ; } + Str255 name ; ::GetFontName( m_macFontNum , name ) ; m_faceName = wxMacMakeStringFromPascal( name ) ; @@ -259,9 +267,9 @@ void wxFontRefData::MacFindFont() m_macFontStyle = 0; if (m_weight == wxBOLD) m_macFontStyle |= bold; - if (m_style == wxITALIC || m_style == wxSLANT) + if (m_style == wxITALIC || m_style == wxSLANT) m_macFontStyle |= italic; - if (m_underlined) + if (m_underlined) m_macFontStyle |= underline; m_macFontSize = m_pointSize ; } @@ -271,7 +279,7 @@ void wxFontRefData::MacFindFont() Fixed atsuSize = IntToFixed( m_macFontSize ) ; Style atsuStyle = normal ; - verify_noerr(::ATSUFONDtoFontID(m_macFontNum, atsuStyle , (UInt32*)&m_macATSUFontID) ); + verify_noerr(::ATSUFONDtoFontID(m_macFontNum, atsuStyle , (UInt32*)&m_macATSUFontID) ); if ( m_macFontStyle & bold ) { ATSUFontID test ; @@ -281,6 +289,7 @@ void wxFontRefData::MacFindFont() m_macATSUFontID = test ; } } + if ( m_macFontStyle & italic ) { ATSUFontID test ; @@ -290,6 +299,7 @@ void wxFontRefData::MacFindFont() m_macATSUFontID = test ; } } + if ( m_macFontStyle & underline ) { ATSUFontID test ; @@ -299,7 +309,7 @@ void wxFontRefData::MacFindFont() m_macATSUFontID = test ; } } - + m_macATSUAdditionalQDStyles = m_macFontStyle & (~atsuStyle ) ; if ( m_macATSUStyle ) @@ -307,8 +317,10 @@ void wxFontRefData::MacFindFont() ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle); m_macATSUStyle = NULL ; } + OSStatus status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUStyle) ; wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ; + ATSUAttributeTag atsuTags[] = { kATSUFontTag , @@ -319,8 +331,8 @@ void wxFontRefData::MacFindFont() kATSUQDUnderlineTag , kATSUQDCondensedTag , kATSUQDExtendedTag , - } ; - ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = + }; + ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = { sizeof( ATSUFontID ) , sizeof( Fixed ) , @@ -330,12 +342,13 @@ void wxFontRefData::MacFindFont() sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , - } ; + }; + Boolean kTrue = true ; Boolean kFalse = false ; ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal; - ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = + ATSUAttributeValuePtr atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = { &m_macATSUFontID , &atsuSize , @@ -345,11 +358,14 @@ void wxFontRefData::MacFindFont() (m_macATSUAdditionalQDStyles & underline) ? &kTrue : &kFalse , (m_macATSUAdditionalQDStyles & condense) ? &kTrue : &kFalse , (m_macATSUAdditionalQDStyles & extend) ? &kTrue : &kFalse , - } ; - status = ::ATSUSetAttributes((ATSUStyle)m_macATSUStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag) , + }; + + status = ::ATSUSetAttributes( + (ATSUStyle)m_macATSUStyle, + sizeof(atsuTags) / sizeof(ATSUAttributeTag) , atsuTags, atsuSizes, atsuValues); - wxASSERT_MSG( status == noErr , wxT("couldn't Modify ATSU style") ) ; + wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ) ; } // ---------------------------------------------------------------------------- @@ -362,8 +378,9 @@ void wxFont::Init() bool wxFont::Create(const wxNativeFontInfo& info) { - return Create(info.pointSize, info.family, info.style, info.weight, - info.underlined, info.faceName, info.encoding); + return Create( + info.pointSize, info.family, info.style, info.weight, + info.underlined, info.faceName, info.encoding ); } wxFont::wxFont(const wxString& fontdesc) @@ -374,30 +391,36 @@ wxFont::wxFont(const wxString& fontdesc) } bool wxFont::Create(int pointSize, - int family, - int style, - int weight, - bool underlined, - const wxString& faceName, - wxFontEncoding encoding) + int family, + int style, + int weight, + bool underlined, + const wxString& faceName, + wxFontEncoding encoding) { UnRef(); - m_refData = new wxFontRefData(pointSize, family, style, weight, - underlined, faceName, encoding); + + m_refData = new wxFontRefData( + pointSize, family, style, weight, + underlined, faceName, encoding); RealizeResource(); - return TRUE; + return true; } -bool wxFont::MacCreateThemeFont(wxUint16 themeFontID ) +bool wxFont::MacCreateThemeFont(wxUint16 themeFontID) { UnRef(); - m_refData = new wxFontRefData(12, wxDEFAULT , wxFONTSTYLE_NORMAL , wxFONTWEIGHT_NORMAL ,false, wxEmptyString, wxFONTENCODING_DEFAULT); + + m_refData = new wxFontRefData( + 12, wxDEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, + false, wxEmptyString, wxFONTENCODING_DEFAULT ); + M_FONTDATA->m_macThemeFontID = themeFontID ; RealizeResource(); - return TRUE; + return true; } wxFont::~wxFont() @@ -407,7 +430,8 @@ wxFont::~wxFont() bool wxFont::RealizeResource() { M_FONTDATA->MacFindFont() ; - return TRUE; + + return true; } void wxFont::SetEncoding(wxFontEncoding encoding) @@ -506,95 +530,109 @@ void wxFont::SetNoAntiAliasing( bool no ) int wxFont::GetPointSize() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_pointSize; } int wxFont::GetFamily() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_family; } int wxFont::GetStyle() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_style; } int wxFont::GetWeight() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_weight; } bool wxFont::GetUnderlined() const { wxCHECK_MSG( M_FONTDATA != NULL , false, wxT("invalid font") ); + return M_FONTDATA->m_underlined; } wxString wxFont::GetFaceName() const { wxCHECK_MSG( M_FONTDATA != NULL , wxEmptyString , wxT("invalid font") ); + return M_FONTDATA->m_faceName; } wxFontEncoding wxFont::GetEncoding() const { wxCHECK_MSG( M_FONTDATA != NULL , wxFONTENCODING_DEFAULT , wxT("invalid font") ); + return M_FONTDATA->m_encoding; } bool wxFont::GetNoAntiAliasing() const { wxCHECK_MSG( M_FONTDATA != NULL , false, wxT("invalid font") ); + return M_FONTDATA->m_noAA; } short wxFont::MacGetFontNum() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macFontNum; } short wxFont::MacGetFontSize() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macFontSize; } wxByte wxFont::MacGetFontStyle() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macFontStyle; } wxUint32 wxFont::MacGetATSUFontID() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macATSUFontID; } -void* wxFont::MacGetATSUStyle() const +void * wxFont::MacGetATSUStyle() const { wxCHECK_MSG( M_FONTDATA != NULL , NULL, wxT("invalid font") ); + return M_FONTDATA->m_macATSUStyle; } wxUint32 wxFont::MacGetATSUAdditionalQDStyles() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macATSUAdditionalQDStyles; } -wxUint16 wxFont::MacGetThemeFontID() const +wxUint16 wxFont::MacGetThemeFontID() const { wxCHECK_MSG( M_FONTDATA != NULL , 0, wxT("invalid font") ); + return M_FONTDATA->m_macThemeFontID; } - -const wxNativeFontInfo *wxFont::GetNativeFontInfo() const +const wxNativeFontInfo * wxFont::GetNativeFontInfo() const { wxCHECK_MSG( M_FONTDATA != NULL , NULL, wxT("invalid font") ); wxCHECK_MSG( Ok(), NULL, wxT("invalid font") );