home *** CD-ROM | disk | FTP | other *** search
- /*
- * 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 */
- }
-