📄 dc.cpp
字号:
bool wxDC::CanGetTextExtent() const{ wxCHECK_MSG(Ok(), false, wxT("Invalid DC")); return true ;}void wxDC::DoGetTextExtent( const wxString &strtext, wxCoord *width, wxCoord *height, wxCoord *descent, wxCoord *externalLeading , wxFont *theFont ) const{ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; wxFont formerFont = m_font ; if ( theFont ) { // work around the constness *((wxFont*)(&m_font)) = *theFont ; } MacInstallFont() ; FontInfo fi ; ::GetFontInfo( &fi ) ;#if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ;#endif if ( height ) *height = YDEV2LOGREL( fi.descent + fi.ascent ) ; if ( descent ) *descent =YDEV2LOGREL( fi.descent ); if ( externalLeading ) *externalLeading = YDEV2LOGREL( fi.leading ) ; int length = strtext.length() ; int laststop = 0 ; int i = 0 ; int curwidth = 0 ; if ( width ) { *width = 0 ;#if 0 // apparently we don't have to do all that while( i < length ) { if( strtext[i] == 13 || strtext[i] == 10) { wxString linetext = strtext.Mid( laststop , i - laststop ) ; if ( height ) *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ;#if TARGET_CARBON if ( useGetThemeText ) { Point bounds={0,0} ; SInt16 baseline ; wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ; ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); curwidth = bounds.h ; } else#endif { wxCharBuffer text = linetext.mb_str(wxConvLocal) ; curwidth = ::TextWidth( text , 0 , strlen(text) ) ; } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; laststop = i+1 ; } i++ ; } wxString linetext = strtext.Mid( laststop , i - laststop ) ;#endif // 0 wxString linetext = strtext ;#if TARGET_CARBON if ( useGetThemeText ) { Point bounds={0,0} ; SInt16 baseline ; wxMacCFStringHolder mString( linetext , m_font.GetEncoding() ) ; ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); curwidth = bounds.h ; } else#endif { wxCharBuffer text = linetext.mb_str(wxConvLocal) ; curwidth = ::TextWidth( text , 0 , strlen(text) ) ; } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; } if ( theFont ) { // work around the constness *((wxFont*)(&m_font)) = formerFont ; m_macFontInstalled = false ; }}bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const{ wxCHECK_MSG(Ok(), false, wxT("Invalid DC")); widths.Empty(); widths.Add(0, text.length()); if (text.length() == 0) return false; wxMacFastPortSetter helper(this) ; MacInstallFont() ;#if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; if ( UMAGetSystemVersion() < 0x1000 || IsKindOf(CLASSINFO( wxPrinterDC ) ) || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ; if ( useGetThemeText ) { // If anybody knows how to do this more efficiently yet still handle // the fractional glyph widths that may be present when using AA // fonts, please change it. Currently it is measuring from the // begining of the string for each succeding substring, which is much // slower than this should be. for (size_t i=0; i<text.length(); i++) { wxString str(text.Left(i+1)); Point bounds = {0,0}; SInt16 baseline ; wxMacCFStringHolder mString(str, m_font.GetEncoding()); ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); widths[i] = XDEV2LOGREL(bounds.h); } } else#endif { wxCharBuffer buff = text.mb_str(wxConvLocal); size_t len = strlen(buff); short* measurements = new short[len+1]; MeasureText(len, buff.data(), measurements); // Copy to widths, starting at measurements[1] // NOTE: this doesn't take into account any multi-byte characters // in buff, it probabkly should... for (size_t i=0; i<text.length(); i++) widths[i] = XDEV2LOGREL(measurements[i+1]); delete [] measurements; } return true;}wxCoord wxDC::GetCharWidth(void) const{ wxCHECK_MSG(Ok(), 1, wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; MacInstallFont() ; int width = 0 ;#if TARGET_CARBON bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; if ( UMAGetSystemVersion() < 0x1000 || ((wxFont*)&m_font)->GetNoAntiAliasing() ) useGetThemeText = false ;#endif char text[] = "g" ;#if TARGET_CARBON if ( useGetThemeText ) { Point bounds={0,0} ; SInt16 baseline ; CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text , 1 , CFStringGetSystemEncoding(), false ) ; ::GetThemeTextDimensions( mString, kThemeCurrentPortFont, kThemeStateActive, false, &bounds, &baseline ); CFRelease( mString ) ; width = bounds.h ; } else#endif { width = ::TextWidth( text , 0 , 1 ) ; } return YDEV2LOGREL(width) ;}wxCoord wxDC::GetCharHeight(void) const{ wxCHECK_MSG(Ok(), 1, wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; MacInstallFont() ; FontInfo fi ; ::GetFontInfo( &fi ) ; return YDEV2LOGREL( fi.descent + fi.ascent );}void wxDC::Clear(void){ wxCHECK_RET(Ok(), wxT("Invalid DC")); wxMacFastPortSetter helper(this) ; Rect rect = { -31000 , -31000 , 31000 , 31000 } ; if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) { ::PenNormal() ; //MacInstallBrush() ; MacSetupBackgroundForCurrentPort( m_backgroundBrush ) ; ::EraseRect( &rect ) ; }}void wxDC::MacInstallFont() const{ wxCHECK_RET(Ok(), wxT("Invalid DC")); // if ( m_macFontInstalled ) // return ; Pattern blackColor ; MacSetupBackgroundForCurrentPort(m_backgroundBrush) ; if ( m_font.Ok() ) { ::TextFont( m_font.GetMacFontNum() ) ; ::TextSize( (short)(m_scaleY * m_font.GetMacFontSize()) ) ; ::TextFace( m_font.GetMacFontStyle() ) ; m_macFontInstalled = true ; m_macBrushInstalled = false ; m_macPenInstalled = false ; RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()); RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()); ::RGBForeColor( &forecolor ); ::RGBBackColor( &backcolor ); } else { FontFamilyID fontId ; Str255 fontName ; SInt16 fontSize ; Style fontStyle ; GetThemeFont(kThemeSmallSystemFont , GetApplicationScript() , fontName , &fontSize , &fontStyle ) ; GetFNum( fontName, &fontId ); ::TextFont( fontId ) ; ::TextSize( short(m_scaleY * fontSize) ) ; ::TextFace( fontStyle ) ; // todo reset after spacing changes - or store the current spacing somewhere m_macFontInstalled = true ; m_macBrushInstalled = false ; m_macPenInstalled = false ; RGBColor forecolor = MAC_WXCOLORREF( m_textForegroundColour.GetPixel()); RGBColor backcolor = MAC_WXCOLORREF( m_textBackgroundColour.GetPixel()); ::RGBForeColor( &forecolor ); ::RGBBackColor( &backcolor ); } short mode = patCopy ; // todo : switch( m_logicalFunction ) { case wxCOPY: // src mode = patCopy ; break ; case wxINVERT: // NOT dst ::PenPat(GetQDGlobalsBlack(&blackColor)); mode = patXor ; break ; case wxXOR: // src XOR dst mode = patXor ; break ; case wxOR_REVERSE: // src OR (NOT dst) mode = notPatOr ; break ; case wxSRC_INVERT: // (NOT src) mode = notPatCopy ; break ; case wxAND: // src AND dst mode = adMin ; break ; // unsupported TODO case wxCLEAR: // 0 case wxAND_REVERSE:// src AND (NOT dst) case wxAND_INVERT: // (NOT src) AND dst case wxNO_OP: // dst case wxNOR: // (NOT src) AND (NOT dst) case wxEQUIV: // (NOT src) XOR dst case wxOR_INVERT: // (NOT src) OR dst case wxNAND: // (NOT src) OR (NOT dst) case wxOR: // src OR dst case wxSET: // 1 // case wxSRC_OR: // source _bitmap_ OR destination // case wxSRC_AND: // source _bitmap_ AND destination break ; } ::PenMode( mode ) ; OSStatus status = noErr ; Fixed atsuSize = IntToFixed( int(m_scaleY * m_font.GetMacFontSize()) ) ; Style qdStyle = m_font.GetMacFontStyle() ; ATSUFontID atsuFont = m_font.GetMacATSUFontID() ; status = ::ATSUCreateStyle((ATSUStyle *)&m_macATSUIStyle) ; wxASSERT_MSG( status == noErr , wxT("couldn't create ATSU style") ) ; ATSUAttributeTag atsuTags[] = { kATSUFontTag , kATSUSizeTag , // kATSUColorTag , // kATSUBaselineClassTag , kATSUVerticalCharacterTag, kATSUQDBoldfaceTag , kATSUQDItalicTag , kATSUQDUnderlineTag , kATSUQDCondensedTag , kATSUQDExtendedTag , } ; ByteCount atsuSizes[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = { sizeof( ATSUFontID ) , sizeof( Fixed ) , // sizeof( RGBColor ) , // sizeof( BslnBaselineClass ) , sizeof( ATSUVerticalCharacterType), sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , sizeof( Boolean ) , } ; Boolean kTrue = true ; Boolean kFalse = false ; //BslnBaselineClass kBaselineDefault = kBSLNHangingBaseline ; ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal; ATSUAttributeValuePtr atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] = { &atsuFont , &atsuSize , // &MAC_WXCOLORREF( m_textForegroundColour.GetPixel() ) , // &kBaselineDefault , &kHorizontal, (qdStyle & bold) ? &kTrue : &kFalse , (qdStyle & italic) ? &kTrue : &kFalse , (qdStyle & underline) ? &kTrue : &kFalse , (qdStyle & condense) ? &kTrue : &kFalse , (qdStyle & extend) ? &kTrue : &kFalse , } ; status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag) , atsuTags, atsuSizes, atsuValues); wxASSERT_MSG( status == noErr , wxT("couldn't set create ATSU style") ) ;}Pattern gPatterns[] ={ // hatch patterns { { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } } , { { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } } , { { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } } , { { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } } , { { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } } , { { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } } , { { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } } , // dash patterns { { 0xCC , 0x99 , 0x33 , 0x66 , 0xCC , 0x99 , 0x33 , 0x66 } } , // DOT { { 0xFE , 0xFD , 0xFB , 0xF7 , 0xEF , 0xDF , 0xBF , 0x7F } } , // LONG_DASH { { 0xEE , 0xDD , 0xBB , 0x77 , 0xEE , 0xDD , 0xBB , 0x77 } } , // SHORT_DASH { { 0xDE , 0xBD , 0x7B , 0xF6 , 0xED , 0xDB , 0xB7 , 0x6F } } , // DOT_DASH} ;static void wxMacGetPattern(int penStyle, Pattern *pattern){ int index = 0; // solid pattern by default switch(penStyle) { // hatches case wxBDIAGONAL_HATCH: index = 1; break; case wxFDIAGONAL_HATCH: index = 2; break; case wxCROSS_HATCH: index = 3; break; case wxHORIZONTAL_HATCH: index = 4; break; case wxVERTICAL_HATCH: index = 5; break; case wxCROSSDIAG_HATCH: index = 6; break; // dashes case wxDOT: index = 7; break; case wxLONG_DASH: index = 8; break; case wx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -