summaryrefslogtreecommitdiff
path: root/test/cairo-test-directfb.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/cairo-test-directfb.c')
-rw-r--r--test/cairo-test-directfb.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/test/cairo-test-directfb.c b/test/cairo-test-directfb.c
new file mode 100644
index 000000000..13049c5e6
--- /dev/null
+++ b/test/cairo-test-directfb.c
@@ -0,0 +1,127 @@
+
+/*
+Test were run with the following script
+target can be directfb_bitmap or directfb
+
+export CAIRO_TEST_TARGET=directfb_bitmap
+export DFBARGS=quiet,no-banner,no-debug,log-file=dfblog,system=x11
+cd cairo/test
+make check
+
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "cairo-test.h"
+#include "cairo-test-directfb.h"
+#include <directfb.h>
+#include "cairo-directfb.h"
+
+/* macro for a safe call to DirectFB functions */
+#define DFBCHECK(x...) \
+{ \
+ err = x; \
+ if (err != DFB_OK) { \
+ fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
+ DirectFBErrorFatal( #x, err ); \
+ } \
+}
+
+typedef struct _DFBInfo {
+ IDirectFB *dfb;
+ IDirectFBDisplayLayer *layer;
+ IDirectFBWindow *window;
+ IDirectFBSurface *surface;
+} DFBInfo ;
+
+static DFBInfo *init(void) {
+ DFBDisplayLayerConfig layer_config;
+ DFBGraphicsDeviceDescription desc;
+ int err;
+ DFBInfo *info = malloc(sizeof(DFBInfo));
+ if( !info )
+ return NULL;
+
+
+ DFBCHECK(DirectFBInit( NULL,NULL));
+ DFBCHECK(DirectFBCreate( &info->dfb ));
+ info->dfb->GetDeviceDescription(info->dfb, &desc );
+
+ DFBCHECK(info->dfb->GetDisplayLayer( info->dfb, DLID_PRIMARY, &info->layer ));
+ info->layer->SetCooperativeLevel( info->layer, DLSCL_ADMINISTRATIVE );
+
+ if (!((desc.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) &&
+ (desc.blitting_flags & DSBLIT_BLEND_COLORALPHA )))
+ {
+ layer_config.flags = DLCONF_BUFFERMODE;
+ layer_config.buffermode = DLBM_BACKSYSTEM;
+ info->layer->SetConfiguration( info->layer, &layer_config );
+ }
+ return info;
+}
+
+
+cairo_surface_t *
+create_directfb_surface (cairo_test_t* test, cairo_format_t format,
+ void **closure) {
+ DFBWindowDescription desc;
+ int err;
+ DFBInfo *info = init();
+ if( !info )
+ return NULL;
+ *closure = info;
+
+ desc.flags = ( DWDESC_POSX | DWDESC_POSY |
+ DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS|DSDESC_PIXELFORMAT );
+ desc.posx = 0;
+ desc.posy = 0;
+ desc.width = test->width;
+ desc.height = test->height;
+ desc.caps = DWCAPS_DOUBLEBUFFER;
+ desc.caps |= DWCAPS_ALPHACHANNEL;
+ desc.pixelformat = DSPF_ARGB;
+
+ DFBCHECK(info->layer->CreateWindow( info->layer, &desc, &info->window ) );
+ info->window->SetOpacity( info->window, 0xFF );
+ info->window->GetSurface( info->window, &info->surface );
+ info->surface->SetColor( info->surface, 0xFF, 0xFF, 0xFF, 0xFF );
+ info->surface->FillRectangle( info->surface,0, 0, desc.width, desc.height );
+ info->surface->Flip( info->surface, NULL, 0 );
+ cairo_surface_t *csurface=cairo_directfb_surface_create(info->dfb,info->surface);
+ return csurface;
+}
+
+cairo_surface_t *
+create_directfb_bitmap_surface (cairo_test_t* test, cairo_format_t format,
+ void **closure) {
+ int err;
+ DFBInfo *info = init();
+ if( !info ) return NULL;
+ *closure = info;
+ info->window= NULL; /* make sure window is null*/
+ DFBSurfaceDescription desc;
+
+ desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
+ desc.caps = DSCAPS_NONE;
+ desc.width = test->width;
+ desc.height = test->height;
+ desc.pixelformat = DSPF_ARGB;
+ DFBCHECK(info->dfb->CreateSurface (info->dfb, &desc,&info->surface));
+ cairo_surface_t *csurface=cairo_directfb_surface_create(info->dfb,
+ info->surface);
+ return csurface;
+}
+
+void
+cleanup_directfb (void* closure) {
+ DFBInfo *info = (DFBInfo *)closure;
+ if( info->surface )
+ info->surface->Release( info->surface );
+ if( info->window )
+ info->window->Release( info->window );
+ if( info->layer )
+ info->layer->Release( info->layer );
+ if( info->dfb )
+ info->dfb->Release( info->dfb );
+}