From: Stefan Csomor Date: Fri, 9 Nov 2007 20:39:58 +0000 (+0000) Subject: forward port from 2.8 X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/fcaea2fab983efc4dcfe7d9f23dd046c5eb3b932?ds=inline forward port from 2.8 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49786 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 24801af63c..54ecf302cb 100644 --- a/src/common/dcgraph.cpp +++ b/src/common/dcgraph.cpp @@ -27,6 +27,9 @@ #include "wx/region.h" #endif +#ifdef __WXMAC__ +#include "wx/mac/private.h" +#endif //----------------------------------------------------------------------------- // constants //----------------------------------------------------------------------------- @@ -138,6 +141,30 @@ void wxGCDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y ) m_graphicContext->DrawIcon( icon , x, y, w, h ); } +bool wxGCDC::StartDoc( const wxString& WXUNUSED(message) ) +{ + return false; +} + +void wxGCDC::EndDoc() +{ +} + +void wxGCDC::StartPage() +{ +} + +void wxGCDC::EndPage() +{ +} + +void wxGCDC::Flush() +{ +#ifdef __WXMAC__ + CGContextFlush( (CGContextRef) m_graphicContext->GetNativeContext() ); +#endif +} + void wxGCDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord w, wxCoord h ) { wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoSetClippingRegion - invalid DC") ); @@ -168,7 +195,7 @@ void wxGCDC::DoSetClippingRegionAsRegion( const wxRegion ®ion ) if (region.Empty()) { - DestroyClippingRegion(); + //DestroyClippingRegion(); return; } @@ -204,7 +231,7 @@ void wxGCDC::DestroyClippingRegion() // so we must explicitely make sure it only covers the area we want it to draw int width, height ; GetSize( &width , &height ) ; - m_graphicContext->Clip( DeviceToLogicalX(0) , DeviceToLogicalY(0) , width, height ); + m_graphicContext->Clip( DeviceToLogicalX(0) , DeviceToLogicalY(0) , DeviceToLogicalXRel(width), DeviceToLogicalYRel(height) ); m_graphicContext->SetPen( m_pen ); m_graphicContext->SetBrush( m_brush ); @@ -501,7 +528,6 @@ void wxGCDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, if ( !m_logicalFunctionSupported ) return; - wxGraphicsPath path = m_graphicContext->CreatePath(); m_graphicContext->PushState(); m_graphicContext->Translate(x+w/2.0,y+h/2.0); wxDouble factor = ((wxDouble) w) / h; @@ -509,8 +535,27 @@ void wxGCDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, // since these angles (ea,sa) are measured counter-clockwise, we invert them to // get clockwise angles + if ( m_brush.GetStyle() != wxTRANSPARENT ) + { + wxGraphicsPath path = m_graphicContext->CreatePath(); + path.MoveToPoint( 0, 0 ); + path.AddLineToPoint( h / 2.0 * cos(DegToRad(sa)) , h / 2.0 * sin(DegToRad(-sa)) ); + path.AddLineToPoint( h / 2.0 * cos(DegToRad(ea)) , h / 2.0 * sin(DegToRad(-ea)) ); + path.AddLineToPoint( 0, 0 ); + m_graphicContext->FillPath( path ); + + path = m_graphicContext->CreatePath(); + path.AddArc( 0, 0, h/2.0 , DegToRad(-sa) , DegToRad(-ea), sa > ea ); + m_graphicContext->FillPath( path ); + m_graphicContext->StrokePath( path ); + } + else + { + wxGraphicsPath path = m_graphicContext->CreatePath(); path.AddArc( 0, 0, h/2.0 , DegToRad(-sa) , DegToRad(-ea), sa > ea ); m_graphicContext->DrawPath( path ); + } + m_graphicContext->PopState(); } @@ -746,7 +791,8 @@ bool wxGCDC::DoStretchBlit( if ( logical_func == wxNO_OP ) return true; - else if ( logical_func != wxCOPY ) + else if ( !m_graphicContext->SetLogicalFunction( logical_func ) ) + { wxFAIL_MSG( wxT("Blitting is only supported with wxCOPY logical operation.") ); return false; @@ -786,6 +832,9 @@ bool wxGCDC::DoStretchBlit( return false; } + // reset logical function + m_graphicContext->SetLogicalFunction( m_logicalFunction ); + return true; } @@ -844,13 +893,13 @@ void wxGCDC::DoGetTextExtent( const wxString &str, wxCoord *width, wxCoord *heig m_graphicContext->GetTextExtent( str, &w, &h, &d, &e ); if ( height ) - *height = (wxCoord)h; + *height = (wxCoord)(h+0.5); if ( descent ) - *descent = (wxCoord)d; + *descent = (wxCoord)(d+0.5); if ( externalLeading ) - *externalLeading = (wxCoord)e; + *externalLeading = (wxCoord)(e+0.5); if ( width ) - *width = (wxCoord)w; + *width = (wxCoord)(w+0.5); if ( theFont ) { @@ -905,8 +954,8 @@ void wxGCDC::Clear(void) void wxGCDC::DoGetSize(int *width, int *height) const { - *width = 1000; - *height = 1000; + *width = 10000; + *height = 10000; } void wxGCDC::DoGradientFillLinear(const wxRect& rect, diff --git a/src/common/graphcmn.cpp b/src/common/graphcmn.cpp index 4095bb95a9..0560f39bf0 100644 --- a/src/common/graphcmn.cpp +++ b/src/common/graphcmn.cpp @@ -509,6 +509,50 @@ wxGraphicsContext::~wxGraphicsContext() { } +bool wxGraphicsContext::StartDoc( const wxString& message ) +{ + return true; +} + +void wxGraphicsContext::EndDoc() +{ +} + +void wxGraphicsContext::StartPage( wxDouble width, wxDouble height ) +{ +} + +void wxGraphicsContext::EndPage() +{ +} + +void wxGraphicsContext::Flush() +{ +} + +#if 0 +void wxGraphicsContext::SetAlpha( wxDouble WXUNUSED(alpha) ) +{ +} + +wxDouble wxGraphicsContext::GetAlpha() const +{ + return 1.0; +} +#endif + +void wxGraphicsContext::GetSize( wxDouble* width, wxDouble* height) +{ + *width = 10000.0; + *height = 10000.0; +} + +void wxGraphicsContext::GetDPI( wxDouble* dpiX, wxDouble* dpiY) +{ + *dpiX = 72.0; + *dpiY = 72.0; +} + // sets the pen void wxGraphicsContext::SetPen( const wxGraphicsPen& pen ) { @@ -579,12 +623,15 @@ void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, w void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, const wxGraphicsBrush& backgroundBrush ) { wxGraphicsBrush formerBrush = m_brush; + wxGraphicsPen formerPen = m_pen; wxDouble width; wxDouble height; wxDouble descent; wxDouble externalLeading; GetTextExtent( str , &width, &height, &descent, &externalLeading ); SetBrush( backgroundBrush ); + // to make sure our 'OffsetToPixelBoundaries' doesn't move the fill shape + SetPen( wxNullGraphicsPen ); wxGraphicsPath path = CreatePath(); path.AddRectangle( x , y, width, height ); @@ -592,11 +639,13 @@ void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, c DrawText( str, x ,y); SetBrush( formerBrush ); + SetPen( formerPen ); } void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle, const wxGraphicsBrush& backgroundBrush ) { wxGraphicsBrush formerBrush = m_brush; + wxGraphicsPen formerPen = m_pen; wxDouble width; wxDouble height; @@ -604,6 +653,8 @@ void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, w wxDouble externalLeading; GetTextExtent( str , &width, &height, &descent, &externalLeading ); SetBrush( backgroundBrush ); + // to make sure our 'OffsetToPixelBoundaries' doesn't move the fill shape + SetPen( wxNullGraphicsPen ); wxGraphicsPath path = CreatePath(); path.MoveToPoint( x , y ); @@ -615,6 +666,7 @@ void wxGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, w FillPath( path ); DrawText( str, x ,y, angle); SetBrush( formerBrush ); + SetPen( formerPen ); } void wxGraphicsContext::StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2)