home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ST-Computer Leser-CD 2000 January
/
LCD_01_2000.iso
/
games
/
doom
/
pmdoom
/
src
/
video
/
svgalib.c
next >
Wrap
C/C++ Source or Header
|
1999-12-17
|
12KB
|
486 lines
/*
* Svgalib functions
* Keyboard routine inspired from Snes9x
*
* Patrice Mandin
*/
#include <stdlib.h>
#include <vga.h>
#include <vgagl.h>
#include <vgakeyboard.h>
#include "am_map.h"
#include "d_main.h"
#include "f_finale.h"
#include "f_wipe.h"
#include "r_draw.h"
#include "v_video.h"
#include "z_zone.h"
#include "i_system.h"
#include "i_zoom.h"
#include "i_video.h"
#include "video/svgalib.h"
typedef struct
{
int number; /* Number of video mode */
vga_modeinfo *info; /* Pointer for informations on the mode */
int depth; /* bits per plane */
} svgamode_t;
void *svgascreen[2]; /* double buffer screens */
void *svgazoomscreen; /* zoomed screen */
/*int scr_width,scr_height;*/ /* size of screen */
int svganummodes; /* Number of video modes */
int dstpos_x,dstpos_y; /* Position in destination screen */
svgamode_t *svgamodelist;
static char prev_keystate [128] = "";
void I_ShutdownGraphics_svgalib(void)
{
keyboard_close();
vga_setmode(TEXT);
}
//
// I_StartTic
//
void I_UpdateKeyboard_svgalib (void)
{
event_t event;
// Taken from Snes9x
char *keystate;
keyboard_update ();
keystate=keyboard_getstate();
#define KEY_DOWN(a) (keystate[a])
#define KEY_PRESS(a) (keystate[a] && !prev_keystate[a])
#define KEY_WASPRESSED(a) (prev_keystate[a] && !keystate[a])
#define PROCESS_KEY(k,t) \
if (KEY_PRESS(k)) \
{ \
event.type = ev_keydown; \
event.data1 = t; \
D_PostEvent(&event); \
} \
if (KEY_WASPRESSED(k)) \
{ \
event.type = ev_keyup; \
event.data1 = t; \
D_PostEvent(&event); \
}
PROCESS_KEY(SCANCODE_CURSORBLOCKRIGHT, KEY_RIGHTARROW);
PROCESS_KEY(SCANCODE_CURSORBLOCKLEFT, KEY_LEFTARROW);
PROCESS_KEY(SCANCODE_CURSORBLOCKDOWN, KEY_DOWNARROW);
PROCESS_KEY(SCANCODE_CURSORBLOCKUP, KEY_UPARROW);
PROCESS_KEY(SCANCODE_ESCAPE, KEY_ESCAPE);
PROCESS_KEY(SCANCODE_ENTER, KEY_ENTER);
PROCESS_KEY(SCANCODE_KEYPADENTER, KEY_ENTER);
PROCESS_KEY(SCANCODE_TAB, KEY_TAB);
PROCESS_KEY(SCANCODE_SPACE, ' ');
PROCESS_KEY(SCANCODE_BREAK, KEY_PAUSE);
PROCESS_KEY(SCANCODE_BREAK_ALTERNATIVE, KEY_PAUSE);
PROCESS_KEY(SCANCODE_F1, KEY_F1);
PROCESS_KEY(SCANCODE_F2, KEY_F2);
PROCESS_KEY(SCANCODE_F3, KEY_F3);
PROCESS_KEY(SCANCODE_F4, KEY_F4);
PROCESS_KEY(SCANCODE_F5, KEY_F5);
PROCESS_KEY(SCANCODE_F6, KEY_F6);
PROCESS_KEY(SCANCODE_F7, KEY_F7);
PROCESS_KEY(SCANCODE_F8, KEY_F8);
PROCESS_KEY(SCANCODE_F9, KEY_F9);
PROCESS_KEY(SCANCODE_F10, KEY_F10);
PROCESS_KEY(SCANCODE_F11, KEY_F11);
PROCESS_KEY(SCANCODE_F12, KEY_F12);
PROCESS_KEY(SCANCODE_1, '1');
PROCESS_KEY(SCANCODE_2, '2');
PROCESS_KEY(SCANCODE_3, '3');
PROCESS_KEY(SCANCODE_4, '4');
PROCESS_KEY(SCANCODE_5, '5');
PROCESS_KEY(SCANCODE_6, '6');
PROCESS_KEY(SCANCODE_7, '7');
PROCESS_KEY(SCANCODE_8, '8');
PROCESS_KEY(SCANCODE_9, '9');
PROCESS_KEY(SCANCODE_0, '0');
PROCESS_KEY(SCANCODE_MINUS, KEY_MINUS);
PROCESS_KEY(SCANCODE_KEYPADMINUS, KEY_MINUS);
PROCESS_KEY(SCANCODE_EQUAL, KEY_EQUALS);
PROCESS_KEY(SCANCODE_KEYPADPLUS, KEY_EQUALS);
PROCESS_KEY(SCANCODE_BACKSPACE, KEY_BACKSPACE);
PROCESS_KEY(SCANCODE_REMOVE, KEY_BACKSPACE);
PROCESS_KEY(SCANCODE_LEFTSHIFT, KEY_RSHIFT);
PROCESS_KEY(SCANCODE_RIGHTSHIFT, KEY_RSHIFT);
PROCESS_KEY(SCANCODE_LEFTCONTROL, KEY_RCTRL);
PROCESS_KEY(SCANCODE_RIGHTCONTROL, KEY_RCTRL);
PROCESS_KEY(SCANCODE_LEFTALT, KEY_RALT);
PROCESS_KEY(SCANCODE_RIGHTALT, KEY_RALT);
PROCESS_KEY(SCANCODE_Q, 'q');
PROCESS_KEY(SCANCODE_W, 'w');
PROCESS_KEY(SCANCODE_E, 'e');
PROCESS_KEY(SCANCODE_R, 'r');
PROCESS_KEY(SCANCODE_T, 't');
PROCESS_KEY(SCANCODE_Y, 'y');
PROCESS_KEY(SCANCODE_U, 'u');
PROCESS_KEY(SCANCODE_I, 'i');
PROCESS_KEY(SCANCODE_O, 'o');
PROCESS_KEY(SCANCODE_P, 'p');
PROCESS_KEY(SCANCODE_A, 'a');
PROCESS_KEY(SCANCODE_S, 's');
PROCESS_KEY(SCANCODE_D, 'd');
PROCESS_KEY(SCANCODE_F, 'f');
PROCESS_KEY(SCANCODE_G, 'g');
PROCESS_KEY(SCANCODE_H, 'h');
PROCESS_KEY(SCANCODE_J, 'j');
PROCESS_KEY(SCANCODE_K, 'k');
PROCESS_KEY(SCANCODE_L, 'l');
PROCESS_KEY(SCANCODE_Z, 'z');
PROCESS_KEY(SCANCODE_X, 'x');
PROCESS_KEY(SCANCODE_C, 'c');
PROCESS_KEY(SCANCODE_V, 'v');
PROCESS_KEY(SCANCODE_B, 'b');
PROCESS_KEY(SCANCODE_N, 'n');
PROCESS_KEY(SCANCODE_M, 'm');
memcpy (prev_keystate, keystate, sizeof (prev_keystate));
}
void I_VidUpdate_svgalib (void)
{
void *source;
int dstwidth,dstheight;
if (dblbuffer)
{
if (zoomscreen)
{
I_Zoom(screens[0],svgascreen[fbnum]);
}
vga_copytoplanar256(svgascreen[fbnum],videowidth,(fbnum<<17)>>2,80,videowidth,videoheight);
vga_setdisplaystart(fbnum<<17);
vga_waitretrace();
fbnum ^=1;
if (!zoomscreen)
{
screens[0]=svgascreen[fbnum]+videowidth*((videoheight-SCREENHEIGHT)>>1);
R_InitBuffer(scaledviewwidth,viewheight); /* mettre a jour ylookup */
}
}
else
{
if (zoomscreen)
{
/* Single buffer, zoom */
source=svgazoomscreen;
I_Zoom(screens[0],svgazoomscreen);
dstwidth=videowidth;
dstheight=videoheight;
}
else
{
/* Single buffer, no zoom */
source=screens[0];
dstwidth=SCREENWIDTH;
dstheight=SCREENHEIGHT;
}
if (videomode==G320x200x256)
memcpy(vga_getgraphmem(),source,SCREENWIDTH*SCREENHEIGHT*pixel_size);
else
gl_putbox(
dstpos_x,dstpos_y,
dstwidth,dstheight,
source);
}
}
void I_SetPalette256_svgalib (byte* palette)
{
int i;
for(i = 0; i < 256; i++)
{
byte r,v,b;
r = gammatable[usegamma][*palette++]>>2;
v = gammatable[usegamma][*palette++]>>2;
b = gammatable[usegamma][*palette++]>>2;
vga_setpalette(i,r,v,b);
}
}
void I_InitGraphics_svgalib(void)
{
static int firsttime=1;
svgamode_t *curmode;
vga_modeinfo *curinfo;
int screensize;
if (!firsttime)
return;
firsttime = 0;
if (videomode<0 || videomode>=svganummodes)
{
/* Standard mode */
videomode=G320x200x256;
bpp=8;
}
else
{
/* Init asked mode */
curmode=&svgamodelist[videomode];
videomode=curmode->number;
bpp=curmode->depth;
}
curinfo=vga_getmodeinfo(videomode);
videowidth=curinfo->width;
videoheight=curinfo->height;
dblbuffer=false;
switch (bpp)
{
case 8:
R_DrawColumn=R_DrawColumn8;
R_DrawColumnLow=R_DrawColumnLow8;
R_DrawFuzzColumn=R_DrawFuzzColumn8;
R_DrawFuzzColumnLow=R_DrawFuzzColumnLow8;
R_DrawTranslatedColumn=R_DrawTranslatedColumn8;
R_DrawTranslatedColumnLow=R_DrawTranslatedColumnLow8;
R_DrawSpan=R_DrawSpan8;
R_DrawSpanLow=R_DrawSpanLow8;
AM_DrawFline=AM_drawFline8;
wipe_doMelt=wipe_doMelt8;
V_DrawPatch=V_DrawPatch8;
V_DrawPatchFlipped=V_DrawPatchFlipped8;
F_DrawPatchCol=F_DrawPatchCol8;
I_Zoom=I_Zoom8;
pixel_size=1;
break;
case 15:
R_DrawColumn=R_DrawColumn16;
R_DrawColumnLow=R_DrawColumnLow16;
R_DrawFuzzColumn=R_DrawFuzzColumn16;
R_DrawFuzzColumnLow=R_DrawFuzzColumnLow16;
R_DrawTranslatedColumn=R_DrawTranslatedColumn16;
R_DrawTranslatedColumnLow=R_DrawTranslatedColumnLow16;
R_DrawSpan=R_DrawSpan16;
R_DrawSpanLow=R_DrawSpanLow16;
AM_DrawFline=AM_drawFline16;
wipe_doMelt=wipe_doMelt16;
V_DrawPatch=V_DrawPatch16;
V_DrawPatchFlipped=V_DrawPatchFlipped16;
F_DrawPatchCol=F_DrawPatchCol16;
I_Zoom=I_Zoom16;
pixel_size=2;
fuzzmask=0x3DEF3DEF;
break;
case 16:
R_DrawColumn=R_DrawColumn16;
R_DrawColumnLow=R_DrawColumnLow16;
R_DrawFuzzColumn=R_DrawFuzzColumn16;
R_DrawFuzzColumnLow=R_DrawFuzzColumnLow16;
R_DrawTranslatedColumn=R_DrawTranslatedColumn16;
R_DrawTranslatedColumnLow=R_DrawTranslatedColumnLow16;
R_DrawSpan=R_DrawSpan16;
R_DrawSpanLow=R_DrawSpanLow16;
AM_DrawFline=AM_drawFline16;
wipe_doMelt=wipe_doMelt16;
V_DrawPatch=V_DrawPatch16;
V_DrawPatchFlipped=V_DrawPatchFlipped16;
F_DrawPatchCol=F_DrawPatchCol16;
I_Zoom=I_Zoom16;
pixel_size=2;
fuzzmask=0x7BEF7BEF;
break;
case 24:
R_DrawColumn=R_DrawColumn24;
R_DrawColumnLow=R_DrawColumnLow24;
R_DrawFuzzColumn=R_DrawFuzzColumn24;
R_DrawFuzzColumnLow=R_DrawFuzzColumnLow24;
R_DrawTranslatedColumn=R_DrawTranslatedColumn24;
R_DrawTranslatedColumnLow=R_DrawTranslatedColumnLow24;
R_DrawSpan=R_DrawSpan24;
R_DrawSpanLow=R_DrawSpanLow24;
AM_DrawFline=AM_drawFline24;
wipe_doMelt=wipe_doMelt24;
V_DrawPatch=V_DrawPatch24;
V_DrawPatchFlipped=V_DrawPatchFlipped24;
F_DrawPatchCol=F_DrawPatchCol24;
I_Zoom=I_Zoom24;
pixel_size=3;
break;
case 32:
R_DrawColumn=R_DrawColumn32;
R_DrawColumnLow=R_DrawColumnLow32;
R_DrawFuzzColumn=R_DrawFuzzColumn32;
R_DrawFuzzColumnLow=R_DrawFuzzColumnLow32;
R_DrawTranslatedColumn=R_DrawTranslatedColumn32;
R_DrawTranslatedColumnLow=R_DrawTranslatedColumnLow32;
R_DrawSpan=R_DrawSpan32;
R_DrawSpanLow=R_DrawSpanLow32;
AM_DrawFline=AM_drawFline32;
wipe_doMelt=wipe_doMelt32;
V_DrawPatch=V_DrawPatch32;
V_DrawPatchFlipped=V_DrawPatchFlipped32;
F_DrawPatchCol=F_DrawPatchCol32;
I_Zoom=I_Zoom32;
pixel_size=4;
fuzzmask=0x007F7F7F;
break;
default:
I_Error("Unknown pixel size for screen\n");
}
screensize=videowidth*videoheight*pixel_size;
if (videomode == G320x240x256 ||
videomode == G320x400x256 )
{
svgascreen[0]=Z_Malloc(screensize, PU_STATIC, NULL);
if (!svgascreen[0])
I_Error("Not enough memory for double buffer screens\n");
svgascreen[1]=Z_Malloc(screensize, PU_STATIC, NULL);
if (!svgascreen[1])
I_Error("Not enough memory for double buffer screens\n");
memset(svgascreen[0],0,screensize);
memset(svgascreen[1],0,screensize);
dblbuffer=true;
}
if (videomode==G320x200x256)
zoomscreen=false;
if (zoomscreen)
{
/* Double buffer : can zoom directly in buffer */
if (videomode!=G320x240x256 && videomode!=G320x400x256)
{
svgazoomscreen=Z_Malloc(screensize, PU_STATIC, NULL);
if (!svgazoomscreen)
I_Error("Not enough memory for zoom screen\n");
}
I_ZoomInit(videowidth,videoheight);
}
/* Set destination position */
dstpos_x=0;
dstpos_y=0;
if (!zoomscreen)
{
dstpos_x=(videowidth-SCREENWIDTH)>>1;
dstpos_y=(videoheight-SCREENHEIGHT)>>1;
}
/* Set video mode */
if (vga_setmode (videomode) < 0)
I_Error ( "Unable to switch to requested screen mode\n");
gl_setcontextvga(videomode);
keyboard_init();
if (dblbuffer)
vga_setdisplaystart(1);
}
void I_VidInit_svgalib(void)
{
int countmode;
int i;
svgamode_t *curmode;
vga_modeinfo *curinfo;
/* Start svgalib */
vga_init();
/* Count available modes */
countmode=0;
for (i=1;i<vga_lastmodenumber();i++)
{
if (vga_hasmode(i))
countmode++;
}
if (!countmode)
I_Error("No available video modes\n");
svgamodelist=malloc(countmode*sizeof(svgamode_t));
/* Now read informations for each mode */
printf("Available Svgalib video modes:\n");
svganummodes=0;
for (i=1;i<vga_lastmodenumber();i++)
{
if (!vga_hasmode(i))
continue;
curmode=&svgamodelist[svganummodes];
curmode->number = i;
curinfo = vga_getmodeinfo(i);
if (curinfo->colors < (1<<8))
continue;
if (i==G360x480x256)
continue;
curmode->depth=0;
switch (curinfo->colors)
{
case 1<<8:
curmode->depth=8;
break;
case 1<<15:
curmode->depth=15;
break;
case 1<<16:
curmode->depth=16;
break;
case 1<<24:
if (curinfo->bytesperpixel == 3)
curmode->depth=24;
else
curmode->depth=32;
break;
}
printf("%d: %dx%d %d bits",svganummodes,curinfo->width,curinfo->height,curmode->depth);
if (i == G320x240x256 || i == G320x400x256 || i == G360x480x256)
printf(",Mode X");
printf("\n");
svganummodes++;
}
printf("\n"); /* end of list */
}