]> git.saurik.com Git - wxWidgets.git/commitdiff
adding raster op hook to graphics context (10.4 only, partial XOR/INVERT support)
authorStefan Csomor <csomor@advancedconcepts.ch>
Sun, 3 Dec 2006 15:30:29 +0000 (15:30 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sun, 3 Dec 2006 15:30:29 +0000 (15:30 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@43764 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mac/carbon/graphics.cpp

index b382c4b81b8da881bdc271ecd9ec031d320af8f8..7bc04419a16b364eadc0f64e3ff1e9fe73d5f6bf 100755 (executable)
 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
 typedef float CGFloat;
 #endif
 #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
 typedef float CGFloat;
 #endif
+#ifndef wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+    #define wxMAC_USE_CORE_GRAPHICS_BLEND_MODES 1
+#else
+    #define wxMAC_USE_CORE_GRAPHICS_BLEND_MODES 0
+#endif
+#endif
 
 //-----------------------------------------------------------------------------
 // constants
 
 //-----------------------------------------------------------------------------
 // constants
@@ -161,7 +168,7 @@ public :
     void StrokeLineSegments( CGContextRef ctxRef , const CGPoint pts[] , size_t count )
     {
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
     void StrokeLineSegments( CGContextRef ctxRef , const CGPoint pts[] , size_t count )
     {
 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
-        if ( UMAGetSystemVersion() >= 0x1040 )
+        if ( CGContextStrokeLineSegments!=NULL  )
         {
             CGContextStrokeLineSegments( ctxRef , pts , count );
         }
         {
             CGContextStrokeLineSegments( ctxRef , pts , count );
         }
@@ -457,7 +464,12 @@ void wxMacCoreGraphicsPenData::Apply( wxGraphicsContext* context )
     }
     else
     {
     }
     else
     {
-        CGContextSetStrokeColorWithColor( cg , m_color );
+        if ( context->GetLogicalFunction() == wxINVERT || context->GetLogicalFunction() == wxXOR )
+        {
+            CGContextSetRGBStrokeColor( cg , 1.0, 1.0 , 1.0, 1.0 );
+        }
+        else
+            CGContextSetStrokeColorWithColor( cg , m_color );
     }
 }
 
     }
 }
 
@@ -1133,6 +1145,7 @@ public:
 
     virtual void * GetNativeContext();
 
 
     virtual void * GetNativeContext();
 
+    bool SetLogicalFunction( int function );
     //
     // transformation
     //
     //
     // transformation
     //
@@ -1310,6 +1323,41 @@ void wxMacCoreGraphicsContext::EnsureIsValid()
        }
 }
 
        }
 }
 
+bool wxMacCoreGraphicsContext::SetLogicalFunction( int function )
+{
+    if (m_logicalFunction == function)
+        return true;
+
+    EnsureIsValid();
+    
+    bool retval = false;
+
+    if ( function == wxCOPY )
+    {
+        retval = true;
+#if wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
+        if ( CGContextSetBlendMode != NULL )
+        {
+            CGContextSetBlendMode( m_cgContext, kCGBlendModeNormal );
+        }
+#endif
+    }
+    else if ( function == wxINVERT || function == wxXOR )
+    {
+#if wxMAC_USE_CORE_GRAPHICS_BLEND_MODES
+        if ( CGContextSetBlendMode != NULL )
+        {
+            // change color to white
+            CGContextSetBlendMode( m_cgContext, kCGBlendModeExclusion );
+            retval = true;
+        }
+#endif
+    }
+    
+    if (retval)
+        m_logicalFunction = function;
+    return retval ;
+}
 
 void wxMacCoreGraphicsContext::Clip( const wxRegion &region )
 {
 
 void wxMacCoreGraphicsContext::Clip( const wxRegion &region )
 {