2 Test were run with the following script
3 target can be directfb_bitmap or directfb
5 export CAIRO_TEST_TARGET=directfb_bitmap
6 export DFBARGS=quiet,no-banner,no-debug,log-file=dfblog,system=x11
12 #include "cairo-boilerplate-private.h"
14 #include <cairo-directfb.h>
19 #include <direct/debug.h>
21 D_DEBUG_DOMAIN (CairoDFB_Boiler, "CairoDFB/Boiler", "Cairo DirectFB Boilerplate");
23 /* macro for a safe call to DirectFB functions */
24 #define DFBCHECK(x...) do{ \
26 if (err != DFB_OK) { \
27 fprintf (stderr, "%s <%d>:\n\t", __FILE__, __LINE__); \
32 typedef struct _DFBInfo {
34 IDirectFBDisplayLayer *layer;
35 IDirectFBWindow *window;
36 IDirectFBSurface *surface;
40 _cairo_boilerplate_directfb_cleanup (void *closure)
42 DFBInfo *info = (DFBInfo *) closure;
45 info->surface->Release (info->surface);
48 info->window->Release (info->window);
51 info->layer->Release (info->layer);
54 info->dfb->Release (info->dfb);
62 DFBDisplayLayerConfig layer_config;
63 DFBGraphicsDeviceDescription desc;
67 info = xcalloc (1, sizeof (DFBInfo));
71 DFBCHECK (DirectFBInit (NULL, NULL));
72 DFBCHECK (DirectFBCreate (&info->dfb));
73 info->dfb->GetDeviceDescription (info->dfb, &desc);
75 DFBCHECK (info->dfb->GetDisplayLayer (info->dfb,
76 DLID_PRIMARY, &info->layer));
77 info->layer->SetCooperativeLevel (info->layer, DLSCL_ADMINISTRATIVE);
79 if ((desc.blitting_flags & (DSBLIT_BLEND_ALPHACHANNEL |
80 DSBLIT_BLEND_COLORALPHA)) !=
81 (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA))
83 layer_config.flags = DLCONF_BUFFERMODE;
84 layer_config.buffermode = DLBM_BACKSYSTEM;
85 info->layer->SetConfiguration (info->layer, &layer_config);
92 _cairo_boilerplate_directfb_cleanup (info);
96 static cairo_surface_t *
97 _cairo_boilerplate_directfb_window_create_surface (DFBInfo *info,
98 cairo_content_t content,
102 DFBWindowDescription desc;
105 D_DEBUG_AT (CairoDFB_Boiler, "%s (%p, %s, %dx%d)\n", __FUNCTION__, info,
106 content == CAIRO_CONTENT_ALPHA ? "ALPHA" :
107 content == CAIRO_CONTENT_COLOR ? "RGB" :
108 content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!",
111 desc.flags = DWDESC_POSX | DWDESC_POSY |
112 DWDESC_WIDTH | DWDESC_HEIGHT;
113 desc.caps = DSCAPS_NONE;
117 desc.height = height;
118 if (content == CAIRO_CONTENT_COLOR_ALPHA) {
119 desc.flags |= DWDESC_CAPS | DWDESC_PIXELFORMAT;
120 desc.caps |= DWCAPS_DOUBLEBUFFER | DWCAPS_ALPHACHANNEL;
121 desc.pixelformat = DSPF_ARGB;
124 DFBCHECK (info->layer->CreateWindow (info->layer, &desc, &info->window));
125 info->window->SetOpacity (info->window, 0xFF);
126 info->window->GetSurface (info->window, &info->surface);
127 info->surface->SetColor (info->surface, 0xFF, 0xFF, 0xFF, 0xFF);
128 info->surface->FillRectangle (info->surface,0, 0, desc.width, desc.height);
129 info->surface->Flip (info->surface, NULL, 0);
131 return cairo_directfb_surface_create (info->dfb, info->surface);
134 _cairo_boilerplate_directfb_cleanup (info);
138 static cairo_surface_t *
139 _cairo_boilerplate_directfb_bitmap_create_surface (DFBInfo *info,
140 cairo_content_t content,
145 DFBSurfaceDescription desc;
147 D_DEBUG_AT (CairoDFB_Boiler, "%s (%p, %s, %dx%d)\n", __FUNCTION__, info,
148 content == CAIRO_CONTENT_ALPHA ? "ALPHA" :
149 content == CAIRO_CONTENT_COLOR ? "RGB" :
150 content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!",
153 desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT;
154 desc.caps = DSCAPS_NONE;
156 desc.height = height;
157 if (content == CAIRO_CONTENT_COLOR_ALPHA) {
158 desc.flags |= DSDESC_PIXELFORMAT;
159 desc.pixelformat = DSPF_ARGB;
161 DFBCHECK (info->dfb->CreateSurface (info->dfb, &desc, &info->surface));
163 return cairo_directfb_surface_create (info->dfb, info->surface);
166 _cairo_boilerplate_directfb_cleanup (info);
170 static cairo_surface_t *
171 _cairo_boilerplate_directfb_create_surface (const char *name,
172 cairo_content_t content,
177 cairo_boilerplate_mode_t mode,
189 D_DEBUG_AT (CairoDFB_Boiler, "%s ('%s', %s, %dx%d, %s)\n",
191 content == CAIRO_CONTENT_ALPHA ? "ALPHA" :
192 content == CAIRO_CONTENT_COLOR ? "RGB" :
193 content == CAIRO_CONTENT_COLOR_ALPHA ? "ARGB" : "unknown content!",
195 mode == CAIRO_BOILERPLATE_MODE_TEST ? "TEST" :
196 mode == CAIRO_BOILERPLATE_MODE_PERF ? "PERF" : "unknown mode!");
203 if (mode == CAIRO_BOILERPLATE_MODE_TEST)
204 return _cairo_boilerplate_directfb_bitmap_create_surface (info, content, width, height);
205 else /* mode == CAIRO_BOILERPLATE_MODE_PERF */
206 return _cairo_boilerplate_directfb_window_create_surface (info, content, width, height);
209 static const cairo_boilerplate_target_t targets[] = {
211 "directfb", "directfb", NULL, NULL,
212 CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR, 0,
213 "cairo_directfb_surface_create",
214 _cairo_boilerplate_directfb_create_surface,
215 cairo_surface_create_similar,
217 _cairo_boilerplate_get_image_surface,
218 cairo_surface_write_to_png,
219 _cairo_boilerplate_directfb_cleanup,
220 NULL, NULL, TRUE, FALSE, FALSE
223 "directfb-bitmap", "directfb", NULL, NULL,
224 CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_CONTENT_COLOR_ALPHA, 0,
225 "cairo_directfb_surface_create",
226 _cairo_boilerplate_directfb_create_surface,
227 cairo_surface_create_similar,
229 _cairo_boilerplate_get_image_surface,
230 cairo_surface_write_to_png,
231 _cairo_boilerplate_directfb_cleanup,
232 NULL, NULL, FALSE, FALSE, FALSE
235 CAIRO_BOILERPLATE (directfb, targets);