1 /* SVGALib video functions */
25 extern void mouse_handler (int button, int dx, int dy, int dz, int drx, int dry, int drz);
27 GraphicsContext *physicalscreen, *screenbuffer;
32 gl_copyscreen(physicalscreen);
35 int gr_set_mode(u_int32_t mode)
39 vga_modeinfo *modeinfo;
54 sprintf(vgamode, "G%dx%dx256", w, h);
55 modenum = vga_getmodenumber(vgamode);
58 mouse_seteventhandler(mouse_handler);
60 modeinfo = vga_getmodeinfo(modenum);
62 if (modeinfo->flags & CAPABLE_LINEAR)
66 vga_setlinearaddressing();
68 // Set up physical screen only
69 gl_setcontextvga(modenum);
70 physicalscreen = gl_allocatecontext();
71 gl_getcontext(physicalscreen);
72 screenbuffer = physicalscreen;
74 framebuffer = physicalscreen->vbuf;
75 rowsize = physicalscreen->bytewidth;
81 // Set up the physical screen
82 gl_setcontextvga(modenum);
83 physicalscreen = gl_allocatecontext();
84 gl_getcontext(physicalscreen);
86 // Set up the virtual screen
87 gl_setcontextvgavirtual(modenum);
88 screenbuffer = gl_allocatecontext();
89 gl_getcontext(screenbuffer);
91 framebuffer = screenbuffer->vbuf;
92 rowsize = screenbuffer->bytewidth;
95 memset(grd_curscreen, 0, sizeof(grs_screen));
96 grd_curscreen->sc_mode = mode;
97 grd_curscreen->sc_w = w;
98 grd_curscreen->sc_h = h;
99 grd_curscreen->sc_aspect = fixdiv(grd_curscreen->sc_w*3,grd_curscreen->sc_h*4);
100 grd_curscreen->sc_canvas.cv_bitmap.bm_x = 0;
101 grd_curscreen->sc_canvas.cv_bitmap.bm_y = 0;
102 grd_curscreen->sc_canvas.cv_bitmap.bm_w = w;
103 grd_curscreen->sc_canvas.cv_bitmap.bm_h = h;
104 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = rowsize;
105 grd_curscreen->sc_canvas.cv_bitmap.bm_type = BM_LINEAR;
106 grd_curscreen->sc_canvas.cv_bitmap.bm_data = framebuffer;
107 gr_set_current_canvas(NULL);
109 //gamefont_choose_game_font(w,h);
117 int mode = SM(320,200);
119 // Only do this function once!
122 MALLOC(grd_curscreen,grs_screen, 1);
123 memset(grd_curscreen, 0, sizeof(grs_screen));
127 if ((retcode=gr_set_mode(mode)))
130 grd_curscreen->sc_canvas.cv_color = 0;
131 grd_curscreen->sc_canvas.cv_drawmode = 0;
132 grd_curscreen->sc_canvas.cv_font = NULL;
133 grd_curscreen->sc_canvas.cv_font_fg_color = 0;
134 grd_curscreen->sc_canvas.cv_font_bg_color = 0;
135 gr_set_current_canvas( &grd_curscreen->sc_canvas );
148 gl_freecontext(screenbuffer);
149 gl_freecontext(physicalscreen);
153 // Palette functions follow.
155 static int last_r=0, last_g=0, last_b=0;
157 void gr_palette_clear ()
161 memset (colors, 0, 768 * sizeof(int));
162 vga_setpalvec (0, 256, colors);
164 gr_palette_faded_out = 1;
168 void gr_palette_step_up (int r, int g, int b)
171 ubyte *p = gr_palette;
176 if (gr_palette_faded_out) return;
178 if ((r==last_r) && (g==last_g) && (b==last_b)) return;
186 temp = (int)(*p++) + r + gr_palette_gamma;
188 else if (temp>63) temp=63;
190 temp = (int)(*p++) + g + gr_palette_gamma;
192 else if (temp>63) temp=63;
194 temp = (int)(*p++) + b + gr_palette_gamma;
196 else if (temp>63) temp=63;
199 vga_setpalvec (0, 256, colors);
202 //added on 980913 by adb to fix palette problems
203 // need a min without side effects...
205 static inline int min(int x, int y) { return x < y ? x : y; }
208 void gr_palette_load (ubyte *pal)
213 for (i = 0; i < 768; i++)
215 gr_current_pal[i] = pal[i];
216 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
217 colors[i] = (min(gr_current_pal[i] + gr_palette_gamma, 63));
220 vga_setpalvec (0, 256, colors);
222 gr_palette_faded_out = 0;
223 init_computed_colors();
228 int gr_palette_fade_out (ubyte *pal, int nsteps, int allow_keys)
232 fix fade_palette[768];
233 fix fade_palette_delta[768];
235 int fade_colors[768];
237 if (gr_palette_faded_out) return 0;
239 if (pal==NULL) pal=gr_current_pal;
241 for (i=0; i<768; i++)
243 gr_current_pal[i] = pal[i];
244 fade_palette[i] = i2f(pal[i]);
245 fade_palette_delta[i] = fade_palette[i] / nsteps;
248 for (j=0; j<nsteps; j++)
250 for (i = 0; i < 768; i++)
252 fade_palette[i] -= fade_palette_delta[i];
253 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
254 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
255 c = f2i(fade_palette[i]);
259 vga_setpalvec (0, 256, fade_colors);
262 gr_palette_faded_out = 1;
268 int gr_palette_fade_in (ubyte *pal, int nsteps, int allow_keys)
272 fix fade_palette[768];
273 fix fade_palette_delta[768];
275 int fade_colors[768];
277 if (!gr_palette_faded_out) return 0;
279 for (i=0; i<768; i++)
281 gr_current_pal[i] = pal[i];
283 fade_palette_delta[i] = i2f(pal[i] + gr_palette_gamma) / nsteps;
286 for (j=0; j<nsteps; j++ )
288 for (i = 0; i < 768; i++ )
290 fade_palette[i] += fade_palette_delta[i];
291 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
292 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
293 c = f2i(fade_palette[i]);
297 vga_setpalvec (0, 256, fade_colors);
300 gr_palette_faded_out = 0;
306 void gr_palette_read (ubyte *pal)
311 vga_getpalvec (0, 256, colors);
313 for (i = 0; i < 768; i++)
317 #endif /* SVGALIB_VIDEO */