⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vid_next.m

📁 Quake 2 Source code for students by Theerthan You can also download from idsoftwares.com
💻 M
📖 第 1 页 / 共 3 页
字号:

			psrc = (byte *)src;
//			srcdelta += width;
//			rowdelta += width;

			for (y = height ; y ; y--)
			{
		    	for (x = xcount ; x ;x--)
			    {
					pdest[0] = ((byte *)pcolormap[0])[psrc[0]];
					pdest[1] = ((byte *)pcolormap[0])[psrc[1]];
					pdest[2] = ((byte *)pcolormap[0])[psrc[2]];
					pdest[3] = ((byte *)pcolormap[0])[psrc[3]];
					pdest[4] = ((byte *)pcolormap[0])[psrc[4]];
					pdest[5] = ((byte *)pcolormap[0])[psrc[5]];
					pdest[6] = ((byte *)pcolormap[0])[psrc[6]];
					pdest[7] = ((byte *)pcolormap[0])[psrc[7]];
					pdest += 8; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;
		    }
		}
    }
}


/*
===================
Update16_1
===================
*/
void Update16_1 (pixel_t *src, unsigned short *dest, int width,
		int height, int destrowbytes)
{
	int				x,y;
	unsigned		rowdelta, srcdelta;
	unsigned		xcount;
	pixel_t			*psrc;
	unsigned short	*pdest;
	int				xwidth;


	psrc = src;
	pdest = dest;
	
	xcount = width >> 3;
	srcdelta = vid.width - width;

	xwidth = width - (xcount << 3);
	if (xwidth)
		Sys_Error ("Width not multiple of 8");

	if ((vid_display == disp_framebuffer) && (vid_scale == 2))
	{
		int		nextrow = destrowbytes >> 1;

	    rowdelta = (destrowbytes - ((width << 1) << 1) + destrowbytes) >> 1;

		if (dither)
		{
			for (y = height ; y ; y--)
			{
		    	for (x = xcount ; x ;x--)
			    {
					unsigned	temp;

					temp = psrc[0];
					pdest[0] = ((unsigned short *)pcolormap[0])[temp];
					pdest[1] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 1] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[1];
					pdest[2] = ((unsigned short *)pcolormap[0])[temp];
					pdest[3] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 2] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 3] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[2];
					pdest[4] = ((unsigned short *)pcolormap[0])[temp];
					pdest[5] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 4] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 5] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[3];
					pdest[6] = ((unsigned short *)pcolormap[0])[temp];
					pdest[7] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 6] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 7] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[4];
					pdest[8] = ((unsigned short *)pcolormap[0])[temp];
					pdest[9] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 8] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 9] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[5];
					pdest[10] = ((unsigned short *)pcolormap[0])[temp];
					pdest[11] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 10] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 11] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[6];
					pdest[12] = ((unsigned short *)pcolormap[0])[temp];
					pdest[13] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 12] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 13] = ((unsigned short *)pcolormap[3])[temp];
					temp = psrc[7];
					pdest[14] = ((unsigned short *)pcolormap[0])[temp];
					pdest[15] = ((unsigned short *)pcolormap[1])[temp];
					pdest[nextrow + 14] = ((unsigned short *)pcolormap[2])[temp];
					pdest[nextrow + 15] = ((unsigned short *)pcolormap[3])[temp];
					pdest += 16; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;
			}
		}
		else
		{
			for (y = height ; y ; y--)
			{
			for (x = xcount ; x ;x--)
			    {
					pdest[0] = pdest[1] = pdest[nextrow] =
							pdest[nextrow + 1] = pcolormap[0][psrc[0]];
					pdest[2] = pdest[3] = pdest[nextrow + 2] =
							pdest[nextrow + 3] = pcolormap[0][psrc[1]];
					pdest[4] = pdest[5] = pdest[nextrow + 4] =
							pdest[nextrow + 5] = pcolormap[0][psrc[2]];
					pdest[6] = pdest[7] = pdest[nextrow + 6] =
							pdest[nextrow + 7] = pcolormap[0][psrc[3]];
					pdest[8] = pdest[9] = pdest[nextrow + 8] =
							pdest[nextrow + 9] = pcolormap[0][psrc[4]];
					pdest[10] = pdest[11] = pdest[nextrow + 10] =
							pdest[nextrow + 11] = pcolormap[0][psrc[5]];
					pdest[12] = pdest[13] = pdest[nextrow + 12] =
							pdest[nextrow + 13] = pcolormap[0][psrc[6]];
					pdest[14] = pdest[15] = pdest[nextrow + 14] =
							pdest[nextrow + 15] = pcolormap[0][psrc[7]];
					pdest += 16; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;
			}
    	}
	}
	else
	{
	    rowdelta = (destrowbytes - (width<<1))>>1;

		if (dither)
		{
			for (y = height ; y>0 ; y -= 2)
			{
		    	for (x = xcount ; x ;x--)
			    {
					pdest[0] = ((unsigned short *)pcolormap[0])[psrc[0]];
					pdest[1] = ((unsigned short *)pcolormap[1])[psrc[1]];
					pdest[2] = ((unsigned short *)pcolormap[0])[psrc[2]];
					pdest[3] = ((unsigned short *)pcolormap[1])[psrc[3]];
					pdest[4] = ((unsigned short *)pcolormap[0])[psrc[4]];
					pdest[5] = ((unsigned short *)pcolormap[1])[psrc[5]];
					pdest[6] = ((unsigned short *)pcolormap[0])[psrc[6]];
					pdest[7] = ((unsigned short *)pcolormap[1])[psrc[7]];
					pdest += 8; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;

		    	for (x = xcount ; x ;x--)
			    {
					pdest[0] = ((unsigned short *)pcolormap[2])[psrc[0]];
					pdest[1] = ((unsigned short *)pcolormap[3])[psrc[1]];
					pdest[2] = ((unsigned short *)pcolormap[2])[psrc[2]];
					pdest[3] = ((unsigned short *)pcolormap[3])[psrc[3]];
					pdest[4] = ((unsigned short *)pcolormap[2])[psrc[4]];
					pdest[5] = ((unsigned short *)pcolormap[3])[psrc[5]];
					pdest[6] = ((unsigned short *)pcolormap[2])[psrc[6]];
					pdest[7] = ((unsigned short *)pcolormap[3])[psrc[7]];
					pdest += 8; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;
			}
		}
		else
		{
			for (y = height ; y ; y--)
			{
			for (x = xcount ; x ;x--)
			    {
					pdest[0] = pcolormap[0][psrc[0]];
					pdest[1] = pcolormap[0][psrc[1]];
					pdest[2] = pcolormap[0][psrc[2]];
					pdest[3] = pcolormap[0][psrc[3]];
					pdest[4] = pcolormap[0][psrc[4]];
					pdest[5] = pcolormap[0][psrc[5]];
					pdest[6] = pcolormap[0][psrc[6]];
					pdest[7] = pcolormap[0][psrc[7]];
					pdest += 8; psrc += 8;
			    }

				psrc += srcdelta;
			    pdest += rowdelta;
			}
    	}
	}
}


/*
===================
Update32_1
===================
*/
void Update32_1 (pixel_t *src, unsigned *dest, int width, int height,
		int destrowbytes)
{
	int				x,y;
	unsigned		rowdelta, srcdelta;
	unsigned		xcount;
	pixel_t			*psrc;
	unsigned		*pdest;
	int				xwidth;

	psrc = src;
	pdest = dest;

	xcount = width >> 3;
	srcdelta = vid.width - width;

	xwidth = width - (xcount << 3);
	if (xwidth)
		Sys_Error ("Width not multiple of 8");

	if ((vid_display == disp_framebuffer) && (vid_scale == 2))
	{
		int		nextrow = destrowbytes >> 2;

	    rowdelta = ((destrowbytes - ((width << 1) << 2)) >> 2)  +
				(destrowbytes >> 2);

		for (y = height ; y ; y--)
		{
			for (x = xcount ; x ;x--)
		    {
				pdest[0] = pdest[1] = pdest[nextrow] =
						pdest[nextrow + 1] = pcolormap[0][psrc[0]];
				pdest[2] = pdest[3] = pdest[nextrow + 2] =
						pdest[nextrow + 3] = pcolormap[0][psrc[1]];
				pdest[4] = pdest[5] = pdest[nextrow + 4] =
						pdest[nextrow + 5] = pcolormap[0][psrc[2]];
				pdest[6] = pdest[7] = pdest[nextrow + 6] =
						pdest[nextrow + 7] = pcolormap[0][psrc[3]];
				pdest[8] = pdest[9] = pdest[nextrow + 8] =
						pdest[nextrow + 9] = pcolormap[0][psrc[4]];
				pdest[10] = pdest[11] = pdest[nextrow + 10] =
						pdest[nextrow + 11] = pcolormap[0][psrc[5]];
				pdest[12] = pdest[13] = pdest[nextrow + 12] =
						pdest[nextrow + 13] = pcolormap[0][psrc[6]];
				pdest[14] = pdest[15] = pdest[nextrow + 14] =
						pdest[nextrow + 15] = pcolormap[0][psrc[7]];
				pdest += 16; psrc += 8;
		    }

			psrc += srcdelta;
		    pdest += rowdelta;
		}
    }
	else
	{
	    rowdelta = (destrowbytes - (width<<2))>>2;

		for (y = height ; y ; y--)
		{
			for (x = xcount ; x ;x--)
		    {
				pdest[0] = pcolormap[0][psrc[0]];
				pdest[1] = pcolormap[0][psrc[1]];
				pdest[2] = pcolormap[0][psrc[2]];
				pdest[3] = pcolormap[0][psrc[3]];
				pdest[4] = pcolormap[0][psrc[4]];
				pdest[5] = pcolormap[0][psrc[5]];
				pdest[6] = pcolormap[0][psrc[6]];
				pdest[7] = pcolormap[0][psrc[7]];
				pdest += 8; psrc += 8;
		    }

			psrc += srcdelta;
		    pdest += rowdelta;
		}
	}
}


/*
==========================================================================

						NEXTSTEP VIEW CLASS

==========================================================================
*/


@implementation QuakeView

/*
=================
windowDidMove

=================
*/
- windowDidMove:sender
{
    NXPoint	aPoint;
    NXRect	winframe;

    aPoint.x = aPoint.y = 0;
    [self convertPoint:&aPoint toView:nil];
    [window convertBaseToScreen: &aPoint];
    [window getFrame: &winframe];

    if ((int)aPoint.x & 7)
    {
	[window moveTo:winframe.origin.x - ((int)aPoint.x&7) 
			:winframe.origin.y];
	[window getFrame: &winframe];
    }
    return self;
}

- windowWillResize:sender toSize:(NXSize *)frameSize
{
	NXRect		fr, cont;
	
	fr.origin.x = fr.origin.y = 0;
	fr.size = *frameSize;
	
	[Window getContentRect:&cont forFrameRect: &fr style:[window style]];

	cont.size.width = (int)cont.size.width & ~15;
	if (cont.size.width < 128)
		cont.size.width = 128;
	cont.size.height = (int)cont.size.height & ~3;
	if (cont.size.height < 32)
		cont.size.height = 32;

	[Window getFrameRect:&fr forContentRect: &cont style:[window style]];

	*frameSize = fr.size;
	
	return self;
}

- windowDidResize:sender
{
	if (vid_display == disp_framebuffer)
		Sys_Error ("How the heck are you resizing a framebuffer window?!?");

	vid.width = bounds.size.width/vid_scale;
	vid.height = bounds.size.height/vid_scale;

//
// allocate memory for the back and translation buffers
//
	vid.rowbytes = vid.width;
	rowbytesnative = vid.width * pixbytesnative;
	
	AllocBuffers (true);

	vid.conbuffer = vid.buffer;
	vid.conrowbytes = vid.rowbytes;
	vid.conwidth = vid.width;
	vid.conheight = vid.height;

	vid.recalc_refdef = 1;

	return self;
}

-(BOOL) acceptsFirstResponder
{
    return YES;
}


typedef struct
{
	int		source, dest;
} keymap_t;

keymap_t keymaps[] =
{
	{103, K_RIGHTARROW},
	{102, K_LEFTARROW},
	{100, K_UPARROW},
	{101, K_DOWNARROW},
	{111, K_PAUSE},

	{59, K_F1},
	{60, K_F2},
	{61, K_F3},
	{62, K_F4},
	{63, K_F5},
	{64, K_F6},
	{65, K_F7},
	{66, K_F8},
	{67, K_F9},
	{68, K_F10},
	{87, K_F11},
	{88, K_F12},
	
	{-1,-1}
};

keymap_t flagmaps[] =
{
	{NX_SHIFTMASK, K_SHIFT},
	{NX_CONTROLMASK, K_CTRL},
	{NX_ALTERNATEMASK, K_ALT},
	{NX_COMMANDMASK, K_ALT},
	
	{-1,-1}
};

/*
===================
keyboard methods
===================
*/
- keyDown:(NXEvent *)theEvent
{
    int	ch;
	keymap_t	*km;
	
	PSobscurecursor ();

// check for non-ascii first
	ch = theEvent->data.key.keyCode;
	for (km=keymaps;km->source!=-1;km++)
		if (ch == km->source)
		{
			Key_Event (km->dest, true);
			return self;
		}

    ch = theEvent->data.key.charCode;
	if (ch >= 'A' && ch <= 'Z')
		ch += 'a' - 'A';
    if (ch>=256)
		return self;
		
	Key_Event (ch, true);
    return self;
}

- flagsChanged:(NXEvent *)theEvent
{
	static int	oldflags;
    int		newflags;
	int		delta;
	keymap_t	*km;
	int		i;
	
	PSobscurecursor ();
    newflags = theEvent->flags;
	delta = newflags ^ oldflags;
	for (i=0 ; i<32 ; i++)
	{
		if ( !(delta & (1<<i)))
			continue;
	// changed
		for (km=flagmaps;km->source!=-1;km++)
			if ( (1<<i) == km->source)
			{
				if (newflags & (1<<i))
					Key_Event (km->dest, true);
				else
					Key_Event (km->dest, false);
			}

	}
	
	oldflags = newflags;
		
    return self;
}


- keyUp:(NXEvent *)theEvent
{
    int	ch;
 	keymap_t	*km;
  
 // check for non-ascii first
	ch = theEvent->data.key.keyCode;
	for (km=keymaps;km->source!=-1;km++)
		if (ch == km->source)
		{
			Key_Event (km->dest, false);
			return self;
		}

   ch = theEvent->data.key.charCode;
	if (ch >= 'A' && ch <= 'Z')
		ch += 'a' - 'A';
    if (ch>=256)
		return self;
	Key_Event (ch, false);
    return self;
}


- tiffShot
{
	id			imagerep, image;
	NXRect		r;
	NXStream	*stream;
	int			fd;
	int    		i; 
	char		tiffname[80]; 
	
	[vid_window_i getFrame: &r];
	r.origin.x = r.origin.y = 0;
	image = [[NXImage alloc] initSize: &r.size];
	imagerep = [[NXCachedImageRep alloc] initFromWindow:vid_window_i rect:&r];
	
	[image lockFocus];
	[imagerep draw];
	[image unlockFocus];
	
// 
// find a file name to save it to 
// 
	strcpy(tiffname,"quake00.tif");
		
	for (i=0 ; i<=99 ; i++) 
	{ 
		tiffname[5] = i/10 + '0'; 
		tiffname[6] = i%10 + '0'; 
		if (Sys_FileTime(tiffname) == -1)
			break;	// file doesn't exist
	} 
	if (i==100) 
		Sys_Error ("SCR_ScreenShot_f: Couldn't create a tiff"); 

	fd = open (tiffname, O_RDWR|O_CREAT|O_TRUNC, 0666);
	stream = NXOpenFile (fd, NX_READWRITE);
	[image writeTIFF: stream];
	NXClose (stream);
	close (fd);
	printf ("wrote %s\n", tiffname);

	[image free];
	[imagerep free];
	return self;
	
}

- screenShot: sender
{
	return [self tiffShot];
}

- setScaleFullScreen: sender
{
	VID_Shutdown ();
	if (vid_fullscreen)
	{
		vid_fullscreen = 0;
		VID_Restart (vid_display, vid_scale);
	}
	else
	{
		vid_fullscreen = 1;
		VID_Restart (vid_display, vid_scale);
	}
	return self;
}

@end

//============================================================================

@implementation FrameWindow

- windowExposed:(NXEvent *)theEvent
{
	return self;
}

@end


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -