]> git.saurik.com Git - wxWidgets.git/blob - src/dfb/wrapdfb.cpp
Fix for always failing assert in GetValue. Save the same value that
[wxWidgets.git] / src / dfb / wrapdfb.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/dfb/wrapdfb.cpp
3 // Purpose: wx wrappers for DirectFB interfaces
4 // Author: Vaclav Slavik
5 // Created: 2006-09-04
6 // RCS-ID: $Id$
7 // Copyright: (c) 2006 REA Elektronik GmbH
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #include "wx/dfb/wrapdfb.h"
19
20 //-----------------------------------------------------------------------------
21 // wxDfbCheckReturn
22 //-----------------------------------------------------------------------------
23
24 bool wxDfbCheckReturn(DFBResult code)
25 {
26 switch ( code )
27 {
28 case DFB_OK:
29 return true;
30
31 // these are programming errors, assert:
32 #define DFB_ASSERT(code) \
33 case code: \
34 wxFAIL_MSG( _T("DirectFB error: ") _T(#code) ); \
35 return false \
36
37 DFB_ASSERT(DFB_DEAD);
38 DFB_ASSERT(DFB_UNSUPPORTED);
39 DFB_ASSERT(DFB_UNIMPLEMENTED);
40 DFB_ASSERT(DFB_INVARG);
41 DFB_ASSERT(DFB_NOIMPL);
42 DFB_ASSERT(DFB_MISSINGFONT);
43 DFB_ASSERT(DFB_THIZNULL);
44 DFB_ASSERT(DFB_INVAREA);
45 DFB_ASSERT(DFB_DESTROYED);
46 DFB_ASSERT(DFB_NOSUCHMETHOD);
47 DFB_ASSERT(DFB_NOSUCHINSTANCE);
48 DFB_ASSERT(DFB_VERSIONMISMATCH);
49
50 #undef DFB_ASSERT
51
52 // these are not errors, but valid return codes:
53 case DFB_INTERRUPTED:
54 case DFB_BUFFEREMPTY:
55 return true;
56
57 default:
58 // FIXME: should handle the errors individually
59 wxLogError(_("DirectFB error %d occured."), (int)code);
60 return false;
61 }
62 }
63
64 //-----------------------------------------------------------------------------
65 // wxDfbPtrBase
66 //-----------------------------------------------------------------------------
67
68 /* static */
69 void wxDfbPtrBase::DoAddRef(wxDfbWrapperBase *ptr)
70 {
71 ptr->AddRef();
72 }
73
74 void wxDfbPtrBase::DoRelease(wxDfbWrapperBase *ptr)
75 {
76 ptr->Release();
77 }
78
79 //-----------------------------------------------------------------------------
80 // wxIDirectFB
81 //-----------------------------------------------------------------------------
82
83 wxIDirectFBPtr wxIDirectFB::ms_ptr;
84
85 /* static */
86 void wxIDirectFB::CreateDirectFB()
87 {
88 IDirectFB *dfb;
89 if ( wxDfbCheckReturn(DirectFBCreate(&dfb)) )
90 ms_ptr = new wxIDirectFB(dfb);
91 }
92
93 /* static */
94 void wxIDirectFB::CleanUp()
95 {
96 ms_ptr.Reset();
97 }
98
99 wxIDirectFBSurfacePtr wxIDirectFB::GetPrimarySurface()
100 {
101 wxIDirectFBDisplayLayerPtr layer(GetDisplayLayer());
102 return layer ? layer->GetSurface() : NULL;
103 }
104
105 //-----------------------------------------------------------------------------
106 // wxIDirectFBSurface
107 //-----------------------------------------------------------------------------
108
109 int wxIDirectFBSurface::GetDepth()
110 {
111 DFBSurfacePixelFormat format = DSPF_UNKNOWN;
112
113 if ( !GetPixelFormat(&format) )
114 return -1;
115
116 return DFB_BITS_PER_PIXEL(format);
117 }
118
119 wxIDirectFBSurfacePtr
120 wxIDirectFBSurface::CreateCompatible(const wxSize& sz, int flags)
121 {
122 wxSize size(sz);
123 if ( size == wxDefaultSize )
124 {
125 if ( !GetSize(&size.x, &size.y) )
126 return NULL;
127 }
128
129 wxCHECK_MSG( size.x > 0 && size.y > 0, NULL, _T("invalid size") );
130
131 DFBSurfaceDescription desc;
132 desc.flags = (DFBSurfaceDescriptionFlags)(
133 DSDESC_CAPS | DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT);
134 GetCapabilities(&desc.caps);
135 GetPixelFormat(&desc.pixelformat);
136 desc.width = size.x;
137 desc.height = size.y;
138
139 // filter out caps that don't make sense for a new compatible surface:
140 int caps = desc.caps;
141 caps &= ~DSCAPS_PRIMARY;
142 caps &= ~DSCAPS_SUBSURFACE;
143 if ( flags & CreateCompatible_NoBackBuffer )
144 {
145 caps &= ~DSCAPS_DOUBLE;
146 caps &= ~DSCAPS_TRIPLE;
147 }
148 desc.caps = (DFBSurfaceCapabilities)caps;
149
150 wxIDirectFBSurfacePtr snew(wxIDirectFB::Get()->CreateSurface(&desc));
151 if ( !snew )
152 return NULL;
153
154 if ( desc.pixelformat == DSPF_LUT8 )
155 {
156 wxIDirectFBPalettePtr pal(GetPalette());
157 if ( pal )
158 {
159 if ( !snew->SetPalette(pal) )
160 return NULL;
161 }
162 }
163
164 return snew;
165 }
166
167 wxIDirectFBSurfacePtr wxIDirectFBSurface::Clone()
168 {
169 wxIDirectFBSurfacePtr snew(CreateCompatible());
170 if ( !snew )
171 return NULL;
172
173 if ( !snew->SetBlittingFlags(DSBLIT_NOFX) )
174 return NULL;
175
176 if ( !snew->Blit(GetRaw(), NULL, 0, 0) )
177 return NULL;
178
179 return snew;
180 }
181
182 bool wxIDirectFBSurface::Flip(const DFBRegion *region, int flags)
183 {
184 return Check(m_ptr->Flip(m_ptr, region, (DFBSurfaceFlipFlags)flags));
185 }
186
187 bool wxIDirectFBSurface::FlipToFront(const DFBRegion *region)
188 {
189 // Blit to the front buffer instead of exchanging front and back ones.
190 // Always doing this ensures that back and front buffer have same content
191 // and so painting to the back buffer will never lose any previous
192 // drawings:
193 return Flip(region, DSFLIP_BLIT);
194 }