// constants
//-----------------------------------------------------------------------------
-#if !defined( __DARWIN__ ) || defined(__MWERKS__)
#ifndef M_PI
const double M_PI = 3.14159265358979;
#endif
-#endif
static const double RAD2DEG = 180.0 / M_PI;
}
#endif
+ wxASSERT(retval != NULL);
return retval;
}
CGImageRelease( m_bitmap );
}
-#if wxUSE_IMAGE
-
-wxImage wxGraphicsBitmap::ConvertToImage() const
-{
- wxMacCoreGraphicsBitmapData* const
- data = static_cast<wxMacCoreGraphicsBitmapData*>(GetRefData());
-
- return data ? data->ConvertToImage() : wxNullImage;
-}
-
-#endif // wxUSE_IMAGE
//
// Graphics Matrix
private:
bool EnsureIsValid();
+ void CheckInvariants() const;
virtual void DoDrawText( const wxString &str, wxDouble x, wxDouble y );
virtual void DoDrawRotatedText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle );
}
+void wxMacCoreGraphicsContext::CheckInvariants() const
+{
+ // check invariants here for debugging ...
+}
+
+
+
void wxMacCoreGraphicsContext::StartPage( wxDouble width, wxDouble height )
{
CGRect r;
bool wxMacCoreGraphicsContext::EnsureIsValid()
{
+ CheckInvariants();
+
if ( !m_cgContext )
{
if (m_invisible)
#endif
}
}
+ CheckInvariants();
+
return m_cgContext != NULL;
}
return false;
}
CGContextSetShouldAntialias(m_cgContext, antialiasMode);
+ CheckInvariants();
return true;
}
return false;
}
CGContextSetInterpolationQuality(m_cgContext, quality);
+ CheckInvariants();
return true;
}
CGContextSetBlendMode(m_cgContext, mode);
}
#endif
+ CheckInvariants();
return true;
}
void wxMacCoreGraphicsContext::BeginLayer(wxDouble opacity)
{
+ CheckInvariants();
CGContextSaveGState(m_cgContext);
CGContextSetAlpha(m_cgContext, (CGFloat) opacity);
CGContextBeginTransparencyLayer(m_cgContext, 0);
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::EndLayer()
{
+ CheckInvariants();
CGContextEndTransparencyLayer(m_cgContext);
CGContextRestoreGState(m_cgContext);
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion )
{
+ CheckInvariants();
#if wxOSX_USE_COCOA_OR_CARBON
if( m_cgContext )
{
// allow usage as measuring context
// wxASSERT_MSG( m_cgContext != NULL, "Needs a valid context for clipping" );
#endif
+ CheckInvariants();
}
// clips drawings to the rect
void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
{
+ CheckInvariants();
CGRect r = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h );
if ( m_cgContext )
{
// wxFAIL_MSG( "Needs a valid context for clipping" );
#endif
}
+ CheckInvariants();
}
// resets the clipping to original extent
// wxFAIL_MSG( "Needs a valid context for clipping" );
#endif
}
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::StrokePath( const wxGraphicsPath &path )
((wxMacCoreGraphicsPenData*)m_pen.GetRefData())->Apply(this);
CGContextAddPath( m_cgContext , (CGPathRef) path.GetNativePath() );
CGContextStrokePath( m_cgContext );
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::DrawPath( const wxGraphicsPath &path , wxPolygonFillMode fillStyle )
CGContextAddPath( m_cgContext , (CGPathRef) path.GetNativePath() );
CGContextDrawPath( m_cgContext , mode );
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::FillPath( const wxGraphicsPath &path , wxPolygonFillMode fillStyle )
else
CGContextFillPath( m_cgContext );
}
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg )
if ( m_cgContext )
{
+ CheckInvariants();
CGContextRestoreGState( m_cgContext );
CGContextRestoreGState( m_cgContext );
if ( m_contextSynthesized )
wxMacDrawCGImage( m_cgContext , &r , image );
}
#endif
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
NULL , kPlotIconRefNormalFlags , icon.GetHICON() );
#endif
CGContextRestoreGState( m_cgContext );
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::PushState()
wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
CTFontRef font = fref->OSXGetCTFont();
CGColorRef col = wxMacCreateCGColor( fref->GetColour() );
+#if 0
+ // right now there's no way to get continuous underlines, only words, so we emulate it
CTUnderlineStyle ustyle = fref->GetUnderlined() ? kCTUnderlineStyleSingle : kCTUnderlineStyleNone ;
wxCFRef<CFNumberRef> underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) );
CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName, kCTUnderlineStyleAttributeName };
CFTypeRef values[] = { font, col, underlined };
+#else
+ CFStringRef keys[] = { kCTFontAttributeName , kCTForegroundColorAttributeName };
+ CFTypeRef values[] = { font, col };
+#endif
wxCFRef<CFDictionaryRef> attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values,
WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) );
wxCFRef<CFAttributedStringRef> attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) );
y += CTFontGetAscent(font);
CGContextSaveGState(m_cgContext);
+ CGAffineTransform textMatrix = CGContextGetTextMatrix(m_cgContext);
+
CGContextTranslateCTM(m_cgContext, (CGFloat) x, (CGFloat) y);
CGContextScaleCTM(m_cgContext, 1, -1);
- CGContextSetTextPosition(m_cgContext, 0, 0);
+ CGContextSetTextMatrix(m_cgContext, CGAffineTransformIdentity);
+
CTLineDraw( line, m_cgContext );
+
+ if ( fref->GetUnderlined() ) {
+ //AKT: draw horizontal line 1 pixel thick and with 1 pixel gap under baseline
+ CGFloat width = CTLineGetTypographicBounds(line, NULL, NULL, NULL);
+
+ CGPoint points[] = { {0.0, -2.0}, {width, -2.0} };
+
+ CGContextSetStrokeColorWithColor(m_cgContext, col);
+ CGContextSetShouldAntialias(m_cgContext, false);
+ CGContextSetLineWidth(m_cgContext, 1.0);
+ CGContextStrokeLineSegments(m_cgContext, points, 2);
+ }
+
CGContextRestoreGState(m_cgContext);
+ CGContextSetTextMatrix(m_cgContext, textMatrix);
CFRelease( col );
+ CheckInvariants();
return;
}
#endif
CGContextRestoreGState(m_cgContext);
CFRelease( col );
#endif
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str,
CGContextRestoreGState(m_cgContext);
::ATSUDisposeTextLayout(atsuLayout);
+ CheckInvariants();
return;
}
// default implementation takes care of rotation and calls non rotated DrawText afterwards
wxGraphicsContext::DoDrawRotatedText( str, x, y, angle );
#endif
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height,
if ( width )
*width = sz.width;
#endif
+
+ CheckInvariants();
}
void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const
#if wxOSX_USE_IPHONE
// TODO core graphics text implementation here
#endif
+
+ CheckInvariants();
}
void * wxMacCoreGraphicsContext::GetNativeContext()
// sets the transform of this context
void wxMacCoreGraphicsContext::SetTransform( const wxGraphicsMatrix& matrix )
{
+ CheckInvariants();
if ( m_cgContext )
{
CGAffineTransform transform = CGContextGetCTM( m_cgContext );
{
m_windowTransform = *(CGAffineTransform*) matrix.GetNativeMatrix();
}
+ CheckInvariants();
}
// gets the matrix of this context
#if wxUSE_IMAGE
virtual wxGraphicsBitmap CreateBitmapFromImage(const wxImage& image);
+ virtual wxImage CreateImageFromBitmap(const wxGraphicsBitmap& bmp);
#endif // wxUSE_IMAGE
// create a graphics bitmap from a native bitmap
return CreateBitmap(wxBitmap(image));
}
+wxImage wxMacCoreGraphicsRenderer::CreateImageFromBitmap(const wxGraphicsBitmap& bmp)
+{
+ wxMacCoreGraphicsBitmapData* const
+ data = static_cast<wxMacCoreGraphicsBitmapData*>(bmp.GetRefData());
+
+ return data ? data->ConvertToImage() : wxNullImage;
+}
+
#endif // wxUSE_IMAGE
wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmapFromNativeBitmap( void* bitmap )