dfb3ae845e9abf626b136d8882f5ea10a5702082
[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,int x,int y)
15 {
16  DFBSurfaceDescription surface_dsc;
17  DFBFontDescription font_dsc;
18  
19  d2_l->max_x=x;
20  d2_l->max_y=y;
21
22  DirectFBInit(argc,&argv);
23  DirectFBCreate(&(d2_l->dfb));
24  d2_l->dfb->SetCooperativeLevel(d2_l->dfb,DFSCL_FULLSCREEN);
25
26  surface_dsc.flags=DSDESC_CAPS;
27  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
28  d2_l->dfb->CreateSurface(d2_l->dfb,&surface_dsc,&(d2_l->p_surface));
29  d2_l->p_surface->GetSize(d2_l->p_surface,&(d2_l->s_width),&(d2_l->s_height));
30  
31  font_dsc.flags=DFDESC_HEIGHT;
32  font_dsc.height=d2_l->s_height/40; /* 40 ? */
33  d2_l->font_h=font_dsc.height;
34  d2_l->dfb->CreateFont(d2_l->dfb,FONT,&font_dsc,&(d2_l->font));
35  d2_l->p_surface->SetFont(d2_l->p_surface,d2_l->font);
36
37  d2_l->fakt_y=(d2_l->s_height-(2*Y_GAP))/(d2_l->max_y);
38  d2_l->fakt_x=(d2_l->s_height-X_GAP)/(d2_l->max_x); /* bullshit, i can't imagine atm */
39  d2_l->info_x=d2_l->fakt_x*d2_l->max_x+2*X_GAP;
40  d2_l->info_y=Y_GAP;
41  d2_l->info_w=d2_l->s_width-d2_l->info_x-2*X_GAP;
42  d2_l->info_h=d2_l->max_y*d2_l->fakt_y;
43
44  if((d2_l->s_height<(d2_l->max_y+2*Y_GAP)) || (d2_l->s_height<(d2_l->max_x+X_GAP)))
45  {
46   puts("resolution too low!");
47   return -1;
48  } else return 1;
49 }
50
51 int d3_lattice_init(int *argc,char **argv,d3_lattice *d3_l,int x,int y,int z)
52 {
53  DFBSurfaceDescription surface_dsc;
54  DFBFontDescription font_dsc;
55  
56  d3_l->max_x=x;
57  d3_l->max_y=y;
58  d3_l->max_z=z;
59
60  DirectFBInit(argc,&argv);
61  DirectFBCreate(&(d3_l->dfb));
62  d3_l->dfb->SetCooperativeLevel(d3_l->dfb,DFSCL_FULLSCREEN);
63
64  surface_dsc.flags=DSDESC_CAPS;
65  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
66  d3_l->dfb->CreateSurface(d3_l->dfb,&surface_dsc,&(d3_l->p_surface));
67  d3_l->p_surface->GetSize(d3_l->p_surface,&(d3_l->s_width),&(d3_l->s_height));
68  
69  font_dsc.flags=DFDESC_HEIGHT;
70  font_dsc.height=d3_l->s_height/40; /* 40 ? */
71  d3_l->font_h=font_dsc.height;
72  d3_l->dfb->CreateFont(d3_l->dfb,FONT,&font_dsc,&(d3_l->font));
73  d3_l->p_surface->SetFont(d3_l->p_surface,d3_l->font);
74
75  d3_l->fakt_y=(d3_l->s_height-(3*Y_GAP))/(d3_l->max_z+d3_l->max_y);
76  d3_l->fakt_x=(d3_l->s_width-(3*X_GAP))/(d3_l->max_x+d3_l->max_y);
77  d3_l->info_x=d3_l->fakt_x*d3_l->max_x+(2*X_GAP);
78  d3_l->info_y=d3_l->fakt_y*d3_l->max_z+(2*Y_GAP);
79  d3_l->info_w=d3_l->fakt_x*d3_l->max_y;
80  d3_l->info_h=d3_l->fakt_y*d3_l->max_y;
81
82  return 1;
83 }
84
85 int d2_lattice_release(d2_lattice *d2_l)
86 {
87  d2_l->font->Release(d2_l->font);
88  d2_l->p_surface->Release(d2_l->p_surface);
89  d2_l->dfb->Release(d2_l->dfb);
90
91  return 1;
92 }
93
94 int d3_lattice_release(d3_lattice *d3_l)
95 {
96  d3_l->font->Release(d3_l->font);
97  d3_l->p_surface->Release(d3_l->p_surface);
98  d3_l->dfb->Release(d3_l->dfb);
99
100  return 1;
101 }
102
103 int dx_lattice_get_color(unsigned char *status,unsigned char *r,unsigned char *g,unsigned char *b)
104 {
105  if((*status)&RED)
106  {
107   *r=0xff;
108   *g=0;
109   *b=0;
110  } else
111  {
112   *r=0;
113   *g=0;
114   *b=0xff;
115  }
116  
117  return 1;
118 }
119
120 int d2_lattice_draw(d2_lattice *d2_l,int x,int y,int arg_c,char **arg_v)
121 {
122  int x_c,y_c;
123  int i;
124  unsigned char r,g,b,a;
125
126  a=0xff; /* no alpha blending */
127  
128  for(x_c=0;x_c<d2_l->max_x;x_c++)
129  {
130   for(y_c=0;y_c<d2_l->max_y;y_c++)
131   {
132    dx_lattice_get_color((*d2_l).status+x_c+y_c*d2_l->max_x,&r,&g,&b);
133    if(x_c==x && y_c==y)
134    {
135     r=0xff;
136     g=0xff;
137     b=0;
138    }
139    d2_l->p_surface->SetColor(d2_l->p_surface,r,g,b,a);
140    d2_l->p_surface->DrawRectangle(d2_l->p_surface,
141                                   x_c*d2_l->fakt_x+X_GAP,
142                                   y_c*d2_l->fakt_y+Y_GAP,
143                                   d2_l->fakt_x,d2_l->fakt_y);
144   }
145  }
146  r=0xff;
147  g=0xff;
148  b=0;
149  /* clear info box */
150  d2_l->p_surface->SetColor(d2_l->p_surface,0,0,0,0);
151  d2_l->p_surface->FillRectangle(d2_l->p_surface,
152                                 d2_l->info_x,d2_l->info_y,
153                                 d2_l->info_w,d2_l->info_h);
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                                 d2_l->info_x,d2_l->info_y,
157                                 d2_l->info_w,d2_l->info_h);
158  d2_l->p_surface->SetColor(d2_l->p_surface,0x80,0x80,0xff,0xff);
159  for(i=1;i<=arg_c;i++)
160  {
161   d2_l->p_surface->DrawString(d2_l->p_surface,arg_v[i],-1,
162                               d2_l->info_x+d2_l->fakt_x,
163                               d2_l->info_y+d2_l->fakt_y+d2_l->font_h+(i-1)*2*d2_l->font_h,
164                               DSTF_LEFT);
165  }
166  /* now we flip all to surface */
167  d2_l->p_surface->Flip(d2_l->p_surface,NULL,0);
168  
169  return 1;
170 }
171
172 int d3_lattice_draw(d3_lattice *d3_l,int x,int y,int z,int arg_c,char **arg_v)  
173 {
174  int x_c,y_c,z_c;
175  int i;
176  unsigned char r,g,b,a;
177
178  a=0xff; /* no alpha blending */
179
180  y_c=y;
181  for(x_c=0;x_c<d3_l->max_x;x_c++)
182  {
183   for(z_c=0;z_c<d3_l->max_z;z_c++)
184   {
185    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);
186    if(x_c==x && z_c==z)
187    {
188     r=0xff;
189     g=0xff;
190     b=0;
191    }
192    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
193    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
194                                   x_c*d3_l->fakt_x+X_GAP,
195                                   z_c*d3_l->fakt_y+Y_GAP,
196                                   d3_l->fakt_x,d3_l->fakt_y);
197   }
198  }
199
200  x_c=x;
201  for(y_c=0;y_c<d3_l->max_y;y_c++) 
202  {
203   for(z_c=0;z_c<d3_l->max_z;z_c++)
204   {
205    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);
206    if(y_c==y && z_c==z)
207    {
208     r=0xff;
209     g=0xff;
210     b=0;
211    }
212    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
213    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
214                                   y_c*d3_l->fakt_x+d3_l->info_x,
215                                   z_c*d3_l->fakt_y+Y_GAP,
216                                   d3_l->fakt_x,d3_l->fakt_y);
217   }
218  }
219
220  z_c=z;
221  for(x_c=0;x_c<d3_l->max_x;x_c++)
222  {
223   for(y_c=0;y_c<d3_l->max_y;y_c++)
224   {
225    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);
226    if(x_c==x && y_c==y)
227    {
228     r=0xff;
229     g=0xff;
230     b=0;
231    }
232    d3_l->p_surface->SetColor(d3_l->p_surface,r,g,b,a);
233    d3_l->p_surface->DrawRectangle(d3_l->p_surface,
234                                   x_c*d3_l->fakt_x+X_GAP,
235                                   y_c*d3_l->fakt_x+d3_l->info_x,
236                                   d3_l->fakt_x,d3_l->fakt_y);
237   }
238  }
239
240  r=0xff;
241  g=0xff;
242  b=0;
243  /* clear info box */
244  d3_l->p_surface->SetColor(d3_l->p_surface,0,0,0,0);
245  d3_l->p_surface->FillRectangle(d3_l->p_surface,
246                                 d3_l->info_x,d3_l->info_y,
247                                 d3_l->info_w,d3_l->info_h);
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                                 d3_l->info_x,d3_l->info_y,
251                                 d3_l->info_w,d3_l->info_h);
252  d3_l->p_surface->DrawLine(d3_l->p_surface,
253                            d3_l->info_x+d3_l->info_w/2,
254                            d3_l->info_y,
255                            d3_l->info_x+d3_l->info_w/2,
256                            d3_l->info_y+d3_l->info_h);
257  d3_l->p_surface->SetColor(d3_l->p_surface,0x80,0x80,0xff,0xff);
258  for(i=1;i<=arg_c;i++)
259  {
260   if(i<8)
261   {
262    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
263                                d3_l->info_x+d3_l->fakt_x,
264                                d3_l->info_y+d3_l->fakt_y+d3_l->font_h+(i-1)*2*d3_l->font_h,
265                                DSTF_LEFT);
266   } else
267   {
268    d3_l->p_surface->DrawString(d3_l->p_surface,arg_v[i],-1,
269                                d3_l->info_x+d3_l->info_w/2+d3_l->fakt_x,
270                                d3_l->info_y+d3_l->fakt_y+d3_l->font_h+(i%8-1)*2*d3_l->font_h,
271                                DSTF_LEFT);
272   }
273  }
274
275  return 1;
276 }
277
278 int d2_event_init(d2_lattice *d2_l)
279 {
280  d2_l->dfb->GetInputDevice(d2_l->dfb,DIDID_KEYBOARD,&(d2_l->keyboard));
281  d2_l->keyboard->CreateEventBuffer(d2_l->keyboard,&(d2_l->k_buffer));
282  
283  return 1;
284 }
285
286 int d3_event_init(d3_lattice *d3_l)                                           
287 {                                                                             
288  d3_l->dfb->GetInputDevice(d3_l->dfb,DIDID_KEYBOARD,&(d3_l->keyboard));
289  d3_l->keyboard->CreateEventBuffer(d3_l->keyboard,&(d3_l->k_buffer));  
290
291  return 1;                                                           
292 }         
293
294 int scan_event(d3_lattice *d3_l,int *x,int *y,int *z,int *q,int *esc)
295 {
296  DFBInputEvent ke;
297
298  d3_l->k_buffer->GetEvent(d3_l->k_buffer,DFB_EVENT(&ke));
299  if(ke.type==DIET_KEYPRESS)
300  {
301   if(ke.key_id==DIKI_LEFT && *x!=0) *x-=1;
302   if(ke.key_id==DIKI_RIGHT && *x!=d3_l->max_x-1) *x+=1;
303   if(ke.key_id==DIKI_DOWN && *y!=0) *y-=1;
304   if(ke.key_id==DIKI_UP && *y!=d3_l->max_y-1) *y+=1;
305   if(ke.key_id==DIKI_PAGE_DOWN && *z!=0) *z-=1;
306   if(ke.key_id==DIKI_PAGE_UP && *z!=d3_l->max_z-1) *z+=1;
307   if(ke.key_id==DIKI_Q) *q=1;
308   if(ke.key_id==DIKI_ESCAPE) *esc=1;
309  }
310
311  return 1;
312 }
313