diff --git a/++dfb/idirectfb.cpp b/++dfb/idirectfb.cpp index 415f7fa..87c812c 100644 --- a/++dfb/idirectfb.cpp +++ b/++dfb/idirectfb.cpp @@ -119,7 +119,9 @@ IDirectFBEventBuffer IDirectFB::CreateEventBuffer () const DFBCHECK( iface->CreateEventBuffer (iface, &idirectfbeventbuffer) ); - return IDirectFBEventBuffer (idirectfbeventbuffer); + static IDirectFBEventBuffer *buffer = new IDirectFBEventBuffer (idirectfbeventbuffer); + return *buffer; +// return IDirectFBEventBuffer (idirectfbeventbuffer); } IDirectFBEventBuffer IDirectFB::CreateInputEventBuffer (DFBInputDeviceCapabilities caps, diff --git a/++dfb/idirectfbsurface.cpp b/++dfb/idirectfbsurface.cpp index bc29fd5..0e65af2 100644 --- a/++dfb/idirectfbsurface.cpp +++ b/++dfb/idirectfbsurface.cpp @@ -348,7 +348,7 @@ void IDirectFBSurface::DrawLine (const DFBRegion &line) IDirectFBSurface IDirectFBSurface::GetSubSurface (int x, int y, int width, int height) { - DFBRectangle rect = { x, y, width, height }; + DFBRectangle rect( x, y, width, height ); IDirectFBSurface_C *idirectfbsurface; diff --git a/++dfb/idirectfbwindow.cpp b/++dfb/idirectfbwindow.cpp index d80665a..457df0b 100644 --- a/++dfb/idirectfbwindow.cpp +++ b/++dfb/idirectfbwindow.cpp @@ -51,7 +51,8 @@ IDirectFBEventBuffer IDirectFBWindow::CreateEventBuffer() DFBCHECK( iface->CreateEventBuffer (iface, &idirectfbeventbuffer) ); - return IDirectFBEventBuffer (idirectfbeventbuffer); + static IDirectFBEventBuffer *buffer = new IDirectFBEventBuffer (idirectfbeventbuffer); + return *buffer; } void IDirectFBWindow::AttachEventBuffer (IDirectFBEventBuffer *buffer) diff --git a/include/++dfb.h b/include/++dfb.h index a7dbf79..fc7b863 100644 --- a/include/++dfb.h +++ b/include/++dfb.h @@ -44,7 +44,17 @@ #define IDirectFBVideoProvider IDirectFBVideoProvider_C #define IDirectFBDataBuffer IDirectFBDataBuffer_C +#define DFBPoint DFBPoint_C +#define DFBDimension DFBDimension_C +#define DFBRectangle DFBRectangle_C +#define DFBRegion DFBRegion_C + + +extern "C" { #include +#include +#include +} #undef IDirectFB #undef IDirectFBScreen @@ -59,19 +69,266 @@ #undef IDirectFBVideoProvider #undef IDirectFBDataBuffer -class DirectFB; -class IDirectFB; -class IDirectFBScreen; -class IDirectFBDisplayLayer; -class IDirectFBSurface; -class IDirectFBPalette; -class IDirectFBWindow; -class IDirectFBInputDevice; -class IDirectFBEventBuffer; -class IDirectFBFont; -class IDirectFBImageProvider; -class IDirectFBVideoProvider; -class IDirectFBDataBuffer; +#undef DFBPoint +#undef DFBDimension +#undef DFBRectangle +#undef DFBRegion + + + +class DFBPoint : public DFBPoint_C { +public: + DFBPoint() { + x = 0; + y = 0; + } + + DFBPoint( const int &_x, const int &_y ) { + x = _x; + y = _y; + } + + DFBPoint( const DFBPoint_C &point ) { + x = point.x; + y = point.y; + } + + DFBPoint( const DFBRectangle_C &rectangle ) { + x = rectangle.x; + y = rectangle.y; + } + + DFBPoint( const DFBRegion_C ®ion ) { + x = region.x1; + y = region.y1; + } + + bool operator== ( const DFBPoint &ref ) const { + return ref.x == x && ref.y == y; + } + + DFBPoint operator +( const DFBPoint &offset ) const { + DFBPoint p( *this ); + p.x += offset.x; + p.y += offset.y; + return p; + } + + DFBPoint& operator +=( const DFBPoint& offset ) { + x += offset.x; + y += offset.y; + return *this; + } +}; + +class DFBDimension : public DFBDimension_C { +public: + DFBDimension() { + w = 0; + h = 0; + } + + DFBDimension( const int &_w, const int &_h ) { + w = _w; + h = _h; + } + + DFBDimension( const DFBDimension_C &dimension ) { + w = dimension.w; + h = dimension.h; + } + + DFBDimension( const DFBPoint_C &point ) { + w = point.x; + h = point.y; + } + + DFBDimension( const DFBRectangle_C &rectangle ) { + w = rectangle.w; + h = rectangle.h; + } + + DFBDimension( const DFBRegion_C ®ion ) { + w = region.x2 - region.x1 + 1; + h = region.y2 - region.y1 + 1; + } + + bool operator== ( const DFBDimension &ref ) const { + return ref.w == w && ref.h == h; + } + + bool contains( const DFBRegion_C ®ion ) const { + if (region.x1 < 0 || region.y1 < 0) + return false; + + if (region.x2 >= w || region.y2 >= h) + return false; + + return true; + } +}; + + + +class DFBRectangle : public DFBRectangle_C { +public: + DFBRectangle() { + x = 0; + y = 0; + w = 0; + h = 0; + } + + DFBRectangle( const int &_x, const int &_y, const int &_w, const int &_h ) { + x = _x; + y = _y; + w = _w; + h = _h; + } + + DFBRectangle( const DFBRectangle_C &rectangle ) { + x = rectangle.x; + y = rectangle.y; + w = rectangle.w; + h = rectangle.h; + } + + DFBRectangle( const DFBRegion_C ®ion ) { + x = region.x1; + y = region.y1; + w = region.x2 - region.x1 + 1; + h = region.y2 - region.y1 + 1; + } + + DFBRectangle( const DFBDimension_C &dimension ) { + x = 0; + y = 0; + w = dimension.w; + h = dimension.h; + } + + DFBRectangle( const DFBPoint_C &point, const DFBDimension_C &dimension ) { + x = point.x; + y = point.y; + w = dimension.w; + h = dimension.h; + } + + bool operator== ( const DFBRectangle &ref ) const { + return ref.x == x && ref.y == y && ref.w == w && ref.h == h; + } + + DFBRectangle& operator-= ( const DFBPoint &sub ) { + x -= sub.x; + y -= sub.y; + + return *this; + } + + DFBRectangle operator -( const DFBPoint &sub ) const { + return DFBRectangle( x - sub.x, y - sub.y, w, h ); + } + + DFBRectangle operator +( const DFBPoint &offset ) const { + DFBRectangle r( *this ); + r.x += offset.x; + r.y += offset.y; + return r; + } +}; + + +class DFBRegion : public DFBRegion_C { +public: + DFBRegion() { + x1 = 0; + y1 = 0; + x2 = 0; + y2 = 0; + } + + DFBRegion( const int &_x1, const int &_y1, const int &_x2, const int &_y2 ) { + x1 = _x1; + y1 = _y1; + x2 = _x2; + y2 = _y2; + } + + DFBRegion( const DFBRegion_C ®ion ) { + x1 = region.x1; + y1 = region.y1; + x2 = region.x2; + y2 = region.y2; + } + + DFBRegion( const DFBRectangle_C &rectangle ) { + x1 = rectangle.x; + y1 = rectangle.y; + x2 = x1 + rectangle.w - 1; + y2 = y1 + rectangle.h - 1; + } + + DFBRegion( const DFBDimension_C &dimension ) { + x1 = 0; + y1 = 0; + x2 = dimension.w - 1; + y2 = dimension.h - 1; + } + + DFBRegion( const DFBPoint_C &point, const DFBDimension_C &dimension ) { + x1 = point.x; + y1 = point.y; + x2 = x1 + dimension.w - 1; + y2 = y1 + dimension.h - 1; + } + + bool operator== ( const DFBRegion &ref ) const { + return ref.x1 == x1 && ref.y1 == y1 && ref.x2 == x2 && ref.y2 == y2; + } + + DFBRegion& operator-= ( const DFBPoint &sub ) { + x1 -= sub.x; + y1 -= sub.y; + x2 -= sub.x; + y2 -= sub.y; + + return *this; + } + + DFBRegion operator- ( const DFBPoint &sub ) const { + return DFBRegion( x1 - sub.x, y1 - sub.y, x2 - sub.x, y2 - sub.y ); + } + + DFBRegion& operator|= ( const DFBRegion &r ) { + if (r.x1 < x1) + x1 = r.x1; + + if (r.y1 < y1) + y1 = r.y1; + + if (r.x2 > x2) + x2 = r.x2; + + if (r.y2 > y2) + y2 = r.y2; + + return *this; + } + + void unionWith ( const DFBRegion &r ) { + if (r.x1 < x1) + x1 = r.x1; + + if (r.y1 < y1) + y1 = r.y1; + + if (r.x2 > x2) + x2 = r.x2; + + if (r.y2 > y2) + y2 = r.y2; + } +}; @@ -85,7 +342,7 @@ class IPPAny inline IPPAny_C *get_iface() { return iface; } inline IPPAny_C *get_iface() const { return iface; } - protected: + public: IPPAny_C* iface; public: IPPAny(){ @@ -132,6 +389,24 @@ class IPPAny } }; + + + +class DirectFB; +class IDirectFB; +class IDirectFBScreen; +class IDirectFBDisplayLayer; +class IDirectFBSurface; +class IDirectFBPalette; +class IDirectFBWindow; +class IDirectFBInputDevice; +class IDirectFBEventBuffer; +class IDirectFBFont; +class IDirectFBImageProvider; +class IDirectFBVideoProvider; +class IDirectFBDataBuffer; + + #include "idirectfb.h" #include "idirectfbscreen.h" #include "idirectfbdisplaylayer.h"