3 * SVGALib video functions
31 extern void mouse_handler (int button, int dx, int dy, int dz, int drx, int dry, int drz);
33 GraphicsContext *physicalscreen, *screenbuffer;
38 gl_copyscreen(physicalscreen);
41 int gr_set_mode(uint32_t mode)
45 vga_modeinfo *modeinfo;
60 sprintf(vgamode, "G%dx%dx256", w, h);
61 modenum = vga_getmodenumber(vgamode);
64 mouse_seteventhandler(mouse_handler);
66 modeinfo = vga_getmodeinfo(modenum);
68 if (modeinfo->flags & CAPABLE_LINEAR)
72 vga_setlinearaddressing();
74 // Set up physical screen only
75 gl_setcontextvga(modenum);
76 physicalscreen = gl_allocatecontext();
77 gl_getcontext(physicalscreen);
78 screenbuffer = physicalscreen;
80 framebuffer = physicalscreen->vbuf;
81 rowsize = physicalscreen->bytewidth;
87 // Set up the physical screen
88 gl_setcontextvga(modenum);
89 physicalscreen = gl_allocatecontext();
90 gl_getcontext(physicalscreen);
92 // Set up the virtual screen
93 gl_setcontextvgavirtual(modenum);
94 screenbuffer = gl_allocatecontext();
95 gl_getcontext(screenbuffer);
97 framebuffer = screenbuffer->vbuf;
98 rowsize = screenbuffer->bytewidth;
101 memset(grd_curscreen, 0, sizeof(grs_screen));
102 grd_curscreen->sc_mode = mode;
103 grd_curscreen->sc_w = w;
104 grd_curscreen->sc_h = h;
105 grd_curscreen->sc_aspect = fixdiv(grd_curscreen->sc_w*3,grd_curscreen->sc_h*4);
106 grd_curscreen->sc_canvas.cv_bitmap.bm_x = 0;
107 grd_curscreen->sc_canvas.cv_bitmap.bm_y = 0;
108 grd_curscreen->sc_canvas.cv_bitmap.bm_w = w;
109 grd_curscreen->sc_canvas.cv_bitmap.bm_h = h;
110 grd_curscreen->sc_canvas.cv_bitmap.bm_rowsize = rowsize;
111 grd_curscreen->sc_canvas.cv_bitmap.bm_type = BM_LINEAR;
112 grd_curscreen->sc_canvas.cv_bitmap.bm_data = framebuffer;
113 gr_set_current_canvas(NULL);
115 //gamefont_choose_game_font(w,h);
123 int mode = SM(320,200);
125 // Only do this function once!
128 MALLOC(grd_curscreen,grs_screen, 1);
129 memset(grd_curscreen, 0, sizeof(grs_screen));
133 if ((retcode=gr_set_mode(mode)))
136 grd_curscreen->sc_canvas.cv_color = 0;
137 grd_curscreen->sc_canvas.cv_drawmode = 0;
138 grd_curscreen->sc_canvas.cv_font = NULL;
139 grd_curscreen->sc_canvas.cv_font_fg_color = 0;
140 grd_curscreen->sc_canvas.cv_font_bg_color = 0;
141 gr_set_current_canvas( &grd_curscreen->sc_canvas );
154 gl_freecontext(screenbuffer);
155 gl_freecontext(physicalscreen);
159 // Palette functions follow.
161 static int last_r=0, last_g=0, last_b=0;
163 void gr_palette_clear ()
167 memset (colors, 0, 768 * sizeof(int));
168 vga_setpalvec (0, 256, colors);
170 gr_palette_faded_out = 1;
174 void gr_palette_step_up (int r, int g, int b)
177 ubyte *p = gr_palette;
182 if (gr_palette_faded_out) return;
184 if ((r==last_r) && (g==last_g) && (b==last_b)) return;
192 temp = (int)(*p++) + r + gr_palette_gamma;
194 else if (temp>63) temp=63;
196 temp = (int)(*p++) + g + gr_palette_gamma;
198 else if (temp>63) temp=63;
200 temp = (int)(*p++) + b + gr_palette_gamma;
202 else if (temp>63) temp=63;
205 vga_setpalvec (0, 256, colors);
208 //added on 980913 by adb to fix palette problems
209 // need a min without side effects...
211 static inline int min(int x, int y) { return x < y ? x : y; }
214 void gr_palette_load (ubyte *pal)
219 for (i = 0; i < 768; i++)
221 gr_current_pal[i] = pal[i];
222 if (gr_current_pal[i] > 63) gr_current_pal[i] = 63;
223 colors[i] = (min(gr_current_pal[i] + gr_palette_gamma, 63));
226 vga_setpalvec (0, 256, colors);
228 gr_palette_faded_out = 0;
229 init_computed_colors();
234 int gr_palette_fade_out (ubyte *pal, int nsteps, int allow_keys)
238 fix fade_palette[768];
239 fix fade_palette_delta[768];
241 int fade_colors[768];
243 if (gr_palette_faded_out) return 0;
245 if (pal==NULL) pal=gr_current_pal;
247 for (i=0; i<768; i++)
249 gr_current_pal[i] = pal[i];
250 fade_palette[i] = i2f(pal[i]);
251 fade_palette_delta[i] = fade_palette[i] / nsteps;
254 for (j=0; j<nsteps; j++)
256 for (i = 0; i < 768; i++)
258 fade_palette[i] -= fade_palette_delta[i];
259 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
260 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
261 c = f2i(fade_palette[i]);
265 vga_setpalvec (0, 256, fade_colors);
268 gr_palette_faded_out = 1;
274 int gr_palette_fade_in (ubyte *pal, int nsteps, int allow_keys)
278 fix fade_palette[768];
279 fix fade_palette_delta[768];
281 int fade_colors[768];
283 if (!gr_palette_faded_out) return 0;
285 for (i=0; i<768; i++)
287 gr_current_pal[i] = pal[i];
289 fade_palette_delta[i] = i2f(pal[i] + gr_palette_gamma) / nsteps;
292 for (j=0; j<nsteps; j++ )
294 for (i = 0; i < 768; i++ )
296 fade_palette[i] += fade_palette_delta[i];
297 if (fade_palette[i] > i2f(pal[i] + gr_palette_gamma))
298 fade_palette[i] = i2f(pal[i] + gr_palette_gamma);
299 c = f2i(fade_palette[i]);
303 vga_setpalvec (0, 256, fade_colors);
306 gr_palette_faded_out = 0;
312 void gr_palette_read (ubyte *pal)
317 vga_getpalvec (0, 256, colors);
319 for (i = 0; i < 768; i++)