X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f0c8f31f407ecfce909060464c0ea655221cdab..f4bc1aa27cb33f679d7e9c1518a7855bbc1fa471:/src/osx/carbon/graphics.cpp diff --git a/src/osx/carbon/graphics.cpp b/src/osx/carbon/graphics.cpp index 37596e8268..436b9f8dd1 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: @@ -35,8 +35,16 @@ #endif #ifdef __WXMAC__ - #include "wx/osx/uma.h" + #include "wx/osx/private.h" #include "wx/osx/dcprint.h" + #include "wx/osx/dcclient.h" + #include "wx/osx/dcmemory.h" +#if wxOSX_USE_CARBON +#include "wx/osx/uma.h" +#else +#include "wx/osx/private.h" +#endif + #else #include "CoreServices/CoreServices.h" #include "ApplicationServices/ApplicationServices.h" @@ -64,7 +72,7 @@ int UMAGetSystemVersion() } -#define wxMAC_USE_CORE_TEXT 1 +#define wxOSX_USE_CORE_TEXT 1 #endif @@ -92,12 +100,17 @@ OSStatus wxMacDrawCGImage( const CGRect * inBounds, CGImageRef inImage) { -#if defined( __LP64__ ) || defined(__WXCOCOA__) - // todo flip - CGContextDrawImage(inContext, *inBounds, inImage ); - return noErr; -#else +#if wxOSX_USE_CARBON return HIViewDrawCGImage( inContext, inBounds, inImage ); +#else + 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 } @@ -122,7 +135,7 @@ CGColorRef wxMacCreateCGColor( const wxColour& col ) return retval; } -#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 && defined(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 ) { @@ -758,30 +771,44 @@ CGFunctionRef wxMacCoreGraphicsBrushData::CreateGradientFunction( const wxColour // Font // +#if wxOSX_USE_IPHONE + +extern UIFont* CreateUIFont( const wxFont& font ); +extern void DrawTextInContext( CGContextRef context, CGPoint where, UIFont *font, NSString* text ); +extern CGSize MeasureTextInContext( UIFont *font, NSString* text ); + +#endif + class wxMacCoreGraphicsFontData : public wxGraphicsObjectRefData { 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 ; } bool GetUnderlined() const { return m_underlined ; } +#if wxOSX_USE_IPHONE + UIFont* GetUIFont() const { return m_uiFont; } +#endif 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 + UIFont* m_uiFont; +#endif }; wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* renderer, const wxFont &font, const wxColour& col) : wxGraphicsObjectRefData( renderer ) @@ -789,10 +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 wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_IPHONE + m_uiFont = CreateUIFont(font); + wxMacCocoaRetain( m_uiFont ); +#endif +#if wxOSX_USE_ATSU_TEXT OSStatus status = noErr; m_macATSUIStyle = NULL; @@ -827,22 +858,21 @@ wxMacCoreGraphicsFontData::wxMacCoreGraphicsFontData(wxGraphicsRenderer* rendere wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ); #endif -#if wxMAC_USE_CG_TEXT -#endif } 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); m_macATSUIStyle = NULL; } #endif -#if wxMAC_USE_CG_TEXT +#if wxOSX_USE_IPHONE + wxMacCocoaRelease( m_uiFont ); #endif } @@ -1244,7 +1274,9 @@ class WXDLLEXPORT wxMacCoreGraphicsContext : public wxGraphicsContext public: wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, CGContextRef cgcontext, wxDouble width = 0, wxDouble height = 0 ); +#if wxOSX_USE_CARBON wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ); +#endif wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window ); @@ -1353,20 +1385,23 @@ public: void SetNativeContext( CGContextRef cg ); - DECLARE_NO_COPY_CLASS(wxMacCoreGraphicsContext) - DECLARE_DYNAMIC_CLASS(wxMacCoreGraphicsContext) + DECLARE_DYNAMIC_CLASS_NO_COPY(wxMacCoreGraphicsContext) private: void EnsureIsValid(); CGContextRef m_cgContext; +#if wxOSX_USE_CARBON WindowRef m_windowRef; +#endif bool m_releaseContext; CGAffineTransform m_windowTransform; wxDouble m_width; wxDouble m_height; +#if wxOSX_USE_CARBON wxCFRef m_clipRgn; +#endif }; //----------------------------------------------------------------------------- @@ -1411,7 +1446,9 @@ void wxMacCoreGraphicsContext::Init() { m_cgContext = NULL; m_releaseContext = false; +#if wxOSX_USE_CARBON m_windowRef = NULL; +#endif m_width = 0; m_height = 0; } @@ -1424,11 +1461,13 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer m_height = height; } +#if wxOSX_USE_CARBON wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, WindowRef window ): wxGraphicsContext(renderer) { Init(); m_windowRef = window; } +#endif wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer, wxWindow* window ): wxGraphicsContext(renderer) { @@ -1438,7 +1477,7 @@ wxMacCoreGraphicsContext::wxMacCoreGraphicsContext( wxGraphicsRenderer* renderer originX = originY = 0; Rect bounds = { 0,0,0,0 }; -#if defined( __LP64__ ) || defined(__WXCOCOA__) +#if defined(__WXCOCOA__) || !wxOSX_USE_CARBON #else m_windowRef = (WindowRef) window->MacGetTopLevelWindowRef(); window->MacWindowToRootWindow( &originX , &originY ); @@ -1499,12 +1538,10 @@ void wxMacCoreGraphicsContext::EnsureIsValid() { if ( !m_cgContext ) { - OSStatus status = -#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) ) - QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext ); +#if defined(__WXCOCOA__) || ! wxOSX_USE_CARBON + wxFAIL_MSG("Cannot create wxDCs lazily"); #else - paramErr; -#endif + OSStatus status = QDBeginCGContext( GetWindowPort( m_windowRef ) , &m_cgContext ); if ( status != noErr ) { wxFAIL_MSG("Cannot nest wxDCs on the same window"); @@ -1532,6 +1569,7 @@ void wxMacCoreGraphicsContext::EnsureIsValid() } } CGContextSaveGState( m_cgContext ); +#endif } } @@ -1548,8 +1586,12 @@ bool wxMacCoreGraphicsContext::SetLogicalFunction( int function ) bool shouldAntiAlias = true; CGBlendMode mode = kCGBlendModeNormal; -#if defined(__WXMAC__) && ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ) +#if defined(__WXMAC__) && ( wxOSX_USE_IPHONE || ( MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ) ) +#if wxOSX_USE_IPHONE + if ( 1 ) +#else if ( UMAGetSystemVersion() >= 0x1050 ) +#endif { retval = true; switch ( function ) @@ -1597,7 +1639,7 @@ bool wxMacCoreGraphicsContext::SetLogicalFunction( int function ) void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion ) { -#ifdef __WXMAC__ +#if wxOSX_USE_CARBON if( m_cgContext ) { wxCFRef shape = wxCFRefFromGet(region.GetWXHRGN()); @@ -1623,6 +1665,9 @@ void wxMacCoreGraphicsContext::Clip( const wxRegion ®ion ) HIShapeOffset( mutableShape, transformedOrigin.x, transformedOrigin.y ); m_clipRgn.reset(mutableShape); } +#else + // allow usage as measuring context + // wxASSERT_MSG( m_cgContext != NULL, "Needs a valid context for clipping" ); #endif } @@ -1636,10 +1681,15 @@ void wxMacCoreGraphicsContext::Clip( wxDouble x, wxDouble y, wxDouble w, wxDoubl } else { +#if wxOSX_USE_CARBON // the clipping itself must be stored as device coordinates, otherwise // we cannot apply it back correctly r.origin= CGPointApplyAffineTransform( r.origin, m_windowTransform ); m_clipRgn.reset(HIShapeCreateWithRect(&r)); +#else + // allow usage as measuring context + // wxFAIL_MSG( "Needs a valid context for clipping" ); +#endif } } @@ -1660,7 +1710,12 @@ void wxMacCoreGraphicsContext::ResetClip() } else { +#if wxOSX_USE_CARBON m_clipRgn.reset(); +#else + // allow usage as measuring context + // wxFAIL_MSG( "Needs a valid context for clipping" ); +#endif } } @@ -1765,7 +1820,7 @@ void wxMacCoreGraphicsContext::SetNativeContext( CGContextRef cg ) CGContextRestoreGState( m_cgContext ); if ( m_releaseContext ) { -#if ! ( defined( __LP64__ ) || defined(__WXCOCOA__) ) +#if wxOSX_USE_CARBON QDEndCGContext( GetWindowPort( m_windowRef ) , &m_cgContext); #endif } @@ -1868,7 +1923,7 @@ void wxMacCoreGraphicsContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDoubl CGContextSaveGState( m_cgContext ); CGContextTranslateCTM( m_cgContext,(CGFloat) x ,(CGFloat) (y + h) ); CGContextScaleCTM( m_cgContext, 1, -1 ); -#ifdef __WXMAC__ +#if wxOSX_USE_CARBON PlotIconRefInContext( m_cgContext , &r , kAlignNone , kTransformNone , NULL , kPlotIconRefNormalFlags , MAC_WXHICON( icon.GetHICON() ) ); #endif @@ -1891,11 +1946,10 @@ void wxMacCoreGraphicsContext::PopState() void wxMacCoreGraphicsContext::DrawText( 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(); @@ -1923,24 +1977,35 @@ 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 - // TODO core graphics text implementation here +#if wxOSX_USE_IPHONE + wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData(); + + CGContextSaveGState(m_cgContext); + + CGColorRef col = wxMacCreateCGColor( fref->GetColour() ); + CGContextSetTextDrawingMode (m_cgContext, kCGTextFill); + CGContextSetFillColorWithColor( m_cgContext, col ); + + wxCFStringRef text(str, wxLocale::GetSystemEncoding() ); + DrawTextInContext( m_cgContext, CGPointMake( x, y ), fref->GetUIFont() , text.AsNSString() ); + + CGContextRestoreGState(m_cgContext); + CFRelease( col ); #endif } void wxMacCoreGraphicsContext::DrawText( 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 @@ -1948,7 +2013,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; @@ -2032,7 +2097,7 @@ 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 ); #endif @@ -2041,7 +2106,7 @@ void wxMacCoreGraphicsContext::DrawText( const wxString &str, wxDouble x, wxDoub 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; @@ -2055,7 +2120,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(); @@ -2084,7 +2149,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid return; } #endif -#if wxMAC_USE_ATSU_TEXT +#if wxOSX_USE_ATSU_TEXT { OSStatus status = noErr; @@ -2121,8 +2186,22 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid return; } #endif -#if wxMAC_USE_CG_TEXT - // TODO core graphics text implementation here +#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; + /* + if ( descent ) + *descent = FixedToInt(textDescent); + if ( externalLeading ) + *externalLeading = 0; + */ + if ( width ) + *width = sz.width; #endif } @@ -2131,10 +2210,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(); @@ -2156,7 +2237,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; @@ -2217,7 +2298,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 } @@ -2280,7 +2361,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 ); @@ -2338,7 +2421,7 @@ wxGraphicsRenderer* wxGraphicsRenderer::GetDefaultRenderer() return &gs_MacCoreGraphicsRenderer; } -#ifdef __WXCOCOA__ +#if defined( __WXCOCOA__ ) || wxOSX_USE_COCOA extern CGContextRef wxMacGetContextFromCurrentNSContext() ; #endif @@ -2377,6 +2460,7 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxMemoryDC& return NULL; } +#if wxUSE_PRINTING_ARCHITECTURE wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxPrinterDC& dc ) { #ifdef __WXMAC__ @@ -2392,16 +2476,20 @@ wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( const wxPrinterDC& #endif return NULL; } +#endif wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeContext( void * context ) { return new wxMacCoreGraphicsContext(this,(CGContextRef)context); } - wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContextFromNativeWindow( void * window ) { +#if wxOSX_USE_CARBON return new wxMacCoreGraphicsContext(this,(WindowRef)window); +#else + return NULL; +#endif } wxGraphicsContext * wxMacCoreGraphicsRenderer::CreateContext( wxWindow* window )