2 * display.c - visualization api
11 int display_init(u32 x,u32 y,u32 z,display *display,cell *cell,int *argc,char **argv)
14 DFBSurfaceDescription surface_dsc;
15 DFBFontDescription font_dsc;
18 /* store dimensions */
22 /* store pointer to cells */
27 DirectFBInit(argc,&argv);
28 DirectFBCreate(&(display->dfb));
29 display->dfb->SetCooperativeLevel(display->dfb,DFSCL_FULLSCREEN);
30 surface_dsc.flags=DSDESC_CAPS;
31 surface_dsc.caps=DSCAPS_PRIMARY|DSCAPS_FLIPPING;
32 display->dfb->CreateSurface(display->dfb,&surface_dsc,&(display->primary_surface));
33 display->primary_surface->GetSize(display->primary_surface,&(display->screen_width),&(display->screen_height));
34 font_dsc.flags=DFDESC_HEIGHT;
35 font_dsc.height=display->max_y*(display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE))/10;
36 display->dfb->CreateFont(display->dfb,DISPLAY_FONT,&font_dsc,&(display->font));
37 display->primary_surface->SetFont(display->primary_surface,display->font);
42 int display_release(display *display)
45 display->font->Release(display->font);
46 display->primary_surface->Release(display->primary_surface);
47 display->dfb->Release(display->dfb);
54 int dfb_choose_color(cell *cell_p,unsigned char *r,unsigned char *g,unsigned char *b)
56 if(cell_p->status&AMORPH)
71 int display_draw(display *display,u32 x,u32 y,u32 z)
74 int menu_x,menu_y,menu_w,menu_h; /* for the yellow box */
77 unsigned char r,g,b,a;
78 int display_faktor_x,display_faktor_y;
79 a=0xff; /* no alpha blending */
80 if(((display->max_x+display->max_y+DISPLAY_X_FREE)>=display->screen_width)|
81 ((display->max_y+display->max_z+DISPLAY_Y_FREE)>=display->screen_height))
83 puts("resolution too low!");
86 display_faktor_x=display->screen_width/(display->max_x+display->max_y+DISPLAY_X_FREE);
87 display_faktor_y=display->screen_height/(display->max_z+display->max_y+DISPLAY_Y_FREE);
88 // if(display_faktor_x<display_faktor_y) display_faktor_y=display_faktor_x;
89 // if(display_faktor_y<display_faktor_x) display_faktor_x=display_faktor_y;
91 /* draw x-z surface */
93 for(x_c=0;x_c<display->max_x;x_c++)
95 for(z_c=0;z_c<display->max_z;z_c++)
97 dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
99 display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
101 display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
102 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);
105 /* draw y-z surface */
107 for(y_c=0;y_c<display->max_y;y_c++)
109 for(z_c=0;z_c<display->max_z;z_c++)
111 dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
113 display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
115 display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
116 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);
119 /* draw x-y surface */
121 for(x_c=0;x_c<display->max_x;x_c++)
123 for(y_c=0;y_c<display->max_y;y_c++)
125 dfb_choose_color(display->cell_p+x_c+y_c*display->max_x+z_c*display->max_x*display->max_y,&r,&g,&b);
127 display->primary_surface->SetColor(display->primary_surface,0xff,0xff,0,0);
129 display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
130 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);
133 /* display info window */
138 menu_x=2*DISPLAY_X_FREE/3+display->max_x*display_faktor_x;
139 menu_y=2*DISPLAY_Y_FREE/3+display->max_z*display_faktor_y;
140 menu_w=display->max_y*display_faktor_x;
141 menu_h=display->max_y*display_faktor_y;
142 display->primary_surface->SetColor(display->primary_surface,0,0,0,0);
143 display->primary_surface->FillRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
144 display->primary_surface->SetColor(display->primary_surface,r,g,b,a);
145 display->primary_surface->DrawRectangle(display->primary_surface,menu_x,menu_y,menu_w,menu_h);
146 display->primary_surface->DrawLine(display->primary_surface,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y,menu_x+display_faktor_x*display->max_x/2,menu_y+display_faktor_y*display->max_y-display_faktor_y);
147 display->primary_surface->SetColor(display->primary_surface,0x80,0x80,0xff,0xff);
148 sprintf(text,"x: %u",x);
149 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT);
150 sprintf(text,"y: %u",y);
151 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*2+menu_h/10*2,DSTF_LEFT);
152 sprintf(text,"z: %u",z);
153 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*3+menu_h/10*3,DSTF_LEFT);
154 sprintf(text,"status: %c",((display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y))->status&AMORPH?'a':'c');
155 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*5+menu_h/10*5,DSTF_LEFT);
156 sprintf(text,"c conc.: %u",(display->cell_p+x+y*display->max_x+z*display->max_x*display->max_y)->conc);
157 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x,menu_y+display_faktor_y*6+menu_h/10*6,DSTF_LEFT);
158 sprintf(text,"step: %d",display->step);
159 display->primary_surface->DrawString(display->primary_surface,text,-1,menu_x+display_faktor_x*display->max_x/2+display_faktor_x,menu_y+display_faktor_y+menu_h/10,DSTF_LEFT);
160 /* flip all to surface */
161 display->primary_surface->Flip(display->primary_surface,NULL,0);
166 int display_event_init(display *display)
169 display->dfb->GetInputDevice(display->dfb,DIDID_KEYBOARD,&(display->keyboard));
170 display->keyboard->CreateEventBuffer(display->keyboard,&(display->keyboard_buffer));
175 int display_scan_event(display *display,u32 *x,u32 *y,u32 *z,int *quit)
177 DFBInputEvent keyboard_event;
178 display->keyboard_buffer->WaitForEvent(display->keyboard_buffer);
179 display->keyboard_buffer->GetEvent(display->keyboard_buffer,DFB_EVENT(&keyboard_event));
180 if(keyboard_event.type==DIET_KEYPRESS)
182 if(keyboard_event.key_id==DIKI_LEFT && *x!=0) *x-=1;
183 if(keyboard_event.key_id==DIKI_RIGHT && *x!=display->max_x-1) *x+=1;
184 if(keyboard_event.key_id==DIKI_DOWN && *y!=0) *y-=1;
185 if(keyboard_event.key_id==DIKI_UP && *y!=display->max_y-1) *y+=1;
186 if(keyboard_event.key_id==DIKI_PAGE_UP && *z!=0) *z-=1;
187 if(keyboard_event.key_id==DIKI_PAGE_DOWN && *z!=display->max_z-1) *z+=1;
188 if(keyboard_event.key_id==DIKI_Q) *quit=1;