ref: cb4c334c162601fa2e2675e293e2e4c7a6ae57e4
parent: e2e44080a665c68dffdf1863fd1902be395adb10
author: Simon Howard <fraggle@gmail.com>
date: Sat Sep 20 15:46:11 EDT 2008
Add I_VideoBuffer variable for pointer to screen buffer used by i_video.c code. Make V_CopyRect always blit to the screen. Subversion-branch: /branches/raven-branch Subversion-revision: 1245
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -416,6 +416,7 @@
I_SetGrabMouseCallback(D_GrabMouseCallback);
I_SetWindowTitle(gamedescription);
+ V_RestoreBuffer();
R_ExecuteSetViewSize();
D_StartGameLoop();
--- a/src/doom/st_lib.c
+++ b/src/doom/st_lib.c
@@ -123,7 +123,7 @@
if (n->y - ST_Y < 0)
I_Error("drawNum: n->y - ST_Y < 0");
- V_CopyRect(x, n->y - ST_Y, BG, w*numdigits, h, x, n->y, FG);
+ V_CopyRect(x, n->y - ST_Y, screens[BG], w*numdigits, h, x, n->y);
// if non-number, do not draw it
if (num == 1994)
@@ -233,7 +233,7 @@
if (y - ST_Y < 0)
I_Error("updateMultIcon: y - ST_Y < 0");
- V_CopyRect(x, y-ST_Y, BG, w, h, x, y, FG);
+ V_CopyRect(x, y-ST_Y, screens[BG], w, h, x, y);
}
V_DrawPatch(mi->x, mi->y, FG, mi->p[*mi->inum]);
mi->oldinum = *mi->inum;
@@ -285,7 +285,7 @@
if (*bi->val)
V_DrawPatch(bi->x, bi->y, FG, bi->p);
else
- V_CopyRect(x, y-ST_Y, BG, w, h, x, y, FG);
+ V_CopyRect(x, y-ST_Y, screens[BG], w, h, x, y);
bi->oldval = *bi->val;
}
--- a/src/doom/st_stuff.c
+++ b/src/doom/st_stuff.c
@@ -438,7 +438,7 @@
if (netgame)
V_DrawPatch(ST_FX, 0, BG, faceback);
- V_CopyRect(ST_X, 0, BG, ST_WIDTH, ST_HEIGHT, ST_X, ST_Y, FG);
+ V_CopyRect(ST_X, 0, screens[BG], ST_WIDTH, ST_HEIGHT, ST_X, ST_Y);
}
}
--- a/src/i_video.c
+++ b/src/i_video.c
@@ -101,7 +101,7 @@
static boolean nomouse = false;
int usemouse = 1;
-// if true, screens[0] is screen->pixel
+// if true, I_VideoBuffer is screen->pixels
static boolean native_surface;
@@ -132,6 +132,10 @@
static int grabmouse = true;
+// The screen buffer; this is modified to draw things to the screen
+
+byte *I_VideoBuffer = NULL;
+
// If true, game is running as a screensaver
boolean screensaver_mode = false;
@@ -304,9 +308,9 @@
for (y=0; y<disk_image_h; ++y)
{
memcpy(disk_image + disk_image_w * y,
- screens[0] + SCREENWIDTH * y,
+ I_VideoBuffer + SCREENWIDTH * y,
disk_image_w);
- memset(screens[0] + SCREENWIDTH * y, 0, disk_image_w);
+ memset(I_VideoBuffer + SCREENWIDTH * y, 0, disk_image_w);
}
W_ReleaseLumpName(disk_name);
@@ -689,7 +693,7 @@
if (SDL_LockSurface(screen) >= 0)
{
- I_InitScale(screens[0],
+ I_InitScale(I_VideoBuffer,
(byte *) screen->pixels + (y_offset * screen->pitch)
+ x_offset,
screen->pitch);
@@ -738,7 +742,7 @@
for (y=0; y<disk_image_h; ++y)
{
byte *screenloc =
- screens[0]
+ I_VideoBuffer
+ (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH
+ (SCREENWIDTH - 1 - disk_image_w);
@@ -764,7 +768,7 @@
for (y=0; y<disk_image_h; ++y)
{
byte *screenloc =
- screens[0]
+ I_VideoBuffer
+ (SCREENHEIGHT - 1 - disk_image_h + y) * SCREENWIDTH
+ (SCREENWIDTH - 1 - disk_image_w);
@@ -810,9 +814,9 @@
if (tics > 20) tics = 20;
for (i=0 ; i<tics*2 ; i+=4)
- screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff;
+ I_VideoBuffer[ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0xff;
for ( ; i<20*4 ; i+=4)
- screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0;
+ I_VideoBuffer[ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0;
}
// draw to screen
@@ -839,7 +843,7 @@
//
void I_ReadScreen (byte* scr)
{
- memcpy (scr, screens[0], SCREENWIDTH*SCREENHEIGHT);
+ memcpy(scr, I_VideoBuffer, SCREENWIDTH*SCREENHEIGHT);
}
@@ -1603,16 +1607,18 @@
if (native_surface)
{
- screens[0] = (unsigned char *) screen->pixels;
+ I_VideoBuffer = (unsigned char *) screen->pixels;
- screens[0] += (screen->h - SCREENHEIGHT) / 2;
+ I_VideoBuffer += (screen->h - SCREENHEIGHT) / 2;
}
else
{
- screens[0] = (unsigned char *) Z_Malloc (SCREENWIDTH * SCREENHEIGHT,
- PU_STATIC, NULL);
+ I_VideoBuffer = (unsigned char *) Z_Malloc (SCREENWIDTH * SCREENHEIGHT,
+ PU_STATIC, NULL);
}
+ V_RestoreBuffer();
+
// "Loading from disk" icon
LoadDiskImage();
@@ -1619,7 +1625,7 @@
// Clear the screen to black.
- memset(screens[0], 0, SCREENWIDTH * SCREENHEIGHT);
+ memset(I_VideoBuffer, 0, SCREENWIDTH * SCREENHEIGHT);
// We need SDL to give us translated versions of keys as well
--- a/src/i_video.h
+++ b/src/i_video.h
@@ -109,6 +109,7 @@
extern int vanilla_keyboard_mapping;
extern boolean screensaver_mode;
extern int usegamma;
+extern byte *I_VideoBuffer;
#endif
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -146,7 +146,7 @@
int height )
{
M_AddToBox (dirtybox, x, y);
- M_AddToBox (dirtybox, x+width-1, y+height-1);
+ M_AddToBox (dirtybox, x + width-1, y + height-1);
}
@@ -153,44 +153,37 @@
//
// V_CopyRect
//
-void
-V_CopyRect
-( int srcx,
- int srcy,
- int srcscrn,
- int width,
- int height,
- int destx,
- int desty,
- int destscrn )
+void V_CopyRect(int srcx, int srcy, byte *source,
+ int width, int height,
+ int destx, int desty)
{
- byte* src;
- byte* dest;
-
+ byte *src;
+ byte *dest;
+
#ifdef RANGECHECK
- if (srcx<0
- ||srcx+width >SCREENWIDTH
- || srcy<0
- || srcy+height>SCREENHEIGHT
- ||destx<0||destx+width >SCREENWIDTH
- || desty<0
- || desty+height>SCREENHEIGHT
- || (unsigned)srcscrn>4
- || (unsigned)destscrn>4)
+ if (srcx < 0
+ || srcx + width > SCREENWIDTH
+ || srcy < 0
+ || srcy + height > SCREENHEIGHT
+ || destx < 0
+ || destx + width > SCREENWIDTH
+ || desty < 0
+ || desty + height > SCREENHEIGHT)
{
- I_Error ("Bad V_CopyRect");
+ I_Error ("Bad V_CopyRect");
}
#endif
- V_MarkRect (destx, desty, width, height);
-
- src = screens[srcscrn]+SCREENWIDTH*srcy+srcx;
- dest = screens[destscrn]+SCREENWIDTH*desty+destx;
+ V_MarkRect(destx, desty, width, height);
+
+ src = source + SCREENWIDTH * srcy + srcx;
+ dest = I_VideoBuffer + SCREENWIDTH * desty + destx;
+
for ( ; height>0 ; height--)
{
- memcpy (dest, src, width);
- src += SCREENWIDTH;
- dest += SCREENWIDTH;
+ memcpy(dest, src, width);
+ src += SCREENWIDTH;
+ dest += SCREENWIDTH;
}
}
@@ -431,62 +424,29 @@
}
-
//
-// V_GetBlock
-// Gets a linear block of pixels from the view buffer.
-//
-void
-V_GetBlock
-( int x,
- int y,
- int scrn,
- int width,
- int height,
- byte* dest )
-{
- byte* src;
-
-#ifdef RANGECHECK
- if (x<0
- ||x+width >SCREENWIDTH
- || y<0
- || y+height>SCREENHEIGHT
- || (unsigned)scrn>4 )
- {
- I_Error ("Bad V_DrawBlock");
- }
-#endif
-
- src = screens[scrn] + y*SCREENWIDTH+x;
-
- while (height--)
- {
- memcpy (dest, src, width);
- src += SCREENWIDTH;
- dest += width;
- }
-}
-
-
-
-
-//
// V_Init
//
void V_Init (void)
{
- int i;
- byte* base;
+ int i;
+ byte *base;
// stick these in low dos memory on PCs
- base = Z_Malloc(SCREENWIDTH * SCREENHEIGHT * 4, PU_STATIC, NULL);
+ base = Z_Malloc(SCREENWIDTH * SCREENHEIGHT * 3, PU_STATIC, NULL);
for (i=0 ; i<4 ; i++)
{
- screens[i] = base + i*SCREENWIDTH*SCREENHEIGHT;
+ screens[i + 1] = base + i*SCREENWIDTH*SCREENHEIGHT;
}
+}
+
+// Restore screen buffer to the i_video screen buffer.
+
+void V_RestoreBuffer(void)
+{
+ screens[0] = I_VideoBuffer;
}
//
--- a/src/v_video.h
+++ b/src/v_video.h
@@ -54,17 +54,11 @@
// Allocates buffer screens, call before R_Init.
void V_Init (void);
+// Draw a block from the specified source screen to the screen.
-void
-V_CopyRect
-( int srcx,
- int srcy,
- int srcscrn,
- int width,
- int height,
- int destx,
- int desty,
- int destscrn );
+void V_CopyRect(int srcx, int srcy, byte *source,
+ int width, int height,
+ int destx, int desty);
void
V_DrawPatch
@@ -110,5 +104,7 @@
int height );
void V_ScreenShot(void);
+
+void V_RestoreBuffer(void);
#endif