X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3c861501a451503b31c075ccb59d16b0ae01e99..d90e6104e95614ed74bd9efaf6807f7a32641363:/src/dfb/dcclient.cpp diff --git a/src/dfb/dcclient.cpp b/src/dfb/dcclient.cpp index 257d73b45b..3ded9ca719 100644 --- a/src/dfb/dcclient.cpp +++ b/src/dfb/dcclient.cpp @@ -42,16 +42,59 @@ 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); } //----------------------------------------------------------------------------- @@ -63,18 +106,7 @@ wxClientDCBase::wxClientDCBase(wxWindow *win) 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); } //----------------------------------------------------------------------------- @@ -86,9 +118,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) 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); } //-----------------------------------------------------------------------------