X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2680ced12cbbed16990007c5fa3ea7730700122..a881f34e499feadfef915b9d4c80e45a73ba37d4:/src/osx/carbon/graphics.cpp?ds=sidebyside diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index 1b0eca575a..27177ea1a5 100644 --- a/src/osx/carbon/graphics.cpp +++ b/src/osx/carbon/graphics.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/carbon/dccg.cpp +// Name: src/osx/carbon/dccg.cpp // Purpose: wxDC class // Author: Stefan Csomor // Modified by: @@ -72,7 +72,7 @@ int UMAGetSystemVersion() } -#define wxMAC_USE_CORE_TEXT 1 +#define wxOSX_USE_CORE_TEXT 1 #endif @@ -103,8 +103,13 @@ OSStatus wxMacDrawCGImage( #if wxOSX_USE_CARBON return HIViewDrawCGImage( inContext, inBounds, inImage ); #else - // todo flip - CGContextDrawImage(inContext, *inBounds, inImage ); + CGContextSaveGState(inContext); + CGContextTranslateCTM(inContext, inBounds->origin.x, inBounds->origin.y + inBounds->size.height); + CGRect r = *inBounds; + r.origin.x = r.origin.y = 0; + CGContextScaleCTM(inContext, 1, -1); + CGContextDrawImage(inContext, r, inImage ); + CGContextRestoreGState(inContext); return noErr; #endif } @@ -130,7 +135,7 @@ CGColorRef wxMacCreateCGColor( const wxColour& col ) return retval; } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && wxMAC_USE_CORE_TEXT +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && wxOSX_USE_CORE_TEXT CTFontRef wxMacCreateCTFont( const wxFont& font ) { @@ -685,7 +690,7 @@ void wxMacCoreGraphicsBrushData::CreateRadialGradientBrush( wxDouble xo, wxDoubl const wxColour &oColor, const wxColour &cColor ) { m_gradientFunction = CreateGradientFunction( oColor, cColor ); - m_shading = CGShadingCreateRadial( wxMacGetGenericRGBColorSpace(), CGPointMake((CGFloat) xo,(CGFloat) yo), 0, + m_shading = CGShadingCreateRadial( wxMacGetGenericRGBColorSpace(), CGPointMake((CGFloat) xo,(CGFloat) yo), 0, CGPointMake((CGFloat) xc,(CGFloat) yc), (CGFloat) radius, m_gradientFunction, true, true ) ; m_isShading = true ; } @@ -780,10 +785,10 @@ public: wxMacCoreGraphicsFontData( wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col ); ~wxMacCoreGraphicsFontData(); -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT virtual ATSUStyle GetATSUStyle() { return m_macATSUIStyle; } #endif -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT CTFontRef GetCTFont() const { return m_ctFont ; } #endif wxColour GetColour() const { return m_colour ; } @@ -795,10 +800,10 @@ public: private : wxColour m_colour; bool m_underlined; -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT ATSUStyle m_macATSUIStyle; #endif -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT wxCFRef< CTFontRef > m_ctFont; #endif #if wxOSX_USE_IPHONE @@ -811,14 +816,14 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere m_colour = col; m_underlined = font.GetUnderlined(); -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT m_ctFont.reset( wxMacCreateCTFont( font ) ); #endif #if wxOSX_USE_IPHONE m_uiFont = CreateUIFont(font); wxMacCocoaRetain( m_uiFont ); #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT OSStatus status = noErr; m_macATSUIStyle = NULL; @@ -857,9 +862,9 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere wxMacCoreGraphicsFontData::~wxMacCoreGraphicsFontData() { -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT if ( m_macATSUIStyle ) { ::ATSUDisposeStyle((ATSUStyle)m_macATSUIStyle); @@ -1359,10 +1364,6 @@ public: // text // - virtual void DrawText( const wxString &str, wxDouble x, wxDouble y ); - - virtual void DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ); - virtual void GetTextExtent( const wxString &text, wxDouble *width, wxDouble *height, wxDouble *descent, wxDouble *externalLeading ) const; @@ -1385,6 +1386,9 @@ public: private: void EnsureIsValid(); + virtual void DoDrawText( const wxString &str, wxDouble x, wxDouble y ); + virtual void DoDrawRotatedText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ); + CGContextRef m_cgContext; #if wxOSX_USE_CARBON WindowRef m_windowRef; @@ -1939,13 +1943,12 @@ void wxMacCoreGraphicsContext::PopState() CGContextRestoreGState( m_cgContext ); } -void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y ) +void wxMacCoreGraphicsContext::DoDrawText( const wxString &str, wxDouble x, wxDouble y ) { - if ( m_font.IsNull() ) - return; + wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") ); EnsureIsValid(); -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050 ) { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); @@ -1973,19 +1976,19 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub return; } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { DrawText(str, x, y, 0.0); return; } #endif -#if wxMAC_USE_CG_TEXT +#if wxOSX_USE_IPHONE wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); CGContextSaveGState(m_cgContext); CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); - CGContextSetTextDrawingMode (m_cgContext, kCGTextFill); + CGContextSetTextDrawingMode (m_cgContext, kCGTextFill); CGContextSetFillColorWithColor( m_cgContext, col ); wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); @@ -1996,13 +1999,14 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub #endif } -void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDouble y, wxDouble angle ) +void wxMacCoreGraphicsContext::DoDrawRotatedText(const wxString &str, + wxDouble x, wxDouble y, + wxDouble angle) { - if ( m_font.IsNull() ) - return; + wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") ); EnsureIsValid(); -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050 ) { // default implementation takes care of rotation and calls non rotated DrawText afterwards @@ -2010,7 +2014,7 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub return; } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { OSStatus status = noErr; ATSUTextLayout atsuLayout; @@ -2094,16 +2098,16 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub return; } #endif -#if wxMAC_USE_CG_TEXT +#if wxOSX_USE_IPHONE // default implementation takes care of rotation and calls non rotated DrawText afterwards - wxGraphicsContext::DrawText( str, x, y, angle ); + wxGraphicsContext::DoDrawRotatedText( str, x, y, angle ); #endif } void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height, wxDouble *descent, wxDouble *externalLeading ) const { - wxCHECK_RET( !m_font.IsNull(), wxT("wxDC(cg)::DoGetTextExtent - no valid font set") ); + wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::GetTextExtent - no valid font set") ); if ( width ) *width = 0; @@ -2117,7 +2121,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid if (str.empty()) return; -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT if ( UMAGetSystemVersion() >= 0x1050 ) { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); @@ -2146,7 +2150,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid return; } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { OSStatus status = noErr; @@ -2183,12 +2187,12 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid return; } #endif -#if wxMAC_USE_CG_TEXT +#if wxOSX_USE_IPHONE wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); CGSize sz = MeasureTextInContext( fref->GetUIFont() , text.AsNSString() ); - + if ( height ) *height = sz.height; /* @@ -2207,10 +2211,12 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr widths.Empty(); widths.Add(0, text.length()); + wxCHECK_RET( !m_font.IsNull(), wxT("wxMacCoreGraphicsContext::DrawText - no valid font set") ); + if (text.empty()) return; -#if wxMAC_USE_CORE_TEXT +#if wxOSX_USE_CORE_TEXT { wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); CTFontRef font = fref->GetCTFont(); @@ -2232,7 +2238,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr return; } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { OSStatus status = noErr; ATSUTextLayout atsuLayout; @@ -2268,7 +2274,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr #else ATSLayoutRecord *layoutRecords = NULL; ItemCount glyphCount = 0; - + // Get the glyph extents OSStatus err = ::ATSUDirectGetLayoutDataArrayPtrFromTextLayout(atsuLayout, 0, @@ -2277,7 +2283,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr &layoutRecords, &glyphCount); wxASSERT(glyphCount == (text.length()+1)); - + if ( err == noErr && glyphCount == (text.length()+1)) { for ( int pos = 1; pos < (int)glyphCount ; pos ++ ) @@ -2285,7 +2291,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr widths[pos-1] = FixedToInt( layoutRecords[pos].realPos ); } } - + ::ATSUDirectReleaseLayoutDataArrayPtr(NULL, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void **) &layoutRecords); @@ -2293,7 +2299,7 @@ void wxMacCoreGraphicsContext::GetPartialTextExtents(const wxString& text, wxArr ::ATSUDisposeTextLayout(atsuLayout); } #endif -#if wxMAC_USE_CG_TEXT +#if wxOSX_USE_IPHONE // TODO core graphics text implementation here #endif } @@ -2356,7 +2362,9 @@ public : virtual wxGraphicsContext * CreateContext( const wxWindowDC& dc); virtual wxGraphicsContext * CreateContext( const wxMemoryDC& dc); +#if wxUSE_PRINTING_ARCHITECTURE virtual wxGraphicsContext * CreateContext( const wxPrinterDC& dc); +#endif virtual wxGraphicsContext * CreateContextFromNativeContext( void * context ); @@ -2453,9 +2461,9 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxMemoryDC& return NULL; } +#if wxUSE_PRINTING_ARCHITECTURE wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxPrinterDC& dc ) { -#if wxUSE_PRINTING_ARCHITECTURE #ifdef __WXMAC__ const wxDCImpl* impl = dc.GetImpl(); wxPrinterDCImpl *print_impl = wxDynamicCast( impl, wxPrinterDCImpl ); @@ -2466,10 +2474,10 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxPrinterDC& return new wxMacCoreGraphicsContext( this, (CGContextRef)(print_impl->GetGraphicsContext()->GetNativeContext()), (wxDouble) w, (wxDouble) h ); } -#endif #endif return NULL; } +#endif wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeContext( void * context ) {