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