implemented bmp writing (doesntwork by now)
[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/40; /* 40 ? */
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-(3*Y_GAP))/(d3_l->max_z+d3_l->max_y);
69  d3_l->fakt_x=(d3_l->s_width-(3*X_GAP))/(d3_l->max_x+d3_l->max_y);
70  d3_l->info_x=d3_l->fakt_x*d3_l->max_x+(2*X_GAP);
71  d3_l->info_y=d3_l->fakt_y*d3_l->max_z+(2*Y_GAP);
72  d3_l->info_w=d3_l->fakt_x*d3_l->max_y;
73  d3_l->info_h=d3_l->fakt_y*d3_l->max_y;
74
75  return 1;
76 }
77
78 int d2_lattice_release(d2_lattice *d2_l)
79 {
80  d2_l->font->Release(d2_l->font);
81  d2_l->p_surface->Release(d2_l->p_surface);
82  d2_l->dfb->Release(d2_l->dfb);
83
84  return 1;
85 }
86
87 int d3_lattice_release(d3_lattice *d3_l)
88 {
89  d3_l->font->Release(d3_l->font);
90  d3_l->p_surface->Release(d3_l->p_surface);
91  d3_l->dfb->Release(d3_l->dfb);
92
93  return 1;
94 }
95
96 int dx_lattice_get_color(unsigned char *status,unsigned char *r,unsigned char *g,unsigned char *b,unsigned char mode)
97 {
98  *g=0;
99  if(!mode)
100  {
101   if((*status)&RED)
102   {
103    *r=0xff;
104    *b=0;
105   } else
106   {
107    *r=0;
108    *b=0xff;
109   }
110  } else if(mode==1)
111  {
112   *r=*status;
113   *g=*status;
114   *b=0xff;
115  } else if(mode==2)
116  {
117   *r=*status;
118   *b=0xff;
119  }
120  
121  return 1;
122 }
123
124 int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v,unsigned char mode,int max_extra)
125 {
126  int x_c,y_c;
127  int i;
128  unsigned char r,g,b,a;
129  unsigned char foobar;
130
131  a=0xff; /* no alpha blending */
132  
133  for(x_c=0;x_c<d2_l->max_x;x_c++)
134  {
135   for(y_c=0;y_c<d2_l->max_y;y_c++)
136   {
137    if(!mode) dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b,mode);
138    if(mode==1)
139    {
140     foobar=(unsigned char)(*(d2_l->extra+x_c+y_c*d2_l->max_x)*255/max_extra);
141     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
142    }
143    if(mode==2)
144    {
145     foobar=(*(unsigned char *)(d2_l->v_ptr+x_c+y_c*d2_l->max_x));
146     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
147    }
148    if(x_c==x && y_c==y)
149    {
150     r=0xff;
151     g=0xff;
152     b=0;
153    }
154    d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
155    d2_l->p_surface->DrawRectangle(d2_l->p_surface,
156                                   x_c*d2_l->fakt_x+X_GAP,
157                                   y_c*d2_l->fakt_y+Y_GAP,
158                                   d2_l->fakt_x,d2_l->fakt_y);
159   }
160  }
161  r=0xff;
162  g=0xff;
163  b=0;
164  /* clear info box */
165  d2_l->p_surface->SetColor(d2_l->p_surface,0,0,0,0);
166  d2_l->p_surface->FillRectangle(d2_l->p_surface,
167                                 d2_l->info_x,d2_l->info_y,
168                                 d2_l->info_w,d2_l->info_h);
169  d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
170  d2_l->p_surface->DrawRectangle(d2_l->p_surface,
171                                 d2_l->info_x,d2_l->info_y,
172                                 d2_l->info_w,d2_l->info_h);
173  d2_l->p_surface->SetColor(d2_l->p_surface,0x80,0x80,0xff,0xff);
174  for(i=1;i<=arg_c;i++)
175  {
176   d2_l->p_surface->DrawString(d2_l->p_surface,arg_v[i],-1,
177                               d2_l->info_x+d2_l->fakt_x,
178                               d2_l->info_y+d2_l->fakt_y+d2_l->font_h+(i-1)*2*d2_l->font_h,
179                               DSTF_LEFT);
180  }
181  /* now we flip all to surface */
182  d2_l->p_surface->Flip(d2_l->p_surface,NULL,0);
183  
184  return 1;
185 }
186
187 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)
188 {
189  int x_c,y_c,z_c;
190  int i;
191  unsigned char foobar;
192  unsigned char r,g,b,a;
193
194  a=0xff; /* no alpha blending */
195
196  y_c=y;
197  for(x_c=0;x_c<d3_l->max_x;x_c++)
198  {
199   for(z_c=0;z_c<d3_l->max_z;z_c++)
200   {
201    if(!mode) 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);
202    if(mode==1)
203    {
204     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);
205     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
206    }
207    if(mode==2)
208    {
209     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));
210     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
211    }
212    if(x_c==x && z_c==z)
213    {
214     r=0xff;
215     g=0xff;
216     b=0;
217    }
218    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
219    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
220                                   x_c*d3_l->fakt_x+X_GAP,
221                                   z_c*d3_l->fakt_y+Y_GAP,
222                                   d3_l->fakt_x,d3_l->fakt_y);
223   }
224  }
225
226  x_c=x;
227  for(y_c=0;y_c<d3_l->max_y;y_c++) 
228  {
229   for(z_c=0;z_c<d3_l->max_z;z_c++)
230   {
231    if(!mode) 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);
232    if(mode==1)
233    {
234     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);
235     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
236    }
237    if(mode==2)
238    {
239     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));
240     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
241    }
242    if(y_c==y && z_c==z)
243    {
244     r=0xff;
245     g=0xff;
246     b=0;
247    }
248    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
249    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
250                                   y_c*d3_l->fakt_x+d3_l->info_x,
251                                   z_c*d3_l->fakt_y+Y_GAP,
252                                   d3_l->fakt_x,d3_l->fakt_y);
253   }
254  }
255
256  z_c=z;
257  for(x_c=0;x_c<d3_l->max_x;x_c++)
258  {
259   for(y_c=0;y_c<d3_l->max_y;y_c++)
260   {
261    if(!mode) 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);
262    if(mode==1)
263    {
264     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);
265     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
266    }
267    if(mode==2)
268    {
269     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));
270     dx_lattice_get_color(&foobar,&r,&g,&b,mode);
271    }
272    if(x_c==x && y_c==y)
273    {
274     r=0xff;
275     g=0xff;
276     b=0;
277    }
278    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
279    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
280                                   x_c*d3_l->fakt_x+X_GAP,
281                                   y_c*d3_l->fakt_y+d3_l->info_y,
282                                   d3_l->fakt_x,d3_l->fakt_y);
283   }
284  }
285
286  r=0xff;
287  g=0xff;
288  b=0;
289  /* clear info box */
290  d3_l->p_surface->SetColor(d3_l->p_surface,0,0,0,0);
291  d3_l->p_surface->FillRectangle(d3_l->p_surface,
292                                 d3_l->info_x,d3_l->info_y,
293                                 d3_l->info_w,d3_l->info_h);
294  d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
295  d3_l->p_surface->DrawRectangle(d3_l->p_surface,
296                                 d3_l->info_x,d3_l->info_y,
297                                 d3_l->info_w,d3_l->info_h);
298  d3_l->p_surface->DrawLine(d3_l->p_surface,
299                            d3_l->info_x+d3_l->info_w/2,
300                            d3_l->info_y,
301                            d3_l->info_x+d3_l->info_w/2,
302                            d3_l->info_y+d3_l->info_h);
303  d3_l->p_surface->SetColor(d3_l->p_surface,0x80,0x80,0xff,0xff);
304  for(i=1;i<=arg_c;i++)
305  {
306   if(i<13)
307   {
308    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
309                                d3_l->info_x+d3_l->fakt_x,
310                                d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i-1)*d3_l->font_h,
311                                DSTF_LEFT);
312   } else
313   {
314    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
315                                d3_l->info_x+d3_l->info_w/2+d3_l->fakt_x,
316                                d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i%13-1)*d3_l->font_h,
317                                DSTF_LEFT);
318   }
319  }
320
321  /* now we flip all to surface */
322  d3_l->p_surface->Flip(d3_l->p_surface,NULL,0);
323
324  return 1;
325 }
326
327 int d2_event_init(d2_lattice *d2_l)
328 {
329  d2_l->dfb->GetInputDevice(d2_l->dfb,DIDID_KEYBOARD,&(d2_l->keyboard));
330  d2_l->keyboard->CreateEventBuffer(d2_l->keyboard,&(d2_l->k_buffer));
331  
332  return 1;
333 }
334
335 int d3_event_init(d3_lattice *d3_l)                                           
336 {                                                                             
337  d3_l->dfb->GetInputDevice(d3_l->dfb,DIDID_KEYBOARD,&(d3_l->keyboard));
338  d3_l->keyboard->CreateEventBuffer(d3_l->keyboard,&(d3_l->k_buffer));  
339
340  return 1;                                                           
341 }         
342
343 int scan_event(d3_lattice *d3_l,int *x,int *y,int *z,int *q,int *esc,int *switchmode,int *bmp)
344 {
345  DFBInputEvent ke;
346
347  d3_l->k_buffer->WaitForEvent(d3_l->k_buffer);
348  d3_l->k_buffer->GetEvent(d3_l->k_buffer,DFB_EVENT(&ke));
349  if(ke.type==DIET_KEYPRESS)
350  {
351   if(ke.key_id==DIKI_LEFT && *x!=0) *x-=1;
352   if(ke.key_id==DIKI_RIGHT && *x!=d3_l->max_x-1) *x+=1;
353   if(ke.key_id==DIKI_UP && *y!=0) *y-=1;
354   if(ke.key_id==DIKI_DOWN && *y!=d3_l->max_y-1) *y+=1;
355   if(ke.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
356   if(ke.key_id==DIKI_PAGE_DOWN && *z!=d3_l->max_z-1) *z+=1;
357   if(ke.key_id==DIKI_Q) *q=1;
358   if(ke.key_id==DIKI_ESCAPE) *esc=1;
359   if(ke.key_id==DIKI_M) *switchmode=(*switchmode+1)%3;
360   if(ke.key_id==DIKI_1) *bmp=1;
361   if(ke.key_id==DIKI_2) *bmp=2;
362   if(ke.key_id==DIKI_3) *bmp=3;
363  }
364
365  return 1;
366 }
367