]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/graphics.cpp
I still think that's needed ...
[wxWidgets.git] / src / mac / carbon / graphics.cpp
index 48cd16a9cf42cbd797ba908539d3e5e745864a3c..616c5d4a54f8409063b15e2fa22808b89ef4f2fe 100644 (file)
@@ -12,6 +12,7 @@
 #include "wx/wxprec.h"
 
 #include "wx/graphics.h"
+#include "wx/private/graphics.h"
 
 #ifndef WX_PRECOMP
     #include "wx/dcclient.h"
@@ -264,8 +265,8 @@ public:
 
 protected :
     CGLineCap m_cap;
-    wxMacCFRefHolder<CGColorRef> m_color;
-    wxMacCFRefHolder<CGColorSpaceRef> m_colorSpace;
+    wxCFRef<CGColorRef> m_color;
+    wxCFRef<CGColorSpaceRef> m_colorSpace;
 
     CGLineJoin m_join;
     CGFloat m_width;
@@ -276,7 +277,7 @@ protected :
 
 
     bool m_isPattern;
-    wxMacCFRefHolder<CGPatternRef> m_pattern;
+    wxCFRef<CGPatternRef> m_pattern;
     CGFloat* m_patternColorComponents;
 };
 
@@ -285,9 +286,7 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer
 {
     Init();
 
-    CGFloat components[4] = { pen.GetColour().Red() / 255.0 , pen.GetColour().Green() / 255.0 ,
-            pen.GetColour().Blue() / 255.0 , pen.GetColour().Alpha() / 255.0 } ;
-    m_color.Set( CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ) ;
+    m_color.reset( pen.GetColour().CreateCGColor() ) ;
 
     // TODO: * m_dc->m_scaleX
     m_width = pen.GetWidth();
@@ -390,8 +389,8 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer
                 wxBitmap* bmp = pen.GetStipple();
                 if ( bmp && bmp->Ok() )
                 {
-                    m_colorSpace.Set( CGColorSpaceCreatePattern( NULL ) );
-                    m_pattern.Set( *( new ImagePattern( bmp , CGAffineTransformMakeScale( 1,-1 ) ) ) );
+                    m_colorSpace.reset( CGColorSpaceCreatePattern( NULL ) );
+                    m_pattern.reset( (CGPatternRef) *( new ImagePattern( bmp , CGAffineTransformMakeScale( 1,-1 ) ) ) );
                     m_patternColorComponents = new CGFloat[1] ;
                     m_patternColorComponents[0] = 1.0;
                     m_isPattern = true;
@@ -402,8 +401,8 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer
         default :
             {
                 m_isPattern = true;
-                m_colorSpace.Set( CGColorSpaceCreatePattern( wxMacGetGenericRGBColorSpace() ) );
-                m_pattern.Set( *( new HatchPattern( pen.GetStyle() , CGAffineTransformMakeScale( 1,-1 ) ) ) );
+                m_colorSpace.reset( CGColorSpaceCreatePattern( wxMacGetGenericRGBColorSpace() ) );
+                m_pattern.reset( (CGPatternRef) *( new HatchPattern( pen.GetStyle() , CGAffineTransformMakeScale( 1,-1 ) ) ) );
                 m_patternColorComponents = new CGFloat[4] ;
                 m_patternColorComponents[0] = pen.GetColour().Red() / 255.0;
                 m_patternColorComponents[1] = pen.GetColour().Green() / 255.0;
@@ -492,11 +491,11 @@ class wxMacCoreGraphicsColour
         void Apply( CGContextRef cgContext );
     protected:
         void Init();
-        wxMacCFRefHolder<CGColorRef> m_color;
-        wxMacCFRefHolder<CGColorSpaceRef> m_colorSpace;
+        wxCFRef<CGColorRef> m_color;
+        wxCFRef<CGColorSpaceRef> m_colorSpace;
         
         bool m_isPattern;
-        wxMacCFRefHolder<CGPatternRef> m_pattern;
+        wxCFRef<CGPatternRef> m_pattern;
         CGFloat* m_patternColorComponents;
 } ;
 
@@ -536,13 +535,13 @@ wxMacCoreGraphicsColour::wxMacCoreGraphicsColour( const wxBrush &brush )
     Init();
     if ( brush.GetStyle() == wxSOLID )
     {
-        m_color.Set( brush.GetColour().CreateCGColor() );
+        m_color.reset( brush.GetColour().CreateCGColor() );
     }
     else if ( brush.IsHatch() )
     {
         m_isPattern = true;
-        m_colorSpace.Set( CGColorSpaceCreatePattern( wxMacGetGenericRGBColorSpace() ) );
-        m_pattern.Set( *( new HatchPattern( brush.GetStyle() , CGAffineTransformMakeScale( 1,-1 ) ) ) );
+        m_colorSpace.reset( CGColorSpaceCreatePattern( wxMacGetGenericRGBColorSpace() ) );
+        m_pattern.reset( (CGPatternRef) *( new HatchPattern( brush.GetStyle() , CGAffineTransformMakeScale( 1,-1 ) ) ) );
 
         m_patternColorComponents = new CGFloat[4] ;
         m_patternColorComponents[0] = brush.GetColour().Red() / 255.0;
@@ -559,8 +558,8 @@ wxMacCoreGraphicsColour::wxMacCoreGraphicsColour( const wxBrush &brush )
             m_isPattern = true;
             m_patternColorComponents = new CGFloat[1] ;
             m_patternColorComponents[0] = 1.0;
-            m_colorSpace.Set( CGColorSpaceCreatePattern( NULL ) );
-            m_pattern.Set( *( new ImagePattern( bmp , CGAffineTransformMakeScale( 1,-1 ) ) ) );
+            m_colorSpace.reset( CGColorSpaceCreatePattern( NULL ) );
+            m_pattern.reset( (CGPatternRef) *( new ImagePattern( bmp , CGAffineTransformMakeScale( 1,-1 ) ) ) );
         }
     }
 }
