]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
Renamed DrawCheckButton due to conflict with existing and public api of wxUniversal...
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 776f63b21fcfd32a89ce320f1fe9cc739e79723a..1d07f860742f8c50ef6b9db940aec53317544f10 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        dc.cpp
+// Name:        src/mac/carbon/dc.cpp
 // Purpose:     wxDC class
 // Author:      Stefan Csomor
 // Modified by:
 #include "wx/dc.h"
 
 #if !wxMAC_USE_CORE_GRAPHICS
-#include "wx/app.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/log.h"
+    #include "wx/app.h"
+#endif
+
 #include "wx/mac/uma.h"
 #include "wx/dcmemory.h"
 #include "wx/dcprint.h"
 #include "wx/region.h"
 #include "wx/image.h"
-#include "wx/log.h"
 
 #ifdef __MSL__
     #if __MSL__ >= 0x6000
 #include <TextEncodingConverter.h>
 #endif
 
+
+// set to 0 if problems arise
+#define wxMAC_EXPERIMENTAL_DC 1
+
+
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 
 //-----------------------------------------------------------------------------
@@ -48,8 +57,6 @@ const short kUnsupportedMode = -2 ;
 
 extern TECObjectRef s_TECNativeCToUnicode ;
 
-// set to 0 if problems arise
-#define wxMAC_EXPERIMENTAL_DC 1
 
 wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
     m_ph( (GrafPtr) dc->m_macPort )
@@ -113,7 +120,7 @@ wxMacWindowClipper::wxMacWindowClipper( const wxWindow* win ) :
         if ( win->GetPeer() )
         {
             int x = 0 , y = 0;
-            win->MacWindowToRootWindow( &x,&y ) ;
+            win->MacWindowToRootWindow( &x, &y ) ;
 
             // get area including focus rect
             CopyRgn( (RgnHandle) ((wxWindow*)win)->MacGetVisibleRegion(true).GetWXHRGN() , m_newClip ) ;
@@ -281,7 +288,6 @@ wxDC::wxDC()
     m_needComputeScaleY = false;
     m_macPort = NULL ;
     m_macMask = NULL ;
-    m_ok = false ;
     m_macFontInstalled = false ;
     m_macBrushInstalled = false ;
     m_macPenInstalled = false ;
@@ -406,8 +412,8 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
      }
      else
      {
-         RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF} ;
-         RGBColor black = { 0, 0, 0} ;
+         RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF } ;
+         RGBColor black = { 0, 0, 0 } ;
          RGBForeColor( &black ) ;
          RGBBackColor( &white ) ;
      }
@@ -459,7 +465,7 @@ void wxDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y )
     wxCoord ww = XLOG2DEVREL(w);
     wxCoord hh = YLOG2DEVREL(h);
 
-    Rect r = { yy , xx, yy + hh  , xx + ww } ;
+    Rect r = { yy , xx, yy + hh, xx + ww } ;
     PlotIconRef( &r , kAlignNone , kTransformNone , kPlotIconRefNormalFlags , MAC_WXHICON( icon.GetHICON() ) ) ;
 }
 
@@ -479,8 +485,8 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
     {
         m_clipX1 = wxMax( m_clipX1 , xx );
         m_clipY1 = wxMax( m_clipY1 , yy );
-        m_clipX2 = wxMin( m_clipX2, (xx + ww));
-        m_clipY2 = wxMin( m_clipY2, (yy + hh));
+        m_clipX2 = wxMin( m_clipX2, (xx + ww) );
+        m_clipY2 = wxMin( m_clipY2, (yy + hh) );
     }
     else
     {
@@ -492,7 +498,7 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
     }
 }
 
-void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
+void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region )
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoSetClippingRegionAsRegion - invalid DC"));
 
@@ -522,8 +528,8 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
         {
             m_clipX1 = wxMax( m_clipX1 , xx );
             m_clipY1 = wxMax( m_clipY1 , yy );
-            m_clipX2 = wxMin( m_clipX2, (xx + ww));
-            m_clipY2 = wxMin( m_clipY2, (yy + hh));
+            m_clipX2 = wxMin( m_clipX2, (xx + ww) );
+            m_clipY2 = wxMin( m_clipY2, (yy + hh) );
         }
         else
         {
@@ -750,9 +756,7 @@ bool wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const
     GetCPixel( XLOG2DEVMAC(x), YLOG2DEVMAC(y), &colour );
 
     // convert from Mac colour to wx
-    col->Set( colour.red   >> 8,
-        colour.green >> 8,
-        colour.blue  >> 8);
+    col->Set( colour.red >> 8, colour.green >> 8, colour.blue >> 8);
 
     return true ;
 }
