]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/dc.cpp
added xpmdecod files
[wxWidgets.git] / src / mac / carbon / dc.cpp
index 1682209492529b1cfe5abd1cacf95ab92cad9d54..b1e9a3b4c4c5fa9f9218fce2c84b9b93c449f740 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
@@ -40,8 +45,8 @@ long wxDC::m_macCurrentPortId = 1 ;
 wxDC::wxDC()
 {
   m_ok = FALSE;
 wxDC::wxDC()
 {
   m_ok = FALSE;
-  m_optimize = FALSE;
-  m_autoSetting = FALSE;
+//  m_optimize = FALSE;
+//  m_autoSetting = FALSE;
   m_colour = TRUE;
   m_clipping = FALSE;
   
   m_colour = TRUE;
   m_clipping = FALSE;
   
@@ -128,7 +133,7 @@ wxDC::~wxDC(void)
 
 void wxDC::MacSetupPort() const
 {
 
 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);
        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 )
                        { 
     {
                        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 ) ;
                        }
@@ -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)
   {
   // 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() ;
   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); 
@@ -583,19 +593,19 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
   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 );
   }
 }
 
   }
 }
 
@@ -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);
   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() ;
@@ -716,13 +726,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) ) ;
        };
 }
 
        };
 }
 
@@ -769,171 +779,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 
@@ -950,10 +795,12 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
 
        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) )
        {
@@ -1231,15 +1078,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 +1096,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 +1104,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 ;
 
@@ -1345,17 +1196,25 @@ void wxDC::MacInstallPen() const
        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 ;
@@ -1424,8 +1283,10 @@ void wxDC::MacInstallBrush() const
 
        // 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)