@@ -1273,7 +1272,7 @@ private:
     wxDouble m_width;
     wxDouble m_height;
 
-    wxMacCFRefHolder<HIShapeRef> m_clipRgn;
+    wxCFRef<HIShapeRef> m_clipRgn;
 };
 
 //-----------------------------------------------------------------------------
@@ -1323,7 +1322,7 @@ void wxMacCoreGraphicsContext::Init()
     m_height = 0;
 
     HIRect r = CGRectMake(0,0,0,0);
-    m_clipRgn.Set(HIShapeCreateWithRect(&r));
+    m_clipRgn.reset(HIShapeCreateWithRect(&r));
 }
 
 wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext, wxDouble width, wxDouble height ) : wxGraphicsContext(renderer)
@@ -1422,8 +1421,7 @@ void wxMacCoreGraphicsContext::EnsureIsValid()
                if ( !HIShapeIsEmpty(m_clipRgn) )
                {
             // the clip region is in device coordinates, so we convert this again to user coordinates
-            wxMacCFRefHolder<HIMutableShapeRef> hishape ;
-            hishape.Set( HIShapeCreateMutableCopy( m_clipRgn ) );
+            wxCFRef<HIMutableShapeRef> hishape( HIShapeCreateMutableCopy( m_clipRgn ) );
             CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero,m_windowTransform);
             HIShapeOffset( hishape, -transformedOrigin.x, -transformedOrigin.y );
                        HIShapeReplacePathInCGContext( hishape, m_cgContext );
@@ -1443,22 +1441,53 @@ bool wxMacCoreGraphicsContext::SetLogicalFunction( int function )
     EnsureIsValid();
     
     bool retval = false;
-
-    if ( function == wxCOPY )
+    bool shouldAntiAlias = true;
+    CGBlendMode mode = kCGBlendModeNormal;
+    
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+    if ( UMAGetSystemVersion() >= 0x1050 )
     {
         retval = true;
-        CGContextSetBlendMode( m_cgContext, kCGBlendModeNormal );
+        switch ( function )
+        {
+            // TODO find best corresponding porter duff modes
+            case wxCOPY :
+                mode = kCGBlendModeCopy;
+                break;
+            case wxCLEAR :
+                mode = kCGBlendModeClear;
+                break;
+            case wxXOR :
+                mode = kCGBlendModeXOR;
+                shouldAntiAlias = false;
+                break;  
+            default :
+                retval = false;
+                break;
+        }
     }
-    else if ( function == wxINVERT || function == wxXOR )
+    else
+#endif
     {
-        // change color to white
-        CGContextSetBlendMode( m_cgContext, kCGBlendModeExclusion );
-        CGContextSetShouldAntialias( m_cgContext, false );
-        retval = true;
+        if ( function == wxCOPY )
+        {
+            retval = true;
+        }
+        else if ( function == wxINVERT || function == wxXOR )
+        {
+            // change color to white
+            mode = kCGBlendModeExclusion;
+            shouldAntiAlias = false;
+            retval = true;
+        }
     }
     
     if (retval)
+    {
         m_logicalFunction = function;
+        CGContextSetBlendMode( m_cgContext, mode );
+        CGContextSetShouldAntialias(m_cgContext, shouldAntiAlias);
+    }
     return retval ;
 }
 
@@ -1477,7 +1506,7 @@ void wxMacCoreGraphicsContext::Clip( const wxRegion &region )
         
         CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero, m_windowTransform );
         HIShapeOffset( mutableShape, transformedOrigin.x, transformedOrigin.y );
-        m_clipRgn.Set(mutableShape);
+        m_clipRgn.reset(mutableShape);
     }
 }
 
@@ -1494,7 +1523,7 @@ void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDoubl
         // the clipping itself must be stored as device coordinates, otherwise 
         // we cannot apply it back correctly
         r.origin= CGPointApplyAffineTransform( r.origin, m_windowTransform );
-        m_clipRgn.Set(HIShapeCreateWithRect(&r));
+        m_clipRgn.reset(HIShapeCreateWithRect(&r));
     }
 }
 
@@ -1516,7 +1545,7 @@ void wxMacCoreGraphicsContext::ResetClip()
     else
     {
         HIRect r = CGRectMake(0,0,0,0);
-        m_clipRgn.Set(HIShapeCreateWithRect(&r));
+        m_clipRgn.reset(HIShapeCreateWithRect(&r));
     }
 }
 
@@ -1745,12 +1774,12 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub
     if ( UMAGetSystemVersion() >= 0x1050 )
     {
         wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
-        wxMacCFStringHolder text(str, wxLocale::GetSystemEncoding() );
+        wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
         CTFontRef font = fref->GetCTFont();
         CGColorRef col = fref->GetColour().GetPixel();
         CTUnderlineStyle ustyle = fref->GetUnderlined() ? kCTUnderlineStyleSingle : kCTUnderlineStyleNone ;
         wxCFRef<CFNumberRef> underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) ); 
-        CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName };
+         CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName };
         CFTypeRef values[] = { font, col, underlined };
         wxCFRef<CFDictionaryRef> attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, 
                                                         WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) );
@@ -1797,34 +1826,11 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub
     {
         OSStatus status = noErr;
         ATSUTextLayout atsuLayout;
-        UniCharCount chars = str.length();
-        UniChar* ubuf = NULL;
-        
-#if SIZEOF_WCHAR_T == 4
-        wxMBConvUTF16 converter;
-#if wxUSE_UNICODE
-        size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 );
-#else
-        const wxWCharBuffer wchar = str.wc_str( wxConvLocal );
-        size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 );
-#endif
-        chars = unicharlen / 2;
-#else
-#if wxUSE_UNICODE
-        ubuf = (UniChar*) str.wc_str();
-#else
-        wxWCharBuffer wchar = str.wc_str( wxConvLocal );
-        chars = wxWcslen( wchar.data() );
-        ubuf = (UniChar*) wchar.data();
-#endif
-#endif
-        
+        wxMacUniCharBuffer unibuf( str );
+        UniCharCount chars = unibuf.GetChars();
+
         ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle());
-        status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 ,
+        status = ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 ,
                                                    &chars , &style , &atsuLayout );
         
         wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the rotated text") );
@@ -1897,9 +1903,6 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub
         
         ::ATSUDisposeTextLayout(atsuLayout);
         
