-
[my-code/ivac.git] / dfb_api.c
index 7435ad4..c530831 100644 (file)
--- a/dfb_api.c
+++ b/dfb_api.c
 
 /* std includes */
 #include <stdio.h>
+#include <string.h>
 #include <unistd.h>
 
 /* dfb includes */
 #include <directfb.h>
 
-#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;
+}