shithub: choc

Download patch

ref: 96cfb635bef9e156f1c304e7f68b4bf0eeead891
parent: cb4c334c162601fa2e2675e293e2e4c7a6ae57e4
author: Simon Howard <fraggle@gmail.com>
date: Sat Sep 20 15:54:44 EDT 2008

Add a dest_buffer pointer for the v_video code, and V_UseBuffer to allow
that to be temporarily changed. Make V_DrawBlock always draw to the
screen.

Subversion-branch: /branches/raven-branch
Subversion-revision: 1246

--- a/src/doom/f_wipe.c
+++ b/src/doom/f_wipe.c
@@ -256,7 +256,7 @@
 {
     wipe_scr_end = Z_Malloc(SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL);
     I_ReadScreen(wipe_scr_end);
-    V_DrawBlock(x, y, 0, width, height, wipe_scr_start); // restore start scr.
+    V_DrawBlock(x, y, width, height, wipe_scr_start); // restore start scr.
     return 0;
 }
 
--- a/src/i_video.c
+++ b/src/i_video.c
@@ -1617,6 +1617,7 @@
                                                     PU_STATIC, NULL);
     }
 
+    screens[0] = I_VideoBuffer;
     V_RestoreBuffer();
 
     // "Loading from disk" icon
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -42,6 +42,10 @@
 #include "w_wad.h"
 #include "z_zone.h"
 
+// The screen buffer that the v_video.c code draws to.
+
+static byte *dest_screen = NULL;
+
 // Each screen is [SCREENWIDTH*SCREENHEIGHT]; 
 byte*				screens[5];	
  
@@ -321,66 +325,10 @@
 // V_DrawPatchDirect
 // Draws directly to the screen on the pc. 
 //
-void
-V_DrawPatchDirect
-( int		x,
-  int		y,
-  int		scrn,
-  patch_t*	patch ) 
+
+void V_DrawPatchDirect(int x, int y, int scrn, patch_t *patch) 
 {
     V_DrawPatch (x,y,scrn, patch); 
-
-    /*
-    int		count;
-    int		col; 
-    column_t*	column; 
-    byte*	desttop;
-    byte*	dest;
-    byte*	source; 
-    int		w; 
-	 
-    y -= SHORT(patch->topoffset); 
-    x -= SHORT(patch->leftoffset); 
-
-#ifdef RANGECHECK 
-    if (x<0
-	||x+SHORT(patch->width) >SCREENWIDTH
-	|| y<0
-	|| y+SHORT(patch->height)>SCREENHEIGHT 
-	|| (unsigned)scrn>4)
-    {
-	I_Error ("Bad V_DrawPatchDirect");
-    }
-#endif 
- 
-    //	V_MarkRect (x, y, SHORT(patch->width), SHORT(patch->height)); 
-    desttop = destscreen + y*SCREENWIDTH/4 + (x>>2); 
-	 
-    w = SHORT(patch->width); 
-    for ( col = 0 ; col<w ; col++) 
-    { 
-	outp (SC_INDEX+1,1<<(x&3)); 
-	column = (column_t *)((byte *)patch + LONG(patch->columnofs[col])); 
- 
-	// step through the posts in a column 
-	 
-	while (column->topdelta != 0xff ) 
-	{ 
-	    source = (byte *)column + 3; 
-	    dest = desttop + column->topdelta*SCREENWIDTH/4; 
-	    count = column->length; 
- 
-	    while (count--) 
-	    { 
-		*dest = *source++; 
-		dest += SCREENWIDTH/4; 
-	    } 
-	    column = (column_t *)(  (byte *)column + column->length 
-				    + 4 ); 
-	} 
-	if ( ((++x)&3) == 0 ) 
-	    desttop++;	// go to next byte, not next plane 
-    }*/ 
 } 
  
 
@@ -389,23 +337,16 @@
 // V_DrawBlock
 // Draw a linear block of pixels into the view buffer.
 //
-void
-V_DrawBlock
-( int		x,
-  int		y,
-  int		scrn,
-  int		width,
-  int		height,
-  byte*		src ) 
+
+void V_DrawBlock(int x, int y, int width, int height, byte *src) 
 { 
-    byte*	dest; 
-	 
+    byte *dest; 
+ 
 #ifdef RANGECHECK 
-    if (x<0
-	||x+width >SCREENWIDTH
-	|| y<0
-	|| y+height>SCREENHEIGHT 
-	|| (unsigned)scrn>4 )
+    if (x < 0
+     || x + width >SCREENWIDTH
+     || y < 0
+     || y + height > SCREENHEIGHT)
     {
 	I_Error ("Bad V_DrawBlock");
     }
@@ -413,7 +354,7 @@
  
     V_MarkRect (x, y, width, height); 
  
-    dest = screens[scrn] + y*SCREENWIDTH+x; 
+    dest = dest_screen + y * SCREENWIDTH + x; 
 
     while (height--) 
     { 
@@ -442,11 +383,18 @@
     }
 }
 
+// Set the buffer that the code draws to.
+
+void V_UseBuffer(byte *buffer)
+{
+    dest_screen = buffer;
+}
+
 // Restore screen buffer to the i_video screen buffer.
 
 void V_RestoreBuffer(void)
 {
-    screens[0] = I_VideoBuffer;
+    dest_screen = I_VideoBuffer;
 }
 
 //
--- a/src/v_video.h
+++ b/src/v_video.h
@@ -76,15 +76,9 @@
 
 
 // Draw a linear block of pixels into the view buffer.
-void
-V_DrawBlock
-( int		x,
-  int		y,
-  int		scrn,
-  int		width,
-  int		height,
-  byte*		src );
 
+void V_DrawBlock(int x, int y, int width, int height, byte *src);
+
 // Reads a linear block of pixels into the view buffer.
 void
 V_GetBlock
@@ -105,6 +99,7 @@
 
 void V_ScreenShot(void);
 
+void V_UseBuffer(byte *buffer);
 void V_RestoreBuffer(void);
 
 #endif