]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
wxFont can now raelly use the native fonts
[wxWidgets.git] / src / mac / dc.cpp
index acad87440d2c876e6f80bce00e957ce6ddc59faf..275f5147249ff5ceb6a918c28682fb6ff8beb04c 100644 (file)
@@ -38,7 +38,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 #define twips2mm               0.0176388888889
 #define mm2pt                  2.83464566929
 #define pt2mm                  0.352777777778
-#ifndef __UNIX__
+#ifndef __DARWIN__
 const double M_PI = 3.14159265358979 ;
 #endif
 const double RAD2DEG  = 180.0 / M_PI;
@@ -90,10 +90,11 @@ wxDC::wxDC()
        m_macPenInstalled = false ;
        
        m_macLocalOrigin.h = m_macLocalOrigin.v = 0 ;
-       m_macClipRect.left = -32000 ;
-       m_macClipRect.top = -32000 ;
-       m_macClipRect.right = 32000 ;
-       m_macClipRect.bottom = 32000 ;
+       m_macBoundaryClipRgn = NewRgn() ;
+       m_macCurrentClipRgn = NewRgn() ;
+
+       SetRectRgn( m_macBoundaryClipRgn , -32000 , -32000 , 32000 , 32000 ) ;
+       SetRectRgn( m_macCurrentClipRgn , -32000 , -32000 , 32000 , 32000 ) ;
 
     m_pen = *wxBLACK_PEN;
     m_font = *wxNORMAL_FONT;
@@ -113,23 +114,14 @@ wxMacPortSetter::~wxMacPortSetter()
 
 wxDC::~wxDC(void)
 {
+  DisposeRgn( m_macBoundaryClipRgn ) ;
+  DisposeRgn( m_macCurrentClipRgn ) ;
 }
 void wxDC::MacSetupPort(AGAPortHelper* help) const
 {
 //     help->Setup( m_macPort ) ;
        ::SetOrigin(-m_macLocalOrigin.h, -m_macLocalOrigin.v);
-
-       if ( m_clipping )
-       {
-               Rect clip = { m_clipY1 , m_clipX1 , m_clipY2 , m_clipX2 } ;
-               ::SectRect( &clip , &m_macClipRect , &clip ) ;
-               ::ClipRect( &clip ) ;
-       }
-       else
-       {
-               ::ClipRect(&m_macClipRect);
-       }
-
+       SetClip( m_macCurrentClipRgn);
 
        m_macFontInstalled = false ;
        m_macBrushInstalled = false ;
@@ -251,6 +243,9 @@ void wxDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
     ww = XLOG2DEVREL(width);
     hh = YLOG2DEVREL(height);
 
+    SetRectRgn( m_macCurrentClipRgn , xx , yy , xx + ww , yy + hh ) ;
+    SectRgn( m_macCurrentClipRgn , m_macBoundaryClipRgn , m_macCurrentClipRgn ) ;
+    
     if( m_clipping )
     {
         m_clipX1 = wxMax( m_clipX1 , xx );
@@ -279,14 +274,53 @@ void wxDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
         return;
     }
 
+    wxCoord x, y, w, h;
+    region.GetBox( x, y, w, h );
     wxCoord xx, yy, ww, hh;
-    region.GetBox( xx, yy, ww, hh );
-    wxDC::DoSetClippingRegion( xx, yy, ww, hh );
+
+    xx = XLOG2DEV(x);
+    yy = YLOG2DEV(y);
+    ww = XLOG2DEVREL(w);
+    hh = YLOG2DEVREL(h);
+
+    // if we have a scaling that we cannot map onto native regions
+    // we must use the box
+
+    if ( ww != w || hh != h )
+    {
+        wxDC::DoSetClippingRegion( x, y, w, h );
+    }
+    else
+    {
+        CopyRgn( region.GetWXHRGN() , m_macCurrentClipRgn ) ;
+        if ( xx != x || yy != y )
+        {
+            OffsetRgn( m_macCurrentClipRgn , xx - x , yy - y ) ;
+        }
+        SectRgn( m_macCurrentClipRgn , m_macBoundaryClipRgn , m_macCurrentClipRgn ) ;
+        if( m_clipping )
+        {
+            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));
+        }
+        else
+        {
+            m_clipping = TRUE;
+            m_clipX1 = xx;
+            m_clipY1 = yy;
+            m_clipX2 = xx + ww;
+            m_clipY2 = yy + hh;
+        }
+    }
+
 }
 
 void wxDC::DestroyClippingRegion()
 {
   wxMacPortSetter helper(this) ;
+  CopyRgn( m_macBoundaryClipRgn , m_macCurrentClipRgn ) ;
   m_clipping = FALSE;
 }    
 void wxDC::DoGetSize( int* width, int* height ) const
@@ -944,12 +978,19 @@ 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 )
+                        wxDC *source, wxCoord xsrc, wxCoord ysrc, int logical_func , bool useMask,
+                        wxCoord xsrcMask,  wxCoord ysrcMask )
 {
     wxCHECK_MSG(Ok(), false, wxT("wxDC::DoBlit Illegal dc"));
     wxCHECK_MSG(source->Ok(), false, wxT("wxDC::DoBlit  Illegal source DC"));
     wxMacPortSetter helper(this) ;
 
+    /* TODO: use the mask origin when drawing transparently */
+    if (xsrcMask == -1 && ysrcMask == -1)
+    {
+        xsrcMask = xsrc; ysrcMask = ysrc;
+    }
+
        CGrafPtr                        sourcePort = (CGrafPtr) source->m_macPort ;
        PixMapHandle    bmappixels =  GetGWorldPixMap( sourcePort ) ; 
        RGBColor        white = { 0xFFFF, 0xFFFF,0xFFFF} ;