]> git.saurik.com Git - wxWidgets.git/commitdiff
forward port from 2.8
authorStefan Csomor <csomor@advancedconcepts.ch>
Fri, 9 Nov 2007 20:39:58 +0000 (20:39 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Fri, 9 Nov 2007 20:39:58 +0000 (20:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49786 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/dcgraph.cpp
src/common/graphcmn.cpp

index 24801af63c298b884b5f809daa8d19b07b877b70..54ecf302cbe44925d89ae0e992646e09af19fdc6 100644 (file)
@@ -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 &region )
 
     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,
index 4095bb95a9046faeb9e56fc1ee67e3eedafc98d5..0560f39bf0ae489786696de409e816ad74040968 100644 (file)
@@ -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)