#include "wx/wxprec.h"
#include "wx/graphics.h"
+#include "wx/private/graphics.h"
#ifndef WX_PRECOMP
#include "wx/dcclient.h"
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;
bool m_isPattern;
- wxMacCFRefHolder<CGPatternRef> m_pattern;
+ wxCFRef<CGPatternRef> m_pattern;
CGFloat* m_patternColorComponents;
};
{
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();
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;
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;
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;
} ;
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;
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 ) ) ) );
}
}
}
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();
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 );
wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") );
#endif
-#if WXMAC_USE_CG_TEXT
+#if wxMAC_USE_CG_TEXT
#endif
}
m_macATSUIStyle = NULL;
}
#endif
-#if WXMAC_USE_CG_TEXT
+#if wxMAC_USE_CG_TEXT
#endif
}
wxDouble m_width;
wxDouble m_height;
- wxMacCFRefHolder<HIShapeRef> m_clipRgn;
+ wxCFRef<HIShapeRef> m_clipRgn;
};
//-----------------------------------------------------------------------------
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)
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 );
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 ;
}
CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero, m_windowTransform );
HIShapeOffset( mutableShape, transformedOrigin.x, transformedOrigin.y );
- m_clipRgn.Set(mutableShape);
+ m_clipRgn.reset(mutableShape);
}
}
// 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));
}
}
else
{
HIRect r = CGRectMake(0,0,0,0);
- m_clipRgn.Set(HIShapeCreateWithRect(&r));
+ m_clipRgn.reset(HIShapeCreateWithRect(&r));
}
}
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) );
return;
}
#endif
-#if WXMAC_USE_CG_TEXT
+#if wxMAC_USE_CG_TEXT
// TODO core graphics text implementation here
#endif
}
{
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") );
::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
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,
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") );
*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
}
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,
#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 ++ )
}
::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
}
// Context
virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc);
+ virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc);
virtual wxGraphicsContext * CreateContextFromNativeContext( void * context );
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 )