make it possible to create wxWindowDC for a hidden window
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41131 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -41,6 +41,14 @@ enum wxDfbCloneSurfaceMode
|
|||||||
wxDfbCloneSurface_CopyPixels
|
wxDfbCloneSurface_CopyPixels
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Creates surface that is compatible with given @a surface (i.e. has same
|
||||||
|
capabilities, pixel format etc.) and has given @a size.
|
||||||
|
*/
|
||||||
|
wxIDirectFBSurfacePtr wxDfbCreateCompatibleSurface(
|
||||||
|
const wxIDirectFBSurfacePtr& surface,
|
||||||
|
const wxSize& size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Creates a new surface by cloning existing one. Depending on @a mode,
|
Creates a new surface by cloning existing one. Depending on @a mode,
|
||||||
either makes exact copy (wxDfbCloneSurface_CopyPixels) or only creates a
|
either makes exact copy (wxDfbCloneSurface_CopyPixels) or only creates a
|
||||||
|
|||||||
@@ -50,28 +50,24 @@ void wxWindowDC::InitForWin(wxWindow *win, const wxRect *rect)
|
|||||||
{
|
{
|
||||||
wxCHECK_RET( win, _T("invalid window") );
|
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:
|
// check if the rectangle covers full window and so is not needed:
|
||||||
if ( rect && *rect == wxRect(win->GetSize()) )
|
if ( rect && *rect == wxRect(win->GetSize()) )
|
||||||
rect = NULL;
|
rect = NULL;
|
||||||
|
|
||||||
// obtain the surface used for painting:
|
// obtain the surface used for painting:
|
||||||
wxIDirectFBSurfacePtr surface;
|
wxIDirectFBSurfacePtr surface;
|
||||||
if ( !rect )
|
|
||||||
|
if ( !win->IsVisible() )
|
||||||
|
{
|
||||||
|
// we're painting on invisible window: the changes won't have any
|
||||||
|
// effect, as the window will be repainted anyhow when it is shown, but
|
||||||
|
// we still need a valid DC so that e.g. text extents can be measured,
|
||||||
|
// so let's create a dummy surface that has the same format as the real
|
||||||
|
// one would have and let the code paint on it:
|
||||||
|
wxSize size(rect ? rect->GetSize() : win->GetSize());
|
||||||
|
surface = wxDfbCreateCompatibleSurface(win->GetDfbSurface(), size);
|
||||||
|
}
|
||||||
|
else if ( !rect )
|
||||||
{
|
{
|
||||||
wxCHECK_RET( win->GetSize().x > 0 && win->GetSize().y > 0,
|
wxCHECK_RET( win->GetSize().x > 0 && win->GetSize().y > 0,
|
||||||
_T("window has invalid size") );
|
_T("window has invalid size") );
|
||||||
|
|||||||
@@ -87,8 +87,9 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
|
|||||||
// surface manipulation helpers
|
// surface manipulation helpers
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
|
wxIDirectFBSurfacePtr wxDfbCreateCompatibleSurface(
|
||||||
wxDfbCloneSurfaceMode mode)
|
const wxIDirectFBSurfacePtr& s,
|
||||||
|
const wxSize& size)
|
||||||
{
|
{
|
||||||
if ( !s )
|
if ( !s )
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -97,8 +98,9 @@ wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
|
|||||||
desc.flags = (DFBSurfaceDescriptionFlags)(
|
desc.flags = (DFBSurfaceDescriptionFlags)(
|
||||||
DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
|
DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
|
||||||
s->GetCapabilities(&desc.caps);
|
s->GetCapabilities(&desc.caps);
|
||||||
s->GetSize(&desc.width, &desc.height);
|
|
||||||
s->GetPixelFormat(&desc.pixelformat);
|
s->GetPixelFormat(&desc.pixelformat);
|
||||||
|
desc.width = size.x;
|
||||||
|
desc.height = size.y;
|
||||||
|
|
||||||
wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
|
wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
|
||||||
if ( !snew )
|
if ( !snew )
|
||||||
@@ -114,6 +116,23 @@ wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return snew;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
|
||||||
|
wxDfbCloneSurfaceMode mode)
|
||||||
|
{
|
||||||
|
if ( !s )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
wxSize size;
|
||||||
|
if ( !s->GetSize(&size.x, &size.y) )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
wxIDirectFBSurfacePtr snew(wxDfbCreateCompatibleSurface(s, size));
|
||||||
|
if ( !snew )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if ( mode == wxDfbCloneSurface_CopyPixels )
|
if ( mode == wxDfbCloneSurface_CopyPixels )
|
||||||
{
|
{
|
||||||
if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
|
if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
|
||||||
|
|||||||
Reference in New Issue
Block a user