git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45233 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
232 lines
6.1 KiB
C++
232 lines
6.1 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/dfb/wrapdfb.cpp
|
|
// Purpose: wx wrappers for DirectFB interfaces
|
|
// Author: Vaclav Slavik
|
|
// Created: 2006-09-04
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2006 REA Elektronik GmbH
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/intl.h"
|
|
#include "wx/log.h"
|
|
#endif
|
|
|
|
#include "wx/dfb/wrapdfb.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDfbCheckReturn
|
|
//-----------------------------------------------------------------------------
|
|
|
|
bool wxDfbCheckReturn(DFBResult code)
|
|
{
|
|
switch ( code )
|
|
{
|
|
case DFB_OK:
|
|
return true;
|
|
|
|
// these are programming errors, assert:
|
|
#define DFB_ASSERT(code) \
|
|
case code: \
|
|
wxFAIL_MSG( _T("DirectFB error: ") _T(#code) ); \
|
|
return false \
|
|
|
|
DFB_ASSERT(DFB_DEAD);
|
|
DFB_ASSERT(DFB_UNSUPPORTED);
|
|
DFB_ASSERT(DFB_UNIMPLEMENTED);
|
|
DFB_ASSERT(DFB_INVARG);
|
|
DFB_ASSERT(DFB_NOIMPL);
|
|
DFB_ASSERT(DFB_MISSINGFONT);
|
|
DFB_ASSERT(DFB_THIZNULL);
|
|
DFB_ASSERT(DFB_INVAREA);
|
|
DFB_ASSERT(DFB_DESTROYED);
|
|
DFB_ASSERT(DFB_NOSUCHMETHOD);
|
|
DFB_ASSERT(DFB_NOSUCHINSTANCE);
|
|
DFB_ASSERT(DFB_VERSIONMISMATCH);
|
|
|
|
#undef DFB_ASSERT
|
|
|
|
// these are not errors, but valid return codes:
|
|
case DFB_INTERRUPTED:
|
|
case DFB_BUFFEREMPTY:
|
|
return true;
|
|
|
|
default:
|
|
// FIXME: should handle the errors individually
|
|
wxLogError(_("DirectFB error %d occured."), (int)code);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxDfbPtrBase
|
|
//-----------------------------------------------------------------------------
|
|
|
|
/* static */
|
|
void wxDfbPtrBase::DoAddRef(wxDfbWrapperBase *ptr)
|
|
{
|
|
ptr->AddRef();
|
|
}
|
|
|
|
void wxDfbPtrBase::DoRelease(wxDfbWrapperBase *ptr)
|
|
{
|
|
ptr->Release();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// wxIDirectFB
|
|
//-----------------------------------------------------------------------------
|
|
|
|
wxIDirectFBPtr wxIDirectFB::ms_ptr;
|
|
|
|
/* static */
|
|
void wxIDirectFB::CreateDirectFB()
|
|
{
|
|
IDirectFB *dfb;
|
|
if ( wxDfbCheckReturn(DirectFBCreate(&dfb)) )
|
|
ms_ptr = new wxIDirectFB(dfb);
|
|
}
|
|
|
|
/* static */
|
|
void wxIDirectFB::CleanUp()
|
|
{
|
|
ms_ptr.Reset();
|
|
}
|
|
|
|
wxIDirectFBSurfacePtr wxIDirectFB::GetPrimarySurface()
|
|
{
|
|
DFBSurfaceDescription desc;
|
|
desc.flags = DSDESC_CAPS;
|
|
desc.caps = DSCAPS_PRIMARY;
|
|
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, _T("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)
|
|
);
|
|
}
|