| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/dfb/wrapdfb.h
- // Purpose: wx wrappers for DirectFB interfaces
- // Author: Vaclav Slavik
- // Created: 2006-08-23
- // Copyright: (c) 2006 REA Elektronik GmbH
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_DFB_WRAPDFB_H_
- #define _WX_DFB_WRAPDFB_H_
- #include "wx/dfb/dfbptr.h"
- #include "wx/gdicmn.h"
- #include "wx/vidmode.h"
- #include <directfb.h>
- #include <directfb_version.h>
- // DFB < 1.0 didn't have u8 type, only __u8
- #if DIRECTFB_MAJOR_VERSION == 0
- typedef __u8 u8;
- #endif
- wxDFB_DECLARE_INTERFACE(IDirectFB);
- wxDFB_DECLARE_INTERFACE(IDirectFBDisplayLayer);
- wxDFB_DECLARE_INTERFACE(IDirectFBFont);
- wxDFB_DECLARE_INTERFACE(IDirectFBWindow);
- wxDFB_DECLARE_INTERFACE(IDirectFBSurface);
- wxDFB_DECLARE_INTERFACE(IDirectFBPalette);
- wxDFB_DECLARE_INTERFACE(IDirectFBEventBuffer);
- /**
- Checks the @a code of a DirectFB call and returns true if it was
- successful and false if it failed, logging the errors as appropriate
- (asserts for programming errors, wxLogError for runtime failures).
- */
- bool wxDfbCheckReturn(DFBResult code);
- //-----------------------------------------------------------------------------
- // wxDfbEvent
- //-----------------------------------------------------------------------------
- /**
- The struct defined by this macro is a thin wrapper around DFB*Event type.
- It is needed because DFB*Event are typedefs and so we can't forward declare
- them, but we need to pass them to methods declared in public headers where
- <directfb.h> cannot be included. So this struct just holds the event value,
- it's sole purpose is that it can be forward declared.
- */
- #define WXDFB_DEFINE_EVENT_WRAPPER(T) \
- struct wx##T \
- { \
- wx##T() {} \
- wx##T(const T& event) : m_event(event) {} \
- \
- operator T&() { return m_event; } \
- operator const T&() const { return m_event; } \
- T* operator&() { return &m_event; } \
- \
- DFBEventClass GetClass() const { return m_event.clazz; } \
- \
- private: \
- T m_event; \
- };
- WXDFB_DEFINE_EVENT_WRAPPER(DFBEvent)
- WXDFB_DEFINE_EVENT_WRAPPER(DFBWindowEvent)
- //-----------------------------------------------------------------------------
- // wxDfbWrapper<T>
- //-----------------------------------------------------------------------------
- /// Base class for wxDfbWrapper<T>
- class wxDfbWrapperBase
- {
- public:
- /// Increases reference count of the object
- void AddRef()
- {
- m_refCnt++;
- }
- /// Decreases reference count and if it reaches zero, deletes the object
- void Release()
- {
- if ( --m_refCnt == 0 )
- delete this;
- }
- /// Returns result code of the last call
- DFBResult GetLastResult() const { return m_lastResult; }
- protected:
- wxDfbWrapperBase() : m_refCnt(1), m_lastResult(DFB_OK) {}
- /// Dtor may only be called from Release()
- virtual ~wxDfbWrapperBase() {}
- /**
- Checks the @a result of a DirectFB call and returns true if it was
- successful and false if it failed. Also stores result of the call
- so that it can be obtained by calling GetLastResult().
- */
- bool Check(DFBResult result)
- {
- m_lastResult = result;
- return wxDfbCheckReturn(result);
- }
- protected:
- /// Reference count
- unsigned m_refCnt;
- /// Result of the last DirectFB call
- DFBResult m_lastResult;
- };
- /**
- This template is base class for friendly C++ wrapper around DirectFB
- interface T.
- The wrapper provides same API as DirectFB, with a few exceptions:
- - methods return true/false instead of error code
- - methods that return or create another interface return pointer to the
- interface (or NULL on failure) instead of storing it in the last
- argument
- - interface arguments use wxFooPtr type instead of raw DirectFB pointer
- - methods taking flags use int type instead of an enum when the flags
- can be or-combination of enum elements (this is workaround for
- C++-unfriendly DirectFB API)
- */
- template<typename T>
- class wxDfbWrapper : public wxDfbWrapperBase
- {
- public:
- /// "Raw" DirectFB interface type
- typedef T DirectFBIface;
- /// Returns raw DirectFB pointer
- T *GetRaw() const { return m_ptr; }
- protected:
- /// To be called from ctor. Takes ownership of raw object.
- void Init(T *ptr) { m_ptr = ptr; }
- /// Dtor may only be used from Release
- ~wxDfbWrapper()
- {
- if ( m_ptr )
- m_ptr->Release(m_ptr);
- }
- protected:
- // pointer to DirectFB object
- T *m_ptr;
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBFont
- //-----------------------------------------------------------------------------
- struct wxIDirectFBFont : public wxDfbWrapper<IDirectFBFont>
- {
- wxIDirectFBFont(IDirectFBFont *s) { Init(s); }
- bool GetStringWidth(const char *text, int bytes, int *w)
- { return Check(m_ptr->GetStringWidth(m_ptr, text, bytes, w)); }
- bool GetStringExtents(const char *text, int bytes,
- DFBRectangle *logicalRect, DFBRectangle *inkRect)
- {
- return Check(m_ptr->GetStringExtents(m_ptr, text, bytes,
- logicalRect, inkRect));
- }
- bool GetHeight(int *h)
- { return Check(m_ptr->GetHeight(m_ptr, h)); }
- bool GetDescender(int *descender)
- { return Check(m_ptr->GetDescender(m_ptr, descender)); }
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBPalette
- //-----------------------------------------------------------------------------
- struct wxIDirectFBPalette : public wxDfbWrapper<IDirectFBPalette>
- {
- wxIDirectFBPalette(IDirectFBPalette *s) { Init(s); }
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBSurface
- //-----------------------------------------------------------------------------
- struct wxIDirectFBSurface : public wxDfbWrapper<IDirectFBSurface>
- {
- wxIDirectFBSurface(IDirectFBSurface *s) { Init(s); }
- bool GetSize(int *w, int *h)
- { return Check(m_ptr->GetSize(m_ptr, w, h)); }
- bool GetCapabilities(DFBSurfaceCapabilities *caps)
- { return Check(m_ptr->GetCapabilities(m_ptr, caps)); }
- bool GetPixelFormat(DFBSurfacePixelFormat *caps)
- { return Check(m_ptr->GetPixelFormat(m_ptr, caps)); }
- // convenience version of GetPixelFormat, returns DSPF_UNKNOWN if fails
- DFBSurfacePixelFormat GetPixelFormat();
- bool SetClip(const DFBRegion *clip)
- { return Check(m_ptr->SetClip(m_ptr, clip)); }
- bool SetColor(u8 r, u8 g, u8 b, u8 a)
- { return Check(m_ptr->SetColor(m_ptr, r, g, b, a)); }
- bool Clear(u8 r, u8 g, u8 b, u8 a)
- { return Check(m_ptr->Clear(m_ptr, r, g, b, a)); }
- bool DrawLine(int x1, int y1, int x2, int y2)
- { return Check(m_ptr->DrawLine(m_ptr, x1, y1, x2, y2)); }
- bool DrawRectangle(int x, int y, int w, int h)
- { return Check(m_ptr->DrawRectangle(m_ptr, x, y, w, h)); }
- bool FillRectangle(int x, int y, int w, int h)
- { return Check(m_ptr->FillRectangle(m_ptr, x, y, w, h)); }
- bool SetFont(const wxIDirectFBFontPtr& font)
- { return Check(m_ptr->SetFont(m_ptr, font->GetRaw())); }
- bool DrawString(const char *text, int bytes, int x, int y, int flags)
- {
- return Check(m_ptr->DrawString(m_ptr, text, bytes, x, y,
- (DFBSurfaceTextFlags)flags));
- }
- /**
- Updates the front buffer from the back buffer. If @a region is not
- NULL, only given rectangle is updated.
- */
- bool FlipToFront(const DFBRegion *region = NULL);
- wxIDirectFBSurfacePtr GetSubSurface(const DFBRectangle *rect)
- {
- IDirectFBSurface *s;
- if ( Check(m_ptr->GetSubSurface(m_ptr, rect, &s)) )
- return new wxIDirectFBSurface(s);
- else
- return NULL;
- }
- wxIDirectFBPalettePtr GetPalette()
- {
- IDirectFBPalette *s;
- if ( Check(m_ptr->GetPalette(m_ptr, &s)) )
- return new wxIDirectFBPalette(s);
- else
- return NULL;
- }
- bool SetPalette(const wxIDirectFBPalettePtr& pal)
- { return Check(m_ptr->SetPalette(m_ptr, pal->GetRaw())); }
- bool SetBlittingFlags(int flags)
- {
- return Check(
- m_ptr->SetBlittingFlags(m_ptr, (DFBSurfaceBlittingFlags)flags));
- }
- bool Blit(const wxIDirectFBSurfacePtr& source,
- const DFBRectangle *source_rect,
- int x, int y)
- { return Blit(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)); }
- bool StretchBlit(const wxIDirectFBSurfacePtr& source,
- const DFBRectangle *source_rect,
- const DFBRectangle *dest_rect)
- {
- return Check(m_ptr->StretchBlit(m_ptr, source->GetRaw(),
- source_rect, dest_rect));
- }
- /// 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();
- /// Flags for CreateCompatible()
- enum CreateCompatibleFlags
- {
- /// Don't create double-buffered surface
- CreateCompatible_NoBackBuffer = 1
- };
- /**
- 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.
- @param flags Or-combination of CreateCompatibleFlags values
- */
- wxIDirectFBSurfacePtr CreateCompatible(const wxSize& size = wxDefaultSize,
- int flags = 0);
- bool Lock(DFBSurfaceLockFlags flags, void **ret_ptr, int *ret_pitch)
- { return Check(m_ptr->Lock(m_ptr, flags, ret_ptr, ret_pitch)); }
- bool Unlock()
- { return Check(m_ptr->Unlock(m_ptr)); }
- /// Helper struct for safe locking & unlocking of surfaces
- struct Locked
- {
- Locked(const wxIDirectFBSurfacePtr& surface, DFBSurfaceLockFlags flags)
- : m_surface(surface)
- {
- if ( !surface->Lock(flags, &ptr, &pitch) )
- ptr = NULL;
- }
- ~Locked()
- {
- if ( ptr )
- m_surface->Unlock();
- }
- void *ptr;
- int pitch;
- private:
- wxIDirectFBSurfacePtr m_surface;
- };
- private:
- // this is private because we want user code to use FlipToFront()
- bool Flip(const DFBRegion *region, int flags);
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBEventBuffer
- //-----------------------------------------------------------------------------
- struct wxIDirectFBEventBuffer : public wxDfbWrapper<IDirectFBEventBuffer>
- {
- wxIDirectFBEventBuffer(IDirectFBEventBuffer *s) { Init(s); }
- bool CreateFileDescriptor(int *ret_fd)
- {
- return Check(m_ptr->CreateFileDescriptor(m_ptr, ret_fd));
- }
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBWindow
- //-----------------------------------------------------------------------------
- struct wxIDirectFBWindow : public wxDfbWrapper<IDirectFBWindow>
- {
- wxIDirectFBWindow(IDirectFBWindow *s) { Init(s); }
- bool GetID(DFBWindowID *id)
- { return Check(m_ptr->GetID(m_ptr, id)); }
- bool GetPosition(int *x, int *y)
- { return Check(m_ptr->GetPosition(m_ptr, x, y)); }
- bool GetSize(int *w, int *h)
- { return Check(m_ptr->GetSize(m_ptr, w, h)); }
- bool MoveTo(int x, int y)
- { return Check(m_ptr->MoveTo(m_ptr, x, y)); }
- bool Resize(int w, int h)
- { return Check(m_ptr->Resize(m_ptr, w, h)); }
- bool SetOpacity(u8 opacity)
- { return Check(m_ptr->SetOpacity(m_ptr, opacity)); }
- bool SetStackingClass(DFBWindowStackingClass klass)
- { return Check(m_ptr->SetStackingClass(m_ptr, klass)); }
- bool RaiseToTop()
- { return Check(m_ptr->RaiseToTop(m_ptr)); }
- bool LowerToBottom()
- { return Check(m_ptr->LowerToBottom(m_ptr)); }
- wxIDirectFBSurfacePtr GetSurface()
- {
- IDirectFBSurface *s;
- if ( Check(m_ptr->GetSurface(m_ptr, &s)) )
- return new wxIDirectFBSurface(s);
- else
- return NULL;
- }
- bool AttachEventBuffer(const wxIDirectFBEventBufferPtr& buffer)
- { return Check(m_ptr->AttachEventBuffer(m_ptr, buffer->GetRaw())); }
- bool RequestFocus()
- { return Check(m_ptr->RequestFocus(m_ptr)); }
- bool Destroy()
- { return Check(m_ptr->Destroy(m_ptr)); }
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFBDisplayLayer
- //-----------------------------------------------------------------------------
- struct wxIDirectFBDisplayLayer : public wxDfbWrapper<IDirectFBDisplayLayer>
- {
- wxIDirectFBDisplayLayer(IDirectFBDisplayLayer *s) { Init(s); }
- wxIDirectFBWindowPtr CreateWindow(const DFBWindowDescription *desc)
- {
- IDirectFBWindow *w;
- if ( Check(m_ptr->CreateWindow(m_ptr, desc, &w)) )
- return new wxIDirectFBWindow(w);
- else
- return NULL;
- }
- bool GetConfiguration(DFBDisplayLayerConfig *config)
- { return Check(m_ptr->GetConfiguration(m_ptr, config)); }
- wxVideoMode GetVideoMode();
- bool GetCursorPosition(int *x, int *y)
- { return Check(m_ptr->GetCursorPosition(m_ptr, x, y)); }
- bool WarpCursor(int x, int y)
- { return Check(m_ptr->WarpCursor(m_ptr, x, y)); }
- };
- //-----------------------------------------------------------------------------
- // wxIDirectFB
- //-----------------------------------------------------------------------------
- struct wxIDirectFB : public wxDfbWrapper<IDirectFB>
- {
- /**
- Returns pointer to DirectFB singleton object, it never returns NULL
- after wxApp was initialized. The object is cached, so calling this
- method is cheap.
- */
- static wxIDirectFBPtr Get()
- {
- if ( !ms_ptr ) CreateDirectFB();
- return ms_ptr;
- }
- bool SetVideoMode(int w, int h, int bpp)
- { return Check(m_ptr->SetVideoMode(m_ptr, w, h, bpp)); }
- wxIDirectFBSurfacePtr CreateSurface(const DFBSurfaceDescription *desc)
- {
- IDirectFBSurface *s;
- if ( Check(m_ptr->CreateSurface(m_ptr, desc, &s)) )
- return new wxIDirectFBSurface(s);
- else
- return NULL;
- }
- wxIDirectFBEventBufferPtr CreateEventBuffer()
- {
- IDirectFBEventBuffer *b;
- if ( Check(m_ptr->CreateEventBuffer(m_ptr, &b)) )
- return new wxIDirectFBEventBuffer(b);
- else
- return NULL;
- }
- wxIDirectFBFontPtr CreateFont(const char *filename,
- const DFBFontDescription *desc)
- {
- IDirectFBFont *f;
- if ( Check(m_ptr->CreateFont(m_ptr, filename, desc, &f)) )
- return new wxIDirectFBFont(f);
- else
- return NULL;
- }
- wxIDirectFBDisplayLayerPtr
- GetDisplayLayer(DFBDisplayLayerID id = DLID_PRIMARY)
- {
- IDirectFBDisplayLayer *l;
- if ( Check(m_ptr->GetDisplayLayer(m_ptr, id, &l)) )
- return new wxIDirectFBDisplayLayer(l);
- else
- return NULL;
- }
- /// Returns primary surface
- wxIDirectFBSurfacePtr GetPrimarySurface();
- private:
- wxIDirectFB(IDirectFB *ptr) { Init(ptr); }
- // creates ms_ptr instance
- static void CreateDirectFB();
- static void CleanUp();
- friend class wxApp; // calls CleanUp
- // pointer to the singleton IDirectFB object
- static wxIDirectFBPtr ms_ptr;
- };
- #endif // _WX_DFB_WRAPDFB_H_
|