#include "wx/region.h"
 #endif
 
+#ifdef __WXMAC__
+#include "wx/mac/private.h"
+#endif
 //-----------------------------------------------------------------------------
 // constants
 //-----------------------------------------------------------------------------
     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") );
 
     if (region.Empty())
     {
-        DestroyClippingRegion();
+        //DestroyClippingRegion();
         return;
     }
 
     // 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 );
     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;
 
     // 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();
 }
 
 
     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;
         return false;
     }
 
+    // reset logical function
+    m_graphicContext->SetLogicalFunction( m_logicalFunction );
+
     return true;
 }
 
     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 )
     {
 
 void wxGCDC::DoGetSize(int *width, int *height) const
 {
-    *width = 1000;
-    *height = 1000;
+    *width = 10000;
+    *height = 10000;
 }
 
 void wxGCDC::DoGradientFillLinear(const wxRect& rect,
 
 {
 }
 
+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 ) 
 {
 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 );
 
     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;
     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 );
     FillPath( path );
     DrawText( str, x ,y, angle);
     SetBrush( formerBrush );
+       SetPen( formerPen );
 }
 
 void wxGraphicsContext::StrokeLine( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2)