]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/dc.cpp
Applied FloodFill patch
[wxWidgets.git] / src / mac / dc.cpp
index de479fbeec167aca6d8ac00a15645229a45b819f..2828b715c6f727d6f61d49424785862c2e5a9d60 100644 (file)
@@ -19,6 +19,7 @@
 #include "wx/dcmemory.h"
 #include "wx/region.h"
 #include "wx/image.h"
+#include "wx/log.h"
 
 
 #if __MSL__ >= 0x6000
@@ -52,8 +53,6 @@ const double RAD2DEG  = 180.0 / M_PI;
 const short kEmulatedMode = -1 ;
 const short kUnsupportedMode = -2 ;
 
-#define wxMAC_EXPERIMENTAL_PATTERN 0
-
 wxMacPortSetter::wxMacPortSetter( const wxDC* dc ) :
        m_ph( (GrafPtr) dc->m_macPort ) 
 {
@@ -655,6 +654,34 @@ void  wxDC::DoFloodFill( wxCoord x, wxCoord y, const wxColour& col,
 {
 }
 
+    if (GetBrush().GetStyle() == wxTRANSPARENT)
+    {
+        wxLogDebug(wxT("In FloodFill, Current Brush is transparent, no filling done"));
+        return ;
+    }
+    int height = 0;
+    int width  = 0;
+    this->GetSize(&width, &height);
+    //it would be nice to fail if we don't get a sensible size...
+    if (width < 1 || height < 1)
+    {
+        wxLogError(wxT("In FloodFill, dc.GetSize routine failed, method not supported by this DC"));
+        return ;
+    }
+
+    //this is much faster than doing the individual pixels
+    wxMemoryDC memdc;
+    wxBitmap bitmap(width, height);
+    memdc.SelectObject(bitmap);
+    memdc.Blit(0, 0, width, height, (wxDC*) this, 0, 0);
+    memdc.SelectObject(wxNullBitmap);
+
+    wxImage image(bitmap);
+    image.DoFloodFill (x,y, GetBrush(), col, style, GetLogicalFunction());
+    bitmap = wxBitmap(image);
+    memdc.SelectObject(bitmap);
+    this->Blit(0, 0, width, height, &memdc, 0, 0);
+    memdc.SelectObject(wxNullBitmap);
 bool  wxDC::DoGetPixel( wxCoord x, wxCoord y, wxColour *col ) const 
 {
     wxCHECK_MSG( Ok(), false, wxT("wxDC::DoGetPixel  Invalid DC") );
@@ -1790,11 +1817,21 @@ void wxDC::MacInstallFont() const
 
 }
 
+Pattern gHatchPatterns[] =
+{   
+    { 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF } ,
+    { 0x01 , 0x02 , 0x04 , 0x08 , 0x10 , 0x20 , 0x40 , 0x80 } ,
+    { 0x80 , 0x40 , 0x20 , 0x10 , 0x08 , 0x04 , 0x02 , 0x01 } ,
+    { 0x10 , 0x10 , 0x10 , 0xFF , 0x10 , 0x10 , 0x10 , 0x10 } ,
+    { 0x00 , 0x00 , 0x00 , 0xFF , 0x00 , 0x00 , 0x00 , 0x00 } ,
+    { 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 , 0x10 } ,
+    { 0x81 , 0x42 , 0x24 , 0x18 , 0x18 , 0x24 , 0x42 , 0x81 } ,
+} ;
+
 static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern)
 {
-    // we have our own pattern list now
-       int thePatListID = 128;
-       int theIndex;
+       int theIndex = 1 ;
+       
        switch(hatchStyle)
        {
                case wxBDIAGONAL_HATCH:
@@ -1819,7 +1856,7 @@ static void wxMacGetHatchPattern(int hatchStyle, Pattern *pattern)
                        theIndex = 1; // solid pattern
                        break;
        }
-       GetIndPattern( pattern, thePatListID, theIndex);        
+       *pattern = gHatchPatterns[theIndex-1] ; 
 }
 
 void wxDC::MacInstallPen() const