📄 font.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/carbon/font.cpp// Purpose: wxFont class// Author: Stefan Csomor// Modified by:// Created: 1998-01-01// RCS-ID: $Id: font.cpp,v 1.53 2006/11/20 16:21:04 VS Exp $// Copyright: (c) Stefan Csomor// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#include "wx/font.h"#ifndef WX_PRECOMP #include "wx/string.h" #include "wx/utils.h" #include "wx/intl.h" #include "wx/gdicmn.h"#endif#include "wx/fontutil.h"#include "wx/graphics.h"#include "wx/mac/private.h"#ifndef __DARWIN__#include <ATSUnicode.h>#endifIMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)class WXDLLEXPORT wxFontRefData: public wxGDIRefData{ friend class WXDLLEXPORT wxFont;public: wxFontRefData() : m_fontId(0) , m_pointSize(10) , m_family(wxDEFAULT) , m_style(wxNORMAL) , m_weight(wxNORMAL) , m_underlined(false) , m_faceName(wxT("applicationfont")) , m_encoding(wxFONTENCODING_DEFAULT) , m_macFontFamily(0) , m_macFontSize(0) , m_macFontStyle(0) , m_macATSUStyle(0) , m_macATSUFontID(0) { Init(m_pointSize, m_family, m_style, m_weight, m_underlined, m_faceName, m_encoding); } wxFontRefData(const wxFontRefData& data) : wxGDIRefData() , m_fontId(data.m_fontId) , m_pointSize(data.m_pointSize) , m_family(data.m_family) , m_style(data.m_style) , m_weight(data.m_weight) , m_underlined(data.m_underlined) , m_faceName(data.m_faceName) , m_encoding(data.m_encoding) , m_macFontFamily(data.m_macFontFamily) , m_macFontSize(data.m_macFontSize) , m_macFontStyle(data.m_macFontStyle) , m_macATSUStyle(0) , m_macATSUFontID(data.m_macATSUFontID) { Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight, data.m_underlined, data.m_faceName, data.m_encoding); } wxFontRefData(int size, int family, int style, int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding) : m_fontId(0) , m_pointSize(size) , m_family(family) , m_style(style) , m_weight(weight) , m_underlined(underlined) , m_faceName(faceName) , m_encoding(encoding) , m_macFontFamily(0) , m_macFontSize(0) , m_macFontStyle(0) , m_macATSUStyle(0) , m_macATSUFontID(0) { Init(size, family, style, weight, underlined, faceName, encoding); } virtual ~wxFontRefData(); 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, int family, int style, int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding); // font characterstics int m_fontId; int m_pointSize; int m_family; int m_style; int m_weight; bool m_underlined; wxString m_faceName; wxFontEncoding m_encoding; bool m_noAA; // No anti-aliasingpublic: FMFontFamily m_macFontFamily; FMFontSize m_macFontSize; FMFontStyle 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 // included in the ATSU font id ATSUStyle m_macATSUStyle ; ATSUFontID m_macATSUFontID; FMFontStyle 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;};#define M_FONTDATA ((wxFontRefData*)m_refData)// ============================================================================// implementation// ============================================================================// ----------------------------------------------------------------------------// wxFontRefData// ----------------------------------------------------------------------------void wxFontRefData::Init(int pointSize, int family, int style, int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding){ m_style = style; m_pointSize = pointSize; m_family = family; m_style = style; m_weight = weight; m_underlined = underlined; m_faceName = faceName; m_encoding = encoding; m_macFontFamily = 0 ; m_macFontSize = 0; m_macFontStyle = 0; m_macATSUFontID = 0; m_macATSUAdditionalQDStyles = 0 ; m_macATSUStyle = NULL ; m_macThemeFontID = kThemeCurrentPortFont ; m_noAA = false;}wxFontRefData::~wxFontRefData(){ if ( m_macATSUStyle ) { ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle); m_macATSUStyle = NULL ; }}void wxFontRefData::MacFindFont(){ OSStatus status ; Str255 qdFontName ; if ( m_macThemeFontID != kThemeCurrentPortFont ) { Style style ; GetThemeFont( m_macThemeFontID, GetApplicationScript(), qdFontName, &m_macFontSize, &style ); m_macFontStyle = style ; m_faceName = wxMacMakeStringFromPascal( qdFontName ); if ( m_macFontStyle & bold ) m_weight = wxBOLD ; else m_weight = wxNORMAL ; if ( m_macFontStyle & italic ) m_style = wxITALIC ; if ( m_macFontStyle & underline ) m_underlined = true ; m_pointSize = m_macFontSize ;#ifndef __LP64__ m_macFontFamily = FMGetFontFamilyFromName( qdFontName );#endif } else { if ( m_faceName.empty() ) { if ( m_family == wxDEFAULT ) {#ifndef __LP64__ m_macFontFamily = GetAppFont(); FMGetFontFamilyName(m_macFontFamily,qdFontName); m_faceName = wxMacMakeStringFromPascal( qdFontName );#endif } else { switch ( m_family ) { case wxSCRIPT : case wxROMAN : case wxDECORATIVE : m_faceName = wxT("Times"); break ; case wxSWISS : m_faceName = wxT("Lucida Grande"); break ; case wxMODERN : m_faceName = wxT("Monaco"); break ; default: m_faceName = wxT("Times"); break ; }#ifndef __LP64__ wxMacStringToPascal( m_faceName , qdFontName ); m_macFontFamily = FMGetFontFamilyFromName( qdFontName );#endif } } else {#ifndef __LP64__ if ( m_faceName == wxT("systemfont") ) m_macFontFamily = GetSysFont(); else if ( m_faceName == wxT("applicationfont") ) m_macFontFamily = GetAppFont(); else#else if ( m_faceName == wxT("systemfont") ) m_faceName = wxT("Lucida Grande"); else if ( m_faceName == wxT("applicationfont") ) m_faceName = wxT("Lucida Grande");#endif { wxMacCFStringHolder cf( m_faceName, wxLocale::GetSystemEncoding() ); ATSFontFamilyRef atsfamily = ATSFontFamilyFindFromName( cf , kATSOptionFlagsDefault ); wxASSERT_MSG( atsfamily != (ATSFontFamilyRef) -1 , wxT("ATSFontFamilyFindFromName failed") ); m_macFontFamily = FMGetFontFamilyFromATSFontFamilyRef( atsfamily ); } } m_macFontStyle = 0; if (m_weight == wxBOLD) m_macFontStyle |= bold; if (m_style == wxITALIC || m_style == wxSLANT) m_macFontStyle |= italic; if (m_underlined) m_macFontStyle |= underline; m_macFontSize = m_pointSize ; } // we try to get as much styles as possible into ATSU // ATSUFontID and FMFont are equivalent FMFontStyle intrinsicStyle = 0 ;#ifndef __LP64__ status = FMGetFontFromFontFamilyInstance( m_macFontFamily , m_macFontStyle , &m_macATSUFontID , &intrinsicStyle); wxASSERT_MSG( status == noErr , wxT("couldn't get an ATSUFont from font family") );#endif m_macATSUAdditionalQDStyles = m_macFontStyle & (~intrinsicStyle ); if ( m_macATSUStyle ) { ::ATSUDisposeStyle((ATSUStyle)m_macATSUStyle); m_macATSUStyle = NULL ; } status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUStyle); wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ); ATSUAttributeTag atsuTags[] = { kATSUFontTag , kATSUSizeTag , kATSUVerticalCharacterTag, kATSUQDBoldfaceTag , kATSUQDItalicTag ,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -