switch having an affine transform even when there is no native context around

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42607 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2006-10-29 09:44:04 +00:00
parent f518afb5dc
commit 549be22603

View File

@@ -1160,13 +1160,13 @@ public:
private: private:
void EnsureIsValid(); void EnsureIsValid();
CGContextRef m_cgContext; CGContextRef m_cgContext;
WindowRef m_windowRef; WindowRef m_windowRef;
int m_originX;
int m_originY;
wxMacCFRefHolder<HIShapeRef> m_clipRgn;
bool m_releaseContext; bool m_releaseContext;
CGAffineTransform m_windowTransform;
wxMacCFRefHolder<HIShapeRef> m_clipRgn;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -1192,8 +1192,7 @@ void wxMacCoreGraphicsContext::Init()
m_cgContext = NULL; m_cgContext = NULL;
m_releaseContext = false; m_releaseContext = false;
m_windowRef = NULL; m_windowRef = NULL;
m_originX = 0;
m_originY = 0;
HIRect r = CGRectMake(0,0,0,0); HIRect r = CGRectMake(0,0,0,0);
m_clipRgn.Set(HIShapeCreateWithRect(&r)); m_clipRgn.Set(HIShapeCreateWithRect(&r));
} }
@@ -1201,19 +1200,7 @@ void wxMacCoreGraphicsContext::Init()
wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext ) : wxGraphicsContext(renderer) wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext ) : wxGraphicsContext(renderer)
{ {
Init(); Init();
m_cgContext = cgcontext; SetNativeContext(cgcontext);
// FIXME: This check is needed because currently we need to use a DC/GraphicsContext
// in order to get font properties, like wxFont::GetPixelSize, but since we don't have
// a native window attached to use, I create a wxGraphicsContext with a NULL CGContextRef
// for this one operation.
// When wxFont::GetPixelSize on Mac no longer needs a graphics context, this check
// can be removed.
if (m_cgContext)
{
CGContextSaveGState( m_cgContext );
CGContextSaveGState( m_cgContext );
}
} }
wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ): wxGraphicsContext(renderer) wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ): wxGraphicsContext(renderer)
@@ -1226,8 +1213,15 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer
{ {
Init(); Init();
m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef(); m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef();
m_originX = m_originY = 0; int originX , originY;
window->MacWindowToRootWindow( &m_originX , &m_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) wxMacCoreGraphicsContext::wxMacCoreGraphicsContext(wxGraphicsRenderer* renderer) : wxGraphicsContext(renderer)
@@ -1243,15 +1237,7 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext() : wxGraphicsContext(NULL)
wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext() wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext()
{ {
if ( m_cgContext ) SetNativeContext(NULL);
{
// TODO : when is this necessary - should we add a Flush() method ? CGContextSynchronize( m_cgContext );
CGContextRestoreGState( m_cgContext );
CGContextRestoreGState( m_cgContext );
}
if ( m_releaseContext )
QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext);
} }
void wxMacCoreGraphicsContext::EnsureIsValid() void wxMacCoreGraphicsContext::EnsureIsValid()
@@ -1260,12 +1246,8 @@ void wxMacCoreGraphicsContext::EnsureIsValid()
{ {
OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext ); OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext );
wxASSERT_MSG( status == noErr , wxT("Cannot nest wxDCs on the same window") ); wxASSERT_MSG( status == noErr , wxT("Cannot nest wxDCs on the same window") );
Rect bounds;
GetWindowBounds( m_windowRef, kWindowContentRgn, &bounds ); CGContextConcatCTM( m_cgContext, m_windowTransform );
CGContextSaveGState( m_cgContext );
CGContextTranslateCTM( m_cgContext , 0 , bounds.bottom - bounds.top );
CGContextScaleCTM( m_cgContext , 1 , -1 );
CGContextTranslateCTM( m_cgContext, m_originX, m_originY );
CGContextSaveGState( m_cgContext ); CGContextSaveGState( m_cgContext );
m_releaseContext = true; m_releaseContext = true;
if ( !HIShapeIsEmpty(m_clipRgn) ) if ( !HIShapeIsEmpty(m_clipRgn) )
@@ -1426,30 +1408,58 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg )
// we allow either setting or clearing but not replacing // we allow either setting or clearing but not replacing
wxASSERT( m_cgContext == NULL || cg == NULL ); wxASSERT( m_cgContext == NULL || cg == NULL );
if ( cg ) if ( m_cgContext )
CGContextSaveGState( cg ); {
// TODO : when is this necessary - should we add a Flush() method ? CGContextSynchronize( m_cgContext );
CGContextRestoreGState( m_cgContext );
CGContextRestoreGState( m_cgContext );
if ( m_releaseContext )
QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext);
else
CGContextRelease(m_cgContext);
}
m_cgContext = cg; m_cgContext = cg;
// FIXME: This check is needed because currently we need to use a DC/GraphicsContext
// in order to get font properties, like wxFont::GetPixelSize, but since we don't have
// a native window attached to use, I create a wxGraphicsContext with a NULL CGContextRef
// for this one operation.
// When wxFont::GetPixelSize on Mac no longer needs a graphics context, this check
// can be removed.
if (m_cgContext)
{
CGContextRetain(m_cgContext);
CGContextSaveGState( m_cgContext );
CGContextSaveGState( m_cgContext );
m_releaseContext = NULL;
}
} }
void wxMacCoreGraphicsContext::Translate( wxDouble dx , wxDouble dy ) void wxMacCoreGraphicsContext::Translate( wxDouble dx , wxDouble dy )
{ {
EnsureIsValid(); if ( m_cgContext )
CGContextTranslateCTM( m_cgContext, dx, dy );
CGContextTranslateCTM( m_cgContext, dx, dy ); else
m_windowTransform = CGAffineTransformTranslate(m_windowTransform,dx,dy);
} }
void wxMacCoreGraphicsContext::Scale( wxDouble xScale , wxDouble yScale ) void wxMacCoreGraphicsContext::Scale( wxDouble xScale , wxDouble yScale )
{ {
EnsureIsValid(); if ( m_cgContext )
CGContextScaleCTM( m_cgContext , xScale , yScale );
CGContextScaleCTM( m_cgContext , xScale , yScale ); else
m_windowTransform = CGAffineTransformScale(m_windowTransform,xScale,yScale);
} }
void wxMacCoreGraphicsContext::Rotate( wxDouble angle ) void wxMacCoreGraphicsContext::Rotate( wxDouble angle )
{ {
EnsureIsValid(); if ( m_cgContext )
CGContextRotateCTM( m_cgContext , angle );
CGContextRotateCTM( m_cgContext , angle ); else
m_windowTransform = CGAffineTransformRotate(m_windowTransform,angle);
} }
void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
@@ -1752,23 +1762,34 @@ void * wxMacCoreGraphicsContext::GetNativeContext()
// concatenates this transform with the current transform of this context // concatenates this transform with the current transform of this context
void wxMacCoreGraphicsContext::ConcatTransform( const wxGraphicsMatrix& matrix ) void wxMacCoreGraphicsContext::ConcatTransform( const wxGraphicsMatrix& matrix )
{ {
CGContextConcatCTM( m_cgContext, *(CGAffineTransform*) matrix.GetNativeMatrix()); if ( m_cgContext )
CGContextConcatCTM( m_cgContext, *(CGAffineTransform*) matrix.GetNativeMatrix());
else
m_windowTransform = CGAffineTransformConcat(m_windowTransform, *(CGAffineTransform*) matrix.GetNativeMatrix());
} }
// sets the transform of this context // sets the transform of this context
void wxMacCoreGraphicsContext::SetTransform( const wxGraphicsMatrix& matrix ) void wxMacCoreGraphicsContext::SetTransform( const wxGraphicsMatrix& matrix )
{ {
CGAffineTransform transform = CGContextGetCTM( m_cgContext ); if ( m_cgContext )
transform = CGAffineTransformInvert( transform ) ; {
CGContextConcatCTM( m_cgContext, transform); CGAffineTransform transform = CGContextGetCTM( m_cgContext );
CGContextConcatCTM( m_cgContext, *(CGAffineTransform*) matrix.GetNativeMatrix()); transform = CGAffineTransformInvert( transform ) ;
CGContextConcatCTM( m_cgContext, transform);
CGContextConcatCTM( m_cgContext, *(CGAffineTransform*) matrix.GetNativeMatrix());
}
else
{
m_windowTransform = *(CGAffineTransform*) matrix.GetNativeMatrix();
}
} }
// gets the matrix of this context // gets the matrix of this context
wxGraphicsMatrix wxMacCoreGraphicsContext::GetTransform() const wxGraphicsMatrix wxMacCoreGraphicsContext::GetTransform() const
{ {
wxGraphicsMatrix m = CreateMatrix(); wxGraphicsMatrix m = CreateMatrix();
*((CGAffineTransform*) m.GetNativeMatrix()) = CGContextGetCTM( m_cgContext ); *((CGAffineTransform*) m.GetNativeMatrix()) = ( m_cgContext == NULL ? m_windowTransform :
CGContextGetCTM( m_cgContext ));
return m; return m;
} }