dfb api ready.
[physik/morpheus.git] / display.c
1 /*
2  * display.c - visualization api
3  *
4  */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #include "defines.h"
10
11 #ifdef USE_DFB_API
12 // static IDirectFB *dfb=NULL;
13 // static IDirectFBSurface *primary_surface=NULL;
14 // static IDirectFBFont *font=NULL;
15 // static int screen_width=0;
16 // static int screen_height=0;
17 #endif
18
19 int display_init(int x,int y,int z,display *display,void *cell,int *argc,char **argv)
20 {
21 #ifdef USE_DFB_API
22  DFBSurfaceDescription surface_dsc;
23 #endif
24
25  /* store dimensions */
26  display->max_x=x;
27  display->max_y=y;
28  display->max_z=z;
29  /* store pointer to cells */
30  display->cell_p=cell;
31
32  /* the api(s) */
33 #ifdef USE_DFB_API
34  DirectFBInit(argc,&argv);
35  DirectFBCreate(&(display->dfb));
36  display->dfb->SetCooperativeLevel(display->dfb,DFSCL_FULLSCREEN);
37  surface_dsc.flags=DSDESC_CAPS;
38  surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
39  display->dfb->CreateSurface(display->dfb,&surface_dsc,&(display->primary_surface));
40  display->primary_surface->GetSize(display->primary_surface,&(display->screen_width),&(display->screen_height));
41
42 #endif
43  return 23;
44 }
45
46 int display_release(display *display)
47 {
48 #ifdef USE_DFB_API
49  display->primary_surface->Release(display->primary_surface);
50  display->dfb->Release(display->dfb);
51 #endif
52
53  return 23;
54 }
55
56 #ifdef USE_DFB_API
57 int dfb_choose_color(u32 *cell_p,unsigned char *r,unsigned char *g,unsigned char *b)
58 {
59  if((*cell_p&AMORPH)==AMORPH)
60  {
61   *r=0xff;
62   *g=0x00;
63   *b=0x00;
64  } else
65  {
66   *r=0x00;
67   *g=0x00;
68   *b=0xff;
69  }
70  return 23;
71 }
72 #endif
73
74 int display_draw(display *display,int x,int y,int z)
75 {
76 #ifdef USE_DFB_API
77  int menu_x,menu_y,menu_w,menu_h; /* for the yellow box */
78  int x_c,y_c,z_c;
79  unsigned char r,g,b,a;
80  int display_faktor_x,display_faktor_y;
81  a=0xff; /* no alpha blending */
82  if(((display->max_x+display->max_y+DISPLAY_X_FREE)>=display->screen_width)|
83     ((display->max_y+display->max_z+DISPLAY_Y_FREE)>=display->screen_height))
84  {
85   puts("resolution too low!");
86   return -23;
87  }
88  display_faktor_x=display->screen_width/(display->max_x+display->max_y+DISPLAY_X_FREE);
89  display_faktor_y=display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE);
90  // if(display_faktor_x<display_faktor_y) display_faktor_y=display_faktor_x;
91  // if(display_faktor_y<display_faktor_x) display_faktor_x=display_faktor_y;
92
93  /* draw x-z surface */
94  y_c=y;
95  for(x_c=0;x_c<display->max_x;x_c++)
96  {
97   for(z_c=0;z_c<display->max_z;z_c++)
98   {
99    dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
100    display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
101    display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
102   }
103  }
104  /* draw y-z surface */
105  x_c=x;
106  for(y_c=0;y_c<display->max_y;y_c++)
107  {
108   for(z_c=0;z_c<display->max_z;z_c++)
109   {
110    dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
111    display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
112    display->primary_surface->DrawRectangle(display->primary_surface,(y_c+display->max_x)*display_faktor_x+2*DISPLAY_X_FREE/3,z_c*display_faktor_y+DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
113   }
114  }
115  /* draw x-y surface */
116  z_c=z;
117  for(x_c=0;x_c<display->max_x;x_c++)
118  {
119   for(y_c=0;y_c<display->max_y;y_c++)
120   {
121    dfb_choose_color((u32 *)(display->cell_p+x_c+y_c*(display->max_x-1)+z_c*(display->max_x-1)*(display->max_y-1)),&r,&g,&b);
122    display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
123    display->primary_surface->DrawRectangle(display->primary_surface,x_c*display_faktor_x+DISPLAY_X_FREE/3,(y_c+display->max_z)*display_faktor_y+2*DISPLAY_Y_FREE/3,display_faktor_x,display_faktor_y);
124   }
125  }
126  /* display info window */
127  r=0xff;
128  g=0xff;
129  b=0x00;
130  a=0xff;
131  menu_x=2*DISPLAY_X_FREE/3+display->max_x*display_faktor_x;
132  menu_y=2*DISPLAY_Y_FREE/3+display->max_z*display_faktor_y;
133  menu_w=display->max_y*display_faktor_x;
134  menu_h=display->max_y*display_faktor_y;
135  display->primary_surface->SetColor(display->primary_surface,0,0,0,0);
136  display->primary_surface->FillRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
137  display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
138  display->primary_surface->DrawRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
139  /* flip all to surface */
140  display->primary_surface->Flip(display->primary_surface,NULL,0);
141 #endif
142  return 23;
143 }