]> icculus.org git repositories - btb/d2x.git/blob - arch/ggi/gr.c
remove rcs tags
[btb/d2x.git] / arch / ggi / gr.c
1 /*
2  *
3  * Graphics functions for GGI.
4  *
5  *
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include <conf.h>
10 #endif
11
12 #include <ggi/ggi.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <string.h>
16 #include "gr.h"
17 #include "grdef.h"
18 #include "palette.h"
19 #include "u_mem.h"
20 #include "error.h"
21 #include "console.h"
22
23 #include "gamefont.h"
24
25 int gr_installed = 0;
26 void *screenbuffer;
27
28 ggi_visual_t *screenvis;
29 const ggi_directbuffer *dbuffer;
30 ggi_mode init_mode;
31
32 ubyte use_directbuffer;
33
34 void gr_update()
35 {
36         ggiFlush(screenvis);
37         if (!use_directbuffer)
38                 ggiPutBox(screenvis, 0, 0, grd_curscreen->sc_w, grd_curscreen->sc_h, screenbuffer);
39 }
40
41 int gr_set_mode(uint32_t mode)
42 {
43         unsigned int w, h;
44         ggi_mode other_mode;
45
46 #ifdef NOGRAPH
47         return 0;
48 #endif
49         if (mode<=0)
50                 return 0;
51
52         w=SM_W(mode);
53         h=SM_H(mode);
54         
55         
56         gr_palette_clear();
57
58         if(ggiCheckGraphMode(screenvis, w, h, GGI_AUTO, GGI_AUTO, GT_8BIT, &other_mode))
59                 ggiSetMode(screenvis, &other_mode);
60         else
61                 ggiSetGraphMode(screenvis, w, h, GGI_AUTO, GGI_AUTO, GT_8BIT);
62
63         ggiSetFlags(screenvis, GGIFLAG_ASYNC);
64                 
65         if (!ggiDBGetNumBuffers(screenvis))
66                 use_directbuffer = 0;
67         else
68         {       
69                 dbuffer = ggiDBGetBuffer(screenvis, 0);
70                 if (!(dbuffer->type & GGI_DB_SIMPLE_PLB))
71                         use_directbuffer = 0;
72                 else
73                         use_directbuffer = 1;
74         }
75
76         memset(grd_curscreen, 0, sizeof(grs_screen));
77
78         grd_curscreen->sc_mode = mode;
79         grd_curscreen->sc_w = w;
80         grd_curscreen->sc_h = h;
81         grd_curscreen->sc_aspect = fixdiv(grd_curscreen->sc_w*3,grd_curscreen->sc_h*4);
82         grd_curscreen->sc_canvas.cv_bitmap.bm_x = 0;
83         grd_curscreen->sc_canvas.cv_bitmap.bm_y = 0;
84         grd_curscreen->sc_canvas.cv_bitmap.bm_w = w;
85         grd_curscreen->sc_canvas.cv_bitmap.bm_h = h;
86         grd_curscreen->sc_canvas.cv_bitmap.bm_type = BM_LINEAR;
87
88         if (use_directbuffer)
89         {
90                 grd_curscreen->sc_canvas.cv_bitmap.bm_data = dbuffer->write;
91                 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = dbuffer->buffer.plb.stride;
92         }
93         else
94         {
95                 d_free(screenbuffer);
96                 screenbuffer = d_malloc (w * h);
97                 grd_curscreen->sc_canvas.cv_bitmap.bm_data = screenbuffer;
98                 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = w;
99         }
100
101         gr_set_current_canvas(NULL);
102         
103         //gamefont_choose_game_font(w,h);
104         
105         return 0;
106 }
107
108 int gr_init(void)
109 {
110         int retcode;
111         int mode = SM(648,480);
112         // Only do this function once!
113         if (gr_installed==1)
114                 return -1;
115         MALLOC(grd_curscreen,grs_screen, 1);
116         memset(grd_curscreen, 0, sizeof(grs_screen));
117         
118         ggiInit();
119         screenvis = ggiOpen(NULL);
120         ggiGetMode(screenvis, &init_mode);
121
122         if ((retcode=gr_set_mode(mode)))
123                 return retcode;
124         
125         grd_curscreen->sc_canvas.cv_color = 0;
126         grd_curscreen->sc_canvas.cv_drawmode = 0;
127         grd_curscreen->sc_canvas.cv_font = NULL;
128         grd_curscreen->sc_canvas.cv_font_fg_color = 0;
129         grd_curscreen->sc_canvas.cv_font_bg_color = 0;
130         gr_set_current_canvas( &grd_curscreen->sc_canvas );
131
132         gr_installed = 1;
133         atexit(gr_close);
134         return 0;
135 }
136
137 void gr_close ()
138 {
139         if (gr_installed==1)
140         {
141                 ggiSetMode(screenvis, &init_mode);
142                 ggiClose(screenvis);
143                 ggiExit();
144                 gr_installed = 0;
145                 d_free(grd_curscreen);
146         }
147 }
148
149 // Palette functions follow.
150
151 static int last_r=0, last_g=0, last_b=0;
152
153 void gr_palette_clear()
154 {
155         ggi_color *colors = calloc (256, sizeof(ggi_color));
156
157         ggiSetPalette (screenvis, 0, 256, colors);
158
159         gr_palette_faded_out = 1;
160 }
161
162
163 void gr_palette_step_up (int r, int g, int b)
164 {
165         int i;
166         ubyte *p = gr_palette;
167         int temp;
168
169         ggi_color colors[256];
170
171         if (gr_palette_faded_out) return;
172
173         if ((r==last_r) && (g==last_g) && (b==last_b)) return;
174
175         last_r = r;
176         last_g = g;
177         last_b = b;
178
179         for (i = 0; i < 256; i++)
180         {
181                 temp = (int)(*p++) + r + gr_palette_gamma;
182                 if (temp<0) temp=0;
183                 else if (temp>63) temp=63;
184                 colors[i].r = temp * 0x3ff;
185                 temp = (int)(*p++) + g + gr_palette_gamma;
186                 if (temp<0) temp=0;
187                 else if (temp>63) temp=63;
188                 colors[i].g = temp * 0x3ff;
189                 temp = (int)(*p++) + b + gr_palette_gamma;
190                 if (temp<0) temp=0;
191                 else if (temp>63) temp=63;
192                 colors[i].b = temp * 0x3ff;
193         }
194         ggiSetPalette (screenvis, 0, 256, colors);
195 }
196
197 //added on 980913 by adb to fix palette problems
198 // need a min without side effects...
199 #undef min
200 static inline int min(int x, int y) { return x < y ? x : y; }
201 //end changes by adb
202
203 void gr_palette_load (ubyte *pal)       
204 {
205         int i, j;
206         ggi_color colors[256];
207
208         for (i = 0, j = 0; j < 256; j++)
209         {
210                 gr_current_pal[i] = pal[i];
211                 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
212                 colors[j].r = (min(gr_current_pal[i] + gr_palette_gamma, 63)) * 0x3ff;
213                 i++;
214                 gr_current_pal[i] = pal[i];
215                 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
216                 colors[j].g = (min(gr_current_pal[i] + gr_palette_gamma, 63)) * 0x3ff;
217                 i++;
218                 gr_current_pal[i] = pal[i];
219                 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
220                 colors[j].b = (min(gr_current_pal[i] + gr_palette_gamma, 63)) * 0x3ff;
221                 i++;
222         }
223
224         ggiSetPalette(screenvis, 0, 256, colors);
225
226         gr_palette_faded_out = 0;
227         init_computed_colors();
228 }
229
230
231
232 int gr_palette_fade_out (ubyte *pal, int nsteps, int allow_keys)
233 {
234         int i, j, k;
235         ubyte c;
236         fix fade_palette[768];
237         fix fade_palette_delta[768];
238
239         ggi_color fade_colors[256];
240
241         if (gr_palette_faded_out) return 0;
242
243         if (pal==NULL) pal=gr_current_pal;
244
245         for (i=0; i<768; i++)
246         {
247                 gr_current_pal[i] = pal[i];
248                 fade_palette[i] = i2f(pal[i]);
249                 fade_palette_delta[i] = fade_palette[i] / nsteps;
250         }
251
252         for (j=0; j<nsteps; j++)
253         {
254                 for (i = 0; i < 768; i++)
255                 {
256                         fade_palette[i] -= fade_palette_delta[i];
257                         if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
258                                 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
259                 }
260                 for (i = 0, k = 0; k < 256; k++)
261                 {
262                         c = f2i(fade_palette[i++]);
263                         if (c > 63) c = 63;
264                         fade_colors[k].r = c * 0x3ff;
265                         c = f2i(fade_palette[i++]);
266                         if (c > 63) c = 63;
267                         fade_colors[k].g = c * 0x3ff;
268                         c = f2i(fade_palette[i++]);
269                         if (c > 63) c = 63;
270                         fade_colors[k].b = c * 0x3ff;
271                 }
272                 ggiSetPalette (screenvis, 0, 256, fade_colors);
273                 gr_update();
274         }
275
276         gr_palette_faded_out = 1;
277         return 0;
278 }
279
280
281
282 int gr_palette_fade_in (ubyte *pal, int nsteps, int allow_keys)
283 {
284         int i, j, k;
285         ubyte c;
286         fix fade_palette[768];
287         fix fade_palette_delta[768];
288
289         ggi_color fade_colors[256];
290
291         if (!gr_palette_faded_out) return 0;
292
293         for (i=0; i<768; i++)
294         {
295                 gr_current_pal[i] = pal[i];
296                 fade_palette[i] = 0;
297                 fade_palette_delta[i] = i2f(pal[i] + gr_palette_gamma) / nsteps;
298         }
299
300         for (j=0; j<nsteps; j++ )
301         {
302                 for (i = 0; i < 768; i++ )
303                 {
304                         fade_palette[i] += fade_palette_delta[i];
305                         if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
306                                 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
307                 }
308                 for (i = 0, k = 0; k < 256; k++)
309                 {
310                         c = f2i(fade_palette[i++]);
311                         if (c > 63) c = 63;
312                         fade_colors[k].r = c * 0x3ff;
313                         c = f2i(fade_palette[i++]);
314                         if (c > 63) c = 63;
315                         fade_colors[k].g = c * 0x3ff;
316                         c = f2i(fade_palette[i++]);
317                         if (c > 63) c = 63;
318                         fade_colors[k].b = c * 0x3ff;
319                 }
320                 ggiSetPalette (screenvis, 0, 256, fade_colors);
321                 gr_update();
322         }
323
324         gr_palette_faded_out = 0;
325         return 0;
326 }
327
328
329
330 void gr_palette_read (ubyte *pal)
331 {
332         ggi_color colors[256];
333         int i, j;
334
335         ggiGetPalette (screenvis, 0, 256, colors);
336
337         for (i = 0, j = 0; i < 256; i++)
338         {
339                 pal[j++] = colors[i].r / 0x3ff;
340                 pal[j++] = colors[i].g / 0x3ff;
341                 pal[j++] = colors[i].b / 0x3ff;
342         }
343 }