X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/52c8d32a71bb7553dd89324fa6d56faac95eb5d0..079f4130b861d094c79e0952966caad8b85dab67:/src/dfb/wrapdfb.cpp diff --git a/src/dfb/wrapdfb.cpp b/src/dfb/wrapdfb.cpp index 406d7a6893..c474b48e2b 100644 --- a/src/dfb/wrapdfb.cpp +++ b/src/dfb/wrapdfb.cpp @@ -15,6 +15,11 @@ #pragma hdrstop #endif +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" +#endif + #include "wx/dfb/wrapdfb.h" //----------------------------------------------------------------------------- @@ -31,7 +36,7 @@ bool wxDfbCheckReturn(DFBResult code) // these are programming errors, assert: #define DFB_ASSERT(code) \ case code: \ - wxFAIL_MSG( _T("DirectFB error: ") _T(#code) ); \ + wxFAIL_MSG( "DirectFB error: " _T(#code) ); \ return false \ DFB_ASSERT(DFB_DEAD); @@ -95,3 +100,138 @@ void wxIDirectFB::CleanUp() { ms_ptr.Reset(); } + +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) + ); +}