@@ -767,7 +771,7 @@ void wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
     {
         MacInstallPen() ;
         wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 :
-        m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2;
+            m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2;
         wxCoord xx1 = XLOG2DEVMAC(x1) - offset;
         wxCoord yy1 = YLOG2DEVMAC(y1) - offset;
         wxCoord xx2 = XLOG2DEVMAC(x2) - offset;
@@ -862,7 +866,7 @@ void wxDC::DoDrawArc( wxCoord x1, wxCoord y1,
 
     double dx = xx1 - xxc;
     double dy = yy1 - yyc;
-    double radius = sqrt((double)(dx*dx+dy*dy));
+    double radius = sqrt((double)(dx * dx + dy * dy));
     wxCoord rad = (wxCoord)radius;
     double radius1, radius2;
 
@@ -879,10 +883,10 @@ void wxDC::DoDrawArc( wxCoord x1, wxCoord y1,
     {
         radius1 = (xx1 - xxc == 0) ?
             (yy1 - yyc < 0) ? 90.0 : -90.0 :
-        -atan2(double(yy1-yyc), double(xx1-xxc)) * RAD2DEG;
+        -atan2(double(yy1 - yyc), double(xx1 - xxc)) * RAD2DEG;
         radius2 = (xx2 - xxc == 0) ?
             (yy2 - yyc < 0) ? 90.0 : -90.0 :
-        -atan2(double(yy2-yyc), double(xx2-xxc)) * RAD2DEG;
+        -atan2(double(yy2 - yyc), double(xx2 - xxc)) * RAD2DEG;
     }
 
     wxCoord alpha2 = wxCoord(radius2 - radius1);
@@ -986,11 +990,12 @@ void wxDC::DoDrawLines(int n, wxPoint points[],
     MacInstallPen() ;
     wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 :
     m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2 ;
+
     wxCoord x1, x2 , y1 , y2 ;
     x1 = XLOG2DEVMAC(points[0].x + xoffset);
     y1 = YLOG2DEVMAC(points[0].y + yoffset);
 
-    ::MoveTo(x1 - offset, y1 - offset );
+    ::MoveTo( x1 - offset, y1 - offset );
     for (int i = 0; i < n-1; i++)
     {
         x2 = XLOG2DEVMAC(points[i + 1].x + xoffset);
@@ -1007,7 +1012,7 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[],
 
     if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT )
         return ;
-    
+
     wxMacFastPortSetter helper(this) ;
 
     wxCoord x1, x2 , y1 , y2 ;
@@ -1025,7 +1030,7 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[],
 
     // close the polyline if necessary
     if ( x1 != x2 || y1 != y2 )
-        ::LineTo(x1, y1 ) ;
+        ::LineTo( x1, y1 ) ;
     ClosePoly();
 
     if (m_brush.GetStyle() != wxTRANSPARENT)
@@ -1146,7 +1151,7 @@ void wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
     // CMB: draw nothing if transformed w or h is 0
     if (ww == 0 || hh == 0)
         return;
-    
+
     // CMB: handle -ve width and/or height
     if (ww < 0)
     {
@@ -1182,7 +1187,7 @@ bool wxDC::CanDrawBitmap(void) const
 
 bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                    wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask,
-                   wxCoord xsrcMask,  wxCoord ysrcMask )
+                   wxCoord xsrcMask, wxCoord ysrcMask )
 {
     wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit - invalid DC"));
     wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit - invalid source DC"));
@@ -1307,8 +1312,8 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
         else
         {
             // the modes need this, otherwise we'll end up having really nice colors...
-            RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF} ;
-            RGBColor black = { 0, 0, 0} ;
+            RGBColor white = { 0xFFFF, 0xFFFF, 0xFFFF } ;
+            RGBColor black = { 0, 0, 0 } ;
 
             RGBForeColor( &black ) ;
             RGBBackColor( &white ) ;
@@ -1373,7 +1378,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                                     GetCPixel( srcPoint.h , srcPoint.v , &srcColor ) ;
                                     SetPort( (GrafPtr) m_macPort ) ;
                                     GetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
-                                    wxMacCalculateColour( logical_func , srcColor ,  dstColor ) ;
+                                    wxMacCalculateColour( logical_func , srcColor , dstColor ) ;
                                     SetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
                                 }
                             }
@@ -1436,7 +1441,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                                 GetCPixel( srcPoint.h , srcPoint.v , &srcColor) ;
                                 SetPort( (GrafPtr) m_macPort ) ;
                                 GetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
-                                wxMacCalculateColour( logical_func , srcColor ,  dstColor ) ;
+                                wxMacCalculateColour( logical_func , srcColor , dstColor ) ;
                                 SetCPixel( dstPoint.h , dstPoint.v , &dstColor ) ;
                             }
                         }
