+
+wxIDirectFBSurfacePtr wxIDirectFB::GetPrimarySurface()
+{
+ DFBSurfaceDescription desc;
+ desc.flags = DSDESC_CAPS;
+ // NB: see dcscreen.cpp for why we request double-buffered surface
+ //
+ // This assumes the cooperative level is DFSCL_NORMAL (that's the
+ // default and wx doesn't modify it anywhere); if we ever support
+ // other cooperative levels, DSCAPS_DOUBLE should *not* be used with
+ // them.
+ desc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_DOUBLE);
+ return CreateSurface(&desc);
+}
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBSurface
+//-----------------------------------------------------------------------------
+
+DFBSurfacePixelFormat wxIDirectFBSurface::GetPixelFormat()
+{
+ DFBSurfacePixelFormat format = DSPF_UNKNOWN;
+ GetPixelFormat(&format);
+ return format;
+}
+
+int wxIDirectFBSurface::GetDepth()
+{
+ DFBSurfacePixelFormat format = DSPF_UNKNOWN;
+
+ if ( !GetPixelFormat(&format) )
+ return -1;
+
+ return DFB_BITS_PER_PIXEL(format);
+}
+
+wxIDirectFBSurfacePtr
+wxIDirectFBSurface::CreateCompatible(const wxSize& sz, int flags)
+{
+ wxSize size(sz);
+ if ( size == wxDefaultSize )
+ {
+ if ( !GetSize(&size.x, &size.y) )
+ return NULL;
+ }
+
+ wxCHECK_MSG( size.x > 0 && size.y > 0, NULL, "invalid size" );
+
+ DFBSurfaceDescription desc;
+ desc.flags = (DFBSurfaceDescriptionFlags)(
+ DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
+ GetCapabilities(&desc.caps);
+ GetPixelFormat(&desc.pixelformat);
+ 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;
+
+ if ( desc.pixelformat == DSPF_LUT8 )
+ {
+ wxIDirectFBPalettePtr pal(GetPalette());
+ if ( pal )
+ {
+ if ( !snew->SetPalette(pal) )
+ return NULL;
+ }
+ }
+
+ return snew;
+}
+
+wxIDirectFBSurfacePtr wxIDirectFBSurface::Clone()
+{
+ wxIDirectFBSurfacePtr snew(CreateCompatible());
+ if ( !snew )
+ return NULL;
+
+ if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
+ return NULL;
+
+ if ( !snew->Blit(GetRaw(), NULL, 0, 0) )
+ return NULL;
+
+ return snew;
+}
+
+bool wxIDirectFBSurface::Flip(const DFBRegion *region, int flags)
+{
+ return Check(m_ptr->Flip(m_ptr, region, (DFBSurfaceFlipFlags)flags));
+}
+
+bool wxIDirectFBSurface::FlipToFront(const DFBRegion *region)
+{
+ // Blit to the front buffer instead of exchanging front and back ones.
+ // Always doing this ensures that back and front buffer have same content
+ // and so painting to the back buffer will never lose any previous
+ // drawings:
+ return Flip(region, DSFLIP_BLIT);
+}
+
+//-----------------------------------------------------------------------------
+// wxIDirectFBDisplayLayer
+//-----------------------------------------------------------------------------
+
+wxVideoMode wxIDirectFBDisplayLayer::GetVideoMode()
+{
+ DFBDisplayLayerConfig cfg;
+ if ( !GetConfiguration(&cfg) )
+ return wxVideoMode(); // invalid
+
+ if ( !((cfg.flags & DLCONF_WIDTH) &&
+ (cfg.flags & DLCONF_HEIGHT) &&
+ (cfg.flags & DLCONF_PIXELFORMAT)) )
+ return wxVideoMode(); // invalid
+
+ return wxVideoMode
+ (
+ cfg.width,
+ cfg.height,
+ DFB_BITS_PER_PIXEL(cfg.pixelformat)
+ );
+}