]> git.saurik.com Git - wxWidgets.git/commitdiff
don't allocate backbuffer for dummy surfaces
authorVáclav Slavík <vslavik@fastmail.fm>
Mon, 25 Sep 2006 08:01:36 +0000 (08:01 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Mon, 25 Sep 2006 08:01:36 +0000 (08:01 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41426 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dfb/wrapdfb.h
src/dfb/dcclient.cpp
src/dfb/wrapdfb.cpp

index 8b737fd9eb981291aa01639899ead45e2a1d456a..d4b5467a5e06c03c989d6f3b54ef5f9f990d565e 100644 (file)
@@ -294,14 +294,23 @@ struct wxIDirectFBSurface : public wxDfbWrapper<IDirectFBSurface>
      */
     wxIDirectFBSurfacePtr Clone();
 
      */
     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.
 
     /**
         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()
 
 private:
     // this is private because we want user code to use FlipToFront()
index 4cac80be25d255fa74192e8754d67b26b1ec64f0..1d1354843e0eaeb3c6194a9264e50beee4467a1f 100644 (file)
@@ -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());
     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 )
     {
 
     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
     }
     // else: don't flip the surface, wxTLW will do it when it finishes
     //       painting of its invalidated areas
index c23796696367b73be73d6991e29ef745cecd00aa..afd6ee064b0e8a57d1fa7bfbe790dfbd5cbeebcf 100644 (file)
@@ -116,7 +116,8 @@ int wxIDirectFBSurface::GetDepth()
     return DFB_BITS_PER_PIXEL(format);
 }
 
     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 )
 {
     wxSize size(sz);
     if ( size == wxDefaultSize )
@@ -135,6 +136,17 @@ wxIDirectFBSurfacePtr wxIDirectFBSurface::CreateCompatible(const wxSize& sz)
     desc.width = size.x;
     desc.height = size.y;
 
     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;
     wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
     if ( !snew )
         return NULL;