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