diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/i_video.c | 211 |
2 files changed, 120 insertions, 92 deletions
@@ -3,6 +3,7 @@ Fixes for non-x86 architectures Fix uac_dead.wad (platform drop on e1m8 should occur when all bosses die, not just barons) + Fix "loading" icon to work for all graphics modes 0.0.3 (2005-09-17): Mouse acceleration code to emulate the behaviour of old diff --git a/src/i_video.c b/src/i_video.c index 8e337db6..80d023da 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: i_video.c 126 2005-09-24 22:04:03Z fraggle $ +// $Id: i_video.c 129 2005-09-24 23:41:07Z fraggle $ // // Copyright(C) 1993-1996 Id Software, Inc. // Copyright(C) 2005 Simon Howard @@ -22,6 +22,9 @@ // 02111-1307, USA. // // $Log$ +// Revision 1.29 2005/09/24 23:41:07 fraggle +// Fix "loading" icon for all video modes +// // Revision 1.28 2005/09/24 22:04:03 fraggle // Add application icon to running program // @@ -124,7 +127,7 @@ //----------------------------------------------------------------------------- static const char -rcsid[] = "$Id: i_video.c 126 2005-09-24 22:04:03Z fraggle $"; +rcsid[] = "$Id: i_video.c 129 2005-09-24 23:41:07Z fraggle $"; #include <SDL.h> #include <ctype.h> @@ -242,57 +245,6 @@ static void UpdateFocus(void) screenvisible = (state & SDL_APPACTIVE) != 0; } -void I_BeginRead(void) -{ - int y; - - if (disk_image == NULL) - return; - - // save background and copy the disk image in - - for (y=0; y<disk_image_h; ++y) - { - byte *screenloc = - screens[0] - + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH - + (SCREENWIDTH - 1 - disk_image_w); - - memcpy(saved_background + y * disk_image_w, - screenloc, - disk_image_w); - memcpy(screenloc, disk_image + y * disk_image_w, disk_image_w); - } - - SDL_UpdateRect(screen, - screen->w - disk_image_w, screen->h - disk_image_h, - disk_image_w, disk_image_h); -} - -void I_EndRead(void) -{ - int y; - - if (disk_image == NULL) - return; - - // save background and copy the disk image in - - for (y=0; y<disk_image_h; ++y) - { - byte *screenloc = - screens[0] - + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH - + (SCREENWIDTH - 1 - disk_image_w); - - memcpy(screenloc, saved_background + y * disk_image_w, disk_image_w); - } - - SDL_UpdateRect(screen, - screen->w - disk_image_w, screen->h - disk_image_h, - disk_image_w, disk_image_h); -} - static void LoadDiskImage(void) { patch_t *disk; @@ -548,39 +500,21 @@ void UpdateGrab(void) } -// -// I_FinishUpdate -// -void I_FinishUpdate (void) -{ - static int lasttic; - int tics; - int i; - // UNUSED static unsigned char *bigscreen=0; - - UpdateGrab(); - - // Don't update the screen if the window isn't visible. - // Not doing this breaks under Windows when we alt-tab away - // while fullscreen. +// Update a small portion of the screen - if (!(SDL_GetAppState() & SDL_APPACTIVE)) - return; +static void UpdateArea(int x1, int y1, int x2, int y2, boolean always_update) +{ + int w = x2 - x1; + int h = y2 - y1; - // draws little dots on the bottom of the screen - if (devparm) + if (palette_to_set && !always_update) { + // If we have a palette to set, the only way to update is to + // update the entire screen + // If we are only updating part of the screen (disk icon), we + // cannot update the screen - i = I_GetTime(); - tics = i - lasttic; - lasttic = i; - if (tics > 20) tics = 20; - - for (i=0 ; i<tics*2 ; i+=2) - screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff; - for ( ; i<20*2 ; i+=2) - screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0; - + return; } if (screenmultiply == 1 && !native_surface) @@ -591,13 +525,13 @@ void I_FinishUpdate (void) SDL_LockSurface(screen); - bufp = screens[0]; - screenp = (byte *) screen->pixels; pitch = screen->pitch; + bufp = screens[0] + y1 * SCREENWIDTH + x1; + screenp = (byte *) screen->pixels + y1 * pitch + x1; - for (y=0; y<SCREENHEIGHT; ++y) + for (y=y1; y<y2; ++y) { - memcpy(screenp, bufp, SCREENWIDTH); + memcpy(screenp, bufp, w); screenp += pitch; bufp += SCREENWIDTH; } @@ -615,19 +549,19 @@ void I_FinishUpdate (void) SDL_LockSurface(screen); - bufp = screens[0]; - screenp = (byte *) screen->pixels; - screenp2 = ((byte *) screen->pixels) + screen->pitch; pitch = screen->pitch * 2; + bufp = screens[0] + y1 * SCREENWIDTH + x1; + screenp = (byte *) screen->pixels + (y1 * pitch) + (x1 * 2); + screenp2 = screenp + screen->pitch; - for (y=0; y<SCREENHEIGHT; ++y) + for (y=y1; y<y2; ++y) { byte *sp, *sp2, *bp; sp = screenp; sp2 = screenp2; bp = bufp; - for (x=0; x<SCREENWIDTH; ++x) + for (x=x1; x<x2; ++x) { *sp2++ = *bp; *sp2++ = *bp; @@ -651,10 +585,103 @@ void I_FinishUpdate (void) } else { - SDL_Flip(screen); + SDL_UpdateRect(screen, + x1 * screenmultiply, + y1 * screenmultiply, + (x2-x1) * screenmultiply, + (y2-y1) * screenmultiply); } } +void I_BeginRead(void) +{ + int y; + + if (disk_image == NULL) + return; + + // save background and copy the disk image in + + for (y=0; y<disk_image_h; ++y) + { + byte *screenloc = + screens[0] + + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH + + (SCREENWIDTH - 1 - disk_image_w); + + memcpy(saved_background + y * disk_image_w, + screenloc, + disk_image_w); + memcpy(screenloc, disk_image + y * disk_image_w, disk_image_w); + } + + UpdateArea(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h, + SCREENWIDTH, SCREENHEIGHT, + false); +} + +void I_EndRead(void) +{ + int y; + + if (disk_image == NULL) + return; + + // save background and copy the disk image in + + for (y=0; y<disk_image_h; ++y) + { + byte *screenloc = + screens[0] + + (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH + + (SCREENWIDTH - 1 - disk_image_w); + + memcpy(screenloc, saved_background + y * disk_image_w, disk_image_w); + } + + UpdateArea(SCREENWIDTH - disk_image_w, SCREENHEIGHT - disk_image_h, + SCREENWIDTH, SCREENHEIGHT, + false); +} + +// +// I_FinishUpdate +// +void I_FinishUpdate (void) +{ + static int lasttic; + int tics; + int i; + // UNUSED static unsigned char *bigscreen=0; + + UpdateGrab(); + + // Don't update the screen if the window isn't visible. + // Not doing this breaks under Windows when we alt-tab away + // while fullscreen. + + if (!(SDL_GetAppState() & SDL_APPACTIVE)) + return; + + // draws little dots on the bottom of the screen + if (devparm) + { + + i = I_GetTime(); + tics = i - lasttic; + lasttic = i; + if (tics > 20) tics = 20; + + for (i=0 ; i<tics*2 ; i+=2) + screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff; + for ( ; i<20*2 ; i+=2) + screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0; + + } + + UpdateArea(0, 0, SCREENWIDTH, SCREENHEIGHT, true); +} + // // I_ReadScreen |