]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/graphics.cpp
wxUSE_PROPGRID is now recognized by source and header files
[wxWidgets.git] / src / osx / carbon / graphics.cpp
index 37596e8268e9696370c97effd2e443ebd85844ad..436b9f8dd1ca660fe9aed703784f14663cc33438 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/mac/carbon/dccg.cpp
+// Name:        src/osx/carbon/dccg.cpp
 // Purpose:     wxDC class
 // Author:      Stefan Csomor
 // Modified by:
 #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<HIShapeRef> 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 &region )
 {
-#ifdef __WXMAC__
+#if wxOSX_USE_CARBON
     if( m_cgContext )
     {
         wxCFRef<HIShapeRef> shape = wxCFRefFromGet(region.GetWXHRGN());
@@ -1623,6 +1665,9 @@ void wxMacCoreGraphicsContext::Clip( const wxRegion &region )
         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 )