-
[physik/nlsop.git] / dfbapi.c
index 3d0e4d0..58510fc 100644 (file)
--- a/dfbapi.c
+++ b/dfbapi.c
@@ -6,18 +6,16 @@
  */
 
 #include <stdio.h>
+#include <directfb.h>
 #include "dfbapi.h"
 
 /* two dimensional lattice */
 
-int d2_lattice_init(int *argc,char **argv,d2_lattice *d2_l,int x,int y)
+int d2_lattice_init(int *argc,char **argv,d2_lattice *d2_l)
 {
  DFBSurfaceDescription surface_dsc;
  DFBFontDescription font_dsc;
  
- d2_l->max_x=x;
- d2_l->max_y=y;
-
  DirectFBInit(argc,&argv);
  DirectFBCreate(&(d2_l->dfb));
  d2_l->dfb->SetCooperativeLevel(d2_l->dfb,DFSCL_FULLSCREEN);
@@ -28,7 +26,7 @@ int d2_lattice_init(int *argc,char **argv,d2_lattice *d2_l,int x,int y)
  d2_l->p_surface->GetSize(d2_l->p_surface,&(d2_l->s_width),&(d2_l->s_height));
  
  font_dsc.flags=DFDESC_HEIGHT;
- font_dsc.height=d2_l->s_height/40; /* 40 ? */
+ font_dsc.height=d2_l->s_height/60; /* 60 ? */
  d2_l->font_h=font_dsc.height;
  d2_l->dfb->CreateFont(d2_l->dfb,FONT,&font_dsc,&(d2_l->font));
  d2_l->p_surface->SetFont(d2_l->p_surface,d2_l->font);
@@ -47,15 +45,11 @@ int d2_lattice_init(int *argc,char **argv,d2_lattice *d2_l,int x,int y)
  } else return 1;
 }
 
-int d3_lattice_init(int *argc,char **argv,d3_lattice *d3_l,int x,int y,int z)
+int d3_lattice_init(int *argc,char **argv,d3_lattice *d3_l)
 {
  DFBSurfaceDescription surface_dsc;
  DFBFontDescription font_dsc;
  
- d3_l->max_x=x;
- d3_l->max_y=y;
- d3_l->max_z=z;
-
  DirectFBInit(argc,&argv);
  DirectFBCreate(&(d3_l->dfb));
  d3_l->dfb->SetCooperativeLevel(d3_l->dfb,DFSCL_FULLSCREEN);
@@ -71,12 +65,13 @@ int d3_lattice_init(int *argc,char **argv,d3_lattice *d3_l,int x,int y,int z)
  d3_l->dfb->CreateFont(d3_l->dfb,FONT,&font_dsc,&(d3_l->font));
  d3_l->p_surface->SetFont(d3_l->p_surface,d3_l->font);
 
- d3_l->fakt_y=(d3_l->s_height-(3*Y_GAP))/(d3_l->max_z+d3_l->max_y);
- d3_l->fakt_x=(d3_l->s_width-(3*X_GAP))/(d3_l->max_x+d3_l->max_y);
- d3_l->info_x=d3_l->fakt_x*d3_l->max_x+(2*X_GAP);
- d3_l->info_y=d3_l->fakt_y*d3_l->max_z+(2*Y_GAP);
- d3_l->info_w=d3_l->fakt_x*d3_l->max_y;
- d3_l->info_h=d3_l->fakt_y*d3_l->max_y;
+ d3_l->fakt_y=(d3_l->s_height-(2*Y_GAP))/d3_l->max_z;
+ d3_l->fakt_x=(d3_l->s_width-(4*X_GAP))/(d3_l->max_x+d3_l->max_y+d3_l->max_x);
+ d3_l->info_x=d3_l->fakt_x*(d3_l->max_x+d3_l->max_y)+(3*X_GAP);
+ d3_l->info_y=d3_l->fakt_y*d3_l->max_y+(2*Y_GAP);
+ d3_l->o_x=d3_l->fakt_x*d3_l->max_x+(2*X_GAP);
+ d3_l->info_w=d3_l->fakt_x*d3_l->max_x;
+ d3_l->info_h=d3_l->fakt_y*(d3_l->max_z-d3_l->max_y)-Y_GAP;
 
  return 1;
 }
@@ -99,28 +94,40 @@ int d3_lattice_release(d3_lattice *d3_l)
  return 1;
 }
 
-int dx_lattice_get_color(unsigned char *status,unsigned char *r,unsigned char *g,unsigned char *b)
+int dx_lattice_get_color(unsigned char *status,unsigned char *r,unsigned char *g,unsigned char *b,unsigned char mode)
 {
- if((*status)&RED)
+ *g=0;
+ if((!mode)||mode==3)
+ {
+  if((*status)&RED)
+  {
+   *r=0xff;
+   *b=0;
+  } else
+  {
+   *r=0;
+   *b=0xff;
+  }
+ } else if(mode==1)
  {
-  *r=0xff;
-  *g=0;
-  *b=0;
- } else
+  *r=*status;
+  *g=*status;
+  *b=0xff;
+ } else if(mode==2)
  {
-  *r=0;
-  *g=0;
+  *r=*status;
   *b=0xff;
  }
  
  return 1;
 }
 
-int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v)
+int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v,unsigned char mode,int max_extra)
 {
  int x_c,y_c;
  int i;
  unsigned char r,g,b,a;
+ unsigned char foobar;
 
  a=0xff; /* no alpha blending */
  
@@ -128,7 +135,17 @@ int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v)
  {
   for(y_c=0;y_c<d2_l->max_y;y_c++)
   {
-   dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b);
+   if(!mode) dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b,mode);
+   if(mode==1)
+   {
+    foobar=(unsigned char)(*(d2_l->extra+x_c+y_c*d2_l->max_x)*255/max_extra);
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
+   if(mode==2)
+   {
+    foobar=(*(unsigned char *)(d2_l->v_ptr+x_c+y_c*d2_l->max_x));
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
    if(x_c==x && y_c==y)
    {
     r=0xff;
@@ -168,10 +185,11 @@ int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v)
  return 1;
 }
 
-int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)  
+int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v,unsigned char mode,int max_extra,u32 *p1,u32 max1,u32 *p2,u32 max2)
 {
  int x_c,y_c,z_c;
  int i;
+ unsigned char foobar;
  unsigned char r,g,b,a;
 
  a=0xff; /* no alpha blending */
@@ -181,7 +199,26 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
  {
   for(z_c=0;z_c<d3_l->max_z;z_c++)
   {
-   dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b);
+   if((!mode)||mode==3) dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b,mode);
+   if(mode==3)
+   {
+    if(d3_l->max_x*p1[z_c]/max1==x_c)
+    {
+     r=0xff;
+     g=0xff;
+     b=0xff;
+    }
+   }
+   if(mode==1)
+   {
+    foobar=(unsigned char)(*(d3_l->extra+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y)*255/max_extra);
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
+   if(mode==2)
+   {
+    foobar=(*(unsigned char *)(d3_l->v_ptr+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y));
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
    if(x_c==x && z_c==z)
    {
     r=0xff;
@@ -201,7 +238,26 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
  {
   for(z_c=0;z_c<d3_l->max_z;z_c++)
   {
-   dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b);
+   if((!mode)||mode==3) dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b,mode);
+   if(mode==3)
+   {
+    if((int)(d3_l->max_y*(1.0*p2[z_c]/max2))==y_c)
+    {
+     r=0xff;
+     g=0xff;
+     b=0xff;
+    }
+   }
+   if(mode==1)
+   {
+    foobar=(unsigned char)(*(d3_l->extra+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y)*255/max_extra);
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
+   if(mode==2)
+   {
+    foobar=(*(unsigned char *)(d3_l->v_ptr+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y));
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
    if(y_c==y && z_c==z)
    {
     r=0xff;
@@ -210,7 +266,7 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
    }
    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
-                                  y_c*d3_l->fakt_x+d3_l->info_x,
+                                  y_c*d3_l->fakt_x+d3_l->o_x,
                                   z_c*d3_l->fakt_y+Y_GAP,
                                   d3_l->fakt_x,d3_l->fakt_y);
   }
@@ -221,7 +277,17 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
  {
   for(y_c=0;y_c<d3_l->max_y;y_c++)
   {
-   dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b);
+   if((!mode)||mode==3) dx_lattice_get_color((*d3_l).status+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y,&r,&g,&b,mode);
+   if(mode==1)
+   {
+    foobar=(unsigned char)(*(d3_l->extra+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y)*255/max_extra);
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
+   if(mode==2)
+   {
+    foobar=(*(unsigned char *)(d3_l->v_ptr+x_c+y_c*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y));
+    dx_lattice_get_color(&foobar,&r,&g,&b,mode);
+   }
    if(x_c==x && y_c==y)
    {
     r=0xff;
@@ -230,8 +296,8 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
    }
    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
-                                  x_c*d3_l->fakt_x+X_GAP,
-                                  y_c*d3_l->fakt_x+d3_l->info_x,
+                                  x_c*d3_l->fakt_x+d3_l->info_x,
+                                  y_c*d3_l->fakt_y+Y_GAP,
                                   d3_l->fakt_x,d3_l->fakt_y);
   }
  }
@@ -248,28 +314,70 @@ int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)
  d3_l->p_surface->DrawRectangle(d3_l->p_surface,
                                 d3_l->info_x,d3_l->info_y,
                                 d3_l->info_w,d3_l->info_h);
- d3_l->p_surface->DrawLine(d3_l->p_surface,
-                           d3_l->info_x+d3_l->info_w/2,
-                           d3_l->info_y,
-                           d3_l->info_x+d3_l->info_w/2,
-                           d3_l->info_y+d3_l->info_h);
  d3_l->p_surface->SetColor(d3_l->p_surface,0x80,0x80,0xff,0xff);
  for(i=1;i<=arg_c;i++)
- {
-  if(i<8)
-  {
    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
                                d3_l->info_x+d3_l->fakt_x,
-                               d3_l->info_y+d3_l->fakt_y+d3_l->font_h+(i-1)*2*d3_l->font_h,
-                               DSTF_LEFT);
-  } else
-  {
-   d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
-                               d3_l->info_x+d3_l->info_w/2+d3_l->fakt_x,
-                               d3_l->info_y+d3_l->fakt_y+d3_l->font_h+(i%8-1)*2*d3_l->font_h,
+                               d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i-1)*d3_l->font_h,
                                DSTF_LEFT);
-  }
+
+ /* now we flip all to surface */
+ d3_l->p_surface->Flip(d3_l->p_surface,NULL,0);
+
+ return 1;
+}
+
+int d2_event_init(d2_lattice *d2_l)
+{
+ d2_l->dfb->GetInputDevice(d2_l->dfb,DIDID_KEYBOARD,&(d2_l->keyboard));
+ d2_l->keyboard->CreateEventBuffer(d2_l->keyboard,&(d2_l->k_buffer));
+ return 1;
+}
+
+int d3_event_init(d3_lattice *d3_l)                                           
+{                                                                             
+ d3_l->dfb->GetInputDevice(d3_l->dfb,DIDID_KEYBOARD,&(d3_l->keyboard));
+ d3_l->keyboard->CreateEventBuffer(d3_l->keyboard,&(d3_l->k_buffer));  
+
+ return 1;                                                           
+}         
+
+int scan_event(d3_lattice *d3_l,int *x,int *y,int *z,int *q,int *esc,int *switchmode,int *bmp,int *ac_distr)
+{
+ DFBInputEvent ke;
+
+ d3_l->k_buffer->WaitForEvent(d3_l->k_buffer);
+ d3_l->k_buffer->GetEvent(d3_l->k_buffer,DFB_EVENT(&ke));
+ if(ke.type==DIET_KEYPRESS)
+ {
+  if(ke.key_id==DIKI_LEFT && *x!=0) *x-=1;
+  if(ke.key_id==DIKI_RIGHT && *x!=d3_l->max_x-1) *x+=1;
+  if(ke.key_id==DIKI_UP && *y!=0) *y-=1;
+  if(ke.key_id==DIKI_DOWN && *y!=d3_l->max_y-1) *y+=1;
+  if(ke.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
+  if(ke.key_id==DIKI_PAGE_DOWN && *z!=d3_l->max_z-1) *z+=1;
+  if(ke.key_id==DIKI_Q) *q=1;
+  if(ke.key_id==DIKI_ESCAPE) *esc=1;
+  if(ke.key_id==DIKI_M) *switchmode=(*switchmode+1)%4;
+  if(ke.key_id==DIKI_1) *bmp=1;
+  if(ke.key_id==DIKI_2) *bmp=2;
+  if(ke.key_id==DIKI_3) *bmp=3;
+  if(ke.key_id==DIKI_4) *bmp=4;
+  if(ke.key_id==DIKI_5) *bmp=5;
+  if(ke.key_id==DIKI_6) *bmp=6;
+  if(ke.key_id==DIKI_7) *bmp=7;
+  if(ke.key_id==DIKI_8) *bmp=8;
+  if(ke.key_id==DIKI_9) *bmp=9;
+  if(ke.key_id==DIKI_W) *bmp=10;
+  if(ke.key_id==DIKI_E) *bmp=11;
+  if(ke.key_id==DIKI_R) *bmp=12;
+  if(ke.key_id==DIKI_A) *ac_distr=1;
+  if(ke.key_id==DIKI_C) *ac_distr=2;
+  if(ke.key_id==DIKI_B) *ac_distr=3;
+  if(ke.key_id==DIKI_X) *ac_distr=4;
  }
 
  return 1;
-} 
+}
+