X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/133cb28b21dc61342da65dcb0addbca9a96b6fe2..9db177273906bb393b97b4a98f6a8b4d61e8f0e3:/src/osx/carbon/graphics.cpp?ds=sidebyside diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index 5501962714..053481f1ca 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -113,11 +113,9 @@ extern "C" // 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; @@ -149,26 +147,13 @@ OSStatus wxMacDrawCGImage( 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 ) ; - } + CGColorRef retval = col.CreateCGColor(); -#endif + wxASSERT(retval != NULL); return retval; } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && wxOSX_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT CTFontRef wxMacCreateCTFont( const wxFont& font ) { @@ -970,20 +955,29 @@ wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData() #endif } -class wxMacCoreGraphicsBitmapData : public wxGraphicsObjectRefData +class wxMacCoreGraphicsBitmapData : public wxGraphicsBitmapData { public: wxMacCoreGraphicsBitmapData( wxGraphicsRenderer* renderer, CGImageRef bitmap, bool monochrome ); ~wxMacCoreGraphicsBitmapData(); virtual CGImageRef GetBitmap() { return m_bitmap; } + virtual void* GetNativeBitmap() const { return m_bitmap; } bool IsMonochrome() { return m_monochrome; } + +#if wxUSE_IMAGE + wxImage ConvertToImage() const + { + return wxBitmap(m_bitmap).ConvertToImage(); + } +#endif // wxUSE_IMAGE + private : CGImageRef m_bitmap; bool m_monochrome; }; -wxMacCoreGraphicsBitmapData::wxMacCoreGraphicsBitmapData( wxGraphicsRenderer* renderer, CGImageRef bitmap, bool monochrome ) : wxGraphicsObjectRefData( renderer ), +wxMacCoreGraphicsBitmapData::wxMacCoreGraphicsBitmapData( wxGraphicsRenderer* renderer, CGImageRef bitmap, bool monochrome ) : wxGraphicsBitmapData( renderer ), m_bitmap(bitmap), m_monochrome(monochrome) { } @@ -993,6 +987,7 @@ wxMacCoreGraphicsBitmapData::~wxMacCoreGraphicsBitmapData() CGImageRelease( m_bitmap ); } + // // Graphics Matrix // @@ -1384,8 +1379,6 @@ public: wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer); - wxMacCoreGraphicsContext(); - ~wxMacCoreGraphicsContext(); void Init(); @@ -1497,10 +1490,11 @@ public: void SetNativeContext( CGContextRef cg ); - DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacCoreGraphicsContext) + wxDECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext); 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 ); @@ -1536,8 +1530,6 @@ private: // wxMacCoreGraphicsContext implementation //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxMacCoreGraphicsContext, wxGraphicsContext) - class wxQuartzOffsetHelper { public : @@ -1580,6 +1572,8 @@ void wxMacCoreGraphicsContext::Init() m_view = NULL; #endif m_invisible = false; + m_antialias = wxANTIALIAS_DEFAULT; + m_interpolation = wxINTERPOLATION_DEFAULT; } wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext, wxDouble width, wxDouble height ) : wxGraphicsContext(renderer) @@ -1640,18 +1634,19 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext(wxGraphicsRenderer* renderer) Init(); } -wxMacCoreGraphicsContext::wxMacCoreGraphicsContext() : wxGraphicsContext(NULL) +wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext() { - Init(); - wxLogDebug(wxT("Illegal Constructor called")); + SetNativeContext(NULL); } -wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext() + +void wxMacCoreGraphicsContext::CheckInvariants() const { - SetNativeContext(NULL); + // check invariants here for debugging ... } + void wxMacCoreGraphicsContext::StartPage( wxDouble width, wxDouble height ) { CGRect r; @@ -1677,6 +1672,8 @@ void wxMacCoreGraphicsContext::Flush() bool wxMacCoreGraphicsContext::EnsureIsValid() { + CheckInvariants(); + if ( !m_cgContext ) { if (m_invisible) @@ -1750,6 +1747,8 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() #endif } } + CheckInvariants(); + return m_cgContext != NULL; } @@ -1776,13 +1775,48 @@ bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) return false; } CGContextSetShouldAntialias(m_cgContext, antialiasMode); + CheckInvariants(); return true; } -bool wxMacCoreGraphicsContext::SetInterpolationQuality(wxInterpolationQuality WXUNUSED(interpolation)) +bool wxMacCoreGraphicsContext::SetInterpolationQuality(wxInterpolationQuality interpolation) { - // placeholder - return false; + if (!EnsureIsValid()) + return true; + + if (m_interpolation == interpolation) + return true; + + m_interpolation = interpolation; + CGInterpolationQuality quality; + + switch (interpolation) + { + case wxINTERPOLATION_DEFAULT: + quality = kCGInterpolationDefault; + break; + case wxINTERPOLATION_NONE: + quality = kCGInterpolationNone; + break; + case wxINTERPOLATION_FAST: + quality = kCGInterpolationLow; + break; + case wxINTERPOLATION_GOOD: +#if wxOSX_USE_COCOA_OR_CARBON + quality = UMAGetSystemVersion() < 0x1060 ? kCGInterpolationHigh : (CGInterpolationQuality) 4 /*kCGInterpolationMedium only on 10.6*/; +#else + quality = kCGInterpolationMedium; +#endif + break; + case wxINTERPOLATION_BEST: + quality = kCGInterpolationHigh; + break; + default: + return false; + } + CGContextSetInterpolationQuality(m_cgContext, quality); + CheckInvariants(); + return true; } bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) @@ -1798,8 +1832,8 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) if (m_composition == wxCOMPOSITION_DEST) return true; -#if wxOSX_USE_COCOA_OR_CARBON - if ( UMAGetSystemVersion() < 0x1060 ) + // TODO REMOVE if we don't need it because of bugs in 10.5 +#if 0 { CGCompositeOperation cop = kCGCompositeOperationSourceOver; CGBlendMode mode = kCGBlendModeNormal; @@ -1838,11 +1872,9 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) case wxCOMPOSITION_XOR: cop = kCGCompositeOperationXOR; break; -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 case wxCOMPOSITION_ADD: mode = kCGBlendModePlusLighter ; break; -#endif default: return false; } @@ -1852,8 +1884,6 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) CGContextSetBlendMode(m_cgContext, mode); } #endif -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - else { CGBlendMode mode = kCGBlendModeNormal; switch( op ) @@ -1900,25 +1930,31 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) } 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 ) { @@ -1949,11 +1985,13 @@ void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion ) // 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 ) { @@ -1972,6 +2010,7 @@ void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDoubl // wxFAIL_MSG( "Needs a valid context for clipping" ); #endif } + CheckInvariants(); } // resets the clipping to original extent @@ -1998,6 +2037,7 @@ void wxMacCoreGraphicsContext::ResetClip() // wxFAIL_MSG( "Needs a valid context for clipping" ); #endif } + CheckInvariants(); } void wxMacCoreGraphicsContext::StrokePath( const wxGraphicsPath &path ) @@ -2016,6 +2056,8 @@ 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 ) @@ -2069,6 +2111,8 @@ void wxMacCoreGraphicsContext::DrawPath( const wxGraphicsPath &path , wxPolygonF CGContextAddPath( m_cgContext , (CGPathRef) path.GetNativePath() ); CGContextDrawPath( m_cgContext , mode ); + + CheckInvariants(); } void wxMacCoreGraphicsContext::FillPath( const wxGraphicsPath &path , wxPolygonFillMode fillStyle ) @@ -2099,6 +2143,8 @@ void wxMacCoreGraphicsContext::FillPath( const wxGraphicsPath &path , wxPolygonF else CGContextFillPath( m_cgContext ); } + + CheckInvariants(); } void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) @@ -2108,6 +2154,7 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) if ( m_cgContext ) { + CheckInvariants(); CGContextRestoreGState( m_cgContext ); CGContextRestoreGState( m_cgContext ); if ( m_contextSynthesized ) @@ -2181,7 +2228,7 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble return; #ifdef __WXMAC__ - wxMacCoreGraphicsBitmapData* refdata =static_cast(bmp.GetRefData()); + wxMacCoreGraphicsBitmapData* refdata = static_cast(bmp.GetRefData()); CGImageRef image = refdata->GetBitmap(); CGRect r = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h ); if ( refdata->IsMonochrome() == 1 ) @@ -2212,6 +2259,8 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble wxMacDrawCGImage( m_cgContext , &r , image ); } #endif + + CheckInvariants(); } void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) @@ -2222,15 +2271,17 @@ void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDoubl if (m_composition == wxCOMPOSITION_DEST) return; - CGRect r = CGRectMake( (CGFloat) 0.0 , (CGFloat) 0.0 , (CGFloat) w , (CGFloat) h ); CGContextSaveGState( m_cgContext ); CGContextTranslateCTM( m_cgContext,(CGFloat) x ,(CGFloat) (y + h) ); CGContextScaleCTM( m_cgContext, 1, -1 ); #if wxOSX_USE_COCOA_OR_CARBON + CGRect r = CGRectMake( (CGFloat) 0.0 , (CGFloat) 0.0 , (CGFloat) w , (CGFloat) h ); PlotIconRefInContext( m_cgContext , &r , kAlignNone , kTransformNone , NULL , kPlotIconRefNormalFlags , icon.GetHICON() ); #endif CGContextRestoreGState( m_cgContext ); + + CheckInvariants(); } void wxMacCoreGraphicsContext::PushState() @@ -2260,16 +2311,21 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo return; #if wxOSX_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); 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 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 attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values, WXSIZEOF( keys ), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks) ); wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); @@ -2278,12 +2334,30 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo 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); - CFRelease( col ); + CGContextSetTextMatrix(m_cgContext, textMatrix); + CGColorRelease( col ); + CheckInvariants(); return; } #endif @@ -2308,6 +2382,8 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo CGContextRestoreGState(m_cgContext); CFRelease( col ); #endif + + CheckInvariants(); } void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, @@ -2323,7 +2399,6 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, return; #if wxOSX_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) { // default implementation takes care of rotation and calls non rotated DrawText afterwards wxGraphicsContext::DoDrawRotatedText( str, x, y, angle ); @@ -2410,6 +2485,7 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, CGContextRestoreGState(m_cgContext); ::ATSUDisposeTextLayout(atsuLayout); + CheckInvariants(); return; } @@ -2418,6 +2494,8 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, // 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, @@ -2438,7 +2516,6 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid return; #if wxOSX_USE_CORE_TEXT - if ( UMAGetSystemVersion() >= 0x1050 ) { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); CTFontRef font = fref->OSXGetCTFont(); @@ -2519,6 +2596,8 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid if ( width ) *width = sz.width; #endif + + CheckInvariants(); } void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const @@ -2617,6 +2696,8 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr #if wxOSX_USE_IPHONE // TODO core graphics text implementation here #endif + + CheckInvariants(); } void * wxMacCoreGraphicsContext::GetNativeContext() @@ -2657,6 +2738,7 @@ void wxMacCoreGraphicsContext::ConcatTransform( const wxGraphicsMatrix& matrix ) // sets the transform of this context void wxMacCoreGraphicsContext::SetTransform( const wxGraphicsMatrix& matrix ) { + CheckInvariants(); if ( m_cgContext ) { CGAffineTransform transform = CGContextGetCTM( m_cgContext ); @@ -2668,6 +2750,7 @@ void wxMacCoreGraphicsContext::SetTransform( const wxGraphicsMatrix& matrix ) { m_windowTransform = *(CGAffineTransform*) matrix.GetNativeMatrix(); } + CheckInvariants(); } // gets the matrix of this context @@ -2679,6 +2762,49 @@ wxGraphicsMatrix wxMacCoreGraphicsContext::GetTransform() const return m; } + +#if wxUSE_IMAGE + +// ---------------------------------------------------------------------------- +// wxMacCoreGraphicsImageContext +// ---------------------------------------------------------------------------- + +// This is a GC that can be used to draw on wxImage. In this implementation we +// simply draw on a wxBitmap using wxMemoryDC and then convert it to wxImage in +// the end so it's not especially interesting and exists mainly for +// compatibility with the other platforms. +class wxMacCoreGraphicsImageContext : public wxMacCoreGraphicsContext +{ +public: + wxMacCoreGraphicsImageContext(wxGraphicsRenderer* renderer, + wxImage& image) : + wxMacCoreGraphicsContext(renderer), + m_image(image), + m_bitmap(image), + m_memDC(m_bitmap) + { + SetNativeContext + ( + (CGContextRef)(m_memDC.GetGraphicsContext()->GetNativeContext()) + ); + m_width = image.GetWidth(); + m_height = image.GetHeight(); + } + + virtual ~wxMacCoreGraphicsImageContext() + { + m_memDC.SelectObject(wxNullBitmap); + m_image = m_bitmap.ConvertToImage(); + } + +private: + wxImage& m_image; + wxBitmap m_bitmap; + wxMemoryDC m_memDC; +}; + +#endif // wxUSE_IMAGE + // // Renderer // @@ -2708,6 +2834,10 @@ public : virtual wxGraphicsContext * CreateContext( wxWindow* window ); +#if wxUSE_IMAGE + virtual wxGraphicsContext * CreateContextFromImage(wxImage& image); +#endif // wxUSE_IMAGE + virtual wxGraphicsContext * CreateMeasuringContext(); // Path @@ -2737,10 +2867,19 @@ public : // sets the font virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; + virtual wxGraphicsFont CreateFont(double sizeInPixels, + const wxString& facename, + int flags = wxFONTFLAG_DEFAULT, + const wxColour& col = *wxBLACK); // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) ; +#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 virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); @@ -2850,6 +2989,16 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateMeasuringContext() return new wxMacCoreGraphicsContext(this); } +#if wxUSE_IMAGE + +wxGraphicsContext* +wxMacCoreGraphicsRenderer::CreateContextFromImage(wxImage& image) +{ + return new wxMacCoreGraphicsImageContext(this, image); +} + +#endif // wxUSE_IMAGE + // Path wxGraphicsPath wxMacCoreGraphicsRenderer::CreatePath() @@ -2908,6 +3057,28 @@ wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmap( const wxBitmap& bmp ) return wxNullGraphicsBitmap; } +#if wxUSE_IMAGE + +wxGraphicsBitmap +wxMacCoreGraphicsRenderer::CreateBitmapFromImage(const wxImage& image) +{ + // We don't have any direct way to convert wxImage to CGImage so pass by + // wxBitmap. This makes this function pretty useless in this implementation + // but it allows to have the same API as with Cairo backend where we can + // convert wxImage to a Cairo surface directly, bypassing wxBitmap. + return CreateBitmap(wxBitmap(image)); +} + +wxImage wxMacCoreGraphicsRenderer::CreateImageFromBitmap(const wxGraphicsBitmap& bmp) +{ + wxMacCoreGraphicsBitmapData* const + data = static_cast(bmp.GetRefData()); + + return data ? data->ConvertToImage() : wxNullImage; +} + +#endif // wxUSE_IMAGE + wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmapFromNativeBitmap( void* bitmap ) { if ( bitmap != NULL ) @@ -2960,7 +3131,6 @@ wxMacCoreGraphicsRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, return p; } -// sets the font wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const wxColour &col ) { if ( font.IsOk() ) @@ -2973,6 +3143,32 @@ wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const return wxNullGraphicsFont; } +wxGraphicsFont +wxMacCoreGraphicsRenderer::CreateFont(double sizeInPixels, + const wxString& facename, + int flags, + const wxColour& col) +{ + // This implementation is not ideal as we don't support fractional font + // sizes right now, but it's the simplest one. + // + // Notice that under Mac we always use 72 DPI so the font size in pixels is + // the same as the font size in points and we can pass it directly to wxFont + // ctor. + wxFont font(wxRound(sizeInPixels), + wxFONTFAMILY_DEFAULT, + flags & wxFONTFLAG_ITALIC ? wxFONTSTYLE_ITALIC + : wxFONTSTYLE_NORMAL, + flags & wxFONTFLAG_BOLD ? wxFONTWEIGHT_BOLD + : wxFONTWEIGHT_NORMAL, + (flags & wxFONTFLAG_UNDERLINED) != 0, + facename); + + wxGraphicsFont f; + f.SetRefData(new wxMacCoreGraphicsFontData(this, font, col)); + return f; +} + // // CoreGraphics Helper Methods //