Iskhodnyy_kod_Doom
.pdfint |
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
211
{
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;
212
// 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,
213
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, |
214
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++)
215
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) );
216
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--);
}
7.9i video.h
// Emacs style mode select -*- C++ -*-
217
//-----------------------------------------------------------------------------
//
//$Id:$
//Copyright (C) 1993-1996 by id Software, Inc.
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//DESCRIPTION:
//System specific interface stuff.
//-----------------------------------------------------------------------------
#ifndef __I_VIDEO__ #define __I_VIDEO__
#include "doomtype.h"
#ifdef __GNUG__ #pragma interface #endif
//Called by D_DoomMain,
//determines the hardware configuration
//and sets up the video mode
void I_InitGraphics (void);
void I_ShutdownGraphics(void);
// Takes full 8 bit values.
void I_SetPalette (byte* palette);
void I_UpdateNoBlit (void); void I_FinishUpdate (void);
// Wait for vertical retrace or pause a bit. void I_WaitVBL(int count);
void I_ReadScreen (byte* scr);
void I_BeginRead (void); void I_EndRead (void);
#endif //-----------------------------------------------------------------------------
//
// $Log:$
//
//-----------------------------------------------------------------------------
218
8 Miscellaneous
8.1 m argv.c
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------
//
//$Id:$
//Copyright (C) 1993-1996 by id Software, Inc.
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//$Log:$
//DESCRIPTION:
//-----------------------------------------------------------------------------
static const char |
|
|
rcsid[] = "$Id: m_argv.c,v |
1.1 1997/02/03 22:45:10 b1 Exp $"; |
|
#include <string.h> |
|
|
int |
myargc; |
|
char** |
myargv; |
//
//M_CheckParm
//Checks for the given parameter
//in the program’s command line arguments.
//Returns the argument number (1 to argc-1)
//or 0 if not present
int M_CheckParm (char *check)
{
int |
i; |
for (i = 1;i<myargc;i++)
{
if ( !strcasecmp(check, myargv[i]) ) return i;
}
return 0;
}
8.2m argv.h
// Emacs style mode select -*- C++ -*-
219
//-----------------------------------------------------------------------------
//
//$Id:$
//Copyright (C) 1993-1996 by id Software, Inc.
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//DESCRIPTION:
//Nil.
//
//-----------------------------------------------------------------------------
#ifndef |
__M_ARGV__ |
|
#define |
__M_ARGV__ |
|
// |
|
|
// MISC |
|
|
// |
|
|
extern |
int |
myargc; |
extern |
char** |
myargv; |
//Returns the position of the given parameter
//in the arg list (0 if not found).
int M_CheckParm (char* check);
#endif //-----------------------------------------------------------------------------
//
// $Log:$
//
//-----------------------------------------------------------------------------
8.3 m bbox.c
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------
//
//$Id:$
//Copyright (C) 1993-1996 by id Software, Inc.
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//
//$Log:$
//DESCRIPTION:
220