fixed nlsop for packaging ..
[physik/nlsop.git] / dfbapi.c
1 /*
2  * scientific visualization api for direct framebuffer
3  *
4  * author: hackbard@hackdaworld.dyndns.org
5  *
6  */
7
8 #include <stdio.h>
9 #include <directfb.h>
10 #include "dfbapi.h"
11
12 /* two dimensional lattice */
13
14 int d2_lattice_init(int *argc,char **argv,d2_lattice *d2_l)
15 {
16  DFBSurfaceDescription surface_dsc;
17  DFBFontDescription font_dsc;
18  
19  DirectFBInit(argc,&argv);
20  DirectFBCreate(&(d2_l->dfb));
21  d2_l->dfb->SetCooperativeLevel(d2_l->dfb,DFSCL_FULLSCREEN);
22
23  surface_dsc.flags=DSDESC_CAPS;
24  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
25  d2_l->dfb->CreateSurface(d2_l->dfb,&surface_dsc,&(d2_l->p_surface));
26  d2_l->p_surface->GetSize(d2_l->p_surface,&(d2_l->s_width),&(d2_l->s_height));
27  
28  font_dsc.flags=DFDESC_HEIGHT;
29  font_dsc.height=d2_l->s_height/60; /* 60 ? */
30  d2_l->font_h=font_dsc.height;
31  d2_l->dfb->CreateFont(d2_l->dfb,FONT,&font_dsc,&(d2_l->font));
32  d2_l->p_surface->SetFont(d2_l->p_surface,d2_l->font);
33
34  d2_l->fakt_y=(d2_l->s_height-(2*Y_GAP))/(d2_l->max_y);
35  d2_l->fakt_x=(d2_l->s_height-X_GAP)/(d2_l->max_x); /* bullshit, i can't imagine atm */
36  d2_l->info_x=d2_l->fakt_x*d2_l->max_x+2*X_GAP;
37  d2_l->info_y=Y_GAP;
38  d2_l->info_w=d2_l->s_width-d2_l->info_x-2*X_GAP;
39  d2_l->info_h=d2_l->max_y*d2_l->fakt_y;
40
41  if((d2_l->s_height<(d2_l->max_y+2*Y_GAP)) || (d2_l->s_height<(d2_l->max_x+X_GAP)))
42  {
43   puts("resolution too low!");
44   return -1;
45  } else return 1;
46 }
47
48 int d3_lattice_init(int *argc,char **argv,d3_lattice *d3_l)
49 {
50  DFBSurfaceDescription surface_dsc;
51  DFBFontDescription font_dsc;
52  
53  DirectFBInit(argc,&argv);
54  DirectFBCreate(&(d3_l->dfb));
55  d3_l->dfb->SetCooperativeLevel(d3_l->dfb,DFSCL_FULLSCREEN);
56
57  surface_dsc.flags=DSDESC_CAPS;
58  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
59  d3_l->dfb->CreateSurface(d3_l->dfb,&surface_dsc,&(d3_l->p_surface));
60  d3_l->p_surface->GetSize(d3_l->p_surface,&(d3_l->s_width),&(d3_l->s_height));
61  
62  font_dsc.flags=DFDESC_HEIGHT;
63  font_dsc.height=d3_l->s_height/40; /* 40 ? */
64  d3_l->font_h=font_dsc.height;
65  d3_l->dfb->CreateFont(d3_l->dfb,FONT,&font_dsc,&(d3_l->font));
66  d3_l->p_surface->SetFont(d3_l->p_surface,d3_l->font);
67
68  d3_l->fakt_y=(d3_l->s_height-(2*Y_GAP))/d3_l->max_z;
69  d3_l->fakt_x=(d3_l->s_width-(4*X_GAP))/(d3_l->max_x+d3_l->max_y+d3_l->max_x);
70  d3_l->info_x=d3_l->fakt_x*(d3_l->max_x+d3_l->max_y)+(3*X_GAP);
71  d3_l->info_y=d3_l->fakt_y*d3_l->max_y+(2*Y_GAP);
72  d3_l->o_x=d3_l->fakt_x*d3_l->max_x+(2*X_GAP);
73  d3_l->info_w=d3_l->fakt_x*d3_l->max_x;
74  d3_l->info_h=d3_l->fakt_y*(d3_l->max_z-d3_l->max_y)-Y_GAP;
75
76  return 1;
77 }
78
79 int d2_lattice_release(d2_lattice *d2_l)
80 {
81  d2_l->font->Release(d2_l->font);
82  d2_l->p_surface->Release(d2_l->p_surface);
83  d2_l->dfb->Release(d2_l->dfb);
84
85  return 1;
86 }
87
88 int d3_lattice_release(d3_lattice *d3_l)
89 {
90  d3_l->font->Release(d3_l->font);
91  d3_l->p_surface->Release(d3_l->p_surface);
92  d3_l->dfb->Release(d3_l->dfb);
93
94  return 1;
95 }
96
97 int dx_lattice_get_color(unsigned char *status,unsigned char *r,unsigned char *g,unsigned char *b,unsigned char mode)
98 {
99  *g=0;
100  if((!mode)||mode==3)
101  {
102   if((*status)&RED)
103   {
104    *r=0xff;
105    *b=0;
106   } else
107   {
108    *r=0;
109    *b=0xff;
110   }
111  } else if(mode==1)
112  {
113   *r=*status;
114   *g=*status;
115   *b=0xff;
116  } else if(mode==2)
117  {
118   *r=*status;
119   *b=0xff;
120  }
121  
122  return 1;
123 }
124
125 int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v,unsigned char mode,int max_extra)
126 {
127  int x_c,y_c;
128  int i;
129  unsigned char r,g,b,a;
130  unsigned char foobar;
131
132  a=0xff; /* no alpha blending */
133  
134  for(x_c=0;x_c<d2_l->max_x;x_c++)
135  {
136   for(y_c=0;y_c<d2_l->max_y;y_c++)
137   {
138    if(!mode) dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b,mode);
139    if(mode==1)
140    {
141     foobar=(unsigned char)(*(d2_l->extra+x_c+y_c*d2_l->max_x)*255/max_extra);
142     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
143    }
144    if(mode==2)
145    {
146     foobar=(*(unsigned char *)(d2_l->v_ptr+x_c+y_c*d2_l->max_x));
147     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
148    }
149    if(x_c==x && y_c==y)
150    {
151     r=0xff;
152     g=0xff;
153     b=0;
154    }
155    d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
156    d2_l->p_surface->DrawRectangle(d2_l->p_surface,
157                                   x_c*d2_l->fakt_x+X_GAP,
158                                   y_c*d2_l->fakt_y+Y_GAP,
159                                   d2_l->fakt_x,d2_l->fakt_y);
160   }
161  }
162  r=0xff;
163  g=0xff;
164  b=0;
165  /* clear info box */
166  d2_l->p_surface->SetColor(d2_l->p_surface,0,0,0,0);
167  d2_l->p_surface->FillRectangle(d2_l->p_surface,
168                                 d2_l->info_x,d2_l->info_y,
169                                 d2_l->info_w,d2_l->info_h);
170  d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
171  d2_l->p_surface->DrawRectangle(d2_l->p_surface,
172                                 d2_l->info_x,d2_l->info_y,
173                                 d2_l->info_w,d2_l->info_h);
174  d2_l->p_surface->SetColor(d2_l->p_surface,0x80,0x80,0xff,0xff);
175  for(i=1;i<=arg_c;i++)
176  {
177   d2_l->p_surface->DrawString(d2_l->p_surface,arg_v[i],-1,
178                               d2_l->info_x+d2_l->fakt_x,
179                               d2_l->info_y+d2_l->fakt_y+d2_l->font_h+(i-1)*2*d2_l->font_h,
180                               DSTF_LEFT);
181  }
182  /* now we flip all to surface */
183  d2_l->p_surface->Flip(d2_l->p_surface,NULL,0);
184  
185  return 1;
186 }
187
188 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)
189 {
190  int x_c,y_c,z_c;
191  int i,sum;
192  unsigned char foobar;
193  unsigned char r,g,b,a;
194
195  a=0xff; /* no alpha blending */
196
197  y_c=y;
198  for(x_c=0;x_c<d3_l->max_x;x_c++)
199  {
200   for(z_c=0;z_c<d3_l->max_z;z_c++)
201   {
202    if((!mode)||mode==3)
203    {
204     sum=0;
205     for(i=-2;i<=2;i++)
206      if(*(d3_l->status+x_c+((y_c+i+d3_l->max_y)%d3_l->max_y)*d3_l->max_x+z_c*d3_l->max_x*d3_l->max_y)&RED) sum+=0xff;
207     g=0; b=0;
208     r=(unsigned char)(sum/5);
209    }
210    if(mode==3)
211    {
212     if(d3_l->max_x*p1[z_c]/max1==x_c)
213     {
214      r=0xff;
215      g=0xff;
216      b=0xff;
217     }
218    }
219    if(mode==1)
220    {
221     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);
222     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
223    }
224    if(mode==2)
225    {
226     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));
227     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
228    }
229    if(x_c==x && z_c==z)
230    {
231     r=0xff;
232     g=0xff;
233     b=0;
234    }
235    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
236    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
237                                   x_c*d3_l->fakt_x+X_GAP,
238                                   z_c*d3_l->fakt_y+Y_GAP,
239                                   d3_l->fakt_x,d3_l->fakt_y);
240   }
241  }
242
243  x_c=x;
244  for(y_c=0;y_c<d3_l->max_y;y_c++) 
245  {
246   for(z_c=0;z_c<d3_l->max_z;z_c++)
247   {
248    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);
249    if(mode==3)
250    {
251     if((int)(d3_l->max_y*(1.0*p2[z_c]/max2))==y_c)
252     {
253      r=0xff;
254      g=0xff;
255      b=0xff;
256     }
257    }
258    if(mode==1)
259    {
260     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);
261     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
262    }
263    if(mode==2)
264    {
265     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));
266     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
267    }
268    if(y_c==y && z_c==z)
269    {
270     r=0xff;
271     g=0xff;
272     b=0;
273    }
274    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
275    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
276                                   y_c*d3_l->fakt_x+d3_l->o_x,
277                                   z_c*d3_l->fakt_y+Y_GAP,
278                                   d3_l->fakt_x,d3_l->fakt_y);
279   }
280  }
281
282  z_c=z;
283  for(x_c=0;x_c<d3_l->max_x;x_c++)
284  {
285   for(y_c=0;y_c<d3_l->max_y;y_c++)
286   {
287    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);
288    if(mode==1)
289    {
290     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);
291     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
292    }
293    if(mode==2)
294    {
295     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));
296     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
297    }
298    if(x_c==x && y_c==y)
299    {
300     r=0xff;
301     g=0xff;
302     b=0;
303    }
304    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
305    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
306                                   x_c*d3_l->fakt_x+d3_l->info_x,
307                                   y_c*d3_l->fakt_y+Y_GAP,
308                                   d3_l->fakt_x,d3_l->fakt_y);
309   }
310  }
311
312  r=0xff;
313  g=0xff;
314  b=0;
315  /* clear info box */
316  d3_l->p_surface->SetColor(d3_l->p_surface,0,0,0,0);
317  d3_l->p_surface->FillRectangle(d3_l->p_surface,
318                                 d3_l->info_x,d3_l->info_y,
319                                 d3_l->info_w,d3_l->info_h);
320  d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
321  d3_l->p_surface->DrawRectangle(d3_l->p_surface,
322                                 d3_l->info_x,d3_l->info_y,
323                                 d3_l->info_w,d3_l->info_h);
324  d3_l->p_surface->SetColor(d3_l->p_surface,0x80,0x80,0xff,0xff);
325  for(i=1;i<=arg_c;i++)
326    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
327                                d3_l->info_x+d3_l->fakt_x,
328                                d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i-1)*d3_l->font_h,
329                                DSTF_LEFT);
330
331  /* now we flip all to surface */
332  d3_l->p_surface->Flip(d3_l->p_surface,NULL,0);
333
334  return 1;
335 }
336
337 int d2_event_init(d2_lattice *d2_l)
338 {
339  d2_l->dfb->GetInputDevice(d2_l->dfb,DIDID_KEYBOARD,&(d2_l->keyboard));
340  d2_l->keyboard->CreateEventBuffer(d2_l->keyboard,&(d2_l->k_buffer));
341  
342  return 1;
343 }
344
345 int d3_event_init(d3_lattice *d3_l)                                           
346 {                                                                             
347  d3_l->dfb->GetInputDevice(d3_l->dfb,DIDID_KEYBOARD,&(d3_l->keyboard));
348  d3_l->keyboard->CreateEventBuffer(d3_l->keyboard,&(d3_l->k_buffer));  
349
350  return 1;                                                           
351 }         
352
353 int scan_event(d3_lattice *d3_l,int *x,int *y,int *z,int *q,int *esc,int *switchmode,int *bmp,int *ac_distr)
354 {
355  DFBInputEvent ke;
356
357  d3_l->k_buffer->WaitForEvent(d3_l->k_buffer);
358  d3_l->k_buffer->GetEvent(d3_l->k_buffer,DFB_EVENT(&ke));
359  if(ke.type==DIET_KEYPRESS)
360  {
361   if(ke.key_id==DIKI_LEFT && *x!=0) *x-=1;
362   if(ke.key_id==DIKI_RIGHT && *x!=d3_l->max_x-1) *x+=1;
363   if(ke.key_id==DIKI_UP && *y!=0) *y-=1;
364   if(ke.key_id==DIKI_DOWN && *y!=d3_l->max_y-1) *y+=1;
365   if(ke.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
366   if(ke.key_id==DIKI_PAGE_DOWN && *z!=d3_l->max_z-1) *z+=1;
367   if(ke.key_id==DIKI_END && *z<=d3_l->max_z-10) *z+=10;
368   if(ke.key_id==DIKI_HOME && *z>=10) *z-=10;
369   if(ke.key_id==DIKI_Q) *q=1;
370   if(ke.key_id==DIKI_ESCAPE) *esc=1;
371   if(ke.key_id==DIKI_M) *switchmode=(*switchmode+1)%4;
372   if(ke.key_id==DIKI_1) *bmp=1;
373   if(ke.key_id==DIKI_2) *bmp=2;
374   if(ke.key_id==DIKI_3) *bmp=3;
375   if(ke.key_id==DIKI_4) *bmp=4;
376   if(ke.key_id==DIKI_5) *bmp=5;
377   if(ke.key_id==DIKI_6) *bmp=6;
378   if(ke.key_id==DIKI_7) *bmp=7;
379   if(ke.key_id==DIKI_8) *bmp=8;
380   if(ke.key_id==DIKI_9) *bmp=9;
381   if(ke.key_id==DIKI_W) *bmp=10;
382   if(ke.key_id==DIKI_E) *bmp=11;
383   if(ke.key_id==DIKI_R) *bmp=12;
384   if(ke.key_id==DIKI_A) *ac_distr=1;
385   if(ke.key_id==DIKI_C) *ac_distr=2;
386   if(ke.key_id==DIKI_B) *ac_distr=3;
387   if(ke.key_id==DIKI_X) *ac_distr=4;
388  }
389
390  return 1;
391 }
392