fixed cryst->amorph z direction diffusion bug
[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)
97 {
98  if((*status)&RED)
99  {
100   *r=0xff;
101   *g=0;
102   *b=0;
103  } else
104  {
105   *r=0;
106   *g=0;
107   *b=0xff;
108  }
109  
110  return 1;
111 }
112
113 int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v)
114 {
115  int x_c,y_c;
116  int i;
117  unsigned char r,g,b,a;
118
119  a=0xff; /* no alpha blending */
120  
121  for(x_c=0;x_c<d2_l->max_x;x_c++)
122  {
123   for(y_c=0;y_c<d2_l->max_y;y_c++)
124   {
125    dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b);
126    if(x_c==x && y_c==y)
127    {
128     r=0xff;
129     g=0xff;
130     b=0;
131    }
132    d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
133    d2_l->p_surface->DrawRectangle(d2_l->p_surface,
134                                   x_c*d2_l->fakt_x+X_GAP,
135                                   y_c*d2_l->fakt_y+Y_GAP,
136                                   d2_l->fakt_x,d2_l->fakt_y);
137   }
138  }
139  r=0xff;
140  g=0xff;
141  b=0;
142  /* clear info box */
143  d2_l->p_surface->SetColor(d2_l->p_surface,0,0,0,0);
144  d2_l->p_surface->FillRectangle(d2_l->p_surface,
145                                 d2_l->info_x,d2_l->info_y,
146                                 d2_l->info_w,d2_l->info_h);
147  d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
148  d2_l->p_surface->DrawRectangle(d2_l->p_surface,
149                                 d2_l->info_x,d2_l->info_y,
150                                 d2_l->info_w,d2_l->info_h);
151  d2_l->p_surface->SetColor(d2_l->p_surface,0x80,0x80,0xff,0xff);
152  for(i=1;i<=arg_c;i++)
153  {
154   d2_l->p_surface->DrawString(d2_l->p_surface,arg_v[i],-1,
155                               d2_l->info_x+d2_l->fakt_x,
156                               d2_l->info_y+d2_l->fakt_y+d2_l->font_h+(i-1)*2*d2_l->font_h,
157                               DSTF_LEFT);
158  }
159  /* now we flip all to surface */
160  d2_l->p_surface->Flip(d2_l->p_surface,NULL,0);
161  
162  return 1;
163 }
164
165 int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)  
166 {
167  int x_c,y_c,z_c;
168  int i;
169  unsigned char r,g,b,a;
170
171  a=0xff; /* no alpha blending */
172
173  y_c=y;
174  for(x_c=0;x_c<d3_l->max_x;x_c++)
175  {
176   for(z_c=0;z_c<d3_l->max_z;z_c++)
177   {
178    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);
179    if(x_c==x && z_c==z)
180    {
181     r=0xff;
182     g=0xff;
183     b=0;
184    }
185    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
186    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
187                                   x_c*d3_l->fakt_x+X_GAP,
188                                   z_c*d3_l->fakt_y+Y_GAP,
189                                   d3_l->fakt_x,d3_l->fakt_y);
190   }
191  }
192
193  x_c=x;
194  for(y_c=0;y_c<d3_l->max_y;y_c++) 
195  {
196   for(z_c=0;z_c<d3_l->max_z;z_c++)
197   {
198    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);
199    if(y_c==y && z_c==z)
200    {
201     r=0xff;
202     g=0xff;
203     b=0;
204    }
205    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
206    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
207                                   y_c*d3_l->fakt_x+d3_l->info_x,
208                                   z_c*d3_l->fakt_y+Y_GAP,
209                                   d3_l->fakt_x,d3_l->fakt_y);
210   }
211  }
212
213  z_c=z;
214  for(x_c=0;x_c<d3_l->max_x;x_c++)
215  {
216   for(y_c=0;y_c<d3_l->max_y;y_c++)
217   {
218    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);
219    if(x_c==x && y_c==y)
220    {
221     r=0xff;
222     g=0xff;
223     b=0;
224    }
225    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
226    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
227                                   x_c*d3_l->fakt_x+X_GAP,
228                                   y_c*d3_l->fakt_y+d3_l->info_y,
229                                   d3_l->fakt_x,d3_l->fakt_y);
230   }
231  }
232
233  r=0xff;
234  g=0xff;
235  b=0;
236  /* clear info box */
237  d3_l->p_surface->SetColor(d3_l->p_surface,0,0,0,0);
238  d3_l->p_surface->FillRectangle(d3_l->p_surface,
239                                 d3_l->info_x,d3_l->info_y,
240                                 d3_l->info_w,d3_l->info_h);
241  d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
242  d3_l->p_surface->DrawRectangle(d3_l->p_surface,
243                                 d3_l->info_x,d3_l->info_y,
244                                 d3_l->info_w,d3_l->info_h);
245  d3_l->p_surface->DrawLine(d3_l->p_surface,
246                            d3_l->info_x+d3_l->info_w/2,
247                            d3_l->info_y,
248                            d3_l->info_x+d3_l->info_w/2,
249                            d3_l->info_y+d3_l->info_h);
250  d3_l->p_surface->SetColor(d3_l->p_surface,0x80,0x80,0xff,0xff);
251  for(i=1;i<=arg_c;i++)
252  {
253   if(i<13)
254   {
255    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
256                                d3_l->info_x+d3_l->fakt_x,
257                                d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i-1)*d3_l->font_h,
258                                DSTF_LEFT);
259   } else
260   {
261    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
262                                d3_l->info_x+d3_l->info_w/2+d3_l->fakt_x,
263                                d3_l->info_y+2*d3_l->fakt_y+d3_l->font_h+(i%13-1)*d3_l->font_h,
264                                DSTF_LEFT);
265   }
266  }
267
268  /* now we flip all to surface */
269  d3_l->p_surface->Flip(d3_l->p_surface,NULL,0);
270
271  return 1;
272 }
273
274 int d2_event_init(d2_lattice *d2_l)
275 {
276  d2_l->dfb->GetInputDevice(d2_l->dfb,DIDID_KEYBOARD,&(d2_l->keyboard));
277  d2_l->keyboard->CreateEventBuffer(d2_l->keyboard,&(d2_l->k_buffer));
278  
279  return 1;
280 }
281
282 int d3_event_init(d3_lattice *d3_l)                                           
283 {                                                                             
284  d3_l->dfb->GetInputDevice(d3_l->dfb,DIDID_KEYBOARD,&(d3_l->keyboard));
285  d3_l->keyboard->CreateEventBuffer(d3_l->keyboard,&(d3_l->k_buffer));  
286
287  return 1;                                                           
288 }         
289
290 int scan_event(d3_lattice *d3_l,int *x,int *y,int *z,int *q,int *esc)
291 {
292  DFBInputEvent ke;
293
294  d3_l->k_buffer->WaitForEvent(d3_l->k_buffer);
295  d3_l->k_buffer->GetEvent(d3_l->k_buffer,DFB_EVENT(&ke));
296  if(ke.type==DIET_KEYPRESS)
297  {
298   if(ke.key_id==DIKI_LEFT && *x!=0) *x-=1;
299   if(ke.key_id==DIKI_RIGHT && *x!=d3_l->max_x-1) *x+=1;
300   if(ke.key_id==DIKI_UP && *y!=0) *y-=1;
301   if(ke.key_id==DIKI_DOWN && *y!=d3_l->max_y-1) *y+=1;
302   if(ke.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
303   if(ke.key_id==DIKI_PAGE_DOWN && *z!=d3_l->max_z-1) *z+=1;
304   if(ke.key_id==DIKI_Q) *q=1;
305   if(ke.key_id==DIKI_ESCAPE) *esc=1;
306  }
307
308  return 1;
309 }
310