X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=dfb_api.c;h=c530831a7b63115d54f9ec8e7ed9acb583a6a10d;hb=00aca7d3f73b593d2b08b0849ca7eb51574de507;hp=7435ad4dd02015d7fba6e076018879defd68a201;hpb=20861b5cbccdb9aa93b67cdf9f6222143d2df504;p=my-code%2Fivac.git diff --git a/dfb_api.c b/dfb_api.c index 7435ad4..c530831 100644 --- a/dfb_api.c +++ b/dfb_api.c @@ -4,81 +4,183 @@ /* std includes */ #include +#include #include /* dfb includes */ #include -#define MY_FONT_HEIGHT 48 +#include "dfb_api.h" + +#define MY_FONT_HEIGHT 18 /* global stuff */ /* well ... */ -static IDirectFB *dfb = NULL; -static IDirectFBSurface *primary = NULL; -static int screen_width = 0; -static int screen_height = 0; +IDirectFB *dfb = NULL; + +IDirectFBSurface *primary = NULL; +IDirectFBSurface *logo = NULL; +IDirectFBSurface *video = NULL; +IDirectFBSurface *window = NULL; -static IDirectFBSurface *logo = NULL; +IDirectFBImageProvider *image_provider = NULL; +IDirectFBVideoProvider *video_provider = NULL; -static IDirectFBFont *font = NULL; -static char *text_top="Internet Video / Audio Conferencing" +int screen_width = 0; +int screen_height = 0; -/* image to load */ +char dfb_video_dev[]=VIDEO_DEV; +char text_top[]="Internet Video / Audio Conferencing"; char dfb_image[]="./images/ivac_logo.png"; +char dfb_font[]="./fonts/decker.ttf"; -int main (int argc, char **argv) { - int i; - DFBFontDescription font_desc; - DFBSurfaceDescription dsc; - /* image provider */ - IDirectFBImageProvider *provider; - - /* init */ - DirectFBInit (&argc, &argv); - DirectFBCreate (&dfb); - dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN); - dsc.flags=DSDESC_CAPS; - dsc.caps=DSCAPS_PRIMARY | DSCAPS_FLIPPING; - dfb->CreateSurface(dfb,&dsc,&primary); - primary->GetSize(primary,&screen_width,&screen_height); - printf("debug: w/h = %d / %d\n",screen_width,screen_height); - - /* create the imag provider */ - dfb->CreateImageProvider(dfb,dfb_image,&provider); - /* get image/provider description */ - provider->GetSurfaceDescription(provider,&dsc); - printf("debug: w/h %d / %d\n",dsc.width,dsc.height); - /* create apropriate surface */ - dfb->CreateSurface(dfb,&dsc,&logo); - /* render image */ - provider->RenderTo(provider,logo,NULL); - provider->Release(provider); - - /* create font */ - font_dsc.flags=DFDESC_HEIGHT; - font_dsc.height=MY_FONT_HEIGHT; - - - - /* slide logo */ - for(i = -dsc.width; i < screen_width; i++) { - /* clear screen */ - primary->FillRectangle(primary,0,0,screen_width,screen_height); - - /* blit image */ - primary->Blit(primary,logo,NULL,i,(screen_height-dsc.height)/2); - - /* flip */ - primary->Flip(primary,NULL,DSFLIP_WAITFORSYNC); - } - - /* release image */ - logo->Release(logo); - - primary->Release(primary); - dfb->Release(dfb); - - return 23; +/* variable definitions */ +// struct user_info { + + +/* functions */ + +int dfb_init(int *argc,char **argv) { + DirectFBInit(argc,&argv); + DirectFBCreate(&dfb); + dfb->SetCooperativeLevel(dfb,DFSCL_FULLSCREEN); + return 1; +} + +int check_accel(void) { + DFBCardCapabilities caps; + dfb->GetCardCapabilities(dfb,&caps); + return (caps.acceleration_mask); +} + +int create_primary_surface(void) { + DFBSurfaceDescription desc; + memset(&desc,0,sizeof(DFBSurfaceDescription)); + desc.flags=DSDESC_CAPS; + desc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING; + dfb->CreateSurface(dfb,&desc,&primary); + return 1; +} + +int get_surface_size(IDirectFBSurface *surface,int *width,int *height) { + surface->GetSize(surface,width,height); + return 1; +} + +int get_primary_surface_size(void) { + get_surface_size(primary,&screen_width,&screen_height); + return 1; +} + +int create_logo_surface(void) { + DFBSurfaceDescription desc; + DFBImageDescription image_desc; + dfb->CreateImageProvider(dfb,dfb_image,&image_provider); + image_provider->GetSurfaceDescription(image_provider,&desc); + image_provider->GetImageDescription(image_provider,&image_desc); + printf("image description: caps=%x red=%hhd green=%hhd blue=%hhd\n",image_desc.caps, + image_desc.colorkey_r, + image_desc.colorkey_g, + image_desc.colorkey_b); + dfb->CreateSurface(dfb,&desc,&logo); + image_provider->RenderTo(image_provider,logo,NULL); + image_provider->Release(image_provider); + return 1; +} + +int create_video_surface(void) { + DFBSurfaceDescription desc; + DFBVideoProviderCapabilities caps; + dfb->CreateVideoProvider(dfb,dfb_video_dev,&video_provider); + video_provider->GetSurfaceDescription(video_provider,&desc); + video_provider->GetCapabilities(video_provider,&caps); + printf("video capabilities: %x\n",caps); + dfb->CreateSurface(dfb,&desc,&video); + video_provider->PlayTo(video_provider,video,NULL,video_callback,NULL); + video_provider->Release(video_provider); + return 1; +} + +int clear_screen(IDirectFBSurface *surface) { + surface->FillRectangle(surface,0,0,screen_width,screen_height); + return 1; +} + +int release_surface(IDirectFBSurface *surface) { + surface->Release(surface); + return 1; +} + +int release_dfb(void) { + dfb->Release(dfb); + return 1; +} + +int blit_surface(IDirectFBSurface *source,int x,int y) { + primary->Blit(primary,source,NULL,x,y); + return 1; +} + +int blit_logo(void) { + int x,y; + get_surface_size(logo,&x,&y); + printf("size of logo width/height: %d/%d\n",x,y); + blit_surface(logo,((screen_width-x)/2),((screen_height-y)/2)); + return 1; +} + +int blit_video(void) { + int x,y; + get_surface_size(video,&x,&y); + printf("size of logo width/height: %d/%d\n",x,y); + // blit_surface(video,((screen_width-x)/2),((screen_height-y)/2)); + blit_surface(video,0,0); + return 1; +} + +int flip_it(void) { + primary->Flip(primary,NULL,DSFLIP_WAITFORSYNC); + return 1; +} + +DVFrameCallback video_callback(void) { + primary->StretchBlit(primary,video,NULL,NULL); + // flip_it; + return DFENUM_OK; } +/* test api app */ +int main (int argc, char **argv) { + + dfb_init(&argc,argv); + + check_accel(); + + create_primary_surface(); + + create_video_surface(); + // create_logo_surface(); + + get_primary_surface_size(); + printf("primary surface width/height: %d/%d\n",screen_width,screen_height); + + clear_screen(primary); + + puts("main: blit video"); + blit_video(); + // blit_logo(); + + // puts("main: flip"); + // flip_it(); + + sleep(10); + + release_surface(logo); + + release_surface(primary); + + release_dfb(); + + return 1; +}