]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/dcgraph.cpp
size_t's --> int's
[wxWidgets.git] / src / common / dcgraph.cpp
index 94f164466569e9b616b83389665d84029a5e4b22..613c6a1bcf458d8f166d3535476bbd494787963f 100644 (file)
     #include "wx/region.h"
 #endif
 
-#ifndef wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
-    #define wxMAC_USE_CORE_GRAPHICS_BLEND_MODES 0
-#endif
-
 //-----------------------------------------------------------------------------
 // constants
 //-----------------------------------------------------------------------------
@@ -83,6 +79,14 @@ wxGCDC::wxGCDC(const wxWindowDC& dc)
     SetGraphicsContext( wxGraphicsContext::Create(dc) );
 }
 
+#ifdef __WXMSW__
+wxGCDC::wxGCDC(const wxMemoryDC& dc)
+{
+    Init();
+    SetGraphicsContext( wxGraphicsContext::Create(dc) );
+}
+#endif    
+
 void wxGCDC::Init()
 {
     m_ok = false;
@@ -95,6 +99,7 @@ void wxGCDC::Init()
     m_brush = *wxWHITE_BRUSH;
 
     m_graphicContext = NULL;
+    m_logicalFunctionSupported = true;
 }
 
 
@@ -370,7 +375,7 @@ void wxGCDC::SetBrush( const wxBrush &brush )
         m_graphicContext->SetBrush( m_brush );
     }
 }
-
 void wxGCDC::SetBackground( const wxBrush &brush )
 {
     if (m_backgroundBrush == brush)
@@ -387,17 +392,10 @@ void wxGCDC::SetLogicalFunction( int function )
         return;
 
     m_logicalFunction = function;
-#if wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
-
-    CGContextRef cgContext = ((wxCairoContext*)(m_graphicContext))->GetNativeContext();
-    if ( m_logicalFunction == wxCOPY )
-        CGContextSetBlendMode( cgContext, kCGBlendModeNormal );
-    else if ( m_logicalFunction == wxINVERT )
-        CGContextSetBlendMode( cgContext, kCGBlendModeExclusion );
+    if ( m_graphicContext->SetLogicalFunction( function ) )
+        m_logicalFunctionSupported=true;
     else
-        CGContextSetBlendMode( cgContext, kCGBlendModeNormal );
-#endif
-
+        m_logicalFunctionSupported=false;
 }
 
 bool wxGCDC::DoFloodFill(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y),
@@ -416,11 +414,8 @@ void wxGCDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawLine - invalid DC") );
 
-#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
-
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
-#endif
 
     m_graphicContext->StrokeLine(x1,y1,x2,y2);
 
@@ -432,7 +427,7 @@ void wxGCDC::DoCrossHair( wxCoord x, wxCoord y )
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoCrossHair - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     int w = 0, h = 0;
@@ -452,7 +447,7 @@ void wxGCDC::DoDrawArc( wxCoord x1, wxCoord y1,
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawArc - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     double dx = x1 - xc;
@@ -497,7 +492,7 @@ void wxGCDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawEllipticArc - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     bool fill = m_brush.GetStyle() != wxTRANSPARENT;
@@ -530,11 +525,8 @@ void wxGCDC::DoDrawLines(int n, wxPoint points[],
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawLines - invalid DC") );
 
-#if !wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
-
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
-#endif
 
     wxPoint2DDouble* pointsD = new wxPoint2DDouble[n];
     for( int i = 0; i < n; ++i)
@@ -552,7 +544,7 @@ void wxGCDC::DoDrawSpline(wxList *points)
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawSpline - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     wxGraphicsPath path = m_graphicContext->CreatePath();
@@ -614,7 +606,7 @@ void wxGCDC::DoDrawPolygon( int n, wxPoint points[],
 
     if ( n <= 0 || (m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT ) )
         return;
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     bool closeIt = false;
@@ -667,7 +659,7 @@ void wxGCDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRectangle - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     // CMB: draw nothing if transformed w or h is 0
@@ -690,7 +682,7 @@ void wxGCDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawRoundedRectangle - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     if (radius < 0.0)
@@ -707,7 +699,7 @@ void wxGCDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
 {
     wxCHECK_RET( Ok(), wxT("wxGCDC(cg)::DoDrawEllipse - invalid DC") );
 
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     m_graphicContext->DrawEllipse(x,y,w,h);
@@ -740,14 +732,28 @@ bool wxGCDC::DoBlit(
         ysrcMask = ysrc;
     }
 
-    wxRect subrect(source-> LogicalToDeviceX(xsrc),source-> LogicalToDeviceY(ysrc),
-        source-> LogicalToDeviceXRel(width),source-> LogicalToDeviceYRel(height));
+    wxRect subrect(source->LogicalToDeviceX(xsrc),
+                   source->LogicalToDeviceY(ysrc),
+                   source->LogicalToDeviceXRel(width),
+                   source->LogicalToDeviceYRel(height));
+
+    // if needed clip the subrect down to the size of the source DC
+    wxCoord sw, sh;
+    source->GetSize(&sw, &sh);
+    sw = source->LogicalToDeviceXRel(sw);
+    sh = source->LogicalToDeviceYRel(sh);
+    if (subrect.x + subrect.width > sw)
+        subrect.width = sw - subrect.x;
+    if (subrect.y + subrect.height > sh)
+        subrect.height = sh - subrect.y;
 
     wxBitmap blit = source->GetAsBitmap( &subrect );
 
     if ( blit.Ok() )
     {
-        m_graphicContext->DrawBitmap( blit, xdest , ydest , width , height );
+        m_graphicContext->DrawBitmap( blit, xdest, ydest,
+                                      wxMin(width, blit.GetWidth()),
+                                      wxMin(height, blit.GetHeight()));
     }
     else
     {
@@ -765,7 +771,7 @@ void wxGCDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
 
     if ( str.length() == 0 )
         return;
-    if ( m_logicalFunction != wxCOPY )
+    if ( !m_logicalFunctionSupported )
         return;
 
     if ( m_backgroundMode == wxTRANSPARENT )
@@ -780,7 +786,8 @@ void wxGCDC::DoDrawText(const wxString& str, wxCoord x, wxCoord y)
 
     if ( str.length() == 0 )
         return;
-    if ( m_logicalFunction != wxCOPY )
+
+    if ( !m_logicalFunctionSupported )
         return;
 
     if ( m_backgroundMode == wxTRANSPARENT )