📄 i_video.c
字号:
shmFinished = false;
do
{
I_GetEvent();
} while (!shmFinished);
}
else
{
// draw the image
XPutImage( X_display,
X_mainWindow,
X_gc,
image,
0, 0,
0, 0,
X_width, X_height );
// sync up with server
XSync(X_display, False);
}
*/
}
//
// I_ReadScreen
//
void I_ReadScreen (PBUFFER Dest, PBUFFER scr) // DQ
//void I_ReadScreen (byte* scr)
{
// DQ replaced this, since pitch may not be the same as width
int y;
DWORD * pdwSource, *pdwDest;
BYTE * scrBuffer, *DestBuffer; // DQ
long * scrYLookup, *DestYLookup; // DQ
//pdwSource = (DWORD *)scr;
//pdwDest = (DWORD *)Dest;
scrBuffer = scr->Buffer;
scrYLookup = scr->YLookup;
DestBuffer = Dest->Buffer;
DestYLookup = Dest->YLookup;
for (y = 0; y < SCREENHEIGHT; y++)
{
pdwSource = (DWORD *)(scrBuffer + scrYLookup[y]);
pdwDest = (DWORD *)(DestBuffer + DestYLookup[y]);
memcpy(pdwDest, pdwSource, SCREENWIDTH);
//pdwDest += BufferPitch / sizeof(DWORD);
//pdwSource += SCREENWIDTH / sizeof(DWORD);
}
// memcpy (scr, RenderBuffer/*DQ screens[0]*/, SCREENWIDTH*SCREENHEIGHT);
}
extern LPDIRECTDRAWPALETTE lpPalette;
//
// Palette stuff.
//
//
// I_SetPalette
//
void I_SetPalette(byte* palette)
{
PALETTEENTRY pe[256];
int i;
for (i = 0; i < 256; i++)
{
pe[i].peRed = gammatable[usegamma][*palette++];
pe[i].peGreen = gammatable[usegamma][*palette++];
pe[i].peBlue = gammatable[usegamma][*palette++];
}
if (lpPalette != 0)
lpPalette->lpVtbl->SetEntries(lpPalette, 0, 0, 256, pe);
}
/*
//
// This function is probably redundant,
// if XShmDetach works properly.
// ddt never detached the XShm memory,
// thus there might have been stale
// handles accumulating.
//
void grabsharedmemory(int size)
{
int key = ('d'<<24) | ('o'<<16) | ('o'<<8) | 'm';
struct shmid_ds shminfo;
int minsize = 320*200;
int id;
int rc;
// UNUSED int done=0;
int pollution=5;
// try to use what was here before
do
{
id = shmget((key_t) key, minsize, 0777); // just get the id
if (id != -1)
{
rc=shmctl(id, IPC_STAT, &shminfo); // get stats on it
if (!rc)
{
if (shminfo.shm_nattch)
{
fprintf(stderr, "User %d appears to be running "
"DOOM. Is that wise?\n", shminfo.shm_cpid);
key++;
}
else
{
if (getuid() == shminfo.shm_perm.cuid)
{
rc = shmctl(id, IPC_RMID, 0);
if (!rc)
fprintf(stderr,
"Was able to kill my old shared memory\n");
else
I_Error("Was NOT able to kill my old shared memory");
id = shmget((key_t)key, size, IPC_CREAT|0777);
if (id==-1)
I_Error("Could not get shared memory");
rc=shmctl(id, IPC_STAT, &shminfo);
break;
}
if (size >= shminfo.shm_segsz)
{
fprintf(stderr,
"will use %d's stale shared memory\n",
shminfo.shm_cpid);
break;
}
else
{
fprintf(stderr,
"warning: can't use stale "
"shared memory belonging to id %d, "
"key=0x%x\n",
shminfo.shm_cpid, key);
key++;
}
}
}
else
{
I_Error("could not get stats on key=%d", key);
}
}
else
{
id = shmget((key_t)key, size, IPC_CREAT|0777);
if (id==-1)
{
extern int errno;
fprintf(stderr, "errno=%d\n", errno);
I_Error("Could not get any shared memory");
}
break;
}
} while (--pollution);
if (!pollution)
{
I_Error("Sorry, system too polluted with stale "
"shared memory segments.\n");
}
X_shminfo.shmid = id;
// attach to the shared memory segment
image->data = X_shminfo.shmaddr = shmat(id, 0, 0);
fprintf(stderr, "shared memory id=%d, addr=0x%x\n", id,
(int) (image->data));
}
*/
void I_InitGraphics(void)
{
char* displayname;
// char* d;
int n;
int pnum;
int x=0;
int y=0;
// warning: char format, different type arg
char xsign=' ';
char ysign=' ';
// int oktodraw;
// unsigned long attribmask;
//XSetWindowAttributes attribs;
//XGCValues xgcvalues;
// int valuemask;
static int firsttime=1;
if (!firsttime)
return;
firsttime = 0;
//signal(SIGINT, (void (*)(int)) I_Quit);
if (M_CheckParm("-2"))
multiply = 2;
if (M_CheckParm("-3"))
multiply = 3;
if (M_CheckParm("-4"))
multiply = 4;
//X_width = SCREENWIDTH * multiply;
//X_height = SCREENHEIGHT * multiply;
// check for command-line display name
if ( (pnum=M_CheckParm("-disp")) ) // suggest parentheses around assignment
displayname = myargv[pnum+1];
else
displayname = 0;
// check if the user wants to grab the mouse (quite unnice)
grabMouse = !!M_CheckParm("-grabmouse");
// check for command-line geometry
if ( (pnum=M_CheckParm("-geom")) ) // suggest parentheses around assignment
{
// warning: char format, different type arg 3,5
n = sscanf(myargv[pnum+1], "%c%d%c%d", &xsign, &x, &ysign, &y);
if (n==2)
x = y = 0;
else if (n==6)
{
if (xsign == '-')
x = -x;
if (ysign == '-')
y = -y;
}
else
I_Error("bad -geom parameter");
}
/*
// open the display
X_display = XOpenDisplay(displayname);
if (!X_display)
{
if (displayname)
I_Error("Could not open display [%s]", displayname);
else
I_Error("Could not open display (DISPLAY=[%s])", getenv("DISPLAY"));
}
// use the default visual
// X_screen = DefaultScreen(X_display);
// if (!XMatchVisualInfo(X_display, X_screen, 8, PseudoColor, &X_visualinfo))
// I_Error("xdoom currently only supports 256-color PseudoColor screens");
// X_visual = X_visualinfo.visual;
// check for the MITSHM extension
// doShm = XShmQueryExtension(X_display);
// even if it's available, make sure it's a local connection
if (doShm)
{
if (!displayname) displayname = (char *) getenv("DISPLAY");
if (displayname)
{
d = displayname;
while (*d && (*d != ':')) d++;
if (*d) *d = 0;
if (!(!strcasecmp(displayname, "unix") || !*displayname)) doShm = false;
}
}
fprintf(stderr, "Using MITSHM extension\n");
// create the colormap
X_cmap = XCreateColormap(X_display, RootWindow(X_display,
X_screen), X_visual, AllocAll);
// setup attributes for main window
attribmask = CWEventMask | CWColormap | CWBorderPixel;
attribs.event_mask =
// KeyPressMask
// | KeyReleaseMask
| PointerMotionMask | ButtonPressMask | ButtonReleaseMask
// | ExposureMask;
// attribs.colormap = X_cmap;
// attribs.border_pixel = 0;
// create the main window
X_mainWindow = XCreateWindow( X_display,
RootWindow(X_display, X_screen),
x, y,
X_width, X_height,
0, // borderwidth
8, // depth
InputOutput,
X_visual,
attribmask,
&attribs );
XDefineCursor(X_display, X_mainWindow,
createnullcursor( X_display, X_mainWindow ) );
// create the GC
valuemask = GCGraphicsExposures;
xgcvalues.graphics_exposures = False;
X_gc = XCreateGC( X_display,
X_mainWindow,
valuemask,
&xgcvalues );
// map the window
XMapWindow(X_display, X_mainWindow);
// wait until it is OK to draw
oktodraw = 0;
while (!oktodraw)
{
// XNextEvent(X_display, &X_event);
// if (X_event.type == Expose
// && !X_event.xexpose.count)
{
oktodraw = 1;
}
}
// grabs the pointer so it is restricted to this window
if (grabMouse)
XGrabPointer(X_display, X_mainWindow, True,
ButtonPressMask|ButtonReleaseMask|PointerMotionMask,
GrabModeAsync, GrabModeAsync,
X_mainWindow, None, CurrentTime);
if (doShm)
{
X_shmeventtype = XShmGetEventBase(X_display) + ShmCompletion;
// create the image
image = XShmCreateImage( X_display,
X_visual,
8,
ZPixmap,
0,
&X_shminfo,
X_width,
X_height );
grabsharedmemory(image->bytes_per_line * image->height);
// UNUSED
// create the shared memory segment
// X_shminfo.shmid = shmget (IPC_PRIVATE,
// image->bytes_per_line * image->height, IPC_CREAT | 0777);
// if (X_shminfo.shmid < 0)
// {
// perror("");
// I_Error("shmget() failed in InitGraphics()");
// }
// fprintf(stderr, "shared memory id=%d\n", X_shminfo.shmid);
// attach to the shared memory segment
// image->data = X_shminfo.shmaddr = shmat(X_shminfo.shmid, 0, 0);
if (!image->data)
{
perror("");
I_Error("shmat() failed in InitGraphics()");
}
// get the X server to attach to it
if (!XShmAttach(X_display, &X_shminfo))
I_Error("XShmAttach() failed in InitGraphics()");
}
else
{
image = XCreateImage( X_display,
X_visual,
8,
ZPixmap,
0,
(char*)malloc(X_width * X_height),
X_width, X_height,
8,
X_width );
}
if (multiply == 1)
screens[0] = (unsigned char *) (image->data);
else
screens[0] = (unsigned char *) malloc (SCREENWIDTH * SCREENHEIGHT);
*/
}
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;
printf ("building exptable2...\n");
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;
}
}
printf ("done.\n");
}
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--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -