shithub: choc

Download patch

ref: 7b151f074e26aa398b3cbd4811e4e6edd8a7918c
parent: f2ed07417429e1e813761fd005f39af737779fbe
author: Simon Howard <fraggle@gmail.com>
date: Sun Sep 4 19:18:30 EDT 2005

Remove dead code. Cope with the screen not having width == pitch. Lock
the SDL screen surface properly. Rewrite 2x scaling code.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 72

--- a/src/i_video.c
+++ b/src/i_video.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: i_video.c 64 2005-09-01 00:01:36Z fraggle $
+// $Id: i_video.c 72 2005-09-04 23:18:30Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,10 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.22  2005/09/04 23:18:30  fraggle
+// Remove dead code.  Cope with the screen not having width == pitch.  Lock
+// the SDL screen surface properly. Rewrite 2x scaling code.
+//
 // Revision 1.21  2005/09/01 00:01:36  fraggle
 // -nograbmouse option
 //
@@ -97,7 +101,7 @@
 //-----------------------------------------------------------------------------
 
 static const char
-rcsid[] = "$Id: i_video.c 64 2005-09-01 00:01:36Z fraggle $";
+rcsid[] = "$Id: i_video.c 72 2005-09-04 23:18:30Z fraggle $";
 
 #include <ctype.h>
 #include <SDL.h>
@@ -122,6 +126,12 @@
 static SDL_Color palette[256];
 static boolean palette_to_set;
 
+static int windowwidth, windowheight;
+
+// if true, screens[0] is screen->pixel
+
+static boolean native_surface;
+
 boolean fullscreen = 1;
 boolean grabmouse = 1;
 
@@ -395,71 +405,6 @@
                 event.data2 = event.data3 = 0;
                 D_PostEvent(&event);
                 break;
-
-#if 0
-          case ButtonPress:
-            event.type = ev_mouse;
-            event.data1 =
-                (X_event.xbutton.state & Button1Mask)
-                | (X_event.xbutton.state & Button2Mask ? 2 : 0)
-                | (X_event.xbutton.state & Button3Mask ? 4 : 0)
-                | (X_event.xbutton.button == Button1)
-                | (X_event.xbutton.button == Button2 ? 2 : 0)
-                | (X_event.xbutton.button == Button3 ? 4 : 0);
-            event.data2 = event.data3 = 0;
-            D_PostEvent(&event);
-            // fprintf(stderr, "b");
-            break;
-          case ButtonRelease:
-            event.type = ev_mouse;
-            event.data1 =
-                (X_event.xbutton.state & Button1Mask)
-                | (X_event.xbutton.state & Button2Mask ? 2 : 0)
-                | (X_event.xbutton.state & Button3Mask ? 4 : 0);
-            // suggest parentheses around arithmetic in operand of |
-            event.data1 =
-                event.data1
-                ^ (X_event.xbutton.button == Button1 ? 1 : 0)
-                ^ (X_event.xbutton.button == Button2 ? 2 : 0)
-                ^ (X_event.xbutton.button == Button3 ? 4 : 0);
-            event.data2 = event.data3 = 0;
-            D_PostEvent(&event);
-            // fprintf(stderr, "bu");
-            break;
-          case MotionNotify:
-            event.type = ev_mouse;
-            event.data1 =
-                (X_event.xmotion.state & Button1Mask)
-                | (X_event.xmotion.state & Button2Mask ? 2 : 0)
-                | (X_event.xmotion.state & Button3Mask ? 4 : 0);
-            event.data2 = (X_event.xmotion.x - lastmousex) << 2;
-            event.data3 = (lastmousey - X_event.xmotion.y) << 2;
-
-            if (event.data2 || event.data3)
-            {
-                lastmousex = X_event.xmotion.x;
-                lastmousey = X_event.xmotion.y;
-                if (X_event.xmotion.x != X_width/2 &&
-                    X_event.xmotion.y != X_height/2)
-                {
-                    D_PostEvent(&event);
-                    // fprintf(stderr, "m");
-                    mousemoved = false;
-                } else
-                {
-                    mousemoved = true;
-                }
-            }
-            break;
-            
-          case Expose:
-          case ConfigureNotify:
-            break;
-            
-          default:
-            if (doShm && X_event.type == X_shmeventtype) shmFinished = true;
-            break;
-#endif
         }
     }
 }
@@ -469,34 +414,6 @@
 void I_StartTic (void)
 {
     I_GetEvent();
-#if 0
-
-    if (!X_display)
-	return;
-
-    while (XPending(X_display))
-	I_GetEvent();
-
-    // Warp the pointer back to the middle of the window
-    //  or it will wander off - that is, the game will
-    //  loose input focus within X11.
-    if (grabMouse)
-    {
-	if (!--doPointerWarp)
-	{
-	    XWarpPointer( X_display,
-			  None,
-			  X_mainWindow,
-			  0, 0,
-			  0, 0,
-			  X_width/2, X_height/2);
-
-	    doPointerWarp = POINTER_WARP_COUNTDOWN;
-	}
-    }
-
-    mousemoved = false;
-#endif
 }
 
 
@@ -558,120 +475,69 @@
 	    screens[0][ (SCREENHEIGHT-1)*SCREENWIDTH + i] = 0x0;
     
     }
-    // scales the screen size before blitting it
-    if (multiply == 2)
+
+    if (multiply == 1 && !native_surface)
     {
-	unsigned int *olineptrs[2];
-	unsigned int *ilineptr;
-	int x, y, i;
-	unsigned int twoopixels;
-	unsigned int twomoreopixels;
-	unsigned int fouripixels;
-        unsigned int X_width = screen->pitch;
-        Uint8 *screen_pixels = (Uint8 *) screen->pixels;
+        byte *bufp, *screenp;
+        int y;
+        int pitch;
 
         SDL_LockSurface(screen);
 
-	ilineptr = (unsigned int *) (screens[0]);
-	for (i=0 ; i<2 ; i++)
-	    olineptrs[i] = (unsigned int *) &screen_pixels[i*X_width];
+        bufp = screens[0];
+        screenp = (byte *) screen->pixels;
+        pitch = screen->pitch;
 
-	y = SCREENHEIGHT;
-	while (y--)
-	{
-	    x = SCREENWIDTH;
-	    do
-	    {
-		fouripixels = *ilineptr++;
-		twoopixels =	(fouripixels & 0xff000000)
-		    |	((fouripixels>>8) & 0xffff00)
-		    |	((fouripixels>>16) & 0xff);
-		twomoreopixels =	((fouripixels<<16) & 0xff000000)
-		    |	((fouripixels<<8) & 0xffff00)
-		    |	(fouripixels & 0xff);
-#ifdef __BIG_ENDIAN__
-		*olineptrs[0]++ = twoopixels;
-		*olineptrs[1]++ = twoopixels;
-		*olineptrs[0]++ = twomoreopixels;
-		*olineptrs[1]++ = twomoreopixels;
-#else
-		*olineptrs[0]++ = twomoreopixels;
-		*olineptrs[1]++ = twomoreopixels;
-		*olineptrs[0]++ = twoopixels;
-		*olineptrs[1]++ = twoopixels;
-#endif
-	    } while (x-=4);
-	    olineptrs[0] += X_width/4;
-	    olineptrs[1] += X_width/4;
-	}
+        for (y=0; y<SCREENHEIGHT; ++y)
+        {
+            memcpy(screenp, bufp, SCREENWIDTH);
+            screenp += pitch;
+            bufp += SCREENWIDTH;
+        }
 
         SDL_UnlockSurface(screen);
     }
-#if 0
-    else if (multiply == 3)
+
+    // scales the screen size before blitting it
+
+    if (multiply == 2)
     {
-	unsigned int *olineptrs[3];
-	unsigned int *ilineptr;
-	int x, y, i;
-	unsigned int fouropixels[3];
-	unsigned int fouripixels;
+        byte *bufp, *screenp, *screenp2;
+        int x, y;
+        int pitch;
 
-	ilineptr = (unsigned int *) (screens[0]);
-	for (i=0 ; i<3 ; i++)
-	    olineptrs[i] = (unsigned int *) &image->data[i*X_width];
+        SDL_LockSurface(screen);
 
-	y = SCREENHEIGHT;
-	while (y--)
-	{
-	    x = SCREENWIDTH;
-	    do
-	    {
-		fouripixels = *ilineptr++;
-		fouropixels[0] = (fouripixels & 0xff000000)
-		    |	((fouripixels>>8) & 0xff0000)
-		    |	((fouripixels>>16) & 0xffff);
-		fouropixels[1] = ((fouripixels<<8) & 0xff000000)
-		    |	(fouripixels & 0xffff00)
-		    |	((fouripixels>>8) & 0xff);
-		fouropixels[2] = ((fouripixels<<16) & 0xffff0000)
-		    |	((fouripixels<<8) & 0xff00)
-		    |	(fouripixels & 0xff);
-#ifdef __BIG_ENDIAN__
-		*olineptrs[0]++ = fouropixels[0];
-		*olineptrs[1]++ = fouropixels[0];
-		*olineptrs[2]++ = fouropixels[0];
-		*olineptrs[0]++ = fouropixels[1];
-		*olineptrs[1]++ = fouropixels[1];
-		*olineptrs[2]++ = fouropixels[1];
-		*olineptrs[0]++ = fouropixels[2];
-		*olineptrs[1]++ = fouropixels[2];
-		*olineptrs[2]++ = fouropixels[2];
-#else
-		*olineptrs[0]++ = fouropixels[2];
-		*olineptrs[1]++ = fouropixels[2];
-		*olineptrs[2]++ = fouropixels[2];
-		*olineptrs[0]++ = fouropixels[1];
-		*olineptrs[1]++ = fouropixels[1];
-		*olineptrs[2]++ = fouropixels[1];
-		*olineptrs[0]++ = fouropixels[0];
-		*olineptrs[1]++ = fouropixels[0];
-		*olineptrs[2]++ = fouropixels[0];
-#endif
-	    } while (x-=4);
-	    olineptrs[0] += 2*X_width/4;
-	    olineptrs[1] += 2*X_width/4;
-	    olineptrs[2] += 2*X_width/4;
-	}
+        bufp = screens[0];
+        screenp = (byte *) screen->pixels;
+        screenp2 = ((byte *) screen->pixels) + screen->pitch;
+        pitch = screen->pitch * 2;
 
+        for (y=0; y<SCREENHEIGHT; ++y)
+        {
+            byte *sp, *sp2, *bp;
+            sp = screenp;
+            sp2 = screenp2;
+            bp = bufp;
+
+            for (x=0; x<SCREENWIDTH; ++x)
+            {
+                *sp2++ = *bp;
+                *sp2++ = *bp;
+                *sp++ = *bp;
+                *sp++ = *bp++;
+            }
+            screenp += pitch;
+            screenp2 += pitch;
+            bufp += SCREENWIDTH;
+        }
+
+        SDL_UnlockSurface(screen);
     }
-    else if (multiply == 4)
-    {
-	// Broken. Gotta fix this some day.
-	void Expand4(unsigned *, double *);
-  	Expand4 ((unsigned *)(screens[0]), (double *) (image->data));
-    }
-#endif
 
+    if (native_surface)
+        SDL_UnlockSurface(screen);
+
     // draw to screen
     
     if (palette_to_set)
@@ -683,6 +549,9 @@
     {
         SDL_Flip(screen);
     }
+
+    if (native_surface)
+        SDL_LockSurface(screen);
 }
 
 
@@ -760,8 +629,11 @@
         multiply = 2;
     }
 
-    screen = SDL_SetVideoMode(SCREENWIDTH*multiply, SCREENHEIGHT*multiply, 8, flags);
+    windowwidth = SCREENWIDTH * multiply;
+    windowheight = SCREENHEIGHT * multiply;
 
+    screen = SDL_SetVideoMode(windowwidth, windowheight, 8, flags);
+
     if (screen == NULL)
     {
         I_Error("Error setting video mode: %s\n", SDL_GetError());
@@ -769,11 +641,21 @@
 
     SetCaption();
 
-    if (multiply == 1)
+    // Check if we have a native surface we can use
+
+    native_surface = multiply == 1 && screen->pitch == SCREENWIDTH;
+
+    // If not, allocate a buffer and copy from that buffer to the 
+    // screen when we do an update
+
+    if (native_surface)
 	screens[0] = (unsigned char *) (screen->pixels);
     else
 	screens[0] = (unsigned char *) Z_Malloc (SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL);
 
+    if (native_surface)
+        SDL_LockSurface(screen);
+
     LoadDiskImage();
 
     SDL_EnableUNICODE(1);
@@ -786,135 +668,4 @@
   
     while (SDL_PollEvent(&dummy));
 }
-
-unsigned	exptable[256];
-
-void InitExpand (void)
-{
-    int		i;
-	
-    for (i=0 ; i<256 ; i++)
-	exptable[i] = i | (i<<8) | (i<<16) | (i<<24);
-}
-
-double exptable2[256*256];
-
-void InitExpand2 (void)
-{
-    int		i;
-    int		j;
-    // UNUSED unsigned	iexp, jexp;
-    double*	exp;
-    union
-    {
-	double 		d;
-	unsigned	u[2];
-    } pixel;
-	
-    exp = exptable2;
-    for (i=0 ; i<256 ; i++)
-    {
-	pixel.u[0] = i | (i<<8) | (i<<16) | (i<<24);
-	for (j=0 ; j<256 ; j++)
-	{
-	    pixel.u[1] = j | (j<<8) | (j<<16) | (j<<24);
-	    *exp++ = pixel.d;
-	}
-    }
-}
-
-int	inited;
-
-void
-Expand4
-( unsigned*	lineptr,
-  double*	xline )
-{
-    double	dpixel;
-    unsigned	x;
-    unsigned 	y;
-    unsigned	fourpixels;
-    unsigned	step;
-    double*	exp;
-	
-    exp = exptable2;
-    if (!inited)
-    {
-	inited = 1;
-	InitExpand2 ();
-    }
-		
-		
-    step = 3*SCREENWIDTH/2;
-	
-    y = SCREENHEIGHT-1;
-    do
-    {
-	x = SCREENWIDTH;
-
-	do
-	{
-	    fourpixels = lineptr[0];
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) );
-	    xline[0] = dpixel;
-	    xline[160] = dpixel;
-	    xline[320] = dpixel;
-	    xline[480] = dpixel;
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) );
-	    xline[1] = dpixel;
-	    xline[161] = dpixel;
-	    xline[321] = dpixel;
-	    xline[481] = dpixel;
-
-	    fourpixels = lineptr[1];
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) );
-	    xline[2] = dpixel;
-	    xline[162] = dpixel;
-	    xline[322] = dpixel;
-	    xline[482] = dpixel;
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) );
-	    xline[3] = dpixel;
-	    xline[163] = dpixel;
-	    xline[323] = dpixel;
-	    xline[483] = dpixel;
-
-	    fourpixels = lineptr[2];
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) );
-	    xline[4] = dpixel;
-	    xline[164] = dpixel;
-	    xline[324] = dpixel;
-	    xline[484] = dpixel;
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) );
-	    xline[5] = dpixel;
-	    xline[165] = dpixel;
-	    xline[325] = dpixel;
-	    xline[485] = dpixel;
-
-	    fourpixels = lineptr[3];
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff0000)>>13) );
-	    xline[6] = dpixel;
-	    xline[166] = dpixel;
-	    xline[326] = dpixel;
-	    xline[486] = dpixel;
-			
-	    dpixel = *(double *)( (int)exp + ( (fourpixels&0xffff)<<3 ) );
-	    xline[7] = dpixel;
-	    xline[167] = dpixel;
-	    xline[327] = dpixel;
-	    xline[487] = dpixel;
-
-	    lineptr+=4;
-	    xline+=8;
-	} while (x-=16);
-	xline += step;
-    } while (y--);
-}
-