move misc surface helpers to wxIDirectFBSurface class

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41154 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2006-09-11 09:08:57 +00:00
parent 914f515762
commit a5b31f4e11
11 changed files with 115 additions and 138 deletions

View File

@@ -28,44 +28,6 @@
#define wxSTR_TO_DFB(s) wxConvUTF8.cWC2MB((s).wc_str(*wxConvUI)) #define wxSTR_TO_DFB(s) wxConvUTF8.cWC2MB((s).wc_str(*wxConvUI))
#endif #endif
//-----------------------------------------------------------------------------
// surface manipulation helpers
//-----------------------------------------------------------------------------
/// Mode of wxDfbCloneSurface() call
enum wxDfbCloneSurfaceMode
{
/// Don't copy surface pixels, just clone surface size and attributes
wxDfbCloneSurface_NoPixels = 0,
/// Make exact copy, including the pixels
wxDfbCloneSurface_CopyPixels
};
/**
Creates surface that is compatible with given @a surface (i.e. has same
capabilities, pixel format etc.) and has given @a size.
*/
wxIDirectFBSurfacePtr wxDfbCreateCompatibleSurface(
const wxIDirectFBSurfacePtr& surface,
const wxSize& size);
/**
Creates a new surface by cloning existing one. Depending on @a mode,
either makes exact copy (wxDfbCloneSurface_CopyPixels) or only creates a
new surface with the same size and attributes (wxDfbCloneSurface_NoPixels).
*/
wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
wxDfbCloneSurfaceMode mode);
/// Returns bit depth used by the surface
int wxDfbGetSurfaceDepth(const wxIDirectFBSurfacePtr& s);
/// Returns interface to the primary display layer:
wxIDirectFBDisplayLayerPtr wxDfbGetDisplayLayer();
/// Returns interface to the primary surface:
wxIDirectFBSurfacePtr wxDfbGetPrimarySurface();
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// misc helpers // misc helpers
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -266,10 +266,33 @@ struct wxIDirectFBSurface : public wxDfbWrapper<IDirectFBSurface>
bool Blit(const wxIDirectFBSurfacePtr& source, bool Blit(const wxIDirectFBSurfacePtr& source,
const DFBRectangle *source_rect, const DFBRectangle *source_rect,
int x, int y) int x, int y)
{ { return Blit(source->GetRaw(), source_rect, x, y); }
return Check(
m_ptr->Blit(m_ptr, source->GetRaw(), source_rect, x, y)); bool Blit(IDirectFBSurface *source,
} const DFBRectangle *source_rect,
int x, int y)
{ return Check(m_ptr->Blit(m_ptr, source, source_rect, x, y)); }
/// Returns bit depth used by the surface or -1 on error
int GetDepth();
/**
Creates a new surface by cloning this one. New surface will have same
capabilities, pixel format and pixel data as the existing one.
@see CreateCompatible
*/
wxIDirectFBSurfacePtr Clone();
/**
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.
*/
wxIDirectFBSurfacePtr CreateCompatible(const wxSize& size = wxDefaultSize);
}; };
@@ -446,7 +469,8 @@ struct wxIDirectFB : public wxDfbWrapper<IDirectFB>
return NULL; return NULL;
} }
wxIDirectFBDisplayLayerPtr GetDisplayLayer(DFBDisplayLayerID id) wxIDirectFBDisplayLayerPtr
GetDisplayLayer(DFBDisplayLayerID id = DLID_PRIMARY)
{ {
IDirectFBDisplayLayer *l; IDirectFBDisplayLayer *l;
if ( Check(m_ptr->GetDisplayLayer(m_ptr, id, &l)) ) if ( Check(m_ptr->GetDisplayLayer(m_ptr, id, &l)) )
@@ -455,6 +479,9 @@ struct wxIDirectFB : public wxDfbWrapper<IDirectFB>
return NULL; return NULL;
} }
/// Returns primary surface
wxIDirectFBSurfacePtr GetPrimarySurface();
private: private:
wxIDirectFB(IDirectFB *ptr) { Init(ptr); } wxIDirectFB(IDirectFB *ptr) { Init(ptr); }

