Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]