m_owner->GetSize(width, height);
}
-void wxWindowDC::DoFloodFill( wxCoord WXUNUSED(x1), wxCoord WXUNUSED(y1),
- const wxColour& WXUNUSED(col), int WXUNUSED(style) )
+void wxWindowDC::DoFloodFill( wxCoord x, wxCoord y,
+ const wxColour & col, int style )
{
- wxFAIL_MSG("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
x = XLOG2DEV(x);
y = YLOG2DEV(y);
-#if 0
- wxCoord width = gdk_string_width( font, text.mbc_str() );
- wxCoord height = font->ascent + font->descent;
-
- if ( m_backgroundMode == wxSOLID )
+ // First draw a rectangle representing the text background, if a text
+ // background is specified
+ if (m_textBackgroundColour.Ok () && (m_backgroundMode != wxTRANSPARENT))
{
- gdk_gc_set_foreground( m_textGC, m_textBackgroundColour.GetColor() );
- gdk_draw_rectangle( m_window, m_textGC, TRUE, x, y, width, height );
- gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() );
+ // Since X draws from the baseline of the text, must add the text height
+ int cx = 0;
+ int cy = 0;
+ int ascent = 0;
+ int slen;
+ int direction, descent;
+
+ slen = strlen(text);
+ XCharStruct overall_return;
+
+ (void)XTextExtents(xfont, (char*) text.c_str(), slen, &direction,
+ &ascent, &descent, &overall_return);
+
+ cx = overall_return.width;
+ cy = ascent + descent;
+ m_textBackgroundColour.CalcPixel(m_cmap);
+ XSetForeground ((Display*) m_display, (GC) m_textGC, m_textBackgroundColour.GetPixel());
+ XFillRectangle( (Display*) m_display, (Window) m_window,
+ (GC) m_textGC, x, y, cx, cy );
+ XSetForeground ((Display*) m_display, (GC) m_textGC, m_textForegroundColour.GetPixel());
+
}
-#endif
XSetFont( (Display*) m_display, (GC) m_textGC, xfont->fid );
#if !wxUSE_NANOX
return -1;
}
+//-----------------------------------------------------------------------------
+// wxClientDC
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
+
+wxClientDC::wxClientDC( wxWindow *window )
+ : wxWindowDC( window )
+{
+ wxCHECK_RET( window, _T("NULL window in wxClientDC::wxClientDC") );
+
+ m_window = (WXWindow*) window->GetClientWindow();
+
+#if wxUSE_TWO_WINDOWS
+#else
+ wxPoint ptOrigin = window->GetClientAreaOrigin();
+ SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
+ wxSize size = window->GetClientSize();
+ SetClippingRegion(wxPoint(0, 0), size);
+#endif
+}
+
+void wxClientDC::DoGetSize(int *width, int *height) const
+{
+ wxCHECK_RET( m_owner, _T("GetSize() doesn't work without window") );
+
+ m_owner->GetClientSize( width, height );
+}
+
// ----------------------------------------------------------------------------
// wxPaintDC
// ----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
-wxPaintDC::wxPaintDC(wxWindow* win)
- : wxClientDC(win)
+wxPaintDC::wxPaintDC(wxWindow* window)
+ : wxClientDC(window)
{
#if USE_PAINT_REGION
- if (!win->GetClipPaintRegion())
+ if (!window->GetClipPaintRegion())
return;
- m_paintClippingRegion = win->GetUpdateRegion();
+ m_paintClippingRegion = window->GetUpdateRegion();
Region region = (Region) m_paintClippingRegion.GetX11Region();
if (region)
{
- m_paintClippingRegion = win->GetUpdateRegion();
- Region region2 = (Region) m_paintClippingRegion.GetX11Region();
- if (region2)
- {
m_currentClippingRegion.Union( m_paintClippingRegion );
- XSetRegion( (Display*) m_display, (GC) m_penGC, region2 );
- XSetRegion( (Display*) m_display, (GC) m_brushGC, region2 );
- XSetRegion( (Display*) m_display, (GC) m_textGC, region2 );
- XSetRegion( (Display*) m_display, (GC) m_bgGC, region2 );
- }
+ XSetRegion( (Display*) m_display, (GC) m_penGC, region );
+ XSetRegion( (Display*) m_display, (GC) m_brushGC, region );
+ XSetRegion( (Display*) m_display, (GC) m_textGC, region );
+ XSetRegion( (Display*) m_display, (GC) m_bgGC, region );
}
#endif // USE_PAINT_REGION
}
-//-----------------------------------------------------------------------------
-// wxClientDC
-//-----------------------------------------------------------------------------
-
-IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
-
-wxClientDC::wxClientDC( wxWindow *win )
- : wxWindowDC( win )
-{
- wxCHECK_RET( win, _T("NULL window in wxClientDC::wxClientDC") );
-
-#ifdef __WXUNIVERSAL__
- wxPoint ptOrigin = win->GetClientAreaOrigin();
- SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
- wxSize size = win->GetClientSize();
- SetClippingRegion(wxPoint(0, 0), size);
-#endif // __WXUNIVERSAL__
-}
-
-void wxClientDC::DoGetSize(int *width, int *height) const
-{
- wxCHECK_RET( m_owner, _T("GetSize() doesn't work without window") );
-
- m_owner->GetClientSize( width, height );
-}
-
// ----------------------------------------------------------------------------
// wxDCModule
// ----------------------------------------------------------------------------