1 //**************************************************************************
5 //**************************************************************************
14 #include "p_local.h" // for P_AproxDistance
22 int DisplayTicker = 0;
27 void I_StartupNet (void);
28 void I_ShutdownNet (void);
29 void I_ReadExternDriver(void);
30 void GrabScreen (void);
32 extern int usemouse, usejoystick;
34 extern void **lumpcache;
37 externdata_t *i_ExternData;
38 boolean useexterndriver;
40 SDL_Surface* sdl_screen;
44 //===============================
49 boolean novideo; // if true, stay in text mode for debugging
59 ============================================================================
63 ============================================================================
66 //--------------------------------------------------------------------------
70 //--------------------------------------------------------------------------
72 void I_WaitVBL(int vbls)
80 SDL_Delay( 16667/1000 );
84 //--------------------------------------------------------------------------
88 // Palette source must use 8 bit RGB elements.
90 //--------------------------------------------------------------------------
92 void I_SetPalette(byte *palette)
96 SDL_Color cmap[ 256 ];
106 for( ; c != cend; c++ )
108 //_outbyte(PEL_DATA, (gammatable[usegamma][*palette++])>>2);
110 c->r = gammatable[usegamma][*palette++];
111 c->g = gammatable[usegamma][*palette++];
112 c->b = gammatable[usegamma][*palette++];
114 SDL_SetColors( sdl_screen, cmap, 0, 256 );
118 ============================================================================
122 ============================================================================
125 byte *pcscreen, *destscreen, *destview;
136 extern int screenblocks;
146 // blit screen to video
150 if(screenblocks > 9 || UpdateState&(I_FULLSCRN|I_MESSAGES))
152 dest = (byte *)screen;
156 dest = (byte *)pcscreen;
158 tics = ticcount-lasttic;
164 for(i = 0; i < tics; i++)
169 for(i = tics; i < 20; i++)
176 //memset(pcscreen, 255, SCREENHEIGHT*SCREENWIDTH);
178 if(UpdateState == I_NOUPDATE)
182 if(UpdateState&I_FULLSCRN)
184 memcpy(pcscreen, screen, SCREENWIDTH*SCREENHEIGHT);
185 UpdateState = I_NOUPDATE; // clear out all draw types
187 SDL_UpdateRect( sdl_screen, 0, 0, SCREENWIDTH, SCREENHEIGHT );
189 if(UpdateState&I_FULLVIEW)
191 if(UpdateState&I_MESSAGES && screenblocks > 7)
194 (viewwindowy+viewheight)*SCREENWIDTH; i += SCREENWIDTH)
196 memcpy(pcscreen+i, screen+i, SCREENWIDTH);
198 UpdateState &= ~(I_FULLVIEW|I_MESSAGES);
200 SDL_UpdateRect( sdl_screen, 0, 0, SCREENWIDTH,
201 viewwindowy+viewheight );
205 for(i = viewwindowy*SCREENWIDTH+viewwindowx; i <
206 (viewwindowy+viewheight)*SCREENWIDTH; i += SCREENWIDTH)
208 memcpy(pcscreen+i, screen+i, viewwidth);
210 UpdateState &= ~I_FULLVIEW;
212 SDL_UpdateRect( sdl_screen, viewwindowx, viewwindowy, viewwidth,
216 if(UpdateState&I_STATBAR)
218 memcpy(pcscreen+SCREENWIDTH*(SCREENHEIGHT-SBARHEIGHT),
219 screen+SCREENWIDTH*(SCREENHEIGHT-SBARHEIGHT),
220 SCREENWIDTH*SBARHEIGHT);
221 UpdateState &= ~I_STATBAR;
223 SDL_UpdateRect( sdl_screen, 0, SCREENHEIGHT-SBARHEIGHT,
224 SCREENWIDTH, SBARHEIGHT );
226 if(UpdateState&I_MESSAGES)
228 memcpy(pcscreen, screen, SCREENWIDTH*28);
229 UpdateState &= ~I_MESSAGES;
231 SDL_UpdateRect( sdl_screen, 0, 0, SCREENWIDTH, 28 );
235 //--------------------------------------------------------------------------
237 // PROC I_InitGraphics
239 //--------------------------------------------------------------------------
241 void I_InitGraphics(void)
250 // SDL_DOUBLEBUF does not work in full screen mode. Does not seem to
251 // be necessary anyway.
253 sdl_screen = SDL_SetVideoMode(SCREENWIDTH, SCREENHEIGHT, 8, SDL_SWSURFACE);
255 if( sdl_screen == NULL )
257 fprintf( stderr, "Couldn't set video mode %dx%d: %s\n",
258 SCREENWIDTH, SCREENHEIGHT, SDL_GetError() );
262 // Only grab if we want to
263 if (!M_CheckParm ("--nograb") && !M_CheckParm ("-g")) {
264 SDL_WM_GrabInput (SDL_GRAB_ON);
268 snprintf (text, 20, "HHexen v%s", HHEXEN_VERSION);
269 SDL_WM_SetCaption( text, "HHEXEN" );
272 pcscreen = destscreen = sdl_screen->pixels;
274 I_SetPalette( W_CacheLumpName("PLAYPAL", PU_CACHE) );
277 //--------------------------------------------------------------------------
279 // PROC I_ShutdownGraphics
281 //--------------------------------------------------------------------------
283 void I_ShutdownGraphics(void)
288 //--------------------------------------------------------------------------
292 // Reads the screen currently displayed into a linear buffer.
294 //--------------------------------------------------------------------------
297 void I_ReadScreen(byte *scr)
299 memcpy(scr, screen, SCREENWIDTH*SCREENHEIGHT);
303 //===========================================================================
307 // Translates the key
310 int xlatekey(SDL_keysym *key)
317 case SDLK_LEFT: rc = KEY_LEFTARROW; break;
318 case SDLK_RIGHT: rc = KEY_RIGHTARROW; break;
319 case SDLK_DOWN: rc = KEY_DOWNARROW; break;
320 case SDLK_UP: rc = KEY_UPARROW; break;
321 case SDLK_ESCAPE: rc = KEY_ESCAPE; break;
324 case SDLK_RETURN: rc = KEY_ENTER; break;
326 case SDLK_F1: rc = KEY_F1; break;
327 case SDLK_F2: rc = KEY_F2; break;
328 case SDLK_F3: rc = KEY_F3; break;
329 case SDLK_F4: rc = KEY_F4; break;
330 case SDLK_F5: rc = KEY_F5; break;
331 case SDLK_F6: rc = KEY_F6; break;
332 case SDLK_F7: rc = KEY_F7; break;
333 case SDLK_F8: rc = KEY_F8; break;
334 case SDLK_F9: rc = KEY_F9; break;
335 case SDLK_F10: rc = KEY_F10; break;
336 case SDLK_F11: rc = KEY_F11; break;
337 case SDLK_F12: rc = KEY_F12; break;
339 case SDLK_INSERT: rc = KEY_INS; break;
340 case SDLK_DELETE: rc = KEY_DEL; break;
341 case SDLK_PAGEUP: rc = KEY_PGUP; break;
342 case SDLK_PAGEDOWN: rc = KEY_PGDN; break;
343 case SDLK_HOME: rc = KEY_HOME; break;
344 case SDLK_END: rc = KEY_END; break;
346 case SDLK_BACKSPACE: rc = KEY_BACKSPACE; break;
348 case SDLK_PAUSE: rc = KEY_PAUSE; break;
350 case SDLK_EQUALS: rc = KEY_EQUALS; break;
353 case SDLK_MINUS: rc = KEY_MINUS; break;
382 /* This processes SDL events */
383 void I_GetEvent(SDL_Event *Event)
392 mod = SDL_GetModState ();
393 if (mod & KMOD_RCTRL || mod & KMOD_LCTRL) {
394 if (Event->key.keysym.sym == 'g') {
395 if (SDL_WM_GrabInput (SDL_GRAB_QUERY) == SDL_GRAB_OFF)
396 SDL_WM_GrabInput (SDL_GRAB_ON);
398 SDL_WM_GrabInput (SDL_GRAB_OFF);
401 } else if (mod & KMOD_RALT || mod & KMOD_LALT) {
402 if (Event->key.keysym.sym == SDLK_RETURN) {
403 SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
407 event.type = ev_keydown;
408 event.data1 = xlatekey(&Event->key.keysym);
409 H2_PostEvent(&event);
413 event.type = ev_keyup;
414 event.data1 = xlatekey(&Event->key.keysym);
415 H2_PostEvent(&event);
418 case SDL_MOUSEBUTTONDOWN:
419 case SDL_MOUSEBUTTONUP:
420 buttonstate = SDL_GetMouseState(NULL, NULL);
421 event.type = ev_mouse;
423 | (buttonstate & SDL_BUTTON(1) ? 1 : 0)
424 | (buttonstate & SDL_BUTTON(2) ? 2 : 0)
425 | (buttonstate & SDL_BUTTON(3) ? 4 : 0);
426 event.data2 = event.data3 = 0;
427 H2_PostEvent(&event);
430 case SDL_MOUSEMOTION:
431 /* Ignore mouse warp events */
432 if ( (Event->motion.x != sdl_screen->w/2) ||
433 (Event->motion.y != sdl_screen->h/2) )
435 /* Warp the mouse back to the center */
436 event.type = ev_mouse;
438 | (Event->motion.state & SDL_BUTTON(1) ? 1 : 0)
439 | (Event->motion.state & SDL_BUTTON(2) ? 2 : 0)
440 | (Event->motion.state & SDL_BUTTON(3) ? 4 : 0);
441 event.data2 = Event->motion.xrel << 3;
442 event.data3 = -Event->motion.yrel << 3;
443 H2_PostEvent(&event);
456 void I_StartTic (void)
460 while ( SDL_PollEvent(&Event) )
466 ============================================================================
470 ============================================================================
482 int I_TimerISR (void)
489 ============================================================================
493 ============================================================================
501 ============================================================================
505 ============================================================================
518 void I_StartupMouse (void)
523 void GrabScreen (void)