]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
corrected graying out, only to be executed when background is gray or white
[wxWidgets.git] / src / mac / dc.cpp
index 6d995bb99f1e11bbd84c68f78e2cf3af5057256e..59472ddfa54b71968894b93fe310e60db8f562ec 100644 (file)
@@ -119,8 +119,6 @@ wxDC::~wxDC(void)
 }
 void wxDC::MacSetupPort(AGAPortHelper* help) const
 {
-//     help->Setup( m_macPort ) ;
-       ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
        SetClip( m_macCurrentClipRgn);
 
        m_macFontInstalled = false ;
@@ -136,8 +134,8 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask
  
      wxMacPortSetter helper(this) ;
  
-     wxCoord xx = XLOG2DEV(x);
-     wxCoord yy = YLOG2DEV(y);
+     wxCoord xx = XLOG2DEVMAC(x);
+     wxCoord yy = YLOG2DEVMAC(y);
      wxCoord w = bmp.GetWidth();
      wxCoord h = bmp.GetHeight();
      wxCoord ww = XLOG2DEVREL(w);
@@ -238,8 +236,8 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
     wxCHECK_RET(Ok(), wxT("wxDC::DoSetClippingRegion  Invalid DC"));
     wxCoord xx, yy, ww, hh;
 
-    xx = XLOG2DEV(x);
-    yy = YLOG2DEV(y);
+    xx = XLOG2DEVMAC(x);
+    yy = YLOG2DEVMAC(y);
     ww = XLOG2DEVREL(width);
     hh = YLOG2DEVREL(height);
 
@@ -278,8 +276,8 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
     region.GetBox( x, y, w, h );
     wxCoord xx, yy, ww, hh;
 
-    xx = XLOG2DEV(x);
-    yy = YLOG2DEV(y);
+    xx = XLOG2DEVMAC(x);
+    yy = YLOG2DEVMAC(y);
     ww = XLOG2DEVREL(w);
     hh = YLOG2DEVREL(h);
 
@@ -531,7 +529,7 @@ bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const
 
     RGBColor colour;
 
-    GetCPixel( XLOG2DEV(x), YLOG2DEV(y), &colour );
+    GetCPixel( XLOG2DEVMAC(x), YLOG2DEVMAC(y), &colour );
 
     // Convert from Mac colour to wx
     col->Set( colour.red   >> 8,
@@ -553,10 +551,10 @@ void  wxDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
                wxCoord offset = ( (m_pen.GetWidth() == 0 ? 1 :
                             m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2;
 
-        wxCoord xx1 = XLOG2DEV(x1) - offset;
-        wxCoord yy1 = YLOG2DEV(y1) - offset;
-        wxCoord xx2 = XLOG2DEV(x2) - offset;
-        wxCoord yy2 = YLOG2DEV(y2) - offset;
+        wxCoord xx1 = XLOG2DEVMAC(x1) - offset;
+        wxCoord yy1 = YLOG2DEVMAC(y1) - offset;
+        wxCoord xx2 = XLOG2DEVMAC(x2) - offset;
+        wxCoord yy2 = YLOG2DEVMAC(y2) - offset;
 
         if ((m_pen.GetCap() == wxCAP_ROUND) &&
             (m_pen.GetWidth() <= 1))
@@ -593,14 +591,14 @@ void  wxDC::DoCrossHair( wxCoord x, wxCoord y )
         int w = 0;
         int h = 0;
         GetSize( &w, &h );
-        wxCoord xx = XLOG2DEV(x);
-        wxCoord yy = YLOG2DEV(y);
+        wxCoord xx = XLOG2DEVMAC(x);
+        wxCoord yy = YLOG2DEVMAC(y);
 
         MacInstallPen();
-        ::MoveTo( 0, yy );
-        ::LineTo( XLOG2DEVREL(w), yy );
-        ::MoveTo( xx, 0 );
-        ::LineTo( xx, YLOG2DEVREL(h) );
+        ::MoveTo( XLOG2DEVMAC(0), yy );
+        ::LineTo( XLOG2DEVMAC(w), yy );
+        ::MoveTo( xx, YLOG2DEVMAC(0) );
+        ::LineTo( xx, YLOG2DEVMAC(h) );
     }
 }
 
@@ -645,12 +643,12 @@ void  wxDC::DoDrawArc( wxCoord x1, wxCoord y1,
 {
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawArc  Invalid DC"));
 
-    wxCoord xx1 = XLOG2DEV(x1);
-    wxCoord yy1 = YLOG2DEV(y1);
-    wxCoord xx2 = XLOG2DEV(x2);
-    wxCoord yy2 = YLOG2DEV(y2);
-    wxCoord xxc = XLOG2DEV(xc);
-    wxCoord yyc = YLOG2DEV(yc);
+    wxCoord xx1 = XLOG2DEVMAC(x1);
+    wxCoord yy1 = YLOG2DEVMAC(y1);
+    wxCoord xx2 = XLOG2DEVMAC(x2);
+    wxCoord yy2 = YLOG2DEVMAC(y2);
+    wxCoord xxc = XLOG2DEVMAC(xc);
+    wxCoord yyc = YLOG2DEVMAC(yc);
     double dx = xx1 - xxc;
     double dy = yy1 - yyc;
     double radius = sqrt((double)(dx*dx+dy*dy));
@@ -701,8 +699,8 @@ void  wxDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord w, wxCoord h,
     Rect r;
     double angle = sa - ea;  // Order important Mac in opposite direction to wx
  
-    wxCoord xx = XLOG2DEV(x);
-    wxCoord yy = YLOG2DEV(y);
+    wxCoord xx = XLOG2DEVMAC(x);
+    wxCoord yy = YLOG2DEVMAC(y);
     wxCoord ww = m_signX * XLOG2DEVREL(w);
     wxCoord hh = m_signY * YLOG2DEVREL(h);
 
@@ -736,8 +734,8 @@ void  wxDC::DoDrawPoint( wxCoord x, wxCoord y )
   if (m_pen.GetStyle() != wxTRANSPARENT) 
   {
                MacInstallPen() ;
-        wxCoord xx1 = XLOG2DEV(x); 
-        wxCoord yy1 = YLOG2DEV(y);
+        wxCoord xx1 = XLOG2DEVMAC(x); 
+        wxCoord yy1 = YLOG2DEVMAC(y);
        
                ::MoveTo(xx1,yy1);
                ::LineTo(xx1+1, yy1+1);
@@ -759,14 +757,14 @@ void  wxDC::DoDrawLines(int n, wxPoint points[],
                       m_pen.GetWidth() ) * (wxCoord)m_scaleX - 1) / 2 ;
 
   wxCoord x1, x2 , y1 , y2 ;
-  x1 = XLOG2DEV(points[0].x + xoffset);
-  y1 = YLOG2DEV(points[0].y + yoffset);   
+  x1 = XLOG2DEVMAC(points[0].x + xoffset);
+  y1 = YLOG2DEVMAC(points[0].y + yoffset);   
   ::MoveTo(x1 - offset, y1 - offset );
   
   for (int i = 0; i < n-1; i++)
   {
-    x2 = XLOG2DEV(points[i+1].x + xoffset);
-    y2 = YLOG2DEV(points[i+1].y + yoffset);
+    x2 = XLOG2DEVMAC(points[i+1].x + xoffset);
+    y2 = YLOG2DEVMAC(points[i+1].y + yoffset);
     ::LineTo( x2 - offset, y2 - offset );
   }
 }
@@ -780,54 +778,40 @@ void  wxDC::DoDrawPolygon(int n, wxPoint points[],
        
        wxCoord x1, x2 , y1 , y2 ;
   
+    if ( m_brush.GetStyle() == wxTRANSPARENT && m_pen.GetStyle() == wxTRANSPARENT )
+        return ;
+        
+       PolyHandle polygon = OpenPoly();
+       
+       x1 = XLOG2DEVMAC(points[0].x + xoffset);
+       y1 = YLOG2DEVMAC(points[0].y + yoffset);   
+       ::MoveTo(x1,y1);
+
+       for (int i = 0; i < n-1; i++)
+       {
+               x2 = XLOG2DEVMAC(points[i+1].x + xoffset);
+               y2 = YLOG2DEVMAC(points[i+1].y + yoffset);
+               ::LineTo(x2, y2);
+       }
+
+       ClosePoly();
+
        if (m_brush.GetStyle() != wxTRANSPARENT)
        {
-               PolyHandle polygon = OpenPoly();
-               
-               x1 = XLOG2DEV(points[0].x + xoffset);
-               y1 = YLOG2DEV(points[0].y + yoffset);   
-               ::MoveTo(x1,y1);
-  
-               for (int i = 0; i < n-1; i++)
-               {
-               x2 = XLOG2DEV(points[i+1].x + xoffset);
-               y2 = YLOG2DEV(points[i+1].y + yoffset);
-               ::LineTo(x2, y2);
-               }
-
-               ClosePoly();
 
                MacInstallBrush();
                ::PaintPoly( polygon );
                
-               KillPoly( polygon );
        }
        
        if (m_pen.GetStyle() != wxTRANSPARENT) 
        {
-               PolyHandle polygon = OpenPoly();
-               
-               x1 = XLOG2DEV(points[0].x + xoffset);
-               y1 = YLOG2DEV(points[0].y + yoffset);   
-               ::MoveTo(x1,y1);
-  
-               for (int i = 0; i < n-1; i++)
-               {
-               x2 = XLOG2DEV(points[i+1].x + xoffset);
-               y2 = YLOG2DEV(points[i+1].y + yoffset);
-               ::LineTo(x2, y2);
-               }
-               
-               // return to origin to close path
-               ::LineTo(x1,y1);
-
-               ClosePoly();
        
                MacInstallPen() ;
                ::FramePoly( polygon ) ;
                
-               KillPoly( polygon );
        }
+       KillPoly( polygon );
 }
 
 void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
@@ -835,8 +819,8 @@ void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
     wxMacPortSetter helper(this) ;
 
-       wxCoord xx = XLOG2DEV(x);
-       wxCoord yy = YLOG2DEV(y);
+       wxCoord xx = XLOG2DEVMAC(x);
+       wxCoord yy = YLOG2DEVMAC(y);
        wxCoord ww = m_signX * XLOG2DEVREL(width);
        wxCoord hh = m_signY * YLOG2DEVREL(height);
        
@@ -882,8 +866,8 @@ void  wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y,
     if (radius < 0.0) 
            radius = - radius * ((width < height) ? width : height);
        
-       wxCoord xx = XLOG2DEV(x);
-       wxCoord yy = YLOG2DEV(y);
+       wxCoord xx = XLOG2DEVMAC(x);
+       wxCoord yy = YLOG2DEVMAC(y);
        wxCoord ww = m_signX * XLOG2DEVREL(width);
        wxCoord hh = m_signY * YLOG2DEVREL(height);
        
@@ -924,8 +908,8 @@ void  wxDC::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
     wxCHECK_RET(Ok(), wxT("Invalid DC"));
     wxMacPortSetter helper(this) ;
 
-       wxCoord xx = XLOG2DEV(x);
-       wxCoord yy = YLOG2DEV(y);
+       wxCoord xx = XLOG2DEVMAC(x);
+       wxCoord yy = YLOG2DEVMAC(y);
        wxCoord ww = m_signX * XLOG2DEVREL(width);
        wxCoord hh = m_signY * YLOG2DEVREL(height);
 
@@ -995,14 +979,14 @@ bool  wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
        if ( LockPixels(bmappixels) )
        {
                Rect srcrect , dstrect ;
-               srcrect.top = source->YLOG2DEV(ysrc) + source->m_macLocalOrigin.v ;
-               srcrect.left = source->XLOG2DEV(xsrc) + source->m_macLocalOrigin.h ;
-               srcrect.right = source->XLOG2DEV(xsrc + width ) + source->m_macLocalOrigin.v;
-               srcrect.bottom = source->YLOG2DEV(ysrc + height) + source->m_macLocalOrigin.h;
-               dstrect.top = YLOG2DEV(ydest) ;
-               dstrect.left = XLOG2DEV(xdest) ;
-               dstrect.bottom = YLOG2DEV(ydest + height )  ;
-               dstrect.right = XLOG2DEV(xdest + width ) ;
+               srcrect.top = source->YLOG2DEVMAC(ysrc) ;
+               srcrect.left = source->XLOG2DEVMAC(xsrc)  ;
+               srcrect.right = source->XLOG2DEVMAC(xsrc + width ) ;
+               srcrect.bottom = source->YLOG2DEVMAC(ysrc + height) ;
+               dstrect.top = YLOG2DEVMAC(ydest) ;
+               dstrect.left = XLOG2DEVMAC(xdest) ;
+               dstrect.bottom = YLOG2DEVMAC(ydest + height )  ;
+               dstrect.right = XLOG2DEVMAC(xdest + width ) ;
 
        short  mode = (logical_func == wxCOPY ? srcCopy :
  //    logical_func == wxCLEAR ? WHITENESS :
@@ -1140,7 +1124,7 @@ void  wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
             textPixel = data[(srcY*w + srcX)*3] == 0;
             if ( textPixel || (m_backgroundMode == wxSOLID) )
             {
-                SetCPixel(XLOG2DEV(x + dstX), YLOG2DEV(y + dstY),
+                SetCPixel(XLOG2DEVMAC(x + dstX), YLOG2DEVMAC(y + dstY),
                           textPixel ? &colText : &colBack);
             }
         }
@@ -1151,8 +1135,8 @@ void  wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
 #if 0
     if ( m_font.GetUnderlined() )
     {
-        ::MoveTo(XLOG2DEV(x + x4), YLOG2DEV(y + y4 + font->descent));
-        ::LineTo(XLOG2DEV(x + x3), YLOG2DEV(y + y3 + font->descent));
+        ::MoveTo(XLOG2DEVMAC(x + x4), YLOG2DEVMAC(y + y4 + font->descent));
+        ::LineTo(XLOG2DEVMAC(x + x3), YLOG2DEVMAC(y + y3 + font->descent));
     }
 #endif // 0
 
@@ -1165,8 +1149,8 @@ void  wxDC::DoDrawText(const wxString& strtext, wxCoord x, wxCoord y)
     wxCHECK_RET(Ok(), wxT("wxDC::DoDrawText  Invalid DC"));
     wxMacPortSetter helper(this) ;
 
-       long xx = XLOG2DEV(x);
-       long yy = YLOG2DEV(y);
+       long xx = XLOG2DEVMAC(x);
+       long yy = YLOG2DEVMAC(y);
   
 //     if (m_pen.GetStyle() != wxTRANSPARENT)
        {
@@ -1447,27 +1431,28 @@ void wxDC::MacInstallFont() const
 
 static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern)
 {
-       int thePatListID = sysPatListID;
+    // we have our own pattern list now
+       int thePatListID = 128;
        int theIndex;
        switch(hatchStyle)
        {
                case wxBDIAGONAL_HATCH:
-                       theIndex = 34; // WCH: this is not good
+                       theIndex = 2; 
                        break;
                case wxFDIAGONAL_HATCH:
-                       theIndex = 26;
+                       theIndex = 3;
                        break;
                case wxCROSS_HATCH:
-                       theIndex = 5;
+                       theIndex = 4;
                        break;
                case wxHORIZONTAL_HATCH:
-                       theIndex = 25;
+                       theIndex = 5;
                        break;
                case wxVERTICAL_HATCH:
                        theIndex = 6;
                        break;
                case wxCROSSDIAG_HATCH:
-                       theIndex = 4; // WCH: this is not good
+                       theIndex = 7; 
                        break;
                default:
                        theIndex = 1; // solid pattern
@@ -1512,7 +1497,46 @@ void wxDC::MacInstallPen() const
        }
        else
        {
-               ::PenPat(GetQDGlobalsBlack(&blackColor));
+           Pattern pat = *GetQDGlobalsBlack(&blackColor) ;
+           switch( penStyle )
+           {
+               case wxDOT :
+                for ( int i = 0 ; i < 8 ; ++i )
+                {
+                    pat.pat[i] = 0xCC ;
+                }
+                   break ;
+               case wxLONG_DASH :
+                for ( int i = 0 ; i < 8 ; ++i )
+                {
+                    pat.pat[i] = 0xFE ;
+                }
+                   break ;
+               case wxSHORT_DASH :
+                for ( int i = 0 ; i < 8 ; ++i )
+                {
+                    pat.pat[i] = 0xEE ;
+                }
+                   break ;
+               case wxDOT_DASH :
+                for ( int i = 0 ; i < 8 ; ++i )
+                {
+                    pat.pat[i] = 0x6F ;
+                }
+                   break ;
+               case wxUSER_DASH :
+                   {
+                       wxDash* dash ;
+                       int number = m_pen.GetDashes(&dash) ;
+                       // right now we don't allocate larger pixmaps
+                       for ( int i = 0 ; i < 8 ; ++i )
+                       {
+                           pat.pat[i] = dash[0] ;
+                       }
+                   }
+                   break ;
+           }
+               ::PenPat(&pat);
        }
 
        short mode = patCopy ;
@@ -1521,11 +1545,11 @@ void wxDC::MacInstallPen() const
        
        switch( m_logicalFunction )
        {
-               case wxCOPY:       // src
-                       mode = patCopy ;
+               case wxCOPY:       // only foreground color, leave background (thus not patCopy)
+                       mode = patOr ;
                        break ;
                case wxINVERT:     // NOT dst
-                       ::PenPat(GetQDGlobalsBlack(&blackColor));
+//                     ::PenPat(GetQDGlobalsBlack(&blackColor));
                        mode = patXor ;
                        break ;
                case wxXOR:        // src XOR dst
@@ -1561,37 +1585,42 @@ void wxDC::MacInstallPen() const
        m_macFontInstalled = false ;
 }
 
-int wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background ) 
+void wxDC::MacSetupBackgroundForCurrentPort(const wxBrush& background ) 
 {
     Pattern whiteColor ;
-       if ( background.IsMacTheme() )
-       {
-           SetThemeBackground( background.GetMacTheme() , wxDisplayDepth() , true ) ;
-       }
-       else if ( background.IsMacThemeBackground() )
-       {
-           Rect originBox = { 0,0,1,1 } ;
-           ::ApplyThemeBackground( background.GetMacThemeBackground() , &originBox ,kThemeStateActive , 
-               wxDisplayDepth() , true ) ;
-       }
-       else
-       {
-       ::RGBBackColor( &background.GetColour().GetPixel() );
-       int brushStyle = background.GetStyle();
-       if (brushStyle == wxSOLID)
-               ::BackPat(GetQDGlobalsWhite(&whiteColor));
-       else if (IS_HATCH(brushStyle))
-       {
-               Pattern pat ;
-               wxMacGetHatchPattern(brushStyle, &pat);
-               ::BackPat(&pat);
-       }
-       else
-       {
-               ::BackPat(GetQDGlobalsWhite(&whiteColor));
-       }
-       }
-       return 0 ;
+    switch( background.MacGetBrushKind() )
+    {
+      case kwxMacBrushTheme :
+        {
+               ::SetThemeBackground( background.GetMacTheme() , wxDisplayDepth() , true ) ;
+          break ;
+        }
+      case kwxMacBrushThemeBackground :
+        {
+               Rect extent ;
+               ThemeBackgroundKind bg = background.GetMacThemeBackground( &extent ) ;
+               ::ApplyThemeBackground( bg , &extent ,kThemeStateActive , wxDisplayDepth() , true ) ;
+          break ;
+        }
+      case kwxMacBrushColour :
+        {
+                 ::RGBBackColor( &background.GetColour().GetPixel() );
+               int brushStyle = background.GetStyle();
+               if (brushStyle == wxSOLID)
+                       ::BackPat(GetQDGlobalsWhite(&whiteColor));
+               else if (IS_HATCH(brushStyle))
+               {
+                       Pattern pat ;
+                       wxMacGetHatchPattern(brushStyle, &pat);
+                       ::BackPat(&pat);
+               }
+               else
+               {
+                       ::BackPat(GetQDGlobalsWhite(&whiteColor));
+               }
+          break ;
+        }
+    }
 }
 
 void wxDC::MacInstallBrush() const
@@ -1615,9 +1644,46 @@ void wxDC::MacInstallBrush() const
                wxMacGetHatchPattern(brushStyle, &pat);
                ::PenPat(&pat);
        }
-       else
+       else if ( m_brush.GetStyle() == wxSTIPPLE || m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE )
        {
-               ::PenPat(GetQDGlobalsBlack(&blackColor));
+           // for these the text fore (and back for MASK_OPAQUE) colors are used
+           wxBitmap* bitmap = m_brush.GetStipple() ;
+           int width = bitmap->GetWidth() ;
+           int height = bitmap->GetHeight() ;
+           int depth = bitmap->GetDepth() ;
+           if ( m_brush.GetStyle() == wxSTIPPLE )
+           {
+               GWorldPtr gw = bitmap->GetHBITMAP() ;
+               if ( width == 8 && height == 8 && depth == 1)
+               {
+                   Pattern pat ;
+                LockPixels( GetGWorldPixMap( gw ) ) ;
+                BitMap* gwbitmap = (BitMap*) *GetGWorldPixMap( gw ) ; // since the color depth is 1 it is a BitMap
+                   int alignment = gwbitmap->rowBytes & 0x7FFF ;
+                UInt8 *gwbits = (UInt8*) gwbitmap->baseAddr ;
+                for ( int i = 0 ; i < 8 ; ++i )
+                {
+                    pat.pat[i] = gwbits[i*alignment+0] ;
+                }
+                UnlockPixels( GetGWorldPixMap( gw ) ) ;
+                   
+                   ::PenPat( &pat ) ;
+               }
+               else
+               {
+                       ::PenPat(GetQDGlobalsBlack(&blackColor));
+                   }
+           }
+           else if (m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE )
+           {
+               ::RGBForeColor( &m_textForegroundColour.GetPixel() );
+               ::RGBForeColor( &m_textBackgroundColour.GetPixel() );
+                   ::PenPat(GetQDGlobalsBlack(&blackColor));
+           }
+       }
+    else
+    {
+           ::PenPat(GetQDGlobalsBlack(&blackColor));
        }