X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/99030bdf57b8d590066092d2f466626f9bdef172..cd3c2375e6fddd3d478a6776900c21aaeb2d0f08:/src/mac/carbon/dc.cpp diff --git a/src/mac/carbon/dc.cpp b/src/mac/carbon/dc.cpp index 2acff5c48a..ef065b7ac1 100644 --- a/src/mac/carbon/dc.cpp +++ b/src/mac/carbon/dc.cpp @@ -66,6 +66,39 @@ wxMacPortSetter::~wxMacPortSetter() m_dc->MacCleanupPort(&m_ph) ; } +wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) +{ + m_formerClip = NewRgn() ; + m_newClip = NewRgn() ; + GetClip( m_formerClip ) ; + + if ( win ) + { + RgnHandle insidergn = NewRgn() ; + int x = 0 , y = 0; + wxWindow *parent = win->GetParent() ; + parent->MacWindowToRootWindow( &x,&y ) ; + + wxSize size = parent->GetSize() ; + SetRectRgn( insidergn , parent->MacGetLeftBorderSize() , parent->MacGetTopBorderSize() , + size.x - parent->MacGetLeftBorderSize() - parent->MacGetRightBorderSize(), + size.y - parent->MacGetTopBorderSize() - parent->MacGetBottomBorderSize()) ; + + CopyRgn( (RgnHandle) parent->MacGetVisibleRegion(false).GetWXHRGN() , m_newClip ) ; + SectRgn( m_newClip , insidergn , m_newClip ) ; + OffsetRgn( m_newClip , x , y ) ; + SetClip( m_newClip ) ; + DisposeRgn( insidergn ) ; + } +} + +wxMacWindowClipper::~wxMacWindowClipper() +{ + SetClip( m_formerClip ) ; + DisposeRgn( m_newClip ) ; + DisposeRgn( m_formerClip ) ; +} + //----------------------------------------------------------------------------- // Local functions //----------------------------------------------------------------------------- @@ -721,6 +754,7 @@ void wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 ) void wxDC::DoCrossHair( wxCoord x, wxCoord y ) { wxCHECK_RET( Ok(), wxT("wxDC::DoCrossHair Invalid window dc") ); + wxMacPortSetter helper(this) ; if (m_pen.GetStyle() != wxTRANSPARENT) { @@ -782,6 +816,7 @@ void wxDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord xc, wxCoord yc ) { wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc Invalid DC")); + wxMacPortSetter helper(this) ; wxCoord xx1 = XLOG2DEVMAC(x1); wxCoord yy1 = YLOG2DEVMAC(y1); @@ -835,6 +870,7 @@ void wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea ) { wxCHECK_RET(Ok(), wxT("wxDC::DoDrawEllepticArc Invalid DC")); + wxMacPortSetter helper(this) ; Rect r; double angle = sa - ea; // Order important Mac in opposite direction to wx @@ -922,8 +958,8 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[], PolyHandle polygon = OpenPoly(); - x1 = XLOG2DEVMAC(points[0].x + xoffset); - y1 = YLOG2DEVMAC(points[0].y + yoffset); + x2 = x1 = XLOG2DEVMAC(points[0].x + xoffset); + y2 = y1 = YLOG2DEVMAC(points[0].y + yoffset); ::MoveTo(x1,y1); for (int i = 1; i < n; i++) @@ -1403,7 +1439,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, if ( 0 ) { m_macFormerAliasState = IsAntiAliasedTextEnabled(&m_macFormerAliasSize); - SetAntiAliasedTextEnabled(true, m_scaleY * font->m_macFontSize); + SetAntiAliasedTextEnabled(true, SInt16(m_scaleY * font->m_macFontSize)); m_macAliasWasEnabled = true ; } @@ -1431,9 +1467,10 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y, &chars , (ATSUStyle*) &m_macATSUIStyle , &atsuLayout ) ; wxASSERT_MSG( status == noErr , "couldn't create the layout of the rotated text" ); - if ( abs(angle) > 0 ) + int iAngle = int( angle ); + if ( abs(iAngle) > 0 ) { - Fixed atsuAngle = IntToFixed( angle ) ; + Fixed atsuAngle = IntToFixed( iAngle ) ; ByteCount angleSize = sizeof(Fixed) ; ATSUAttributeTag rotationTag = kATSULineRotationTag ; ATSUAttributeValuePtr angleValue = &atsuAngle ; @@ -1464,6 +1501,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) long yy = YLOG2DEVMAC(y); #if TARGET_CARBON bool useDrawThemeText = ( DrawThemeTextBox != (void*) kUnresolvedCFragSymbolAddress ) ; + useDrawThemeText = false ; #endif MacInstallFont() ; if ( 0 ) @@ -1525,7 +1563,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) ::DrawThemeTextBox( mString, kThemeCurrentPortFont, kThemeStateActive, - true, + false, &frame, teJustLeft, nil ); @@ -1551,7 +1589,7 @@ void wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y) ::DrawThemeTextBox( mString, kThemeCurrentPortFont, kThemeStateActive, - true, + false, &frame, teJustLeft, nil ); @@ -1584,22 +1622,18 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he if ( theFont ) { - wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ; - - if ( font ) - { - ::TextFont( font->m_macFontNum ) ; - ::TextSize( YLOG2DEVREL( font->m_macFontSize) ) ; - ::TextFace( font->m_macFontStyle ) ; - } - } - else - { - MacInstallFont() ; + // work around the constness + *((wxFont*)(&m_font)) = *theFont ; } + MacInstallFont() ; + FontInfo fi ; ::GetFontInfo( &fi ) ; +#if TARGET_CARBON + bool useGetThemeText = ( GetThemeTextDimensions != (void*) kUnresolvedCFragSymbolAddress ) ; + useGetThemeText = false ; +#endif if ( height ) *height = YDEV2LOGREL( fi.descent + fi.ascent ) ; @@ -1636,21 +1670,61 @@ void wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he { if ( height ) *height += YDEV2LOGREL( fi.descent + fi.ascent + fi.leading ) ; - curwidth = ::TextWidth( text , laststop , i - laststop ) ; +#if TARGET_CARBON + if ( useGetThemeText ) + { + Point bounds={0,0} ; + SInt16 baseline ; + CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + ::GetThemeTextDimensions( mString, + kThemeCurrentPortFont, + kThemeStateActive, + false, + &bounds, + &baseline ); + CFRelease( mString ) ; + curwidth = bounds.h ; + } + else +#endif + { + curwidth = ::TextWidth( text , laststop , i - laststop ) ; + } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; laststop = i+1 ; } i++ ; } - - curwidth = ::TextWidth( text , laststop , i - laststop ) ; + +#if TARGET_CARBON + if ( useGetThemeText ) + { + Point bounds={0,0} ; + SInt16 baseline ; + CFStringRef mString = CFStringCreateWithBytes( NULL , (UInt8*) text + laststop , i - laststop , CFStringGetSystemEncoding(), false ) ; + ::GetThemeTextDimensions( mString, + kThemeCurrentPortFont, + kThemeStateActive, + false, + &bounds, + &baseline ); + CFRelease( mString ) ; + curwidth = bounds.h ; + } + else +#endif + { + curwidth = ::TextWidth( text , laststop , i - laststop ) ; + } if ( curwidth > *width ) *width = XDEV2LOGREL( curwidth ) ; } if ( theFont ) { + // work around the constness + *((wxFont*)(&m_font)) = formerFont ; m_macFontInstalled = false ; } } @@ -1792,7 +1866,7 @@ void wxDC::MacInstallFont() const OSStatus status = noErr ; - Fixed atsuSize = IntToFixed(m_scaleY * font->m_macFontSize) ; + Fixed atsuSize = IntToFixed( int(m_scaleY * font->m_macFontSize) ) ; Style qdStyle = font->m_macFontStyle ; ATSUFontID atsuFont = font->m_macATSUFontID ; @@ -1861,13 +1935,13 @@ void wxDC::MacInstallFont() const Pattern gHatchPatterns[] = { - { 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 } , + { { 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 } } } ; static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern) @@ -1967,7 +2041,6 @@ void wxDC::MacInstallPen() const case wxUSER_DASH : { wxDash* dash ; - int number = m_pen.GetDashes(&dash) ; // right now we don't allocate larger pixmaps for ( int i = 0 ; i < 8 ; ++i ) {