-#if SIZEOF_WCHAR_T == 4
-        free( ubuf );
-#endif
         return;
     }
 #endif
@@ -1932,7 +1935,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
         wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
         CTFontRef font = fref->GetCTFont();
 
-        wxMacCFStringHolder text(str, wxLocale::GetSystemEncoding() );
+        wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
         CFStringRef keys[] = { kCTFontAttributeName  };
         CFTypeRef values[] = { font };
         wxCFRef<CFDictionaryRef> attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, 
@@ -1960,34 +1963,11 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
         OSStatus status = noErr;
         
         ATSUTextLayout atsuLayout;
-        UniCharCount chars = str.length();
-        UniChar* ubuf = NULL;
-        
-#if SIZEOF_WCHAR_T == 4
-        wxMBConvUTF16 converter;
-#if wxUSE_UNICODE
-        size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 );
-#else
-        const wxWCharBuffer wchar = str.wc_str( wxConvLocal );
-        size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 );
-#endif
-        chars = unicharlen / 2;
-#else
-#if wxUSE_UNICODE
-        ubuf = (UniChar*) str.wc_str();
-#else
-        wxWCharBuffer wchar = str.wc_str( wxConvLocal );
-        chars = wxWcslen( wchar.data() );
-        ubuf = (UniChar*) wchar.data();
-#endif
-#endif
+        wxMacUniCharBuffer unibuf( str );
+        UniCharCount chars = unibuf.GetChars();
         
         ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle());
-        status = ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 ,
+        status = ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 ,
                                                    &chars , &style , &atsuLayout );
         
         wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the text") );
@@ -2008,9 +1988,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
             *width = FixedToInt(textAfter - textBefore);
         
         ::ATSUDisposeTextLayout(atsuLayout);
-#if SIZEOF_WCHAR_T == 4
-        free( ubuf ) ;
-#endif
+
         return;
     }
 #endif
@@ -2032,7 +2010,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr
         wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
         CTFontRef font = fref->GetCTFont();
         
-        wxMacCFStringHolder t(text, wxLocale::GetSystemEncoding() );
+        wxCFStringRef t(text, wxLocale::GetSystemEncoding() );
         CFStringRef keys[] = { kCTFontAttributeName  };
         CFTypeRef values[] = { font };
         wxCFRef<CFDictionaryRef> attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, 
@@ -2052,34 +2030,11 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr
 #if wxMAC_USE_ATSU_TEXT
     {
         ATSUTextLayout atsuLayout;
-        UniCharCount chars = text.length();
-        UniChar* ubuf = NULL;
-        
-#if SIZEOF_WCHAR_T == 4
-        wxMBConvUTF16 converter;
-#if wxUSE_UNICODE
-        size_t unicharlen = converter.WC2MB( NULL , text.wc_str() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , text.wc_str(), unicharlen + 2 );
-#else
-        const wxWCharBuffer wchar = text.wc_str( wxConvLocal );
-        size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 );
-        ubuf = (UniChar*) malloc( unicharlen + 2 );
-        converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 );
-#endif
-        chars = unicharlen / 2;
-#else
-#if wxUSE_UNICODE
-        ubuf = (UniChar*) text.wc_str();
-#else
-        wxWCharBuffer wchar = text.wc_str( wxConvLocal );
-        chars = wxWcslen( wchar.data() );
-        ubuf = (UniChar*) wchar.data();
-#endif
-#endif
+        wxMacUniCharBuffer unibuf( text );
+        UniCharCount chars = unibuf.GetChars();
         
         ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle());
-        ::ATSUCreateTextLayoutWithTextPtr( (UniCharArrayPtr) ubuf , 0 , chars , chars , 1 ,
+        ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 0 , chars , chars , 1 ,
                                           &chars , &style , &atsuLayout );
         
         for ( int pos = 0; pos < (int)chars; pos ++ )
@@ -2099,9 +2054,6 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr
         }
         
         ::ATSUDisposeTextLayout(atsuLayout);
-#if SIZEOF_WCHAR_T == 4
-        free( ubuf ) ;
-#endif
     }
 #endif
 #if wxMAC_USE_CG_TEXT