@@ -1472,7 +1477,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     // TODO: support text background color (only possible by hand, ATSUI does not support it)
     wxCHECK_RET( Ok(), wxT("wxDC::DoDrawRotatedText - invalid DC") );
 
-    if ( str.Length() == 0 )
+    if ( str.empty() )
         return ;
 
     wxMacFastPortSetter helper(this) ;
@@ -1489,7 +1494,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
 
     OSStatus status = noErr ;
     ATSUTextLayout atsuLayout ;
-    UniCharCount chars = str.Length() ;
+    UniCharCount chars = str.length() ;
     UniChar* ubuf = NULL ;
 
 #if SIZEOF_WCHAR_T == 4
@@ -1500,7 +1505,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     converter.WC2MB( (char*) ubuf , str.wc_str(), unicharlen + 2 ) ;
 #else
     const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
-    size_t unicharlen = converter.WC2MB( NULL , wchar.data()  , 0 ) ;
+    size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ;
     ubuf = (UniChar*) malloc( unicharlen + 2 ) ;
     converter.WC2MB( (char*) ubuf , wchar.data() , unicharlen + 2 ) ;
 #endif
@@ -1554,8 +1559,8 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     status = ::ATSUMeasureText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
         &textBefore , &textAfter, &ascent , &descent );
 
-    drawX += (int)(sin(angle/RAD2DEG) * FixedToInt(ascent));
-    drawY += (int)(cos(angle/RAD2DEG) * FixedToInt(ascent));
+    drawX += (int)(sin(angle / RAD2DEG) * FixedToInt(ascent));
+    drawY += (int)(cos(angle / RAD2DEG) * FixedToInt(ascent));
     status = ::ATSUDrawText( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
         IntToFixed(drawX) , IntToFixed(drawY) );
 
@@ -1565,6 +1570,7 @@ void wxDC::DoDrawRotatedText(const wxString& str, wxCoord x, wxCoord y,
     status = ::ATSUMeasureTextImage( atsuLayout, kATSUFromTextBeginning, kATSUToTextEnd,
         IntToFixed(drawX) , IntToFixed(drawY) , &rect );
     wxASSERT_MSG( status == noErr , wxT("couldn't measure the rotated text") );
+
     OffsetRect( &rect , -m_macLocalOrigin.x , -m_macLocalOrigin.y ) ;
     CalcBoundingBox(XDEV2LOG(rect.left), YDEV2LOG(rect.top) );
     CalcBoundingBox(XDEV2LOG(rect.right), YDEV2LOG(rect.bottom) );
@@ -1732,9 +1738,9 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con
     wxCHECK_MSG(Ok(), false, wxT("wxDC::DoGetPartialTextExtents - invalid DC"));
 
     widths.Empty();
-    widths.Add(0, text.Length());
+    widths.Add(0, text.length());
 
-    if (text.Length() == 0)
+    if (text.length() == 0)
         return false;
 
     wxMacFastPortSetter helper(this) ;
@@ -1750,9 +1756,9 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con
         // If anybody knows how to do this more efficiently yet still handle
         // the fractional glyph widths that may be present when using AA
         // fonts, please change it.  Currently it is measuring from the
-        // begining of the string for each succeding substring, which is much
+        // beginning of the string for each succeeding substring, which is much
         // slower than this should be.
-        for (size_t i=0; i<text.Length(); i++)
+        for (size_t i=0; i<text.length(); i++)
         {
             wxString str(text.Left(i + 1));
             Point bounds = {0, 0};
@@ -1778,8 +1784,8 @@ bool wxDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) con
 
         // Copy to widths, starting at measurements[1]
         // NOTE: this doesn't take into account any multi-byte characters
-        // in buff, it probabkly should...
-        for (size_t i=0; i<text.Length(); i++)
+        // in buff, it probably should...
+        for (size_t i=0; i<text.length(); i++)
             widths[i] = XDEV2LOGREL(measurements[i + 1]);
 
         delete [] measurements;
@@ -1859,6 +1865,7 @@ void wxDC::MacInstallFont() const
 
     //    if ( m_macFontInstalled )
     //        return ;
+
     Pattern blackColor ;
     MacSetupBackgroundForCurrentPort(m_backgroundBrush) ;
     if ( m_backgroundMode != wxTRANSPARENT )
@@ -1942,18 +1949,15 @@ void wxDC::MacInstallFont() const
     {
             sizeof( Fixed ) ,
     } ;
-//    Boolean kTrue = true ;
-//    Boolean kFalse = false ;
-
-//    ATSUVerticalCharacterType kHorizontal = kATSUStronglyHorizontal;
     ATSUAttributeValuePtr    atsuValues[sizeof(atsuTags)/sizeof(ATSUAttributeTag)] =
     {
             &atsuSize ,
     } ;
+
     status = ::ATSUSetAttributes((ATSUStyle)m_macATSUIStyle, sizeof(atsuTags)/sizeof(ATSUAttributeTag) ,
         atsuTags, atsuSizes, atsuValues);
 
-    wxASSERT_MSG( status == noErr , wxT("couldn't Modify ATSU style") ) ;
+    wxASSERT_MSG( status == noErr , wxT("couldn't modify ATSU style") ) ;
 }
 
 Pattern gPatterns[] =
