X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bf02a7f9761ce9c0a1279ae958a0e5d53f603e15..a45c9ba59b610080585f76b0d02e1f1499c96ffe:/src/osx/carbon/graphics.cpp diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index bb499d3df2..99e1921ebf 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -72,10 +72,12 @@ int UMAGetSystemVersion() #endif #if wxOSX_USE_COCOA_OR_IPHONE -extern CGContextRef wxOSXGetContextFromCurrentNSContext() ; +extern CGContextRef wxOSXGetContextFromCurrentContext() ; +#if wxOSX_USE_COCOA extern bool wxOSXLockFocus( WXWidget view) ; extern void wxOSXUnlockFocus( WXWidget view) ; #endif +#endif #if 1 // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 @@ -96,7 +98,7 @@ typedef enum CGCompositeOperation { kCGCompositeOperationDestinationAtop = 9, kCGCompositeOperationXOR = 10, kCGCompositeOperationPlusDarker = 11, -// NS only, unsupported by CG : Highlight +// NS only, unsupported by CG : Highlight kCGCompositeOperationPlusLighter = 12 } CGCompositeOperation ; @@ -171,7 +173,7 @@ CGColorRef wxMacCreateCGColor( const wxColour& col ) CTFontRef wxMacCreateCTFont( const wxFont& font ) { #ifdef __WXMAC__ - return wxCFRetain((CTFontRef) font.MacGetCTFont()); + return wxCFRetain((CTFontRef) font.OSXGetCTFont()); #else return CTFontCreateWithName( wxCFStringRef( font.GetFaceName(), wxLocale::GetSystemEncoding() ) , font.GetPointSize() , NULL ); #endif @@ -451,32 +453,32 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer switch ( pen.GetStyle() ) { - case wxSOLID : + case wxPENSTYLE_SOLID: break; - case wxDOT : + case wxPENSTYLE_DOT: m_count = WXSIZEOF(dotted); m_userLengths = new CGFloat[ m_count ] ; memcpy( m_userLengths, dotted, sizeof(dotted) ); m_lengths = m_userLengths; break; - case wxLONG_DASH : + case wxPENSTYLE_LONG_DASH: m_count = WXSIZEOF(dashed); m_lengths = dashed; break; - case wxSHORT_DASH : + case wxPENSTYLE_SHORT_DASH: m_count = WXSIZEOF(short_dashed); m_lengths = short_dashed; break; - case wxDOT_DASH : + case wxPENSTYLE_DOT_DASH: m_count = WXSIZEOF(dotted_dashed); m_lengths = dotted_dashed; break; - case wxUSER_DASH : + case wxPENSTYLE_USER_DASH: wxDash *dashes; m_count = pen.GetDashes( &dashes ); if ((dashes != NULL) && (m_count > 0)) @@ -495,7 +497,7 @@ wxMacCoreGraphicsPenData::wxMacCoreGraphicsPenData( wxGraphicsRenderer* renderer m_lengths = m_userLengths; break; - case wxSTIPPLE : + case wxPENSTYLE_STIPPLE: { wxBitmap* bmp = pen.GetStipple(); if ( bmp && bmp->Ok() ) @@ -571,20 +573,6 @@ void wxMacCoreGraphicsPenData::Apply( wxGraphicsContext* context ) // Brush // -static const char *gs_stripedback_xpm[] = { -/* columns rows colors chars-per-pixel */ -"4 4 2 1", -". c #F0F0F0", -"X c #ECECEC", -/* pixels */ -"....", -"....", -"XXXX", -"XXXX" -}; - -wxBitmap gs_stripedback_bmp( wxImage( (const char* const* ) gs_stripedback_xpm ), -1 ) ; - // make sure we all use one class for all conversions from wx to native colour class wxMacCoreGraphicsColour @@ -815,7 +803,7 @@ public: virtual ATSUStyle GetATSUStyle() { return m_macATSUIStyle; } #endif #if wxOSX_USE_CORE_TEXT - CTFontRef GetCTFont() const { return m_ctFont ; } + CTFontRef OSXGetCTFont() const { return m_ctFont ; } #endif wxColour GetColour() const { return m_colour ; } @@ -853,13 +841,13 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere OSStatus status = noErr; m_macATSUIStyle = NULL; - status = ATSUCreateAndcopyStyle( (ATSUStyle) font.MacGetATSUStyle() , &m_macATSUIStyle ); + status = ATSUCreateAndCopyStyle( (ATSUStyle) font.MacGetATSUStyle() , &m_macATSUIStyle ); wxASSERT_MSG( status == noErr, wxT("couldn't create ATSU style") ); // we need the scale here ... - Fixed atsuSize = IntToFixed( int( 1 * font.MacGetFontSize()) ); + Fixed atsuSize = IntToFixed( int( 1 * font.GetPointSize()) ); RGBColor atsuColor ; col.GetRGBColor( &atsuColor ); ATSUAttributeTag atsuTags[] = @@ -867,19 +855,19 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere kATSUSizeTag , kATSUColorTag , }; - ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ByteCount atsuSizes[WXSIZEOF(atsuTags)] = { sizeof( Fixed ) , sizeof( RGBColor ) , }; - ATSUAttributeValuePtr atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = { &atsuSize , &atsuColor , }; status = ::ATSUSetAttributes( - m_macATSUIStyle, sizeof(atsuTags) / sizeof(ATSUAttributeTag) , + m_macATSUIStyle, WXSIZEOF(atsuTags), atsuTags, atsuSizes, atsuValues); wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ); @@ -1150,9 +1138,12 @@ public : // appends a rectangle as a new closed subpath virtual void AddRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); - // appends an ellipsis as a new closed subpath fitting the passed rectangle + // appends a circle as a new closed subpath virtual void AddCircle( wxDouble x, wxDouble y, wxDouble r ); + // appends an ellipsis as a new closed subpath fitting the passed rectangle + virtual void AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h); + // draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) virtual void AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ); @@ -1229,7 +1220,12 @@ void wxMacCoreGraphicsPathData::AddRectangle( wxDouble x, wxDouble y, wxDouble w void wxMacCoreGraphicsPathData::AddCircle( wxDouble x, wxDouble y , wxDouble r ) { - CGPathAddArc( m_path , NULL , (CGFloat) x , (CGFloat) y , (CGFloat) r , (CGFloat) 0.0 , (CGFloat) (2 * M_PI) , true ); + CGPathAddEllipseInRect( m_path, NULL, CGRectMake(x-r,y-r,2*r,2*r)); +} + +void wxMacCoreGraphicsPathData::AddEllipse( wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + CGPathAddEllipseInRect( m_path, NULL, CGRectMake(x,y,w,h)); } // adds an arc of a circle centering at (x,y) with radius (r) from startAngle to endAngle @@ -1347,7 +1343,7 @@ public: virtual void BeginLayer(wxDouble opacity); virtual void EndLayer(); - + // // transformation // @@ -1465,14 +1461,18 @@ public : m_cg = cg; m_offset = offset; if ( m_offset ) - CGContextTranslateCTM( m_cg, (CGFloat) 0.5, (CGFloat) 0.5 ); + { + m_userOffset = CGContextConvertSizeToUserSpace( m_cg, CGSizeMake( 0.5 , 0.5 ) ); + CGContextTranslateCTM( m_cg, m_userOffset.width , m_userOffset.height ); + } } ~wxQuartzOffsetHelper( ) { if ( m_offset ) - CGContextTranslateCTM( m_cg, (CGFloat) -0.5, (CGFloat) -0.5 ); + CGContextTranslateCTM( m_cg, -m_userOffset.width , -m_userOffset.height ); } public : + CGSize m_userOffset; CGContextRef m_cg; bool m_offset; } ; @@ -1519,12 +1519,14 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer #if wxOSX_USE_COCOA_OR_IPHONE m_view = window->GetHandle(); - if ( !((wxWidgetCocoaImpl*) window->GetPeer())->IsFlipped() ) +#if wxOSX_USE_COCOA + if ( ! window->GetPeer()->IsFlipped() ) { m_windowTransform = CGAffineTransformMakeTranslation( 0 , m_height ); m_windowTransform = CGAffineTransformScale( m_windowTransform , 1 , -1 ); } else +#endif { m_windowTransform = CGAffineTransformIdentity; } @@ -1593,18 +1595,25 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() { if (m_invisible) return false; - -#if wxOSX_USE_COCOA_OR_IPHONE + +#if wxOSX_USE_COCOA if ( wxOSXLockFocus(m_view) ) { - m_cgContext = wxOSXGetContextFromCurrentNSContext(); - wxASSERT_MSG( m_cgContext != NULL, _T("Unable to retrieve drawing context from View")); + m_cgContext = wxOSXGetContextFromCurrentContext(); + wxASSERT_MSG( m_cgContext != NULL, wxT("Unable to retrieve drawing context from View")); } else { m_invisible = true; } #endif +#if wxOSX_USE_IPHONE + m_cgContext = wxOSXGetContextFromCurrentContext(); + if ( m_cgContext == NULL ) + { + m_invisible = true; + } +#endif #if wxOSX_USE_CARBON OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext ); if ( status != noErr ) @@ -1614,9 +1623,11 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() #endif if ( m_cgContext ) { - CGContextConcatCTM( m_cgContext, m_windowTransform ); 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 @@ -1635,8 +1646,9 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() CGContextClip( m_cgContext ); } } +#endif CGContextSaveGState( m_cgContext ); - + #if 0 // turn on for debugging of clientdc static float color = 0.5 ; static int channel = 0 ; @@ -1660,14 +1672,14 @@ bool wxMacCoreGraphicsContext::EnsureIsValid() bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return true; if (m_antialias == antialias) return true; - + m_antialias = antialias; - + bool antialiasMode; switch (antialias) { @@ -1686,19 +1698,18 @@ bool wxMacCoreGraphicsContext::SetAntialiasMode(wxAntialiasMode antialias) bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return true; if ( m_composition == op ) return true; - + m_composition = op; - + if (m_composition == wxCOMPOSITION_DEST) return true; - + #if wxOSX_USE_COCOA_OR_CARBON -#if 1 // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 if ( UMAGetSystemVersion() < 0x1060 ) { CGCompositeOperation cop = kCGCompositeOperationSourceOver; @@ -1706,41 +1717,43 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) switch( op ) { case wxCOMPOSITION_CLEAR: - cop = kCGCompositeOperationClear; + cop = kCGCompositeOperationClear; break; case wxCOMPOSITION_SOURCE: - cop = kCGCompositeOperationCopy; + cop = kCGCompositeOperationCopy; break; case wxCOMPOSITION_OVER: - mode = kCGBlendModeNormal; + mode = kCGBlendModeNormal; break; case wxCOMPOSITION_IN: - cop = kCGCompositeOperationSourceIn; + cop = kCGCompositeOperationSourceIn; break; case wxCOMPOSITION_OUT: - cop = kCGCompositeOperationSourceOut; + cop = kCGCompositeOperationSourceOut; break; case wxCOMPOSITION_ATOP: - cop = kCGCompositeOperationSourceAtop; + cop = kCGCompositeOperationSourceAtop; break; case wxCOMPOSITION_DEST_OVER: - cop = kCGCompositeOperationDestinationOver; + cop = kCGCompositeOperationDestinationOver; break; case wxCOMPOSITION_DEST_IN: - cop = kCGCompositeOperationDestinationIn; + cop = kCGCompositeOperationDestinationIn; break; case wxCOMPOSITION_DEST_OUT: - cop = kCGCompositeOperationDestinationOut; + cop = kCGCompositeOperationDestinationOut; break; case wxCOMPOSITION_DEST_ATOP: - cop = kCGCompositeOperationDestinationAtop; + cop = kCGCompositeOperationDestinationAtop; break; case wxCOMPOSITION_XOR: - cop = kCGCompositeOperationXOR; + 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; } @@ -1749,47 +1762,47 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) else CGContextSetBlendMode(m_cgContext, mode); } - else -#endif #endif +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 + else { CGBlendMode mode = kCGBlendModeNormal; switch( op ) { case wxCOMPOSITION_CLEAR: - mode = kCGBlendModeClear; + mode = kCGBlendModeClear; break; case wxCOMPOSITION_SOURCE: - mode = kCGBlendModeCopy; + mode = kCGBlendModeCopy; break; case wxCOMPOSITION_OVER: - mode = kCGBlendModeNormal; + mode = kCGBlendModeNormal; break; case wxCOMPOSITION_IN: - mode = kCGBlendModeSourceIn; + mode = kCGBlendModeSourceIn; break; case wxCOMPOSITION_OUT: - mode = kCGBlendModeSourceOut; + mode = kCGBlendModeSourceOut; break; case wxCOMPOSITION_ATOP: - mode = kCGBlendModeSourceAtop; + mode = kCGBlendModeSourceAtop; break; case wxCOMPOSITION_DEST_OVER: - mode = kCGBlendModeDestinationOver; + mode = kCGBlendModeDestinationOver; break; case wxCOMPOSITION_DEST_IN: - mode = kCGBlendModeDestinationIn; + mode = kCGBlendModeDestinationIn; break; case wxCOMPOSITION_DEST_OUT: - mode = kCGBlendModeDestinationOut; + mode = kCGBlendModeDestinationOut; break; case wxCOMPOSITION_DEST_ATOP: - mode = kCGBlendModeDestinationAtop; + mode = kCGBlendModeDestinationAtop; break; case wxCOMPOSITION_XOR: - mode = kCGBlendModeXOR; + mode = kCGBlendModeXOR; break; - + case wxCOMPOSITION_ADD: mode = kCGBlendModePlusLighter ; break; @@ -1798,13 +1811,14 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op) } CGContextSetBlendMode(m_cgContext, mode); } +#endif return true; } void wxMacCoreGraphicsContext::BeginLayer(wxDouble opacity) { CGContextSaveGState(m_cgContext); - CGContextSetAlpha(m_cgContext, opacity); + CGContextSetAlpha(m_cgContext, (CGFloat) opacity); CGContextBeginTransparencyLayer(m_cgContext, 0); } @@ -1901,9 +1915,9 @@ void wxMacCoreGraphicsContext::StrokePath( const wxGraphicsPath &path ) if ( m_pen.IsNull() ) return ; - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -1916,9 +1930,9 @@ void wxMacCoreGraphicsContext::StrokePath( const wxGraphicsPath &path ) void wxMacCoreGraphicsContext::DrawPath( const wxGraphicsPath &path , wxPolygonFillMode fillStyle ) { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -1972,9 +1986,9 @@ void wxMacCoreGraphicsContext::FillPath( const wxGraphicsPath &path , wxPolygonF if ( m_brush.IsNull() ) return; - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -2008,13 +2022,10 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) CGContextRestoreGState( m_cgContext ); if ( m_contextSynthesized ) { - // TODO: in case of performance problems, try issuing this not too - // frequently (half of refresh rate) - CGContextFlush(m_cgContext); #if wxOSX_USE_CARBON QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext); #endif -#if wxOSX_USE_COCOA_OR_IPHONE +#if wxOSX_USE_COCOA wxOSXUnlockFocus(m_view); #endif } @@ -2073,12 +2084,12 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDo void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; if (m_composition == wxCOMPOSITION_DEST) return; - + #ifdef __WXMAC__ wxMacCoreGraphicsBitmapData* refdata =static_cast(bmp.GetRefData()); CGImageRef image = refdata->GetBitmap(); @@ -2115,9 +2126,9 @@ void wxMacCoreGraphicsContext::DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -2134,17 +2145,17 @@ void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDoubl void wxMacCoreGraphicsContext::PushState() { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + CGContextSaveGState( m_cgContext ); } void wxMacCoreGraphicsContext::PopState() { - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + CGContextRestoreGState( m_cgContext ); } @@ -2152,9 +2163,9 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo { wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") ); - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -2163,7 +2174,7 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); - CTFontRef font = fref->GetCTFont(); + CTFontRef font = fref->OSXGetCTFont(); CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); CTUnderlineStyle ustyle = fref->GetUnderlined() ? kCTUnderlineStyleSingle : kCTUnderlineStyleNone ; wxCFRef underlined( CFNumberCreate(NULL, kCFNumberSInt32Type, &ustyle) ); @@ -2177,7 +2188,7 @@ void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDo y += CTFontGetAscent(font); CGContextSaveGState(m_cgContext); - CGContextTranslateCTM(m_cgContext, x, y); + CGContextTranslateCTM(m_cgContext, (CGFloat) x, (CGFloat) y); CGContextScaleCTM(m_cgContext, 1, -1); CGContextSetTextPosition(m_cgContext, 0, 0); CTLineDraw( line, m_cgContext ); @@ -2215,9 +2226,9 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, { wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") ); - if (EnsureIsValid()==false) + if (!EnsureIsValid()) return; - + if (m_composition == wxCOMPOSITION_DEST) return; @@ -2253,15 +2264,15 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, { kATSULineRotationTag , }; - ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ByteCount atsuSizes[WXSIZEOF(atsuTags)] = { sizeof( Fixed ) , }; - ATSUAttributeValuePtr atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = { &atsuAngle , }; - status = ::ATSUSetLayoutControls(atsuLayout , sizeof(atsuTags) / sizeof(ATSUAttributeTag), + status = ::ATSUSetLayoutControls(atsuLayout , WXSIZEOF(atsuTags), atsuTags, atsuSizes, atsuValues ); } @@ -2270,15 +2281,15 @@ void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, { kATSUCGContextTag , }; - ByteCount atsuSizes[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ByteCount atsuSizes[WXSIZEOF(atsuTags)] = { sizeof( CGContextRef ) , }; - ATSUAttributeValuePtr atsuValues[sizeof(atsuTags) / sizeof(ATSUAttributeTag)] = + ATSUAttributeValuePtr atsuValues[WXSIZEOF(atsuTags)] = { &m_cgContext , }; - status = ::ATSUSetLayoutControls(atsuLayout , sizeof(atsuTags) / sizeof(ATSUAttributeTag), + status = ::ATSUSetLayoutControls(atsuLayout , WXSIZEOF(atsuTags), atsuTags, atsuSizes, atsuValues ); } @@ -2340,7 +2351,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid if ( UMAGetSystemVersion() >= 0x1050 ) { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); - CTFontRef font = fref->GetCTFont(); + CTFontRef font = fref->OSXGetCTFont(); wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); CFStringRef keys[] = { kCTFontAttributeName }; @@ -2350,9 +2361,13 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid wxCFRef attrtext( CFAttributedStringCreate(kCFAllocatorDefault, text, attributes) ); wxCFRef line( CTLineCreateWithAttributedString(attrtext) ); - CGFloat w, a, d, l; - - w = CTLineGetTypographicBounds(line, &a, &d, &l) ; + // 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; if ( height ) *height = a+d+l; @@ -2434,7 +2449,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr #if wxOSX_USE_CORE_TEXT { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); - CTFontRef font = fref->GetCTFont(); + CTFontRef font = fref->OSXGetCTFont(); wxCFStringRef t(text, wxLocale::GetSystemEncoding() ); CFStringRef keys[] = { kCTFontAttributeName }; @@ -2447,7 +2462,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr int chars = text.length(); for ( int pos = 0; pos < (int)chars; pos ++ ) { - widths[pos] = CTLineGetOffsetForStringIndex( line, pos+1 , NULL )+0.5; + widths[pos] = CTLineGetOffsetForStringIndex( line, pos+1 , NULL ); } return; @@ -2618,6 +2633,9 @@ public : // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) ; + // create a graphics bitmap from a native bitmap + virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); + // create a native bitmap representation virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) ; private : @@ -2701,6 +2719,7 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeWindow( vo #if wxOSX_USE_CARBON return new wxMacCoreGraphicsContext(this,(WindowRef)window); #else + wxUnusedVar(window); return NULL; #endif } @@ -2766,9 +2785,19 @@ wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmap( const wxBitmap& bmp ) if ( bmp.Ok() ) { wxGraphicsBitmap p; -#ifdef __WXMAC__ p.SetRefData(new wxMacCoreGraphicsBitmapData( this , bmp.CreateCGImage(), bmp.GetDepth() == 1 ) ); -#endif + return p; + } + else + return wxNullGraphicsBitmap; +} + +wxGraphicsBitmap wxMacCoreGraphicsRenderer::CreateBitmapFromNativeBitmap( void* bitmap ) +{ + if ( bitmap != NULL ) + { + wxGraphicsBitmap p; + p.SetRefData(new wxMacCoreGraphicsBitmapData( this , (CGImageRef) bitmap, false )); return p; } else