From: Václav Slavík Date: Mon, 25 Sep 2006 08:01:36 +0000 (+0000) Subject: don't allocate backbuffer for dummy surfaces X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7e2baeb41321aedca928608f816f03c13afdeff9?ds=inline don't allocate backbuffer for dummy surfaces git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41426 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dfb/wrapdfb.h b/include/wx/dfb/wrapdfb.h index 8b737fd9eb..d4b5467a5e 100644 --- a/include/wx/dfb/wrapdfb.h +++ b/include/wx/dfb/wrapdfb.h @@ -294,14 +294,23 @@ struct wxIDirectFBSurface : public wxDfbWrapper */ wxIDirectFBSurfacePtr Clone(); + /// Flags for CreateCompatible() + enum CreateCompatibleFlags + { + /// Don't create double-buffered surface + CreateCompatible_NoBackBuffer = 1 + }; + /** Creates a surface compatible with this one, i.e. surface with the same capabilities and pixel format, but with different and size. - @param size Size of the surface to create. If wxDefaultSize, use the - size of this surface. + @param size Size of the surface to create. If wxDefaultSize, use the + size of this surface. + @param flags Or-combination of CreateCompatibleFlags values */ - wxIDirectFBSurfacePtr CreateCompatible(const wxSize& size = wxDefaultSize); + wxIDirectFBSurfacePtr CreateCompatible(const wxSize& size = wxDefaultSize, + int flags = 0); private: // this is private because we want user code to use FlipToFront() diff --git a/src/dfb/dcclient.cpp b/src/dfb/dcclient.cpp index 4cac80be25..1d1354843e 100644 --- a/src/dfb/dcclient.cpp +++ b/src/dfb/dcclient.cpp @@ -74,7 +74,11 @@ wxIDirectFBSurfacePtr CreateDummySurface(wxWindow *win, const wxRect *rect) wxLogTrace(TRACE_PAINT, _T("%p ('%s'): creating dummy DC surface"), win, win->GetName().c_str()); wxSize size(rect ? rect->GetSize() : win->GetSize()); - return win->GetDfbSurface()->CreateCompatible(size); + return win->GetDfbSurface()->CreateCompatible + ( + size, + wxIDirectFBSurface::CreateCompatible_NoBackBuffer + ); } //----------------------------------------------------------------------------- @@ -191,8 +195,14 @@ wxWindowDC::~wxWindowDC() if ( m_shouldFlip ) { - // FIXME: flip only modified parts of the surface - surface->FlipToFront(); + DFBSurfaceCapabilities caps = DSCAPS_NONE; + surface->GetCapabilities(&caps); + if ( caps & DSCAPS_DOUBLE ) + { + // FIXME: flip only modified parts of the surface + surface->FlipToFront(); + } + // else: the surface is not double-buffered and so cannot be flipped } // else: don't flip the surface, wxTLW will do it when it finishes // painting of its invalidated areas diff --git a/src/dfb/wrapdfb.cpp b/src/dfb/wrapdfb.cpp index c237966963..afd6ee064b 100644 --- a/src/dfb/wrapdfb.cpp +++ b/src/dfb/wrapdfb.cpp @@ -116,7 +116,8 @@ int wxIDirectFBSurface::GetDepth() return DFB_BITS_PER_PIXEL(format); } -wxIDirectFBSurfacePtr wxIDirectFBSurface::CreateCompatible(const wxSize& sz) +wxIDirectFBSurfacePtr +wxIDirectFBSurface::CreateCompatible(const wxSize& sz, int flags) { wxSize size(sz); if ( size == wxDefaultSize ) @@ -135,6 +136,17 @@ wxIDirectFBSurfacePtr wxIDirectFBSurface::CreateCompatible(const wxSize& sz) desc.width = size.x; desc.height = size.y; + // filter out caps that don't make sense for a new compatible surface: + int caps = desc.caps; + caps &= ~DSCAPS_PRIMARY; + caps &= ~DSCAPS_SUBSURFACE; + if ( flags & CreateCompatible_NoBackBuffer ) + { + caps &= ~DSCAPS_DOUBLE; + caps &= ~DSCAPS_TRIPLE; + } + desc.caps = (DFBSurfaceCapabilities)caps; + wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc)); if ( !snew ) return NULL;