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