--
[physik/morpheus.git] / display.c
index 4ef9546..9ed5c29 100644 (file)
--- 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 IDirectFBFont *font=NULL;
-// static int screen_width=0;
-// static int screen_height=0;
-#endif
-
-int display_init(int x,int y,int z,display *display,void *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;
 #endif
 
  /* store dimensions */
@@ -38,7 +31,10 @@ int display_init(int x,int y,int z,display *display,void *cell,int *argc,char **
  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
  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;
 }
@@ -46,6 +42,7 @@ int display_init(int x,int y,int z,display *display,void *cell,int *argc,char **
 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
@@ -54,9 +51,9 @@ int display_release(display *display)
 }
 
 #ifdef USE_DFB_API
-int dfb_choose_color(u32 *cell_p,unsigned char *r,unsigned char *g,unsigned char *b)
+int dfb_choose_color(cell *cell_p,unsigned char *r,unsigned char *g,unsigned char *b)
 {
- if((*cell_p&AMORPH)==AMORPH)
+ if(cell_p->status&AMORPH)
  {
   *r=0xff;
   *g=0x00;
@@ -71,11 +68,12 @@ int dfb_choose_color(u32 *cell_p,unsigned char *r,unsigned char *g,unsigned char
 }
 #endif
 
-int display_draw(display *display,int x,int y,int z)
+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 */
- int x_c,y_c,z_c;
+ 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 */
@@ -96,8 +94,11 @@ int display_draw(display *display,int x,int y,int z)
  {
   for(z_c=0;z_c<display->max_z;z_c++)
   {
-   dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
-   display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
+   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);
   }
  }
@@ -107,8 +108,11 @@ int display_draw(display *display,int x,int y,int z)
  {
   for(z_c=0;z_c<display->max_z;z_c++)
   {
-   dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
-   display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
+   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);
   }
  }
@@ -118,8 +122,11 @@ int display_draw(display *display,int x,int y,int z)
  {
   for(y_c=0;y_c<display->max_y;y_c++)
   {
-   dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
-   display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
+   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);
   }
  }
@@ -136,8 +143,49 @@ int display_draw(display *display,int x,int y,int z)
  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;
+}