]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
corrected redraw problems with native controls
[wxWidgets.git] / src / mac / dc.cpp
index 1682209492529b1cfe5abd1cacf95ab92cad9d54..3cfe810af01b8c8cdc6fbe5bec0cd6ace28fded5 100644 (file)
 #endif
 
 #include "wx/dc.h"
+#include "wx/app.h"
 #include "wx/mac/uma.h"
 
+#if __MSL__ >= 0x6000
+#include "math.h"
+#endif
+
 #if !USE_SHARED_LIBRARY
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #endif
@@ -40,8 +45,8 @@ long wxDC::m_macCurrentPortId = 1 ;
 wxDC::wxDC()
 {
   m_ok = FALSE;
-  m_optimize = FALSE;
-  m_autoSetting = FALSE;
+//  m_optimize = FALSE;
+//  m_autoSetting = FALSE;
   m_colour = TRUE;
   m_clipping = FALSE;
   
@@ -128,7 +133,7 @@ wxDC::~wxDC(void)
 
 void wxDC::MacSetupPort() const
 {
-       AGAPortHelper* help = &m_macPortHelper ;
+       AGAPortHelper* help = (AGAPortHelper*) &m_macPortHelper ;
        help->Setup( m_macPort ) ;
        m_macPortId = ++m_macCurrentPortId ;
        ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
@@ -157,7 +162,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
     {
                        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 ) ;
                        }
@@ -427,7 +432,12 @@ void wxDC::ComputeScaleAndOrigin(void)
   // 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);
   }
 };
 
@@ -529,7 +539,7 @@ void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
   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); 
@@ -583,19 +593,19 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
   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);
-       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++)
   {
-    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 );
   }
 }
 
@@ -610,14 +620,14 @@ void  wxDC::DoDrawPolygon(int n, wxPoint points[],
   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++)
   {
-    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() ;
@@ -716,13 +726,13 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
        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() ;
-               ::FrameRoundRect( &rect , radius * 2 , radius * 2 ) ;
+               ::FrameRoundRect( &rect , int(radius * 2) , int(radius * 2) ) ;
        };
 }
 
@@ -950,10 +960,12 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
 
        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) )
        {
@@ -1231,15 +1243,17 @@ void wxDC::MacInstallFont() const
        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 ;
-       
-               ::RGBForeColor(&m_textForegroundColour.GetPixel() );
-               ::RGBBackColor(&m_textBackgroundColour.GetPixel() );
+
+               RGBColor forecolor = m_textForegroundColour.GetPixel();
+               RGBColor backcolor = m_textBackgroundColour.GetPixel();
+               ::RGBForeColor( &forecolor );
+               ::RGBBackColor( &backcolor );
        }
        else
        {
@@ -1247,7 +1261,7 @@ void wxDC::MacInstallFont() const
                
                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
@@ -1255,10 +1269,12 @@ void wxDC::MacInstallFont() const
                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 ;
 
@@ -1345,17 +1361,25 @@ void wxDC::MacInstallPen() const
        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() ;
-       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)
+       {
                ::PenPat(GetQDGlobalsBlack(&blackColor));
+       }
        else if (IS_HATCH(penStyle))
        {
                Pattern pat ;
@@ -1424,8 +1448,10 @@ void wxDC::MacInstallBrush() const
 
        // 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)