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
This commit is contained in:
parent
f2ed074174
commit
7b151f074e
1 changed files with 79 additions and 328 deletions
407
src/i_video.c
407
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_Surface *screen;
|
|||
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 @@ void I_GetEvent(void)
|
|||
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_GetEvent(void)
|
|||
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,119 +475,68 @@ void I_FinishUpdate (void)
|
|||
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
|
||||
|
||||
|
|
@ -683,6 +549,9 @@ void I_FinishUpdate (void)
|
|||
{
|
||||
SDL_Flip(screen);
|
||||
}
|
||||
|
||||
if (native_surface)
|
||||
SDL_LockSurface(screen);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -760,7 +629,10 @@ void I_InitGraphics(void)
|
|||
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)
|
||||
{
|
||||
|
|
@ -769,11 +641,21 @@ void I_InitGraphics(void)
|
|||
|
||||
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);
|
||||
|
|
@ -787,134 +669,3 @@ void I_InitGraphics(void)
|
|||
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--);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue