I find that testing interrupts my creative flow :)
On Mon, 28 Feb 2005 08:33:11 +0100, Denis Oliver Kropp <[EMAIL PROTECTED]>
wrote:
> Quoting Mike Emmel:
> > Attached are two patchs. First a small patch to hide the SDL cursor.
>
> I applied the patch and built Cairo with DirectFB support,
> but how can I test it? Any example program
>
> --
> Best regards,
> Denis Oliver Kropp
>
> .------------------------------------------.
> | DirectFB - Hardware accelerated graphics |
> | http://www.directfb.org/ |
> "------------------------------------------"
>
#include <stdio.h>
#include <cairo.h>
#include <directfb.h>
#define CAIRO_HAS_DIRECTFB_SURFACE
#include <cairo-directfb.h>
#define DATADIR "data"
#define FONT "data/decker.ttf"
/* 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 ); \
} \
}
int main( int argc, char *argv[] )
{
IDirectFB *dfb;
IDirectFBDisplayLayer *layer;
IDirectFBWindow *window1;
IDirectFBSurface *window_surface1;
IDirectFBEventBuffer *buffer;
DFBDisplayLayerConfig layer_config;
DFBCardCapabilities caps;
DFBWindowID id1;
int err;
int quit = 0;
DFBCHECK(DirectFBInit( &argc, &argv ));
DFBCHECK(DirectFBCreate( &dfb ));
dfb->GetCardCapabilities( dfb, &caps );
DFBCHECK(dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer ));
layer->SetCooperativeLevel( layer, DLSCL_ADMINISTRATIVE );
if (!((caps.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) &&
(caps.blitting_flags & DSBLIT_BLEND_COLORALPHA )))
{
layer_config.flags = DLCONF_BUFFERMODE;
layer_config.buffermode = DLBM_BACKSYSTEM;
layer->SetConfiguration( layer, &layer_config );
}
layer->GetConfiguration( layer, &layer_config );
layer->EnableCursor ( layer, 1 );
{
DFBWindowDescription desc;
desc.flags = ( DWDESC_POSX | DWDESC_POSY |
DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS );
desc.posx = 200;
desc.posy = 200;
desc.width = 512;
desc.height = 145;
desc.caps = DWCAPS_ALPHACHANNEL;
DFBCHECK(layer->CreateWindow( layer, &desc, &window1 ) );
window1->CreateEventBuffer( window1, &buffer );
window1->GetSurface( window1, &window_surface1 );
window_surface1->SetColor( window_surface1, 0xFF, 0x20, 0x20, 0xFF );
window_surface1->DrawRectangle( window_surface1,
0, 0, desc.width, desc.height );
window_surface1->Flip( window_surface1, NULL, 0 );
window1->AttachEventBuffer( window1, buffer );
window1->SetOpacity( window1, 0xFF );
window1->GetID( window1, &id1 );
}
window1->RequestFocus( window1 );
window1->RaiseToTop( window1 );
{
cairo_t *cr = cairo_create();
//cairo_save(cr);
cairo_set_target_directfb (cr,dfb,window_surface1);
cairo_set_alpha(cr,1.0);
cairo_set_rgb_color(cr, 1,1,1);
cairo_rectangle(cr, 0, 0,200,200);
cairo_fill(cr);
cairo_save(cr);
cairo_move_to(cr,50,50);
cairo_scale_font (cr, 10);
cairo_set_rgb_color(cr, 0, 0, 0);
cairo_show_text (cr, "Hello World.");
cairo_restore(cr);
cairo_set_rgb_color(cr, 0.0,1.0,0);
cairo_move_to(cr,50,50);
cairo_set_line_width (cr,10);
cairo_line_to(cr,100,100);
cairo_stroke (cr);
cairo_restore(cr);
}
while (!quit) {
static IDirectFBWindow* active = NULL;
static int grabbed = 0;
static int startx = 0;
static int starty = 0;
static int endx = 0;
static int endy = 0;
DFBWindowEvent evt;
buffer->WaitForEventWithTimeout( buffer, 0, 10 );
while (buffer->GetEvent( buffer, DFB_EVENT(&evt) ) == DFB_OK) {
IDirectFBWindow* window;
if (evt.window_id == id1)
window = window1;
if (evt.type == DWET_GOTFOCUS) {
active = window;
}
else if (active) {
switch (evt.type) {
case DWET_BUTTONDOWN:
if (!grabbed && evt.button == DIBI_LEFT) {
grabbed = 1;
startx = evt.cx;
starty = evt.cy;
window->GrabPointer( window );
}
break;
case DWET_BUTTONUP:
switch (evt.button) {
case DIBI_LEFT:
if (grabbed) {
window->UngrabPointer( window );
grabbed = 0;
}
break;
case DIBI_MIDDLE:
break;
case DIBI_RIGHT:
quit = DIKS_DOWN;
break;
default:
break;
}
break;
case DWET_KEYDOWN:
if (grabbed)
break;
switch (evt.key_id) {
case DIKI_RIGHT:
active->Move (active, 1, 0);
break;
case DIKI_LEFT:
active->Move (active, -1, 0);
break;
case DIKI_UP:
active->Move (active, 0, -1);
break;
case DIKI_DOWN:
active->Move (active, 0, 1);
break;
default:
break;
}
break;
case DWET_LOSTFOCUS:
if (!grabbed && active == window)
active = NULL;
break;
default:
break;
}
}
switch (evt.type) {
case DWET_MOTION:
endx = evt.cx;
endy = evt.cy;
break;
case DWET_KEYDOWN:
switch (evt.key_symbol) {
case DIKS_ESCAPE:
case DIKS_SMALL_Q:
case DIKS_CAPITAL_Q:
case DIKS_BACK:
case DIKS_STOP:
quit = 1;
break;
default:
break;
}
break;
default:
break;
}
}
if (active) {
if (grabbed) {
active->Move( active, endx - startx, endy - starty);
startx = endx;
starty = endy;
}
}
}
buffer->Release( buffer );
window_surface1->Release( window_surface1 );
window1->Release( window1 );
layer->Release( layer );
dfb->Release( dfb );
return 0;
}
_______________________________________________
directfb-dev mailing list
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev