X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cb6e26b88e189f91770b1f21d4f29b64cde074f4..bf7bd4b18521e52b4c6651a974e5f43a0101f71b:/src/common/dcgraph.cpp diff --git a/src/common/dcgraph.cpp b/src/common/dcgraph.cpp index 993cccf3db..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,21 +528,34 @@ void wxGCDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h, if ( !m_logicalFunctionSupported ) return; - bool fill = m_brush.GetStyle() != wxTRANSPARENT; - - wxGraphicsPath path = m_graphicContext->CreatePath(); m_graphicContext->PushState(); - m_graphicContext->Translate(x+w/2,y+h/2); + m_graphicContext->Translate(x+w/2.0,y+h/2.0); wxDouble factor = ((wxDouble) w) / h; m_graphicContext->Scale( factor , 1.0); - if ( fill && (sa!=ea) ) - path.MoveToPoint(0,0); + // since these angles (ea,sa) are measured counter-clockwise, we invert them to // get clockwise angles - path.AddArc( 0, 0, h/2 , DegToRad(-sa) , DegToRad(-ea), sa > ea ); - if ( fill && (sa!=ea) ) - path.AddLineToPoint(0,0); + 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(); } @@ -546,7 +586,7 @@ void wxGCDC::DoDrawLines(int n, wxPoint points[], } #if wxUSE_SPLINES -void wxGCDC::DoDrawSpline(wxList *points) +void wxGCDC::DoDrawSpline(const wxPointList *points) { wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawSpline - invalid DC") ); @@ -555,18 +595,18 @@ void wxGCDC::DoDrawSpline(wxList *points) wxGraphicsPath path = m_graphicContext->CreatePath(); - wxList::compatibility_iterator node = points->GetFirst(); - if (node == wxList::compatibility_iterator()) + wxPointList::compatibility_iterator node = points->GetFirst(); + if (node == wxPointList::compatibility_iterator()) // empty list return; - wxPoint *p = (wxPoint *)node->GetData(); + wxPoint *p = node->GetData(); wxCoord x1 = p->x; wxCoord y1 = p->y; node = node->GetNext(); - p = (wxPoint *)node->GetData(); + p = node->GetData(); wxCoord x2 = p->x; wxCoord y2 = p->y; @@ -584,7 +624,7 @@ void wxGCDC::DoDrawSpline(wxList *points) #endif // !wxUSE_STL { - p = (wxPoint *)node->GetData(); + p = node->GetData(); x1 = x2; y1 = y2; x2 = p->x; @@ -698,6 +738,13 @@ void wxGCDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, if (w == 0 || h == 0) return; + if ( m_graphicContext->ShouldOffset() ) + { + // if we are offsetting the entire rectangle is moved 0.5, so the + // border line gets off by 1 + w -= 1; + h -= 1; + } m_graphicContext->DrawRoundedRectangle( x,y,w,h,radius); } @@ -708,6 +755,13 @@ void wxGCDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h) if ( !m_logicalFunctionSupported ) return; + if ( m_graphicContext->ShouldOffset() ) + { + // if we are offsetting the entire rectangle is moved 0.5, so the + // border line gets off by 1 + w -= 1; + h -= 1; + } m_graphicContext->DrawEllipse(x,y,w,h); } @@ -718,15 +772,27 @@ bool wxGCDC::CanDrawBitmap() const bool wxGCDC::DoBlit( wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, - wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool WXUNUSED(useMask), + wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask, wxCoord xsrcMask, wxCoord ysrcMask ) { - wxCHECK_MSG( Ok(), false, wxT("wxGCDC(cg)::DoBlit - invalid DC") ); - wxCHECK_MSG( source->Ok(), false, wxT("wxGCDC(cg)::DoBlit - invalid source DC") ); + return DoStretchBlit( xdest, ydest, width, height, + source, xsrc, ysrc, width, height, logical_func, useMask, + xsrcMask,ysrcMask ); +} + +bool wxGCDC::DoStretchBlit( + wxCoord xdest, wxCoord ydest, wxCoord dstWidth, wxCoord dstHeight, + wxDC *source, wxCoord xsrc, wxCoord ysrc, wxCoord srcWidth, wxCoord srcHeight, + int logical_func , bool WXUNUSED(useMask), + wxCoord xsrcMask, wxCoord ysrcMask ) +{ + wxCHECK_MSG( Ok(), false, wxT("wxGCDC(cg)::DoStretchBlit - invalid DC") ); + wxCHECK_MSG( source->Ok(), false, wxT("wxGCDC(cg)::DoStretchBlit - invalid source DC") ); 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; @@ -740,8 +806,8 @@ bool wxGCDC::DoBlit( wxRect subrect(source->LogicalToDeviceX(xsrc), source->LogicalToDeviceY(ysrc), - source->LogicalToDeviceXRel(width), - source->LogicalToDeviceYRel(height)); + source->LogicalToDeviceXRel(srcWidth), + source->LogicalToDeviceYRel(srcHeight)); // if needed clip the subrect down to the size of the source DC wxCoord sw, sh; @@ -758,8 +824,7 @@ bool wxGCDC::DoBlit( if ( blit.Ok() ) { m_graphicContext->DrawBitmap( blit, xdest, ydest, - wxMin(width, blit.GetWidth()), - wxMin(height, blit.GetHeight())); + dstWidth, dstHeight); } else { @@ -767,6 +832,9 @@ bool wxGCDC::DoBlit( return false; } + // reset logical function + m_graphicContext->SetLogicalFunction( m_logicalFunction ); + return true; } @@ -811,7 +879,7 @@ bool wxGCDC::CanGetTextExtent() const void wxGCDC::DoGetTextExtent( const wxString &str, wxCoord *width, wxCoord *height, wxCoord *descent, wxCoord *externalLeading , - wxFont *theFont ) const + const wxFont *theFont ) const { wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoGetTextExtent - invalid DC") ); @@ -825,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 ) { @@ -886,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,