View File

@@ -71,12 +71,12 @@ static wxVideoMode GetCurrentVideoMode()
{ {
wxVideoMode m; wxVideoMode m;
wxIDirectFBSurfacePtr surface(wxDfbGetPrimarySurface()); wxIDirectFBSurfacePtr surface(wxIDirectFB::Get()->GetPrimarySurface());
if ( !surface ) if ( !surface )
return m; // invalid return m; // invalid
surface->GetSize(&m.w, &m.h); surface->GetSize(&m.w, &m.h);
m.bpp = wxDfbGetSurfaceDepth(surface); m.bpp = surface->GetDepth();
return m; return m;
} }

View File

@@ -158,8 +158,9 @@ public:
wxBitmapRefData(const wxBitmapRefData& data) wxBitmapRefData(const wxBitmapRefData& data)
{ {
m_surface = wxDfbCloneSurface(data.m_surface, if ( data.m_surface )
wxDfbCloneSurface_NoPixels); m_surface = data.m_surface->Clone();
m_mask = data.m_mask ? new wxMask(*data.m_mask) : NULL; m_mask = data.m_mask ? new wxMask(*data.m_mask) : NULL;
#if wxUSE_PALETTE #if wxUSE_PALETTE
m_palette = data.m_palette ? new wxPalette(*data.m_palette) : NULL; m_palette = data.m_palette ? new wxPalette(*data.m_palette) : NULL;
@@ -294,7 +295,7 @@ int wxBitmap::GetDepth() const
{ {
wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") ); wxCHECK_MSG( Ok(), -1, wxT("invalid bitmap") );
return wxDfbGetSurfaceDepth(M_BITMAP->m_surface); return M_BITMAP->m_surface->GetDepth();
} }
wxMask *wxBitmap::GetMask() const wxMask *wxBitmap::GetMask() const

View File

@@ -130,7 +130,7 @@ void wxDC::DestroyClippingRegion()
int wxDC::GetDepth() const int wxDC::GetDepth() const
{ {
return wxDfbGetSurfaceDepth(m_surface); return m_surface->GetDepth();
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@@ -65,7 +65,7 @@ void wxWindowDC::InitForWin(wxWindow *win, const wxRect *rect)
// so let's create a dummy surface that has the same format as the real // so let's create a dummy surface that has the same format as the real
// one would have and let the code paint on it: // one would have and let the code paint on it:
wxSize size(rect ? rect->GetSize() : win->GetSize()); wxSize size(rect ? rect->GetSize() : win->GetSize());
surface = wxDfbCreateCompatibleSurface(win->GetDfbSurface(), size); surface = win->GetDfbSurface()->CreateCompatible(size);
} }
else if ( !rect ) else if ( !rect )
{ {

View File

@@ -38,7 +38,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxDC)
wxScreenDC::wxScreenDC() wxScreenDC::wxScreenDC()
{ {
Init(wxDfbGetPrimarySurface()); Init(wxIDirectFB::Get()->GetPrimarySurface());
} }
#warning "FIXME: does wxScreenDC need Flip call in dtor?" #warning "FIXME: does wxScreenDC need Flip call in dtor?"

View File

@@ -122,7 +122,7 @@ bool wxTopLevelWindowDFB::Create(wxWindow *parent,
pos.y = 0; pos.y = 0;
// create DirectFB window: // create DirectFB window:
wxIDirectFBDisplayLayerPtr layer = wxDfbGetDisplayLayer(); wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer());
wxCHECK_MSG( layer, false, _T("no display layer") ); wxCHECK_MSG( layer, false, _T("no display layer") );
DFBWindowDescription desc; DFBWindowDescription desc;

View File

@@ -83,90 +83,6 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height)
wxDisplaySize(width, height); wxDisplaySize(width, height);
} }
//-----------------------------------------------------------------------------
// surface manipulation helpers
//-----------------------------------------------------------------------------
wxIDirectFBSurfacePtr wxDfbCreateCompatibleSurface(
const wxIDirectFBSurfacePtr& s,
const wxSize& size)
{
if ( !s )
return NULL;
DFBSurfaceDescription desc;
desc.flags = (DFBSurfaceDescriptionFlags)(
DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
s->GetCapabilities(&desc.caps);
s->GetPixelFormat(&desc.pixelformat);
desc.width = size.x;
desc.height = size.y;
wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
if ( !snew )
return NULL;
if ( desc.pixelformat == DSPF_LUT8 )
{
wxIDirectFBPalettePtr pal(s->GetPalette());
if ( s )
{
if ( !snew->SetPalette(pal) )
return NULL;
}
}
return snew;
}
wxIDirectFBSurfacePtr wxDfbCloneSurface(const wxIDirectFBSurfacePtr& s,
wxDfbCloneSurfaceMode mode)
{
if ( !s )
return NULL;
wxSize size;
if ( !s->GetSize(&size.x, &size.y) )
return NULL;
wxIDirectFBSurfacePtr snew(wxDfbCreateCompatibleSurface(s, size));
if ( !snew )
return NULL;
if ( mode == wxDfbCloneSurface_CopyPixels )
{
if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
return NULL;
if ( !snew->Blit(s, NULL, 0, 0) )
return NULL;
}
return snew;
}
int wxDfbGetSurfaceDepth(const wxIDirectFBSurfacePtr& s)
{
wxCHECK_MSG( s, -1, _T("invalid surface") );
DFBSurfacePixelFormat format = DSPF_UNKNOWN;
if ( !s->GetPixelFormat(&format) )
return -1;
return DFB_BITS_PER_PIXEL(format);
}
wxIDirectFBDisplayLayerPtr wxDfbGetDisplayLayer()
{
return wxIDirectFB::Get()->GetDisplayLayer(DLID_PRIMARY);
}
wxIDirectFBSurfacePtr wxDfbGetPrimarySurface()
{
wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer());
return layer ? layer->GetSurface() : NULL;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// mouse // mouse
@@ -174,7 +90,7 @@ wxIDirectFBSurfacePtr wxDfbGetPrimarySurface()
void wxGetMousePosition(int *x, int *y) void wxGetMousePosition(int *x, int *y)
{ {
wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer()); wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer());
if ( layer ) if ( layer )
layer->GetCursorPosition(x, y); layer->GetCursorPosition(x, y);
} }

