X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/df04f800b84a71e6f1f5020fa03c2831fa87e6f2..b39badac119fe944152cd1408a90b82e710ea598:/src/osx/carbon/graphics.cpp diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index c5d4b5b900..5b50bb5ff7 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/osx/carbon/dccg.cpp +// Name: src/osx/carbon/graphics.cpp // Purpose: wxDC class // Author: Stefan Csomor // Modified by: @@ -225,7 +225,7 @@ class ImagePattern : public wxMacCoreGraphicsPattern public : ImagePattern( const wxBitmap* bmp , const CGAffineTransform& transform ) { - wxASSERT( bmp && bmp->Ok() ); + wxASSERT( bmp && bmp->IsOk() ); #ifdef __WXMAC__ Init( (CGImageRef) bmp->CreateCGImage() , transform ); #endif @@ -500,7 +500,7 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer case wxPENSTYLE_STIPPLE: { wxBitmap* bmp = pen.GetStipple(); - if ( bmp && bmp->Ok() ) + if ( bmp && bmp->IsOk() ) { m_colorSpace.reset( CGColorSpaceCreatePattern( NULL ) ); m_pattern.reset( (CGPatternRef) *( new ImagePattern( bmp , CGAffineTransformMakeScale( 1,-1 ) ) ) ); @@ -647,7 +647,7 @@ wxMacCoreGraphicsColour::wxMacCoreGraphicsColour( const wxBrush &brush ) { // now brush is a bitmap wxBitmap* bmp = brush.GetStipple(); - if ( bmp && bmp->Ok() ) + if ( bmp && bmp->IsOk() ) { m_isPattern = true; m_patternColorComponents = new CGFloat[1] ; @@ -978,6 +978,14 @@ public: virtual CGImageRef GetBitmap() { 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; @@ -993,6 +1001,18 @@ wxMacCoreGraphicsBitmapData::~wxMacCoreGraphicsBitmapData() CGImageRelease( m_bitmap ); } +#if wxUSE_IMAGE + +wxImage wxGraphicsBitmap::ConvertToImage() const +{ + wxMacCoreGraphicsBitmapData* const + data = static_cast(GetRefData()); + + return data ? data->ConvertToImage() : wxNullImage; +} + +#endif // wxUSE_IMAGE + // // Graphics Matrix // @@ -1384,15 +1404,10 @@ public: wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer); - wxMacCoreGraphicsContext(); - ~wxMacCoreGraphicsContext(); void Init(); - // returns the size of the graphics context in device coordinates - virtual void GetSize( wxDouble* width, wxDouble* height); - virtual void StartPage( wxDouble width, wxDouble height ); virtual void EndPage(); @@ -1418,6 +1433,8 @@ public: virtual bool SetAntialiasMode(wxAntialiasMode antialias); + virtual bool SetInterpolationQuality(wxInterpolationQuality interpolation); + virtual bool SetCompositionMode(wxCompositionMode op); virtual void BeginLayer(wxDouble opacity); @@ -1460,6 +1477,9 @@ public: virtual bool ShouldOffset() const { + if ( !m_enableOffset ) + return false; + int penwidth = 0 ; if ( !m_pen.IsNull() ) { @@ -1487,10 +1507,15 @@ public: 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 ); + + // fast convenience methods + + + virtual void DrawRectangleX( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); void SetNativeContext( CGContextRef cg ); - DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacCoreGraphicsContext) + wxDECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext); private: bool EnsureIsValid(); @@ -1506,8 +1531,6 @@ private: #endif bool m_contextSynthesized; CGAffineTransform m_windowTransform; - wxDouble m_width; - wxDouble m_height; bool m_invisible; #if wxOSX_USE_COCOA_OR_CARBON @@ -1531,8 +1554,6 @@ private: // wxMacCoreGraphicsContext implementation //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxMacCoreGraphicsContext, wxGraphicsContext) - class wxQuartzOffsetHelper { public : @@ -1575,6 +1596,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) @@ -1590,6 +1613,7 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer { Init(); m_windowRef = window; + m_enableOffset = true; } #endif @@ -1597,6 +1621,7 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer { Init(); + m_enableOffset = true; wxSize sz = window->GetSize(); m_width = sz.x; m_height = sz.y; @@ -1633,23 +1658,11 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext(wxGraphicsRenderer* renderer) Init(); } -wxMacCoreGraphicsContext::wxMacCoreGraphicsContext() : wxGraphicsContext(NULL) -{ - Init(); - wxLogDebug(wxT("Illegal Constructor called")); -} - wxMacCoreGraphicsContext::~wxMacCoreGraphicsContext() { SetNativeContext(NULL); } -void wxMacCoreGraphicsContext::GetSize( wxDouble* width, wxDouble* height) -{ - *width = m_width; - *height = m_height; -} - void wxMacCoreGraphicsContext::StartPage( wxDouble width, wxDouble height ) { @@ -1709,16 +1722,10 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() if ( m_cgContext ) { CGContextSaveGState( m_cgContext ); - CGContextConcatCTM( m_cgContext, m_windowTransform ); - CGContextSetTextMatrix( m_cgContext, CGAffineTransformIdentity ); - m_contextSynthesized = true; #if wxOSX_USE_COCOA_OR_CARBON if ( m_clipRgn.get() ) { - // the clip region is in device coordinates, so we convert this again to user coordinates wxCFRef hishape( HIShapeCreateMutableCopy( m_clipRgn ) ); - CGPoint transformedOrigin = CGPointApplyAffineTransform( CGPointZero,m_windowTransform); - HIShapeOffset( hishape, -transformedOrigin.x, -transformedOrigin.y ); // if the shape is empty, HIShapeReplacePathInCGContext doesn't work if ( HIShapeIsEmpty(hishape)) { @@ -1732,6 +1739,9 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() } } #endif + CGContextConcatCTM( m_cgContext, m_windowTransform ); + CGContextSetTextMatrix( m_cgContext, CGAffineTransformIdentity ); + m_contextSynthesized = true; CGContextSaveGState( m_cgContext ); #if 0 // turn on for debugging of clientdc @@ -1781,6 +1791,45 @@ bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) return true; } +bool wxMacCoreGraphicsContext::SetInterpolationQuality(wxInterpolationQuality interpolation) +{ + 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); + return true; +} + bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) { if (!EnsureIsValid()) @@ -1961,6 +2010,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 ); + r.size= CGSizeApplyAffineTransform(r.size, m_windowTransform); m_clipRgn.reset(HIShapeCreateWithRect(&r)); #else // allow usage as measuring context @@ -2181,7 +2231,7 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble CGRect r = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h ); if ( refdata->IsMonochrome() == 1 ) { - // is is a mask, the '1' in the mask tell where to draw the current brush + // is a mask, the '1' in the mask tell where to draw the current brush if ( !m_brush.IsNull() ) { if ( ((wxMacCoreGraphicsBrushData*)m_brush.GetRefData())->IsShading() ) @@ -2261,10 +2311,16 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo 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) ); @@ -2277,6 +2333,19 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo CGContextScaleCTM(m_cgContext, 1, -1); CGContextSetTextPosition(m_cgContext, 0, 0); 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 ); return; @@ -2387,8 +2456,8 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") ); Rect rect; - x += (int)(sin(angle) * FixedToInt(ascent)); - y += (int)(cos(angle) * FixedToInt(ascent)); + x += (int)(sin(angle) * FixedToFloat(ascent)); + y += (int)(cos(angle) * FixedToFloat(ascent)); status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd, IntToFixed(x) , IntToFixed(y) , &rect ); @@ -2446,13 +2515,8 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); - // round the returned extent: this is probably more correct anyhow but - // we also need to do it to be consistent with GetPartialTextExtents() - // below and avoid strange situation when the last partial extent - // returned by it could have been greater than the full extent returned - // by us - CGFloat a, d, l; - int w = CTLineGetTypographicBounds(line, &a, &d, &l) + 0.5; + CGFloat a, d, l, w; + w = CTLineGetTypographicBounds(line, &a, &d, &l); if ( height ) *height = a+d+l; @@ -2489,13 +2553,13 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid &textBefore , &textAfter, &textAscent , &textDescent ); if ( height ) - *height = FixedToInt(textAscent + textDescent); + *height = FixedToFloat(textAscent + textDescent); if ( descent ) - *descent = FixedToInt(textDescent); + *descent = FixedToFloat(textDescent); if ( externalLeading ) *externalLeading = 0; if ( width ) - *width = FixedToInt(textAfter - textBefore); + *width = FixedToFloat(textAfter - textBefore); ::ATSUDisposeTextLayout(atsuLayout); @@ -2512,7 +2576,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid *height = sz.height; /* if ( descent ) - *descent = FixedToInt(textDescent); + *descent = FixedToFloat(textDescent); if ( externalLeading ) *externalLeading = 0; */ @@ -2583,7 +2647,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr if (result != noErr || actualNumberOfBounds != 1 ) return; - widths[pos] = FixedToInt( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ); + widths[pos] = FixedToFloat( glyphBounds.upperRight.x - glyphBounds.upperLeft.x ); //unsigned char uch = s[i]; } #else @@ -2603,7 +2667,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr { for ( int pos = 1; pos < (int)glyphCount ; pos ++ ) { - widths[pos-1] = FixedToInt( layoutRecords[pos].realPos ); + widths[pos-1] = FixedToFloat( layoutRecords[pos].realPos ); } } @@ -2624,6 +2688,27 @@ void * wxMacCoreGraphicsContext::GetNativeContext() return m_cgContext; } + +void wxMacCoreGraphicsContext::DrawRectangleX( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + if (m_composition == wxCOMPOSITION_DEST) + return; + + CGRect rect = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h ); + if ( !m_brush.IsNull() ) + { + ((wxMacCoreGraphicsBrushData*)m_brush.GetRefData())->Apply(this); + CGContextFillRect(m_cgContext, rect); + } + + wxQuartzOffsetHelper helper( m_cgContext , ShouldOffset() ); + if ( !m_pen.IsNull() ) + { + ((wxMacCoreGraphicsPenData*)m_pen.GetRefData())->Apply(this); + CGContextStrokeRect(m_cgContext, rect); + } +} + // concatenates this transform with the current transform of this context void wxMacCoreGraphicsContext::ConcatTransform( const wxGraphicsMatrix& matrix ) { @@ -2658,6 +2743,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 // @@ -2687,6 +2815,10 @@ public : virtual wxGraphicsContext * CreateContext( wxWindow* window ); +#if wxUSE_IMAGE + virtual wxGraphicsContext * CreateContextFromImage(wxImage& image); +#endif // wxUSE_IMAGE + virtual wxGraphicsContext * CreateMeasuringContext(); // Path @@ -2716,10 +2848,18 @@ 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); +#endif // wxUSE_IMAGE + // create a graphics bitmap from a native bitmap virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); @@ -2756,8 +2896,12 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxWindowDC& if (win_impl->GetWindow()) cgctx = (CGContextRef)(win_impl->GetWindow()->MacGetCGContextRef()); - if (cgctx != 0) - return new wxMacCoreGraphicsContext( this, cgctx, (wxDouble) w, (wxDouble) h ); + // having a cgctx being NULL is fine (will be created on demand) + // this is the case for all wxWindowDCs except wxPaintDC + wxMacCoreGraphicsContext *context = + new wxMacCoreGraphicsContext( this, cgctx, (wxDouble) w, (wxDouble) h ); + context->EnableOffset(true); + return context; } return NULL; } @@ -2771,8 +2915,10 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxMemoryDC& { int w, h; mem_impl->GetSize( &w, &h ); - return new wxMacCoreGraphicsContext( this, + wxMacCoreGraphicsContext* context = new wxMacCoreGraphicsContext( this, (CGContextRef)(mem_impl->GetGraphicsContext()->GetNativeContext()), (wxDouble) w, (wxDouble) h ); + context->EnableOffset(true); + return context; } #endif return NULL; @@ -2804,7 +2950,9 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeContext( v wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeWindow( void * window ) { #if wxOSX_USE_CARBON - return new wxMacCoreGraphicsContext(this,(WindowRef)window); + wxMacCoreGraphicsContext* context = new wxMacCoreGraphicsContext(this,(WindowRef)window); + context->EnableOffset(true); + return context; #else wxUnusedVar(window); return NULL; @@ -2821,6 +2969,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() @@ -2845,7 +3003,7 @@ wxGraphicsMatrix wxMacCoreGraphicsRenderer::CreateMatrix( wxDouble a, wxDouble b wxGraphicsPen wxMacCoreGraphicsRenderer::CreatePen(const wxPen& pen) { - if ( !pen.Ok() || pen.GetStyle() == wxTRANSPARENT ) + if ( !pen.IsOk() || pen.GetStyle() == wxTRANSPARENT ) return wxNullGraphicsPen; else { @@ -2857,7 +3015,7 @@ wxGraphicsPen wxMacCoreGraphicsRenderer::CreatePen(const wxPen& pen) wxGraphicsBrush wxMacCoreGraphicsRenderer::CreateBrush(const wxBrush& brush ) { - if ( !brush.Ok() || brush.GetStyle() == wxTRANSPARENT ) + if ( !brush.IsOk() || brush.GetStyle() == wxTRANSPARENT ) return wxNullGraphicsBrush; else { @@ -2869,7 +3027,7 @@ wxGraphicsBrush wxMacCoreGraphicsRenderer::CreateBrush(const wxBrush& brush ) wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmap( const wxBitmap& bmp ) { - if ( bmp.Ok() ) + if ( bmp.IsOk() ) { wxGraphicsBitmap p; p.SetRefData(new wxMacCoreGraphicsBitmapData( this , bmp.CreateCGImage(), bmp.GetDepth() == 1 ) ); @@ -2879,6 +3037,20 @@ 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)); +} + +#endif // wxUSE_IMAGE + wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmapFromNativeBitmap( void* bitmap ) { if ( bitmap != NULL ) @@ -2931,10 +3103,9 @@ wxMacCoreGraphicsRenderer::CreateRadialGradientBrush(wxDouble xo, wxDouble yo, return p; } -// sets the font wxGraphicsFont wxMacCoreGraphicsRenderer::CreateFont( const wxFont &font , const wxColour &col ) { - if ( font.Ok() ) + if ( font.IsOk() ) { wxGraphicsFont p; p.SetRefData(new wxMacCoreGraphicsFontData( this , font, col )); @@ -2944,6 +3115,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 //