@@ -2007,19 +2011,21 @@ void wxDC::MacInstallPen() const
     //Pattern     blackColor;
     //    if ( m_macPenInstalled )
     //        return ;
+
     RGBColor forecolor = MAC_WXCOLORREF( m_pen.GetColour().GetPixel());
     RGBColor backcolor = MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel());
     ::RGBForeColor( &forecolor );
     ::RGBBackColor( &backcolor );
     ::PenNormal() ;
-    int penWidth = (int) (m_pen.GetWidth() * m_scaleX) ; ;
+
     // null means only one pixel, at whatever resolution
+    int penWidth = (int) (m_pen.GetWidth() * m_scaleX) ;
     if ( penWidth == 0 )
         penWidth = 1 ;
     ::PenSize(penWidth, penWidth);
 
-    int penStyle = m_pen.GetStyle();
     Pattern pat;
+    int penStyle = m_pen.GetStyle();
     if (penStyle == wxUSER_DASH)
     {
         // FIXME: there should be exactly 8 items in the dash
@@ -2096,6 +2102,7 @@ void wxDC::MacInstallPen() const
 void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background )
 {
     Pattern whiteColor ;
+
     if ( background.Ok() )
     {
         switch ( background.MacGetBrushKind() )
@@ -2108,7 +2115,7 @@ void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background )
             {
                 Rect extent ;
                 ThemeBackgroundKind bg = background.MacGetThemeBackground( &extent ) ;
-                ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ;
+                ::ApplyThemeBackground( bg , &extentkThemeStateActive , wxDisplayDepth() , true ) ;
             }
                 break ;
 
@@ -2140,10 +2147,11 @@ void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background )
 void wxDC::MacInstallBrush() const
 {
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
-    Pattern     blackColor ;
+
     //    if ( m_macBrushInstalled )
     //        return ;
-    // foreground
+
+    Pattern     blackColor ;
     bool backgroundTransparent = (GetBackgroundMode() == wxTRANSPARENT) ;
     ::RGBForeColor( &MAC_WXCOLORREF( m_brush.GetColour().GetPixel()) );
     ::RGBBackColor( &MAC_WXCOLORREF( m_backgroundBrush.GetColour().GetPixel()) );
@@ -2151,7 +2159,21 @@ void wxDC::MacInstallBrush() const
     int brushStyle = m_brush.GetStyle();
     if (brushStyle == wxSOLID)
     {
-        ::PenPat(GetQDGlobalsBlack(&blackColor));
+        switch ( m_brush.MacGetBrushKind() )
+        {
+            case kwxMacBrushTheme :
+                {
+                    Pattern whiteColor ;
+                    ::BackPat(GetQDGlobalsWhite(&whiteColor));
+                    ::SetThemePen( m_brush.MacGetTheme() , wxDisplayDepth() , true ) ;
+                }
+            break ;
+
+            default :
+                ::PenPat(GetQDGlobalsBlack(&blackColor));
+                break ;
+
+        }
     }
     else if (m_brush.IsHatch())
     {
@@ -2196,7 +2218,7 @@ void wxDC::MacInstallBrush() const
 
             for ( int i = 0 ; i < 8 ; ++i )
             {
-                pat.pat[i] = gwbits[i*alignment+0] ;
+                pat.pat[i] = gwbits[i * alignment + 0] ;
             }
 
             UnlockPixels( GetGWorldPixMap( gw ) ) ;