]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
wxRadioBox fixed on mac
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 1682209492529b1cfe5abd1cacf95ab92cad9d54..8285afd1c686e983ab0d3e0269956ff0ea9665fa 100644 (file)
 #endif
 
 #include "wx/dc.h"
 #endif
 
 #include "wx/dc.h"
+#include "wx/app.h"
 #include "wx/mac/uma.h"
 
 #include "wx/mac/uma.h"
 
+#if __MSL__ >= 0x6000
+#include "math.h"
+#endif
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #endif
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #endif
@@ -31,8 +36,6 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #define mm2pt                  2.83464566929
 #define pt2mm                  0.352777777778
 
 #define mm2pt                  2.83464566929
 #define pt2mm                  0.352777777778
 
-long wxDC::m_macCurrentPortId = 1 ;
-
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
@@ -40,18 +43,11 @@ long wxDC::m_macCurrentPortId = 1 ;
 wxDC::wxDC()
 {
   m_ok = FALSE;
 wxDC::wxDC()
 {
   m_ok = FALSE;
-  m_optimize = FALSE;
-  m_autoSetting = FALSE;
   m_colour = TRUE;
   m_colour = TRUE;
-  m_clipping = FALSE;
   
   m_mm_to_pix_x = mm2pt;
   m_mm_to_pix_y = mm2pt;
   
   
   m_mm_to_pix_x = mm2pt;
   m_mm_to_pix_y = mm2pt;
   
-  m_logicalOriginX = 0;
-  m_logicalOriginY = 0;
-  m_deviceOriginX = 0;
-  m_deviceOriginY = 0;
   m_internalDeviceOriginX = 0;
   m_internalDeviceOriginY = 0;
   m_externalDeviceOriginX = 0;
   m_internalDeviceOriginX = 0;
   m_internalDeviceOriginY = 0;
   m_externalDeviceOriginX = 0;
@@ -64,28 +60,12 @@ wxDC::wxDC()
   m_scaleX = 1.0;
   m_scaleY = 1.0;
   
   m_scaleX = 1.0;
   m_scaleY = 1.0;
   
-  m_mappingMode = wxMM_TEXT;
   m_needComputeScaleX = FALSE;
   m_needComputeScaleY = FALSE;
   
   m_needComputeScaleX = FALSE;
   m_needComputeScaleY = FALSE;
   
-  m_signX = 1;  // default x-axis left to right
-  m_signY = 1;  // default y-axis top down
-
   m_maxX = m_maxY = -100000;
   m_minY = m_minY =  100000;
 
   m_maxX = m_maxY = -100000;
   m_minY = m_minY =  100000;
 
-  m_logicalFunction = wxCOPY;
-//  m_textAlignment = wxALIGN_TOP_LEFT;
-  m_backgroundMode = wxTRANSPARENT;
-  
-  m_textForegroundColour = *wxBLACK;
-  m_textBackgroundColour = *wxWHITE;
-  m_pen = *wxBLACK_PEN;
-  m_font = *wxNORMAL_FONT;
-  m_brush = *wxTRANSPARENT_BRUSH;
-  m_backgroundBrush = *wxWHITE_BRUSH;
-  
-//  m_palette = wxAPP_COLOURMAP;
   m_macPort = NULL ;
   m_macMask = NULL ;
   m_ok = FALSE ;
   m_macPort = NULL ;
   m_macMask = NULL ;
   m_ok = FALSE ;
@@ -94,43 +74,36 @@ wxDC::wxDC()
        m_macBrushInstalled = false ;
        m_macPenInstalled = false ;
        
        m_macBrushInstalled = false ;
        m_macPenInstalled = false ;
        
-       m_macPortId = 0 ;
        m_macLocalOrigin.h = m_macLocalOrigin.v = 0 ;
        m_macClipRect.left = -32000 ;
        m_macClipRect.top = -32000 ;
        m_macClipRect.right = 32000 ;
        m_macClipRect.bottom = 32000 ;
        m_macLocalOrigin.h = m_macLocalOrigin.v = 0 ;
        m_macClipRect.left = -32000 ;
        m_macClipRect.top = -32000 ;
        m_macClipRect.right = 32000 ;
        m_macClipRect.bottom = 32000 ;
-       ::GetPort( &m_macOrigPort ) ;
+
+    m_pen = *wxBLACK_PEN;
+    m_font = *wxNORMAL_FONT;
+    m_brush = *wxWHITE_BRUSH;
 };
 
 };
 
+wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
+       m_ph( dc->m_macPort ) 
+{
+       wxASSERT( dc->Ok() ) ;
+       
+       dc->MacSetupPort(&m_ph) ;
+}
+
+wxMacPortSetter::~wxMacPortSetter() 
+{
+}
+
 wxDC::~wxDC(void)
 {
 wxDC::~wxDC(void)
 {
-       if ( !m_macPortHelper.IsCleared() )
-       {
-       GrafPtr port ;
-       GetPort( &port ) ;
-       SetPort( m_macPortHelper.GetCurrentPort() ) ;
-       SetOrigin( 0 , 0 ) ;
-       SetPort( port ) ;
-       }
-       /*
-       if ( m_macPort )
-       {
-               ::SetPort( m_macPort ) ;
-               ::SetOrigin( 0 , 0 ) ;
-               ::ClipRect( &m_macPort->portRect ) ;
-               ::PenNormal() ;
-               ::SetPort( m_macOrigPort ) ;
-       }
-       */
-       ++m_macCurrentPortId ;
 };
 
 };
 
-void wxDC::MacSetupPort() const
+void wxDC::MacSetupPort(AGAPortHelper* help) const
 {
 {
-       AGAPortHelper* help = &m_macPortHelper ;
        help->Setup( m_macPort ) ;
        help->Setup( m_macPort ) ;
-       m_macPortId = ++m_macCurrentPortId ;
        ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
        ::ClipRect(&m_macClipRect);
 
        ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
        ::ClipRect(&m_macClipRect);
 
@@ -145,7 +118,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
        
   if (!Ok()) 
        return;
        
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   long xx1 = XLOG2DEV(x); 
   long yy1 = YLOG2DEV(y);
   
   long xx1 = XLOG2DEV(x); 
   long yy1 = YLOG2DEV(y);
@@ -157,7 +130,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
     {
                        if ( bmap->m_bitmapType == kMacBitmapTypePict )
                        { 
     {
                        if ( bmap->m_bitmapType == kMacBitmapTypePict )
                        { 
-               Rect bitmaprect = { 0 , 0 , bmap->m_height * scale , bmap->m_width * scale} ;
+               Rect bitmaprect = { 0 , 0 , int(bmap->m_height * scale) , int(bmap->m_width * scale)} ;
                                ::OffsetRect( &bitmaprect , xx1 , yy1 ) ;
                                ::DrawPicture( bmap->m_hPict , &bitmaprect ) ;
                        }
                                ::OffsetRect( &bitmaprect , xx1 , yy1 ) ;
                                ::DrawPicture( bmap->m_hPict , &bitmaprect ) ;
                        }
@@ -214,7 +187,7 @@ void wxDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y )
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   long xx1 = XLOG2DEV(x); 
   long yy1 = YLOG2DEV(y);
   
   long xx1 = XLOG2DEV(x); 
   long yy1 = YLOG2DEV(y);
@@ -233,7 +206,7 @@ void wxDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y )
 
 void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
 
 void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
-       MacVerifySetup() ;
+       wxMacPortSetter helper(this) ;
        if( m_clipping )
        {
                m_clipX1 = wxMax( m_clipX1 , x ) ;
        if( m_clipping )
        {
                m_clipX1 = wxMax( m_clipX1 , x ) ;
@@ -266,7 +239,7 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 {
     wxCHECK_RET( Ok(), wxT("invalid window dc") );
 
 {
     wxCHECK_RET( Ok(), wxT("invalid window dc") );
 
-       MacVerifySetup() ;
+       wxMacPortSetter helper(this) ;
     if (region.Empty())
     {
         DestroyClippingRegion();
     if (region.Empty())
     {
         DestroyClippingRegion();
@@ -280,7 +253,7 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 
 void wxDC::DestroyClippingRegion(void)
 {
 
 void wxDC::DestroyClippingRegion(void)
 {
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   m_clipping = FALSE;
 //     Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
        ::ClipRect(&m_macClipRect);
   m_clipping = FALSE;
 //     Rect clip = { -32000 , -32000 , 32000 , 32000 } ;
        ::ClipRect(&m_macClipRect);
@@ -427,7 +400,12 @@ void wxDC::ComputeScaleAndOrigin(void)
   // CMB: if scale has changed call SetPen to recalulate the line width 
   if (m_scaleX != origScaleX || m_scaleY != origScaleY)
   {
   // CMB: if scale has changed call SetPen to recalulate the line width 
   if (m_scaleX != origScaleX || m_scaleY != origScaleY)
   {
-       // TODO : set internal flags for recalc
+    // this is a bit artificial, but we need to force wxDC to think
+    // the pen has changed
+    wxPen* pen = & GetPen();
+    wxPen tempPen;
+    m_pen = tempPen;
+    SetPen(* pen);
   }
 };
 
   }
 };
 
@@ -445,7 +423,7 @@ void  wxDC::SetFont( const wxFont &font )
   if (!Ok()) 
        return;
        
   if (!Ok()) 
        return;
        
-  MacVerifySetup() ;
+//  wxMacPortSetter helper(this) ;
   
   m_font = font;
   m_macFontInstalled = false ;
   
   m_font = font;
   m_macFontInstalled = false ;
@@ -456,7 +434,7 @@ void  wxDC::SetPen( const wxPen &pen )
   if (!Ok()  ) 
        return;
 
   if (!Ok()  ) 
        return;
 
-  MacVerifySetup() ;
+//  wxMacPortSetter helper(this) ;
 
        if ( m_pen == pen )
                return ;
 
        if ( m_pen == pen )
                return ;
@@ -473,7 +451,7 @@ void  wxDC::SetBrush( const wxBrush &brush )
 {
   if (!Ok() ) 
        return;
 {
   if (!Ok() ) 
        return;
-  MacVerifySetup() ;
+//  wxMacPortSetter helper(this) ;
   
   if (m_brush == brush) 
        return;
   
   if (m_brush == brush) 
        return;
@@ -486,7 +464,7 @@ void  wxDC::SetBackground( const wxBrush &brush )
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+//  wxMacPortSetter helper(this) ;
   
   if (m_backgroundBrush == brush) 
        return;
   
   if (m_backgroundBrush == brush) 
        return;
@@ -524,12 +502,12 @@ void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
   if (!Ok()) 
        return;
        
   if (!Ok()) 
        return;
        
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   if (m_pen.GetStyle() != wxTRANSPARENT)
   {
                MacInstallPen() ;
   
   if (m_pen.GetStyle() != wxTRANSPARENT)
   {
                MacInstallPen() ;
-               int offset = (m_pen.GetWidth()  - 1) / 2 ;      
+               int offset = ( (m_pen.GetWidth() == 0 ? 1 : m_pen.GetWidth() ) * m_scaleX - 1) / 2 ;    
        long xx1 = XLOG2DEV(x1); 
        long yy1 = YLOG2DEV(y1);
        long xx2 = XLOG2DEV(x2); 
        long xx1 = XLOG2DEV(x1); 
        long yy1 = YLOG2DEV(y1);
        long xx2 = XLOG2DEV(x2); 
@@ -560,7 +538,7 @@ void  wxDC::DoDrawPoint( wxCoord x, wxCoord y )
   if (!Ok()) 
        return;
        
   if (!Ok()) 
        return;
        
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   if (m_pen.GetStyle() != wxTRANSPARENT) 
   {
   
   if (m_pen.GetStyle() != wxTRANSPARENT) 
   {
@@ -578,24 +556,24 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   if (m_pen.GetStyle() == wxTRANSPARENT) 
        return;
 
   
   if (m_pen.GetStyle() == wxTRANSPARENT) 
        return;
 
-       MacInstallPen() ;
+  MacInstallPen() ;
   
   
-       int offset = (m_pen.GetWidth()  - 1 ) / 2 ;     
+  int offset = (m_pen.GetWidth() - 1 ) / 2 ;   
   long x1, x2 , y1 , y2 ;
   x1 = XLOG2DEV(points[0].x + xoffset);
   long x1, x2 , y1 , y2 ;
   x1 = XLOG2DEV(points[0].x + xoffset);
-       y1 = YLOG2DEV(points[0].y + yoffset);   
-       ::MoveTo(x1 - offset ,y1 - offset );
+  y1 = YLOG2DEV(points[0].y + yoffset);   
+  ::MoveTo(x1 - offset ,y1 - offset );
   
   for (int i = 0; i < n-1; i++)
   {
   
   for (int i = 0; i < n-1; i++)
   {
-    long x2 = XLOG2DEV(points[i+1].x + xoffset);
-    long y2 = YLOG2DEV(points[i+1].y + yoffset);
-               ::LineTo(x2 - offset  , y2 - offset );
+    x2 = XLOG2DEV(points[i+1].x + xoffset);
+    y2 = YLOG2DEV(points[i+1].y + yoffset);
+    ::LineTo(x2 - offset  , y2 - offset );
   }
 }
 
   }
 }
 
@@ -605,19 +583,19 @@ void  wxDC::DoDrawPolygon(int n, wxPoint points[],
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
   
   PolyHandle polygon = OpenPoly() ;
   long x1, x2 , y1 , y2 ;
   x1 = XLOG2DEV(points[0].x + xoffset);
   
   PolyHandle polygon = OpenPoly() ;
   long x1, x2 , y1 , y2 ;
   x1 = XLOG2DEV(points[0].x + xoffset);
-       y1 = YLOG2DEV(points[0].y + yoffset);   
-       ::MoveTo(x1,y1);
+  y1 = YLOG2DEV(points[0].y + yoffset);   
+  ::MoveTo(x1,y1);
   
   for (int i = 0; i < n-1; i++)
   {
   
   for (int i = 0; i < n-1; i++)
   {
-    long x2 = XLOG2DEV(points[i+1].x + xoffset);
-    long y2 = YLOG2DEV(points[i+1].y + yoffset);
-               ::LineTo(x2, y2);
+    x2 = XLOG2DEV(points[i+1].x + xoffset);
+    y2 = YLOG2DEV(points[i+1].y + yoffset);
+    ::LineTo(x2, y2);
   }
 
   ClosePoly() ;
   }
 
   ClosePoly() ;
@@ -639,7 +617,7 @@ void  wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
        
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
        
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
@@ -684,7 +662,7 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
        
   if (radius < 0.0) 
        radius = - radius * ((width < height) ? width : height);
        
   if (radius < 0.0) 
        radius = - radius * ((width < height) ? width : height);
@@ -716,13 +694,13 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
        if (m_brush.GetStyle() != wxTRANSPARENT) 
        {
                MacInstallBrush() ;
        if (m_brush.GetStyle() != wxTRANSPARENT) 
        {
                MacInstallBrush() ;
-               ::PaintRoundRect( &rect , radius * 2 , radius * 2 ) ;
+               ::PaintRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ;
        };
        
        if (m_pen.GetStyle() != wxTRANSPARENT) 
        {
                MacInstallPen() ;
        };
        
        if (m_pen.GetStyle() != wxTRANSPARENT) 
        {
                MacInstallPen() ;
-               ::FrameRoundRect( &rect , radius * 2 , radius * 2 ) ;
+               ::FrameRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ;
        };
 }
 
        };
 }
 
@@ -730,7 +708,7 @@ void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
 
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
 
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
@@ -769,171 +747,6 @@ void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
        };
 }
 
        };
 }
 
-// ----------------------------------- spline code ----------------------------------------
-
-static void wx_quadratic_spline(double a1, double b1, double a2, double b2,
-                         double a3, double b3, double a4, double b4);
-static void wx_clear_stack(void);
-static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
-        double *y3, double *x4, double *y4);
-static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
-          double x4, double y4);
-static bool wx_spline_add_point(double x, double y);
-static void wx_spline_draw_point_array(wxDC *dc);
-
-static wxList wx_spline_point_list;
-
-#define                half(z1, z2)    ((z1+z2)/2.0)
-#define                THRESHOLD       5
-
-/* iterative version */
-
-static void wx_quadratic_spline(double a1, double b1, double a2, double b2, double a3, double b3, double a4,
-                 double b4)
-{
-    register double  xmid, ymid;
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-
-    wx_clear_stack();
-    wx_spline_push(a1, b1, a2, b2, a3, b3, a4, b4);
-
-    while (wx_spline_pop(&x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4)) {
-        xmid = (double)half(x2, x3);
-        ymid = (double)half(y2, y3);
-       if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD &&
-           fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD) {
-            wx_spline_add_point( x1, y1 );
-            wx_spline_add_point( xmid, ymid );
-       } else {
-            wx_spline_push(xmid, ymid, (double)half(xmid, x3), (double)half(ymid, y3),
-                 (double)half(x3, x4), (double)half(y3, y4), x4, y4);
-            wx_spline_push(x1, y1, (double)half(x1, x2), (double)half(y1, y2),
-                 (double)half(x2, xmid), (double)half(y2, ymid), xmid, ymid);
-       }
-    }
-}
-
-/* utilities used by spline drawing routines */
-
-typedef struct wx_spline_stack_struct {
-    double           x1, y1, x2, y2, x3, y3, x4, y4;
-} Stack;
-
-#define         SPLINE_STACK_DEPTH             20
-static Stack    wx_spline_stack[SPLINE_STACK_DEPTH];
-static Stack   *wx_stack_top;
-static int      wx_stack_count;
-
-static void wx_clear_stack(void)
-{
-    wx_stack_top = wx_spline_stack;
-    wx_stack_count = 0;
-}
-
-static void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
-{
-    wx_stack_top->x1 = x1;
-    wx_stack_top->y1 = y1;
-    wx_stack_top->x2 = x2;
-    wx_stack_top->y2 = y2;
-    wx_stack_top->x3 = x3;
-    wx_stack_top->y3 = y3;
-    wx_stack_top->x4 = x4;
-    wx_stack_top->y4 = y4;
-    wx_stack_top++;
-    wx_stack_count++;
-}
-
-static int wx_spline_pop(double *x1, double *y1, double *x2, double *y2,
-                  double *x3, double *y3, double *x4, double *y4)
-{
-    if (wx_stack_count == 0)
-       return (0);
-    wx_stack_top--;
-    wx_stack_count--;
-    *x1 = wx_stack_top->x1;
-    *y1 = wx_stack_top->y1;
-    *x2 = wx_stack_top->x2;
-    *y2 = wx_stack_top->y2;
-    *x3 = wx_stack_top->x3;
-    *y3 = wx_stack_top->y3;
-    *x4 = wx_stack_top->x4;
-    *y4 = wx_stack_top->y4;
-    return (1);
-}
-
-static bool wx_spline_add_point(double x, double y)
-{
-  wxPoint *point = new wxPoint ;
-  point->x = (int) x;
-  point->y = (int) y;
-  wx_spline_point_list.Append((wxObject*)point);
-  return TRUE;
-}
-
-static void wx_spline_draw_point_array(wxDC *dc)
-{
-  dc->DrawLines(&wx_spline_point_list, 0, 0 );
-  wxNode *node = wx_spline_point_list.First();
-  while (node)
-  {
-    wxPoint *point = (wxPoint *)node->Data();
-    delete point;
-    delete node;
-    node = wx_spline_point_list.First();
-  }
-}
-
-void  wxDC::DoDrawSpline(wxList *points)
-{
-    wxPoint *p;
-    double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
-    double           x1, y1, x2, y2;
-
-    wxNode *node = points->First();
-    p = (wxPoint *)node->Data();
-
-    x1 = p->x;
-    y1 = p->y;
-
-    node = node->Next();
-    p = (wxPoint *)node->Data();
-
-    x2 = p->x;
-    y2 = p->y;
-    cx1 = (double)((x1 + x2) / 2);
-    cy1 = (double)((y1 + y2) / 2);
-    cx2 = (double)((cx1 + x2) / 2);
-    cy2 = (double)((cy1 + y2) / 2);
-
-    wx_spline_add_point(x1, y1);
-
-    while ((node = node->Next()) != NULL)
-    {
-        p = (wxPoint *)node->Data();
-       x1 = x2;
-       y1 = y2;
-       x2 = p->x;
-       y2 = p->y;
-        cx4 = (double)(x1 + x2) / 2;
-        cy4 = (double)(y1 + y2) / 2;
-        cx3 = (double)(x1 + cx4) / 2;
-        cy3 = (double)(y1 + cy4) / 2;
-
-        wx_quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
-
-       cx1 = cx4;
-       cy1 = cy4;
-        cx2 = (double)(cx1 + x2) / 2;
-        cy2 = (double)(cy1 + y2) / 2;
-    }
-
-    wx_spline_add_point( cx1, cy1 );
-    wx_spline_add_point( x2, y2 );
-
-    wx_spline_draw_point_array( this );
-}
-
 
     
 bool  wxDC::CanDrawBitmap(void) const 
 
     
 bool  wxDC::CanDrawBitmap(void) const 
@@ -946,14 +759,16 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                         wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask )
 {
   if (!Ok()) return FALSE;
                         wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask )
 {
   if (!Ok()) return FALSE;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
 
        CGrafPtr                        sourcePort = (CGrafPtr) source->m_macPort ;
        PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ; 
 
        CGrafPtr                        sourcePort = (CGrafPtr) source->m_macPort ;
        PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ; 
-       RGBColor                white = { 0xFFFF, 0xFFFF,0xFFFF} ;
-       RGBColor                black = { 0,0,0} ;
-       RGBForeColor( &m_textForegroundColour.GetPixel() ) ;
-       RGBBackColor( &m_textBackgroundColour.GetPixel() ) ;
+       RGBColor        white = { 0xFFFF, 0xFFFF,0xFFFF} ;
+       RGBColor        black = { 0,0,0} ;
+       RGBColor        forecolor = m_textForegroundColour.GetPixel();
+       RGBColor        backcolor = m_textBackgroundColour.GetPixel();
+       RGBForeColor( &forecolor ) ;
+       RGBBackColor( &backcolor ) ;
 
        if ( LockPixels(bmappixels) )
        {
 
        if ( LockPixels(bmappixels) )
        {
@@ -1015,7 +830,7 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
 
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
 
        long xx = XLOG2DEV(x);
        long yy = YLOG2DEV(y);
@@ -1095,7 +910,7 @@ void  wxDC::DoGetTextExtent( const wxString &string, wxCoord *width, wxCoord *he
   if (!Ok()) 
        return;
  
   if (!Ok()) 
        return;
  
-   MacVerifySetup() ;
+   wxMacPortSetter helper(this) ;
 
        wxFont formerFont = m_font ; 
        
 
        wxFont formerFont = m_font ; 
        
@@ -1177,7 +992,7 @@ wxCoord   wxDC::GetCharWidth(void) const
   if (!Ok()) 
        return 1;
  
   if (!Ok()) 
        return 1;
  
-   MacVerifySetup() ;
+   wxMacPortSetter helper(this) ;
 
        MacInstallFont() ;
 
 
        MacInstallFont() ;
 
@@ -1192,7 +1007,7 @@ wxCoord   wxDC::GetCharHeight(void) const
   if (!Ok()) 
        return 1;
  
   if (!Ok()) 
        return 1;
  
-   MacVerifySetup() ;
+   wxMacPortSetter helper(this) ;
 
        MacInstallFont() ;
 
 
        MacInstallFont() ;
 
@@ -1206,7 +1021,7 @@ void  wxDC::Clear(void)
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+  wxMacPortSetter helper(this) ;
        Rect rect = { -32767 , -32767 , 32767 , 32767 } ;
        
        if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) 
        Rect rect = { -32767 , -32767 , 32767 , 32767 } ;
        
        if (m_backgroundBrush.GetStyle() != wxTRANSPARENT) 
@@ -1220,10 +1035,9 @@ void wxDC::MacInstallFont() const
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
 
 
-       if ( m_macFontInstalled )
-               return ;
+//     if ( m_macFontInstalled )
+//             return ;
        Pattern blackColor ;
        
        wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
        Pattern blackColor ;
        
        wxFontRefData * font = (wxFontRefData*) m_font.GetRefData() ;
@@ -1231,15 +1045,17 @@ void wxDC::MacInstallFont() const
        if ( font )
        {
                ::TextFont( font->m_macFontNum ) ;
        if ( font )
        {
                ::TextFont( font->m_macFontNum ) ;
-               ::TextSize( m_scaleY * font->m_macFontSize ) ;
+               ::TextSize( short(m_scaleY * font->m_macFontSize) ) ;
                ::TextFace( font->m_macFontStyle ) ;
        
                m_macFontInstalled = true ;
                m_macBrushInstalled = false ;
                m_macPenInstalled = false ;
                ::TextFace( font->m_macFontStyle ) ;
        
                m_macFontInstalled = true ;
                m_macBrushInstalled = false ;
                m_macPenInstalled = false ;
-       
-               ::RGBForeColor(&m_textForegroundColour.GetPixel() );
-               ::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+
+               RGBColor forecolor = m_textForegroundColour.GetPixel();
+               RGBColor backcolor = m_textBackgroundColour.GetPixel();
+               ::RGBForeColor( &forecolor );
+               ::RGBBackColor( &backcolor );
        }
        else
        {
        }
        else
        {
@@ -1247,7 +1063,7 @@ void wxDC::MacInstallFont() const
                
                GetFNum( "\pGeneva" , &fontnum ) ;
                ::TextFont( fontnum ) ;
                
                GetFNum( "\pGeneva" , &fontnum ) ;
                ::TextFont( fontnum ) ;
-               ::TextSize( m_scaleY * 10 ) ;
+               ::TextSize( short(m_scaleY * 10) ) ;
                ::TextFace( 0 ) ;
        
                // todo reset after spacing changes - or store the current spacing somewhere
                ::TextFace( 0 ) ;
        
                // todo reset after spacing changes - or store the current spacing somewhere
@@ -1255,10 +1071,12 @@ void wxDC::MacInstallFont() const
                m_macFontInstalled = true ;
                m_macBrushInstalled = false ;
                m_macPenInstalled = false ;
                m_macFontInstalled = true ;
                m_macBrushInstalled = false ;
                m_macPenInstalled = false ;
-               ::RGBForeColor( &(m_textForegroundColour.GetPixel()) );
-               ::RGBBackColor(&m_textBackgroundColour.GetPixel() );
-       }
 
 
+               RGBColor forecolor = m_textForegroundColour.GetPixel();
+               RGBColor backcolor = m_textBackgroundColour.GetPixel();
+               ::RGBForeColor( &forecolor );
+               ::RGBBackColor( &backcolor );
+       }
 
        short mode = patCopy ;
 
 
        short mode = patCopy ;
 
@@ -1338,24 +1156,31 @@ void wxDC::MacInstallPen() const
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
 
        Pattern  blackColor;
 
 
        Pattern  blackColor;
 
-       if ( m_macPenInstalled )
-               return ;
+//     if ( m_macPenInstalled )
+//             return ;
 
 
-       ::RGBForeColor(&m_pen.GetColour().GetPixel() );
-       ::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+       RGBColor forecolor = m_pen.GetColour().GetPixel();
+       RGBColor backcolor = m_backgroundBrush.GetColour().GetPixel();
+       ::RGBForeColor( &forecolor );
+       ::RGBBackColor( &backcolor );
        
        ::PenNormal() ;
        
        ::PenNormal() ;
-       int penWidth = m_pen.GetWidth();
+       int penWidth = m_pen.GetWidth() * m_scaleX ;
+
+       // null means only one pixel, at whatever resolution
+       if ( penWidth == 0 )
+               penWidth = 1 ; 
        ::PenSize(penWidth, penWidth);
 
        int penStyle = m_pen.GetStyle();
        
        if (penStyle == wxSOLID)
        ::PenSize(penWidth, penWidth);
 
        int penStyle = m_pen.GetStyle();
        
        if (penStyle == wxSOLID)
+       {
                ::PenPat(GetQDGlobalsBlack(&blackColor));
                ::PenPat(GetQDGlobalsBlack(&blackColor));
+       }
        else if (IS_HATCH(penStyle))
        {
                Pattern pat ;
        else if (IS_HATCH(penStyle))
        {
                Pattern pat ;
@@ -1417,15 +1242,17 @@ void wxDC::MacInstallBrush() const
 {
   if (!Ok()) 
        return;
 {
   if (!Ok()) 
        return;
-  MacVerifySetup() ;
+
        Pattern  blackColor, whiteColor ;
        Pattern  blackColor, whiteColor ;
-       if ( m_macBrushInstalled )
-               return ;
+//     if ( m_macBrushInstalled )
+//             return ;
 
        // foreground
 
 
        // foreground
 
-       ::RGBForeColor(&m_brush.GetColour().GetPixel() );
-       ::RGBBackColor(&m_backgroundBrush.GetColour().GetPixel() );
+       RGBColor forecolor = m_brush.GetColour().GetPixel();
+       RGBColor backcolor = m_backgroundBrush.GetColour().GetPixel();
+       ::RGBForeColor( &forecolor );
+       ::RGBBackColor( &backcolor );
 
        int brushStyle = m_brush.GetStyle();
        if (brushStyle == wxSOLID)
 
        int brushStyle = m_brush.GetStyle();
        if (brushStyle == wxSOLID)