]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/graphics.cpp
avoid setting initial position if it was not specified, broken in r70734
[wxWidgets.git] / src / osx / carbon / graphics.cpp
index a1f994748960f38fe6fb36c20aa0f22038fed08e..ff015c21d99bd2c182f27fe85c86cfc36c174a68 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     01/02/97
-// RCS-ID:      $Id$
 // copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -147,9 +146,7 @@ OSStatus wxMacDrawCGImage(
 
 CGColorRef wxMacCreateCGColor( const wxColour& col )
 {
-    CGColorRef retval = 0;
-
-    retval = col.CreateCGColor();
+    CGColorRef retval = col.CreateCGColor();
 
     wxASSERT(retval != NULL);
     return retval;
@@ -1488,7 +1485,7 @@ public:
     // fast convenience methods
     
     
-    virtual void DrawRectangleX( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); 
+    virtual void DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); 
 
     void SetNativeContext( CGContextRef cg );
 
@@ -1921,7 +1918,7 @@ bool wxMacCoreGraphicsContext::SetCompositionMode(wxCompositionMode op)
            mode = kCGBlendModeDestinationAtop;
             break;
         case wxCOMPOSITION_XOR:
-            mode = kCGBlendModeXOR;
+            mode = kCGBlendModeExclusion; // Not kCGBlendModeXOR!
             break;
 
         case wxCOMPOSITION_ADD:
@@ -2514,15 +2511,19 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
     if ( externalLeading )
         *externalLeading = 0;
 
+    // In wxWidgets (MSW-inspired) API it is possible to call GetTextExtent()
+    // with an empty string to get just the descent and the leading of the
+    // font, so support this (mis)use.
+    wxString strToMeasure(str);
     if (str.empty())
-        return;
+        strToMeasure = wxS(" ");
 
 #if wxOSX_USE_CORE_TEXT
     {
         wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
         CTFontRef font = fref->OSXGetCTFont();
 
-        wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
+        wxCFStringRef text(strToMeasure, wxLocale::GetSystemEncoding() );
         CFStringRef keys[] = { kCTFontAttributeName  };
         CFTypeRef values[] = { font };
         wxCFRef<CFDictionaryRef> attributes( CFDictionaryCreate(kCFAllocatorDefault, (const void**) &keys, (const void**) &values,
@@ -2533,14 +2534,18 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
         CGFloat a, d, l, w;
         w = CTLineGetTypographicBounds(line, &a, &d, &l);
 
-        if ( height )
-            *height = a+d+l;
+        if ( !str.empty() )
+        {
+            if ( width )
+                *width = w;
+            if ( height )
+                *height = a+d+l;
+        }
+
         if ( descent )
             *descent = d;
         if ( externalLeading )
             *externalLeading = l;
-        if ( width )
-            *width = w;
         return;
     }
 #endif
@@ -2549,7 +2554,7 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
         OSStatus status = noErr;
 
         ATSUTextLayout atsuLayout;
-        wxMacUniCharBuffer unibuf( str );
+        wxMacUniCharBuffer unibuf( strToMeasure );
         UniCharCount chars = unibuf.GetChars();
 
         ATSUStyle style = (((wxMacCoreGraphicsFontData*)m_font.GetRefData())->GetATSUStyle());
@@ -2567,14 +2572,18 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
         status = ::ATSUGetUnjustifiedBounds( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
                                             &textBefore , &textAfter, &textAscent , &textDescent );
 
-        if ( height )
-            *height = FixedToFloat(textAscent + textDescent);
+        if ( !str.empty() )
+        {
+            if ( width )
+                *width = FixedToFloat(textAfter - textBefore);
+            if ( height )
+                *height = FixedToFloat(textAscent + textDescent);
+        }
+
         if ( descent )
             *descent = FixedToFloat(textDescent);
         if ( externalLeading )
             *externalLeading = 0;
-        if ( width )
-            *width = FixedToFloat(textAfter - textBefore);
 
         ::ATSUDisposeTextLayout(atsuLayout);
 
@@ -2584,19 +2593,23 @@ void wxMacCoreGraphicsContext::GetTextExtent( const wxString &str, wxDouble *wid
 #if wxOSX_USE_IPHONE
     wxMacCoreGraphicsFontData* fref = (wxMacCoreGraphicsFontData*)m_font.GetRefData();
 
-    wxCFStringRef text(str, wxLocale::GetSystemEncoding() );
+    wxCFStringRef text(strToMeasure, wxLocale::GetSystemEncoding() );
     CGSize sz = MeasureTextInContext( fref->GetUIFont() , text.AsNSString() );
 
-    if ( height )
-        *height = sz.height;
+    if ( !str.empty() )
+    {
+        if ( width )
+            *width = sz.width;
+        if ( height )
+            *height = sz.height;
+    }
+
         /*
     if ( descent )
         *descent = FixedToFloat(textDescent);
     if ( externalLeading )
         *externalLeading = 0;
         */
-    if ( width )
-        *width = sz.width;
 #endif
     
     CheckInvariants();    
@@ -2708,11 +2721,21 @@ void * wxMacCoreGraphicsContext::GetNativeContext()
 }
 
 
-void wxMacCoreGraphicsContext::DrawRectangleX( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
+void wxMacCoreGraphicsContext::DrawRectangle( wxDouble x, wxDouble y, wxDouble w, wxDouble h )
 {
+    if (!EnsureIsValid())
+        return;
+
     if (m_composition == wxCOMPOSITION_DEST) 
         return; 
 
+    // when using shading, we have to go back to drawing paths 
+    if ( !m_brush.IsNull() && ((wxMacCoreGraphicsBrushData*)m_brush.GetRefData())->IsShading() )
+    {
+        wxGraphicsContext::DrawRectangle( x,y,w,h );
+        return;
+    }
+
     CGRect rect = CGRectMake( (CGFloat) x , (CGFloat) y , (CGFloat) w , (CGFloat) h );
     if ( !m_brush.IsNull() )
     {