IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
wxWindowDC::wxWindowDC(wxWindow *win)
- : wxDC(win ? win->GetDfbSurface() : NULL)
{
- InitForWin(win);
+ InitForWin(win, NULL);
}
-void wxWindowDC::InitForWin(wxWindow *win)
+void wxWindowDC::InitForWin(wxWindow *win, const wxRect *rect)
{
wxCHECK_RET( win, _T("invalid window") );
+ // FIXME: this should be made to work: we need to detect that the window
+ // is not visible and in that case, a) ignore any drawing actions
+ // and b) provide dummy surface that can still be used to get
+ // information (e.g. text extents):
+ for ( wxWindow *w = win; w; w = w->GetParent() )
+ {
+ // painting on hidden TLW when non-TLW windows are shown is OK,
+ // DirectFB manages that:
+ if ( w->IsTopLevel() )
+ break;
+
+ wxASSERT_MSG( w->IsShown(),
+ _T("painting on hidden window not implemented yet") );
+ }
+
+ // check if the rectangle covers full window and so is not needed:
+ if ( rect && *rect == wxRect(win->GetSize()) )
+ rect = NULL;
+
+ // obtain the surface used for painting:
+ wxIDirectFBSurfacePtr surface;
+ if ( !rect )
+ {
+ wxCHECK_RET( win->GetSize().x > 0 && win->GetSize().y > 0,
+ _T("window has invalid size") );
+
+ surface = win->GetDfbSurface();
+ }
+ else
+ {
+ wxCHECK_RET( !rect || !rect->IsEmpty(), _T("invalid rectangle") );
+
+ DFBRectangle dfbrect = { rect->x, rect->y, rect->width, rect->height };
+ surface = win->GetDfbSurface()->GetSubSurface(&dfbrect);
+ }
+
+ if ( !surface )
+ return;
+
+ Init(surface);
SetFont(win->GetFont());
+
+ // offset coordinates to account for subsurface's origin coordinates:
+ if ( rect )
+ SetDeviceOrigin(rect->x, rect->y);
}
//-----------------------------------------------------------------------------
wxCHECK_RET( win, _T("invalid window") );
wxRect rect = win->GetClientRect();
- DFBRectangle dfbrect = { rect.x, rect.y, rect.width, rect.height };
-
- IDirectFBSurfacePtr winsurf(win->GetDfbSurface());
- IDirectFBSurfacePtr subsurf;
- if ( !DFB_CALL( winsurf->GetSubSurface(winsurf, &dfbrect, &subsurf) ) )
- return;
-
- Init(subsurf);
- InitForWin(win);
-
- // offset coordinates to account for subsurface's origin coordinates:
- SetDeviceOrigin(rect.x, rect.y);
+ InitForWin(win, &rect);
}
//-----------------------------------------------------------------------------
wxClientDC::~wxClientDC()
{
// flip to surface so that the changes become visible
- IDirectFBSurfacePtr surface(GetDirectFBSurface());
+ wxIDirectFBSurfacePtr surface(GetDirectFBSurface());
+
+ // FIXME: do this only if the surface was modified (as opposed to e.g.
+ // used only to obtain text metrics)
if ( surface )
- surface->Flip(surface, NULL, DSFLIP_NONE);
+ surface->Flip(NULL, DSFLIP_NONE);
}
//-----------------------------------------------------------------------------