+ virtual void DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h );
+
+ void SetNativeContext( CGContextRef cg );
+
+ DECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext)
+ DECLARE_DYNAMIC_CLASS(wxMacCoreGraphicsContext)
+
+private:
+ void EnsureIsValid();
+
+ CGContextRef m_cgContext;
+ WindowRef m_windowRef;
+ bool m_releaseContext;
+ CGAffineTransform m_windowTransform;
+
+ wxMacCFRefHolder<HIShapeRef> m_clipRgn;
+};
+
+//-----------------------------------------------------------------------------
+// device context implementation
+//
+// more and more of the dc functionality should be implemented by calling
+// the appropricate wxMacCoreGraphicsContext, but we will have to do that step by step
+// also coordinate conversions should be moved to native matrix ops
+//-----------------------------------------------------------------------------
+
+// we always stock two context states, one at entry, to be able to preserve the
+// state we were called with, the other one after changing to HI Graphics orientation
+// (this one is used for getting back clippings etc)
+
+//-----------------------------------------------------------------------------
+// wxMacCoreGraphicsContext implementation
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxMacCoreGraphicsContext, wxGraphicsContext)
+
+void wxMacCoreGraphicsContext::Init()
+{
+ m_cgContext = NULL;
+ m_releaseContext = false;
+ m_windowRef = NULL;
+
+ HIRect r = CGRectMake(0,0,0,0);
+ m_clipRgn.Set(HIShapeCreateWithRect(&r));
+}
+
+wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext ) : wxGraphicsContext(renderer)
+{
+ Init();
+ SetNativeContext(cgcontext);
+}
+
+wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ): wxGraphicsContext(renderer)
+{
+ Init();
+ m_windowRef = window;
+}
+
+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;
+ GetWindowBounds( m_windowRef, kWindowContentRgn, &bounds );
+
+ m_windowTransform = CGAffineTransformMakeTranslation( 0 , bounds.bottom - bounds.top );
+ m_windowTransform = CGAffineTransformScale( m_windowTransform , 1 , -1 );
+ m_windowTransform = CGAffineTransformTranslate( m_windowTransform, originX, originY ) ;
+}
+
+wxMacCoreGraphicsContext::wxMacCoreGraphicsContext(wxGraphicsRenderer* renderer) : wxGraphicsContext(renderer)
+{
+ Init();
+}
+
+wxMacCoreGraphicsContext::wxMacCoreGraphicsContext() : wxGraphicsContext(NULL)
+{
+ Init();
+ wxLogDebug(wxT("Illegal Constructor called"));
+}
+
+wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext()
+{
+ SetNativeContext(NULL);
+}
+
+void wxMacCoreGraphicsContext::EnsureIsValid()
+{
+ if ( !m_cgContext )
+ {
+ OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext );
+ wxASSERT_MSG( status == noErr , wxT("Cannot nest wxDCs on the same window") );
+
+ CGContextConcatCTM( m_cgContext, m_windowTransform );
+ CGContextSaveGState( m_cgContext );
+ m_releaseContext = true;
+ 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 ) );
+ CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero,m_windowTransform);
+ HIShapeOffset( hishape, -transformedOrigin.x, -transformedOrigin.y );
+ HIShapeReplacePathInCGContext( hishape, m_cgContext );
+ CGContextClip( m_cgContext );
+ }
+ CGContextSaveGState( m_cgContext );
+ }
+}
+
+
+void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion )
+{
+ if( m_cgContext )
+ {
+ HIShapeRef shape = HIShapeCreateWithQDRgn( (RgnHandle) region.GetWXHRGN() );
+ HIShapeReplacePathInCGContext( shape, m_cgContext );
+ CGContextClip( m_cgContext );
+ CFRelease( shape );
+ }
+ else
+ {
+ // this offsetting to device coords is not really correct, but since we cannot apply affine transforms
+ // to regions we try at least to have correct translations
+ wxMacCFRefHolder<HIShapeRef> hishape ;
+ hishape.Set( HIShapeCreateWithQDRgn( (RgnHandle) region.GetWXHRGN() ));
+ HIMutableShapeRef mutableShape = HIShapeCreateMutableCopy( hishape );
+
+ CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero, m_windowTransform );
+ HIShapeOffset( mutableShape, transformedOrigin.x, transformedOrigin.y );
+ m_clipRgn.Set(mutableShape);
+ }
+}
+
+// clips drawings to the rect
+void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
+{
+ HIRect r = CGRectMake( x , y , w , h );
+ if ( m_cgContext )
+ {
+ CGContextClipToRect( m_cgContext, r );
+ }
+ else
+ {
+ // 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));