X-Git-Url: https://hackdaworld.org/gitweb/?p=physik%2Fmorpheus.git;a=blobdiff_plain;f=display.c;h=9ed5c29a589a8b44472a461b2b347ccaa85b3a5f;hp=f61e7e23e95254abe827f3fb5a76d93f33527d8a;hb=HEAD;hpb=0ba7850819572931f67d28ebca0cc7d73d7c6dea diff --git a/display.c b/display.c index f61e7e2..9ed5c29 100644 --- a/display.c +++ b/display.c @@ -8,18 +8,11 @@ #include "defines.h" -#ifdef USE_DFB_API -static IDirectFB *dfb=NULL; -static IDirectFBSurface *primary_surface=NULL; -static int screen_width=0; -static int screen_height=0; -#endif - -int display_init(int x,int y,int z,display *display,u32 *cell,int *argc,char **argv) +int display_init(u32 x,u32 y,u32 z,display *display,cell *cell,int *argc,char **argv) { #ifdef USE_DFB_API DFBSurfaceDescription surface_dsc; - // DFBFontDescription font_dsc; + DFBFontDescription font_dsc; #endif /* store dimensions */ @@ -32,24 +25,167 @@ int display_init(int x,int y,int z,display *display,u32 *cell,int *argc,char **a /* the api(s) */ #ifdef USE_DFB_API DirectFBInit(argc,&argv); - DirectFBCreate(&dfb); - dfb->SetCooperativeLevel(dfb,DFSCL_FULLSCREEN); + DirectFBCreate(&(display->dfb)); + display->dfb->SetCooperativeLevel(display->dfb,DFSCL_FULLSCREEN); surface_dsc.flags=DSDESC_CAPS; surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING; - dfb->CreateSurface(dfb,&surface_dsc,&primary_surface); - primary_surface->GetSize(primary_surface,&screen_width,&screen_height); - display->dfb=dfb; - display->primary_surface=primary_surface; - display->screen_width=screen_width; - display->screen_height=screen_height; + display->dfb->CreateSurface(display->dfb,&surface_dsc,&(display->primary_surface)); + display->primary_surface->GetSize(display->primary_surface,&(display->screen_width),&(display->screen_height)); + font_dsc.flags=DFDESC_HEIGHT; + font_dsc.height=display->max_y*(display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE))/10; + display->dfb->CreateFont(display->dfb,DISPLAY_FONT,&font_dsc,&(display->font)); + display->primary_surface->SetFont(display->primary_surface,display->font); #endif return 23; } -int display_draw(u32 *cell,int x,int y,int z) +int display_release(display *display) +{ +#ifdef USE_DFB_API + display->font->Release(display->font); + display->primary_surface->Release(display->primary_surface); + display->dfb->Release(display->dfb); +#endif + + return 23; +} + +#ifdef USE_DFB_API +int dfb_choose_color(cell *cell_p,unsigned char *r,unsigned char *g,unsigned char *b) +{ + if(cell_p->status&AMORPH) + { + *r=0xff; + *g=0x00; + *b=0x00; + } else + { + *r=0x00; + *g=0x00; + *b=0xff; + } + return 23; +} +#endif + +int display_draw(display *display,u32 x,u32 y,u32 z) { #ifdef USE_DFB_API + int menu_x,menu_y,menu_w,menu_h; /* for the yellow box */ + char text[MAX_TXT]; + u32 x_c,y_c,z_c; + unsigned char r,g,b,a; + int display_faktor_x,display_faktor_y; + a=0xff; /* no alpha blending */ + if(((display->max_x+display->max_y+DISPLAY_X_FREE)>=display->screen_width)| + ((display->max_y+display->max_z+DISPLAY_Y_FREE)>=display->screen_height)) + { + puts("resolution too low!"); + return -23; + } + display_faktor_x=display->screen_width/(display->max_x+display->max_y+DISPLAY_X_FREE); + display_faktor_y=display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE); + // if(display_faktor_xmax_x;x_c++) + { + for(z_c=0;z_cmax_z;z_c++) + { + dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b); + if(x_c==x && z_c==z) + display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0); + else + display->primary_surface->SetColor(display->primary_surface,r,g,b,a); + display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y); + } + } + /* draw y-z surface */ + x_c=x; + for(y_c=0;y_cmax_y;y_c++) + { + for(z_c=0;z_cmax_z;z_c++) + { + dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b); + if(y_c==y && z_c==z) + display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0); + else + display->primary_surface->SetColor(display->primary_surface,r,g,b,a); + display->primary_surface->DrawRectangle(display->primary_surface,(y_c+display->max_x)*display_faktor_x+2*DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y); + } + } + /* draw x-y surface */ + z_c=z; + for(x_c=0;x_cmax_x;x_c++) + { + for(y_c=0;y_cmax_y;y_c++) + { + dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b); + if(x_c==x && y_c==y) + display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0); + else + display->primary_surface->SetColor(display->primary_surface,r,g,b,a); + display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,(y_c+display->max_z)*display_faktor_y+2*DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y); + } + } + /* display info window */ + r=0xff; + g=0xff; + b=0x00; + a=0xff; + menu_x=2*DISPLAY_X_FREE/3+display->max_x*display_faktor_x; + menu_y=2*DISPLAY_Y_FREE/3+display->max_z*display_faktor_y; + menu_w=display->max_y*display_faktor_x; + menu_h=display->max_y*display_faktor_y; + display->primary_surface->SetColor(display->primary_surface,0,0,0,0); + display->primary_surface->FillRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h); + display->primary_surface->SetColor(display->primary_surface,r,g,b,a); + display->primary_surface->DrawRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h); + display->primary_surface->DrawLine(display->primary_surface,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y*display->max_y-display_faktor_y); + display->primary_surface->SetColor(display->primary_surface,0x80,0x80,0xff,0xff); + sprintf(text,"x: %u",x); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT); + sprintf(text,"y: %u",y); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*2+menu_h/10*2,DSTF_LEFT); + sprintf(text,"z: %u",z); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*3+menu_h/10*3,DSTF_LEFT); + sprintf(text,"status: %c",((display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y))->status&AMORPH?'a':'c'); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*5+menu_h/10*5,DSTF_LEFT); + sprintf(text,"c conc.: %u",(display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y)->conc); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*6+menu_h/10*6,DSTF_LEFT); + sprintf(text,"step: %d",display->step); + display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x*display->max_x/2+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT); + /* flip all to surface */ + display->primary_surface->Flip(display->primary_surface,NULL,0); #endif return 23; } + +int display_event_init(display *display) +{ +#ifdef USE_DFB_API + display->dfb->GetInputDevice(display->dfb,DIDID_KEYBOARD,&(display->keyboard)); + display->keyboard->CreateEventBuffer(display->keyboard,&(display->keyboard_buffer)); +#endif + return 23; +} + +int display_scan_event(display *display,u32 *x,u32 *y,u32 *z,int *quit) +{ + DFBInputEvent keyboard_event; + display->keyboard_buffer->WaitForEvent(display->keyboard_buffer); + display->keyboard_buffer->GetEvent(display->keyboard_buffer,DFB_EVENT(&keyboard_event)); + if(keyboard_event.type==DIET_KEYPRESS) + { + if(keyboard_event.key_id==DIKI_LEFT && *x!=0) *x-=1; + if(keyboard_event.key_id==DIKI_RIGHT && *x!=display->max_x-1) *x+=1; + if(keyboard_event.key_id==DIKI_DOWN && *y!=0) *y-=1; + if(keyboard_event.key_id==DIKI_UP && *y!=display->max_y-1) *y+=1; + if(keyboard_event.key_id==DIKI_PAGE_UP && *z!=0) *z-=1; + if(keyboard_event.key_id==DIKI_PAGE_DOWN && *z!=display->max_z-1) *z+=1; + if(keyboard_event.key_id==DIKI_Q) *quit=1; + } + return 23; +}