X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c7f624674056fad7af32c1aa4f5f304d5ca015c0..b1699cd397f7db0193491c8498608578b43db12b:/src/gtk/dcclient.cpp diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index ffd39ac0a7..d903e9311c 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -19,6 +19,7 @@ #include "wx/dcmemory.h" #include "wx/image.h" #include "wx/module.h" +#include "wx/log.h" #include "wx/gtk/win_gtk.h" @@ -400,10 +401,37 @@ void wxWindowDC::DoGetSize( int* width, int* height ) const m_owner->GetSize(width, height); } -void wxWindowDC::DoFloodFill( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), - const wxColour &WXUNUSED(col), int WXUNUSED(style) ) +void wxWindowDC::DoFloodFill( wxCoord x, wxCoord y, + const wxColour & col, int style ) { - wxFAIL_MSG( wxT("wxWindowDC::DoFloodFill not implemented") ); + 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 wxWindowDC::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) const @@ -1011,10 +1039,6 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap, use_bitmap = bitmap; } -#ifdef __WXGTK20__ - useMask = FALSE; -#endif - /* apply mask if any */ GdkBitmap *mask = (GdkBitmap *) NULL; if (use_bitmap.GetMask()) mask = use_bitmap.GetMask()->GetBitmap(); @@ -1022,6 +1046,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap, if (useMask && mask) { GdkBitmap *new_mask = (GdkBitmap*) NULL; +#ifndef __WXGTK20__ // TODO fix crash if (!m_currentClippingRegion.IsNull()) { GdkColor col; @@ -1041,7 +1066,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap, gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, ww, hh ); gdk_gc_unref( gc ); } - +#endif if (is_mono) { if (new_mask) @@ -1058,6 +1083,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap, gdk_gc_set_clip_mask( m_penGC, mask ); gdk_gc_set_clip_origin( m_penGC, xx, yy ); } + if (new_mask) gdk_bitmap_unref( new_mask ); } @@ -1223,6 +1249,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, if (useMask && mask) { GdkBitmap *new_mask = (GdkBitmap*) NULL; +#ifndef __WXGTK20__ // TODO fix crash if (!m_currentClippingRegion.IsNull()) { GdkColor col; @@ -1242,7 +1269,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest, gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, bm_ww, bm_hh ); gdk_gc_unref( gc ); } - +#endif if (is_mono) { if (new_mask)