]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/graphics.cpp
added a dummy return to GetItemState() to suppress gcc warning (but shouldn't we...
[wxWidgets.git] / src / mac / carbon / graphics.cpp
index 0686ba7ebf2cf78e860b069f35597d12634b23c7..8915a925fc214889109146da311ab24ca09a942d 100755 (executable)
 #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
@@ -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
-        if ( UMAGetSystemVersion() >= 0x1040 )
+        if ( CGContextStrokeLineSegments!=NULL  )
         {
             CGContextStrokeLineSegments( ctxRef , pts , count );
         }
@@ -457,7 +464,12 @@ void wxMacCoreGraphicsPenData::Apply( wxGraphicsContext* context )
     }
     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 );
     }
 }
 
@@ -525,9 +537,32 @@ wxMacCoreGraphicsBrushData::wxMacCoreGraphicsBrushData(wxGraphicsRenderer* rende
 
     if ( brush.GetStyle() == wxSOLID )
     {
-        float components[4] = { brush.GetColour().Red() / 255.0 , brush.GetColour().Green() / 255.0 ,
+        if ( brush.MacGetBrushKind() == kwxMacBrushTheme )
+        {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
+            if ( HIThemeBrushCreateCGColor != 0 )
+            {
+                CGColorRef color ;
+                HIThemeBrushCreateCGColor( brush.MacGetTheme(), &color );
+                m_color.Set( color ) ;
+            }
+            else
+#endif
+            {
+                // as close as we can get, unfortunately < 10.4 things get difficult
+                RGBColor color;
+                GetThemeBrushAsColor( brush.MacGetTheme(), 32, true, &color );
+                float components[4] = {  (CGFloat) color.red / 65536,
+                    (CGFloat) color.green / 65536, (CGFloat) color.blue / 65536, 1 } ;
+                m_color.Set( CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ) ;
+            }
+        }
+        else
+        {
+            float components[4] = { brush.GetColour().Red() / 255.0 , brush.GetColour().Green() / 255.0 ,
                 brush.GetColour().Blue() / 255.0 , brush.GetColour().Alpha() / 255.0 } ;
-        m_color.Set( CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ) ;
+            m_color.Set( CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ) ;
+        }
     }
     else if ( brush.IsHatch() )
     {
@@ -1110,6 +1145,7 @@ public:
 
     virtual void * GetNativeContext();
 
+    bool SetLogicalFunction( int function );
     //
     // transformation
     //
@@ -1145,7 +1181,7 @@ public:
     virtual void DrawPath( const wxGraphicsPath &path, int fillStyle = wxODDEVEN_RULE );
 
     virtual bool ShouldOffset() const
-    {
+    {     
         int penwidth = 0 ;
         if ( !m_pen.IsNull() )
         {
@@ -1287,6 +1323,43 @@ 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 );
+            CGContextSetShouldAntialias( m_cgContext, true );
+        }
+#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 );
+            CGContextSetShouldAntialias( m_cgContext, false );
+            retval = true;
+        }
+#endif
+    }
+    
+    if (retval)
+        m_logicalFunction = function;
+    return retval ;
+}
 
 void wxMacCoreGraphicsContext::Clip( const wxRegion &region )
 {