View File

@@ -370,7 +370,7 @@ void wxWindowDFB::WarpPointer(int x, int y)
if ( x >= w ) x = w-1; if ( x >= w ) x = w-1;
if ( y >= h ) y = h-1; if ( y >= h ) y = h-1;
wxIDirectFBDisplayLayerPtr layer(wxDfbGetDisplayLayer()); wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer());
wxCHECK_RET( layer, _T("no display layer") ); wxCHECK_RET( layer, _T("no display layer") );
layer->WarpCursor(x, y); layer->WarpCursor(x, y);

View File

@@ -95,3 +95,74 @@ void wxIDirectFB::CleanUp()
{ {
ms_ptr.Reset(); ms_ptr.Reset();
} }
wxIDirectFBSurfacePtr wxIDirectFB::GetPrimarySurface()
{
wxIDirectFBDisplayLayerPtr layer(GetDisplayLayer());
return layer ? layer->GetSurface() : NULL;
}
//-----------------------------------------------------------------------------
// wxIDirectFBSurface
//-----------------------------------------------------------------------------
int wxIDirectFBSurface::GetDepth()
{
DFBSurfacePixelFormat format = DSPF_UNKNOWN;
if ( !GetPixelFormat(&format) )
return -1;
return DFB_BITS_PER_PIXEL(format);
}
wxIDirectFBSurfacePtr wxIDirectFBSurface::CreateCompatible(const wxSize& sz)
{
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;
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;
}