X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c07e1e2c855d4b8b9a138773c7ef7cd5c0b71418..4813bb8d72d4e6821e031f2b19baaa338b714d39:/src/mac/carbon/graphics.cpp?ds=inline diff --git a/src/mac/carbon/graphics.cpp b/src/mac/carbon/graphics.cpp index e4b9212d91..616c5d4a54 100644 --- a/src/mac/carbon/graphics.cpp +++ b/src/mac/carbon/graphics.cpp @@ -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 m_color; - wxMacCFRefHolder m_colorSpace; + wxCFRef m_color; + wxCFRef m_colorSpace; CGLineJoin m_join; CGFloat m_width; @@ -276,7 +277,7 @@ protected : bool m_isPattern; - wxMacCFRefHolder m_pattern; + wxCFRef 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 m_color; - wxMacCFRefHolder m_colorSpace; + wxCFRef m_color; + wxCFRef m_colorSpace; bool m_isPattern; - wxMacCFRefHolder m_pattern; + wxCFRef 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 ) ) ) ); } } } @@ -718,8 +717,6 @@ private : wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col) : wxGraphicsObjectRefData( renderer ) { - m_macATSUIStyle = NULL; - OSStatus status = noErr; m_colour = col; m_underlined = font.GetUnderlined(); @@ -727,6 +724,8 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere m_ctFont.reset( wxCFRetain((CTFontRef) font.MacGetCTFont()) ); #endif #if wxMAC_USE_ATSU_TEXT + OSStatus status = noErr; + m_macATSUIStyle = NULL; status = ATSUCreateAndCopyStyle( (ATSUStyle) font.MacGetATSUStyle() , &m_macATSUIStyle ); @@ -759,7 +758,7 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ); #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT #endif } @@ -774,7 +773,7 @@ wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData() m_macATSUIStyle = NULL; } #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT #endif } @@ -1273,7 +1272,7 @@ private: wxDouble m_width; wxDouble m_height; - wxMacCFRefHolder m_clipRgn; + wxCFRef 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 hishape ; - hishape.Set( HIShapeCreateMutableCopy( m_clipRgn ) ); + wxCFRef 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 ®ion ) 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 underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) ); - CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName }; + CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName }; CFTypeRef values[] = { font, col, underlined }; wxCFRef attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); @@ -1774,7 +1803,7 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub return; } #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT // TODO core graphics text implementation here #endif } @@ -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,13 +1903,10 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub ::ATSUDisposeTextLayout(atsuLayout); -#if SIZEOF_WCHAR_T == 4 - free( ubuf ); -#endif return; } #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT // default implementation takes care of rotation and calls non rotated DrawText afterwards wxGraphicsContext::DrawText( str, x, y, angle ); #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 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,13 +1988,11 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid *width = FixedToInt(textAfter - textBefore); ::ATSUDisposeTextLayout(atsuLayout); -#if SIZEOF_WCHAR_T == 4 - free( ubuf ) ; -#endif + return; } #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT // TODO core graphics text implementation here #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 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,12 +2054,9 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr } ::ATSUDisposeTextLayout(atsuLayout); -#if SIZEOF_WCHAR_T == 4 - free( ubuf ) ; -#endif } #endif -#if WXMAC_USE_CG_TEXT +#if wxMAC_USE_CG_TEXT // TODO core graphics text implementation here #endif } @@ -2166,6 +2118,7 @@ public : // Context virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc); + virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc); virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ); @@ -2218,18 +2171,26 @@ wxGraphicsRenderer* wxGraphicsRenderer::GetDefaultRenderer() return &gs_MacCoreGraphicsRenderer; } -wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxWindowDC& dc) +wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxWindowDC& dc ) { - wxMemoryDC* mdc = wxDynamicCast(&dc, wxMemoryDC); - if ( mdc ) - { - return new wxMacCoreGraphicsContext(this, - (CGContextRef)mdc->GetGraphicsContext()->GetNativeContext()); - } - else - { - return new wxMacCoreGraphicsContext(this,(CGContextRef)dc.GetWindow()->MacGetCGContextRef() ); - } + const wxDCImpl* impl = dc.GetImpl(); + wxWindowDCImpl *win_impl = wxDynamicCast( impl, wxWindowDCImpl ); + if (win_impl) + return new wxMacCoreGraphicsContext( this, + (CGContextRef)(win_impl->GetWindow()->MacGetCGContextRef()) ); + + return NULL; +} + +wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxMemoryDC& dc ) +{ + const wxDCImpl* impl = dc.GetImpl(); + wxMemoryDCImpl *mem_impl = wxDynamicCast( impl, wxMemoryDCImpl ); + if (mem_impl) + return new wxMacCoreGraphicsContext( this, + (CGContextRef)(mem_impl->GetGraphicsContext()->GetNativeContext()) ); + + return NULL; } wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeContext( void * context )