X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dbe4a80c57a77b249ef32117efe9fd923066f958..82c5e9ab462170405c8f08df7c5a38585abf78bd:/src/mac/carbon/graphics.cpp diff --git a/src/mac/carbon/graphics.cpp b/src/mac/carbon/graphics.cpp index 85795be8c3..0b6b699b4a 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" @@ -22,8 +23,6 @@ #include "wx/icon.h" #endif -#include "wx/mac/uma.h" - #ifdef __MSL__ #if __MSL__ >= 0x6000 #include "math.h" @@ -33,7 +32,38 @@ #endif #endif -#include "wx/mac/private.h" +#ifdef __WXMAC__ + #include "wx/mac/uma.h" +#else + #include "CoreServices/CoreServices.h" + #include "ApplicationServices/ApplicationServices.h" + #include "wx/mac/corefoundation/cfstring.h" + #include "wx/cocoa/dcclient.h" +#endif + +#ifdef __WXCOCOA__ + +CGColorSpaceRef wxMacGetGenericRGBColorSpace() +{ + static wxCFRef genericRGBColorSpace; + + if (genericRGBColorSpace == NULL) + { + genericRGBColorSpace.reset( CGColorSpaceCreateWithName( kCGColorSpaceGenericRGB ) ); + } + + return genericRGBColorSpace; +} + +int UMAGetSystemVersion() +{ + return 0x1050; +} + + +#define wxMAC_USE_CORE_TEXT 1 + +#endif //----------------------------------------------------------------------------- // constants @@ -56,10 +86,10 @@ static const double RAD2DEG = 180.0 / M_PI; OSStatus wxMacDrawCGImage( CGContextRef inContext, - const HIRect * inBounds, + const CGRect * inBounds, CGImageRef inImage) { -#ifdef __LP64__ +#if defined( __LP64__ ) || defined(__WXCOCOA__) // todo flip CGContextDrawImage(inContext, *inBounds, inImage ); return noErr; @@ -68,6 +98,40 @@ OSStatus wxMacDrawCGImage( #endif } +CGColorRef wxMacCreateCGColor( const wxColour& col ) +{ + CGColorRef retval = 0; +#ifdef __WXMAC__ + retval = col.CreateCGColor(); +#else +// TODO add conversion NSColor - CGColorRef (obj-c) +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 + if ( CGColorCreateGenericRGB ) + retval = CGColorCreateGenericRGB( col.Red() / 255.0 , col.Green() / 255.0, col.Blue() / 255.0, col.Alpha() / 255.0 ); + else +#endif + { + CGFloat components[4] = { col.Red() / 255.0, col.Green() / 255.0, col.Blue() / 255.0, col.Alpha() / 255.0 } ; + retval = CGColorCreate( wxMacGetGenericRGBColorSpace() , components ) ; + } + +#endif + return retval; +} + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && defined(wxMAC_USE_CORE_TEXT) + +CTFontRef wxMacCreateCTFont( const wxFont& font ) +{ +#ifdef __WXMAC__ + return wxCFRetain((CTFontRef) font.MacGetCTFont()); +#else + return CTFontCreateWithName( wxCFStringRef( font.GetFaceName(), wxLocale::GetSystemEncoding() ) , font.GetPointSize() , NULL ); +#endif +} + +#endif + // CGPattern wrapper class: always allocate on heap, never call destructor class wxMacCoreGraphicsPattern @@ -113,8 +177,9 @@ public : ImagePattern( const wxBitmap* bmp , const CGAffineTransform& transform ) { wxASSERT( bmp && bmp->Ok() ); - +#ifdef __WXMAC__ Init( (CGImageRef) bmp->CreateCGImage() , transform ); +#endif } // ImagePattern takes ownership of CGImageRef passed in @@ -264,8 +329,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 +341,7 @@ protected : bool m_isPattern; - wxMacCFRefHolder m_pattern; + wxCFRef m_pattern; CGFloat* m_patternColorComponents; }; @@ -285,9 +350,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( wxMacCreateCGColor( pen.GetColour() ) ) ; // TODO: * m_dc->m_scaleX m_width = pen.GetWidth(); @@ -390,8 +453,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 +465,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 +555,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 +599,13 @@ wxMacCoreGraphicsColour::wxMacCoreGraphicsColour( const wxBrush &brush ) Init(); if ( brush.GetStyle() == wxSOLID ) { - m_color.Set( brush.GetColour().CreateCGColor() ); + m_color.reset( wxMacCreateCGColor( brush.GetColour() )); } 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 +622,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 ) ) ) ); } } } @@ -722,7 +785,7 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere m_underlined = font.GetUnderlined(); #if wxMAC_USE_CORE_TEXT - m_ctFont.reset( wxCFRetain((CTFontRef) font.MacGetCTFont()) ); + m_ctFont.reset( wxMacCreateCTFont( font ) ); #endif #if wxMAC_USE_ATSU_TEXT OSStatus status = noErr; @@ -778,6 +841,27 @@ wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData() #endif } +class wxMacCoreGraphicsBitmapData : public wxGraphicsObjectRefData +{ +public: + wxMacCoreGraphicsBitmapData( wxGraphicsRenderer* renderer, CGImageRef bitmap ); + ~wxMacCoreGraphicsBitmapData(); + + virtual CGImageRef GetBitmap() { return m_bitmap; } +private : + CGImageRef m_bitmap; +}; + +wxMacCoreGraphicsBitmapData::wxMacCoreGraphicsBitmapData( wxGraphicsRenderer* renderer, CGImageRef bitmap ) : wxGraphicsObjectRefData( renderer ) +{ + m_bitmap = bitmap; +} + +wxMacCoreGraphicsBitmapData::~wxMacCoreGraphicsBitmapData() +{ + CGImageRelease( m_bitmap ); +} + // // Graphics Matrix // @@ -1256,6 +1340,8 @@ public: virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + virtual void DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); + virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); void SetNativeContext( CGContextRef cg ); @@ -1273,7 +1359,7 @@ private: wxDouble m_width; wxDouble m_height; - wxMacCFRefHolder m_clipRgn; + wxCFRef m_clipRgn; }; //----------------------------------------------------------------------------- @@ -1321,9 +1407,8 @@ void wxMacCoreGraphicsContext::Init() m_windowRef = NULL; m_width = 0; m_height = 0; - - HIRect r = CGRectMake(0,0,0,0); - m_clipRgn.Set(HIShapeCreateWithRect(&r)); + CGRect r = CGRectMake(0,0,0,0); + m_clipRgn.reset(HIShapeCreateWithRect(&r)); } wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext, wxDouble width, wxDouble height ) : wxGraphicsContext(renderer) @@ -1343,14 +1428,15 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window ): wxGraphicsContext(renderer) { Init(); - m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef(); + int originX , originY; originX = originY = 0; - window->MacWindowToRootWindow( &originX , &originY ); Rect bounds = { 0,0,0,0 }; -#ifdef __LP64__ +#if defined( __LP64__ ) || defined(__WXCOCOA__) #else + m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef(); + window->MacWindowToRootWindow( &originX , &originY ); GetWindowBounds( m_windowRef, kWindowContentRgn, &bounds ); #endif m_windowTransform = CGAffineTransformMakeTranslation( 0 , bounds.bottom - bounds.top ); @@ -1409,7 +1495,7 @@ void wxMacCoreGraphicsContext::EnsureIsValid() if ( !m_cgContext ) { OSStatus status = -#ifndef __LP64__ +#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) ) QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext ); #else paramErr; @@ -1422,8 +1508,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 ); @@ -1446,7 +1531,7 @@ bool wxMacCoreGraphicsContext::SetLogicalFunction( int function ) bool shouldAntiAlias = true; CGBlendMode mode = kCGBlendModeNormal; -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 +#if defined(__WXMAC__) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ) if ( UMAGetSystemVersion() >= 0x1050 ) { retval = true; @@ -1495,6 +1580,7 @@ bool wxMacCoreGraphicsContext::SetLogicalFunction( int function ) void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion ) { +#ifdef __WXMAC__ if( m_cgContext ) { HIShapeReplacePathInCGContext( region.GetWXHRGN() , m_cgContext ); @@ -1508,14 +1594,15 @@ 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); } +#endif } // clips drawings to the rect void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { - HIRect r = CGRectMake( x , y , w , h ); + CGRect r = CGRectMake( x , y , w , h ); if ( m_cgContext ) { CGContextClipToRect( m_cgContext, r ); @@ -1525,7 +1612,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)); } } @@ -1546,8 +1633,8 @@ void wxMacCoreGraphicsContext::ResetClip() } else { - HIRect r = CGRectMake(0,0,0,0); - m_clipRgn.Set(HIShapeCreateWithRect(&r)); + CGRect r = CGRectMake(0,0,0,0); + m_clipRgn.reset(HIShapeCreateWithRect(&r)); } } @@ -1652,7 +1739,7 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) CGContextRestoreGState( m_cgContext ); if ( m_releaseContext ) { -#ifndef __LP64__ +#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) ) QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext); #endif } @@ -1674,6 +1761,7 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) { CGContextRetain(m_cgContext); CGContextSaveGState( m_cgContext ); + CGContextSetTextMatrix( m_cgContext, CGAffineTransformIdentity ); CGContextSaveGState( m_cgContext ); m_releaseContext = false; } @@ -1705,11 +1793,17 @@ void wxMacCoreGraphicsContext::Rotate( wxDouble angle ) void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { - EnsureIsValid(); + wxGraphicsBitmap bitmap = GetRenderer()->CreateBitmap(bmp); + DrawBitmap(bitmap, x, y, w, h); +} - CGImageRef image = (CGImageRef)( bmp.CreateCGImage() ); - HIRect r = CGRectMake( x , y , w , h ); - if ( bmp.GetDepth() == 1 ) +void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + EnsureIsValid(); +#ifdef __WXMAC__ + CGImageRef image = static_cast(bmp.GetRefData())->GetBitmap(); + CGRect r = CGRectMake( x , y , w , h ); + // if ( bmp.GetDepth() == 1 ) { // is is a mask, the '1' in the mask tell where to draw the current brush if ( !m_brush.IsNull() ) @@ -1732,11 +1826,14 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDo } } } + /* else { wxMacDrawCGImage( m_cgContext , &r , image ); } CGImageRelease( image ); + */ +#endif } void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) @@ -1747,8 +1844,10 @@ void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDoubl CGContextSaveGState( m_cgContext ); CGContextTranslateCTM( m_cgContext, x , y + h ); CGContextScaleCTM( m_cgContext, 1, -1 ); +#ifdef __WXMAC__ PlotIconRefInContext( m_cgContext , &r , kAlignNone , kTransformNone , NULL , kPlotIconRefNormalFlags , MAC_WXHICON( icon.GetHICON() ) ); +#endif CGContextRestoreGState( m_cgContext ); } @@ -1778,10 +1877,10 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); CTFontRef font = fref->GetCTFont(); - CGColorRef col = fref->GetColour().GetPixel(); + CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); 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) ); @@ -1796,6 +1895,7 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub CGContextSetTextPosition(m_cgContext, 0, 0); CTLineDraw( line, m_cgContext ); CGContextRestoreGState(m_cgContext); + CFRelease( col ); return; } #endif @@ -1974,6 +2074,9 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid wxASSERT_MSG( status == noErr , wxT("couldn't create the layout of the text") ); + status = ::ATSUSetTransientFontMatching( atsuLayout , true ); + wxASSERT_MSG( status == noErr , wxT("couldn't setup transient font matching") ); + ATSUTextMeasurement textBefore, textAfter; ATSUTextMeasurement textAscent, textDescent; @@ -2031,14 +2134,20 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr #endif #if wxMAC_USE_ATSU_TEXT { + OSStatus status = noErr; ATSUTextLayout atsuLayout; wxMacUniCharBuffer unibuf( text ); UniCharCount chars = unibuf.GetChars(); ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle()); - ::ATSUCreateTextLayoutWithTextPtr( unibuf.GetBuffer() , 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") ); + status = ::ATSUSetTransientFontMatching( atsuLayout , true ); + wxASSERT_MSG( status == noErr , wxT("couldn't setup transient font matching") ); + for ( int pos = 0; pos < (int)chars; pos ++ ) { unsigned long actualNumberOfBounds = 0; @@ -2156,6 +2265,11 @@ public : // sets the font virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; + // create a native bitmap representation + virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) ; + + // create a native bitmap representation + virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ; private : DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacCoreGraphicsRenderer) } ; @@ -2173,25 +2287,42 @@ wxGraphicsRenderer* wxGraphicsRenderer::GetDefaultRenderer() return &gs_MacCoreGraphicsRenderer; } +#ifdef __WXCOCOA__ +extern CGContextRef wxMacGetContextFromCurrentNSContext() ; +#endif + wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxWindowDC& dc ) { const wxDCImpl* impl = dc.GetImpl(); wxWindowDCImpl *win_impl = wxDynamicCast( impl, wxWindowDCImpl ); if (win_impl) - return new wxMacCoreGraphicsContext( this, - (CGContextRef)(win_impl->GetWindow()->MacGetCGContextRef()) ); - + { + int w, h; + win_impl->GetSize( &w, &h ); + CGContextRef cgctx = 0; +#ifdef __WXMAC__ + cgctx = (CGContextRef)(win_impl->GetWindow()->MacGetCGContextRef()); +#else + cgctx = wxMacGetContextFromCurrentNSContext() ; +#endif + return new wxMacCoreGraphicsContext( this, cgctx, (wxDouble) w, (wxDouble) h ); + } return NULL; } wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxMemoryDC& dc ) { +#ifdef __WXMAC__ const wxDCImpl* impl = dc.GetImpl(); wxMemoryDCImpl *mem_impl = wxDynamicCast( impl, wxMemoryDCImpl ); if (mem_impl) + { + int w, h; + mem_impl->GetSize( &w, &h ); return new wxMacCoreGraphicsContext( this, - (CGContextRef)(mem_impl->GetGraphicsContext()->GetNativeContext()) ); - + (CGContextRef)(mem_impl->GetGraphicsContext()->GetNativeContext()), (wxDouble) w, (wxDouble) h ); + } +#endif return NULL; } @@ -2262,6 +2393,34 @@ wxGraphicsBrush wxMacCoreGraphicsRenderer::CreateBrush(const wxBrush& brush ) } } +wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmap( const wxBitmap& bmp ) +{ + if ( bmp.Ok() ) + { + wxGraphicsBitmap p; +#ifdef __WXMAC__ + p.SetRefData(new wxMacCoreGraphicsBitmapData( this , bmp.CreateCGImage() ) ); +#endif + return p; + } + else + return wxNullGraphicsBitmap; +} + +wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateSubBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + CGImageRef img = static_cast(bmp.GetRefData())->GetBitmap(); + if ( img ) + { + wxGraphicsBitmap p; + CGImageRef subimg = CGImageCreateWithImageInRect(img,CGRectMake( x , y , w , h )); + p.SetRefData(new wxMacCoreGraphicsBitmapData( this , subimg ) ); + return p; + } + else + return wxNullGraphicsBitmap; +} + // sets the brush to a linear gradient, starting at (x1,y1) with color c1 to (x2,y2) with color c2 wxGraphicsBrush wxMacCoreGraphicsRenderer::CreateLinearGradientBrush( wxDouble x1, wxDouble y1, wxDouble x2, wxDouble y2, const wxColour&c1, const wxColour&c2)