2 * $Source: /cvs/cvsroot/d2x/arch/svgalib/gr.c,v $
5 * $Date: 2001-10-25 08:25:34 $
7 * SVGALib video functions
9 * $Log: not supported by cvs2svn $
10 * Revision 1.2 2001/01/29 13:47:52 bradleyb
11 * Fixed build, some minor cleanups.
38 extern void mouse_handler (int button, int dx, int dy, int dz, int drx, int dry, int drz);
40 GraphicsContext *physicalscreen, *screenbuffer;
45 gl_copyscreen(physicalscreen);
48 int gr_set_mode(u_int32_t mode)
52 vga_modeinfo *modeinfo;
67 sprintf(vgamode, "G%dx%dx256", w, h);
68 modenum = vga_getmodenumber(vgamode);
71 mouse_seteventhandler(mouse_handler);
73 modeinfo = vga_getmodeinfo(modenum);
75 if (modeinfo->flags & CAPABLE_LINEAR)
79 vga_setlinearaddressing();
81 // Set up physical screen only
82 gl_setcontextvga(modenum);
83 physicalscreen = gl_allocatecontext();
84 gl_getcontext(physicalscreen);
85 screenbuffer = physicalscreen;
87 framebuffer = physicalscreen->vbuf;
88 rowsize = physicalscreen->bytewidth;
94 // Set up the physical screen
95 gl_setcontextvga(modenum);
96 physicalscreen = gl_allocatecontext();
97 gl_getcontext(physicalscreen);
99 // Set up the virtual screen
100 gl_setcontextvgavirtual(modenum);
101 screenbuffer = gl_allocatecontext();
102 gl_getcontext(screenbuffer);
104 framebuffer = screenbuffer->vbuf;
105 rowsize = screenbuffer->bytewidth;
108 memset(grd_curscreen, 0, sizeof(grs_screen));
109 grd_curscreen->sc_mode = mode;
110 grd_curscreen->sc_w = w;
111 grd_curscreen->sc_h = h;
112 grd_curscreen->sc_aspect = fixdiv(grd_curscreen->sc_w*3,grd_curscreen->sc_h*4);
113 grd_curscreen->sc_canvas.cv_bitmap.bm_x = 0;
114 grd_curscreen->sc_canvas.cv_bitmap.bm_y = 0;
115 grd_curscreen->sc_canvas.cv_bitmap.bm_w = w;
116 grd_curscreen->sc_canvas.cv_bitmap.bm_h = h;
117 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = rowsize;
118 grd_curscreen->sc_canvas.cv_bitmap.bm_type = BM_LINEAR;
119 grd_curscreen->sc_canvas.cv_bitmap.bm_data = framebuffer;
120 gr_set_current_canvas(NULL);
122 //gamefont_choose_game_font(w,h);
130 int mode = SM(320,200);
132 // Only do this function once!
135 MALLOC(grd_curscreen,grs_screen, 1);
136 memset(grd_curscreen, 0, sizeof(grs_screen));
140 if ((retcode=gr_set_mode(mode)))
143 grd_curscreen->sc_canvas.cv_color = 0;
144 grd_curscreen->sc_canvas.cv_drawmode = 0;
145 grd_curscreen->sc_canvas.cv_font = NULL;
146 grd_curscreen->sc_canvas.cv_font_fg_color = 0;
147 grd_curscreen->sc_canvas.cv_font_bg_color = 0;
148 gr_set_current_canvas( &grd_curscreen->sc_canvas );
161 gl_freecontext(screenbuffer);
162 gl_freecontext(physicalscreen);
166 // Palette functions follow.
168 static int last_r=0, last_g=0, last_b=0;
170 void gr_palette_clear ()
174 memset (colors, 0, 768 * sizeof(int));
175 vga_setpalvec (0, 256, colors);
177 gr_palette_faded_out = 1;
181 void gr_palette_step_up (int r, int g, int b)
184 ubyte *p = gr_palette;
189 if (gr_palette_faded_out) return;
191 if ((r==last_r) && (g==last_g) && (b==last_b)) return;
199 temp = (int)(*p++) + r + gr_palette_gamma;
201 else if (temp>63) temp=63;
203 temp = (int)(*p++) + g + gr_palette_gamma;
205 else if (temp>63) temp=63;
207 temp = (int)(*p++) + b + gr_palette_gamma;
209 else if (temp>63) temp=63;
212 vga_setpalvec (0, 256, colors);
215 //added on 980913 by adb to fix palette problems
216 // need a min without side effects...
218 static inline int min(int x, int y) { return x < y ? x : y; }
221 void gr_palette_load (ubyte *pal)
226 for (i = 0; i < 768; i++)
228 gr_current_pal[i] = pal[i];
229 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
230 colors[i] = (min(gr_current_pal[i] + gr_palette_gamma, 63));
233 vga_setpalvec (0, 256, colors);
235 gr_palette_faded_out = 0;
236 init_computed_colors();
241 int gr_palette_fade_out (ubyte *pal, int nsteps, int allow_keys)
245 fix fade_palette[768];
246 fix fade_palette_delta[768];
248 int fade_colors[768];
250 if (gr_palette_faded_out) return 0;
252 if (pal==NULL) pal=gr_current_pal;
254 for (i=0; i<768; i++)
256 gr_current_pal[i] = pal[i];
257 fade_palette[i] = i2f(pal[i]);
258 fade_palette_delta[i] = fade_palette[i] / nsteps;
261 for (j=0; j<nsteps; j++)
263 for (i = 0; i < 768; i++)
265 fade_palette[i] -= fade_palette_delta[i];
266 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
267 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
268 c = f2i(fade_palette[i]);
272 vga_setpalvec (0, 256, fade_colors);
275 gr_palette_faded_out = 1;
281 int gr_palette_fade_in (ubyte *pal, int nsteps, int allow_keys)
285 fix fade_palette[768];
286 fix fade_palette_delta[768];
288 int fade_colors[768];
290 if (!gr_palette_faded_out) return 0;
292 for (i=0; i<768; i++)
294 gr_current_pal[i] = pal[i];
296 fade_palette_delta[i] = i2f(pal[i] + gr_palette_gamma) / nsteps;
299 for (j=0; j<nsteps; j++ )
301 for (i = 0; i < 768; i++ )
303 fade_palette[i] += fade_palette_delta[i];
304 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
305 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
306 c = f2i(fade_palette[i]);
310 vga_setpalvec (0, 256, fade_colors);
313 gr_palette_faded_out = 0;
319 void gr_palette_read (ubyte *pal)
324 vga_getpalvec (0, 256, colors);
326 for (i = 0; i < 768; i++)