19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopyright (C) 1996-1997 Id Software, Inc.
39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is free software; you can redistribute it and/or
59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodify it under the terms of the GNU General Public License
69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamas published by the Free Software Foundation; either version 2
79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the License, or (at your option) any later version.
89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is distributed in the hope that it will be useful,
109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambut WITHOUT ANY WARRANTY; without even the implied warranty of
119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSee the GNU General Public License for more details.
149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamYou should have received a copy of the GNU General Public License
169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamalong with this program; if not, write to the Free Software
179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// draw.c -- this is the only file outside the refresh that touches the
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// vid buffer
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct {
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vrect_t	rect;
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		width;
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		height;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*ptexbytes;
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		rowbytes;
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} rectdesc_t;
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic rectdesc_t	r_rectdesc;
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambyte		*draw_chars;				// 8*8 graphic characters
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqpic_t		*draw_disc;
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqpic_t		*draw_backtile;
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//=============================================================================
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/* Support Routines */
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct cachepic_s
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char		name[MAX_QPATH];
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cache_user_t	cache;
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} cachepic_t;
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	MAX_CACHED_PICS		128
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamcachepic_t	menu_cachepics[MAX_CACHED_PICS];
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			menu_numcachepics;
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqpic_t	*Draw_PicFromWad (char *name)
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return W_GetLumpName (name);
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_CachePic
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqpic_t	*Draw_CachePic (char *path)
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cachepic_t	*pic;
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qpic_t		*dat;
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (pic=menu_cachepics, i=0 ; i<menu_numcachepics ; pic++, i++)
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!strcmp (path, pic->name))
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (i == menu_numcachepics)
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (menu_numcachepics == MAX_CACHED_PICS)
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("menu_numcachepics == MAX_CACHED_PICS");
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		menu_numcachepics++;
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (pic->name, path);
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat = Cache_Check (&pic->cache);
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (dat)
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return dat;
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// load the pic from disk
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	COM_LoadCacheFile (path, &pic->cache);
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dat = (qpic_t *)pic->cache.data;
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!dat)
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Draw_CachePic: failed to load %s", path);
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SwapPic (dat);
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return dat;
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_Init
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Init (void)
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	draw_chars = W_GetLumpName ("conchars");
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	draw_disc = W_GetLumpName ("disc");
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	draw_backtile = W_GetLumpName ("backtile");
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.width = draw_backtile->width;
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.height = draw_backtile->height;
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.ptexbytes = draw_backtile->data;
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.rowbytes = draw_backtile->width;
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_Character
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraws one 8*8 graphics character with 0 being transparent.
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamIt can be clipped to the top of the screen to allow the console to be
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamsmoothly scrolled off.
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Character (int x, int y, int num)
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest;
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*source;
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				drawline;
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				row, col;
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	num &= 255;
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (y <= -8)
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;			// totally off screen
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (y > vid.height - 8 || x < 0 || x > vid.width - 8)
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (num < 0 || num > 255)
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	row = num>>4;
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	col = num&15;
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = draw_chars + (row<<10) + (col<<3);
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (y < 0)
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// clipped
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		drawline = 8 + y;
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		source -= 128*y;
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y = 0;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		drawline = 8;
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.conbuffer + y*vid.conrowbytes + x;
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (drawline--)
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[0])
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[0] = source[0];
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[1])
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[1] = source[1];
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[2])
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[2] = source[2];
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[3])
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[3] = source[3];
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[4])
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[4] = source[4];
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[5])
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[5] = source[5];
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[6])
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[6] = source[6];
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[7])
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[7] = source[7];
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += 128;
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			dest += vid.conrowbytes;
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pre-expand to native format?
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((byte *)vid.conbuffer + y*vid.conrowbytes + (x<<1));
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (drawline--)
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[0])
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[0] = d_8to16table[source[0]];
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[1])
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[1] = d_8to16table[source[1]];
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[2])
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[2] = d_8to16table[source[2]];
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[3])
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[3] = d_8to16table[source[3]];
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[4])
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[4] = d_8to16table[source[4]];
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[5])
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[5] = d_8to16table[source[5]];
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[6])
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[6] = d_8to16table[source[6]];
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[7])
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[7] = d_8to16table[source[7]];
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += 128;
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pusdest += (vid.conrowbytes >> 1);
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_String
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_String (int x, int y, char *str)
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*str)
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Character (x, y, *str);
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str++;
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x += 8;
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_Alt_String
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Alt_String (int x, int y, char *str)
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (*str)
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Character (x, y, (*str) | 0x80);
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str++;
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x += 8;
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Pixel(int x, int y, byte color)
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest;
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.conbuffer + y*vid.conrowbytes + x;
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*dest = color;
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pre-expand to native format?
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((byte *)vid.conbuffer + y*vid.conrowbytes + (x<<1));
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		*pusdest = d_8to16table[color];
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Crosshair(void)
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int x, y;
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern cvar_t crosshair, cl_crossx, cl_crossy, crosshaircolor;
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern vrect_t		scr_vrect;
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte c = (byte)crosshaircolor.value;
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (crosshair.value == 2) {
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		x = scr_vrect.x + scr_vrect.width/2 + cl_crossx.value;
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y = scr_vrect.y + scr_vrect.height/2 + cl_crossy.value;
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x - 1, y, c);
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x - 3, y, c);
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x + 1, y, c);
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x + 3, y, c);
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x, y - 1, c);
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x, y - 3, c);
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x, y + 1, c);
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Pixel(x, y + 3, c);
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} else if (crosshair.value)
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_Character (
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			scr_vrect.x + scr_vrect.width/2-4 + cl_crossx.value,
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			scr_vrect.y + scr_vrect.height/2-4 + cl_crossy.value,
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			'+');
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_DebugChar
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraws a single character directly to the upper right corner of the screen.
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis is for debugging lockups by drawing different chars in different parts
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the code.
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_DebugChar (char num)
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest;
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*source;
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				drawline;
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	extern byte		*draw_chars;
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				row, col;
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!vid.direct)
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;		// don't have direct FB access, so no debugchars...
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	drawline = 8;
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	row = num>>4;
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	col = num&15;
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = draw_chars + (row<<10) + (col<<3);
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dest = vid.direct + 312;
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (drawline--)
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[0] = source[0];
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[1] = source[1];
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[2] = source[2];
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[3] = source[3];
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[4] = source[4];
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[5] = source[5];
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[6] = source[6];
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest[7] = source[7];
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		source += 128;
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest += 320;
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_Pic
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Pic (int x, int y, qpic_t *pic)
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest, *source;
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				v, u;
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((x < 0) ||
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(x + pic->width > vid.width) ||
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(y < 0) ||
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(y + pic->height > vid.height))
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Draw_Pic: bad coordinates");
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = pic->data;
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.buffer + y * vid.rowbytes + x;
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<pic->height ; v++)
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Q_memcpy (dest, source, pic->width);
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			dest += vid.rowbytes;
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pretranslate at load time?
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<pic->height ; v++)
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=0 ; u<pic->width ; u++)
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[u] = d_8to16table[source[u]];
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
3829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pusdest += vid.rowbytes >> 1;
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_SubPic
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_SubPic(int x, int y, qpic_t *pic, int srcx, int srcy, int width, int height)
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest, *source;
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				v, u;
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ((x < 0) ||
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(x + width > vid.width) ||
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(y < 0) ||
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		(y + height > vid.height))
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Draw_Pic: bad coordinates");
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = pic->data + srcy * pic->width + srcx;
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.buffer + y * vid.rowbytes + x;
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<height ; v++)
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Q_memcpy (dest, source, width);
4189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			dest += vid.rowbytes;
4199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
4209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pretranslate at load time?
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<height ; v++)
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
4299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=srcx ; u<(srcx+width) ; u++)
4309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
4319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[u] = d_8to16table[source[u]];
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pusdest += vid.rowbytes >> 1;
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_TransPic
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_TransPic (int x, int y, qpic_t *pic)
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*dest, *source, tbyte;
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				v, u;
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
4539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 (unsigned)(y + pic->height) > vid.height)
4549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Draw_TransPic: bad coordinates");
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = pic->data;
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.buffer + y * vid.rowbytes + x;
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (pic->width & 7)
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{	// general
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (v=0 ; v<pic->height ; v++)
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (u=0 ; u<pic->width ; u++)
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u] = tbyte;
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest += vid.rowbytes;
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				source += pic->width;
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{	// unwound
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (v=0 ; v<pic->height ; v++)
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (u=0 ; u<pic->width ; u+=8)
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u] = tbyte;
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+1]) != TRANSPARENT_COLOR)
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+1] = tbyte;
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+2]) != TRANSPARENT_COLOR)
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+2] = tbyte;
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+3]) != TRANSPARENT_COLOR)
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+3] = tbyte;
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+4]) != TRANSPARENT_COLOR)
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+4] = tbyte;
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+5]) != TRANSPARENT_COLOR)
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+5] = tbyte;
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+6]) != TRANSPARENT_COLOR)
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+6] = tbyte;
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+7]) != TRANSPARENT_COLOR)
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+7] = tbyte;
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest += vid.rowbytes;
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				source += pic->width;
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pretranslate at load time?
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<pic->height ; v++)
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=0 ; u<pic->width ; u++)
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				tbyte = source[u];
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (tbyte != TRANSPARENT_COLOR)
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					pusdest[u] = d_8to16table[tbyte];
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pusdest += vid.rowbytes >> 1;
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_TransPicTranslate
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_TransPicTranslate (int x, int y, qpic_t *pic, byte *translation)
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*dest, *source, tbyte;
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				v, u;
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (x < 0 || (unsigned)(x + pic->width) > vid.width || y < 0 ||
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		 (unsigned)(y + pic->height) > vid.height)
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("Draw_TransPic: bad coordinates");
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = pic->data;
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.buffer + y * vid.rowbytes + x;
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (pic->width & 7)
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{	// general
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (v=0 ; v<pic->height ; v++)
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (u=0 ; u<pic->width ; u++)
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u] = translation[tbyte];
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest += vid.rowbytes;
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				source += pic->width;
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{	// unwound
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (v=0 ; v<pic->height ; v++)
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (u=0 ; u<pic->width ; u+=8)
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u]) != TRANSPARENT_COLOR)
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u] = translation[tbyte];
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+1]) != TRANSPARENT_COLOR)
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+1] = translation[tbyte];
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+2]) != TRANSPARENT_COLOR)
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+2] = translation[tbyte];
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+3]) != TRANSPARENT_COLOR)
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+3] = translation[tbyte];
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+4]) != TRANSPARENT_COLOR)
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+4] = translation[tbyte];
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+5]) != TRANSPARENT_COLOR)
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+5] = translation[tbyte];
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+6]) != TRANSPARENT_COLOR)
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+6] = translation[tbyte];
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					if ( (tbyte=source[u+7]) != TRANSPARENT_COLOR)
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						dest[u+7] = translation[tbyte];
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest += vid.rowbytes;
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				source += pic->width;
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// FIXME: pretranslate at load time?
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<pic->height ; v++)
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=0 ; u<pic->width ; u++)
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				tbyte = source[u];
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (tbyte != TRANSPARENT_COLOR)
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					pusdest[u] = d_8to16table[tbyte];
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pusdest += vid.rowbytes >> 1;
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			source += pic->width;
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_CharToConback (int num, byte *dest)
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		row, col;
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*source;
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		drawline;
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		x;
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	row = num>>4;
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	col = num&15;
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = draw_chars + (row<<10) + (col<<3);
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	drawline = 8;
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (drawline--)
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (x=0 ; x<8 ; x++)
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (source[x])
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[x] = 0x60 + source[x];
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		source += 128;
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest += 320;
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_ConsoleBackground
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_ConsoleBackground (int lines)
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				x, y, v;
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*src, *dest;
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				f, fstep;
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qpic_t			*conback;
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char			ver[100];
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static			char saveback[320*8];
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	conback = Draw_CachePic ("gfx/conback.lmp");
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// hack the version number directly into the pic
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	//sprintf (ver, "start commands with a \\ character %4.2f", VERSION);
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.download) {
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (ver, "%4.2f", VERSION);
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = conback->data + 320 + 320*186 - 11 - 8*strlen(ver);
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} else {
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if defined(__linux__)
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (ver, "Linux (%4.2f) QuakeWorld %4.2f", LINUX_VERSION, VERSION);
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		sprintf (ver, "QuakeWorld %4.2f", VERSION);
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = conback->data + 320 - (strlen(ver)*8 + 11) + 320*186;
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy(saveback, conback->data + 320*186, 320*8);
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (x=0 ; x<strlen(ver) ; x++)
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Draw_CharToConback (ver[x], dest+(x<<3));
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// draw the pic
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.conbuffer;
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (y=0 ; y<lines ; y++, dest += vid.conrowbytes)
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			v = (vid.conheight - lines + y)*200/vid.conheight;
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			src = conback->data + v*320;
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (vid.conwidth == 320)
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				memcpy (dest, src, vid.conwidth);
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				f = 0;
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				fstep = 320*0x10000/vid.conwidth;
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				for (x=0 ; x<vid.conwidth ; x+=4)
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dest[x] = src[f>>16];
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					f += fstep;
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dest[x+1] = src[f>>16];
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					f += fstep;
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dest[x+2] = src[f>>16];
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					f += fstep;
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					dest[x+3] = src[f>>16];
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					f += fstep;
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.conbuffer;
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (y=0 ; y<lines ; y++, pusdest += (vid.conrowbytes >> 1))
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// FIXME: pre-expand to native format?
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		// FIXME: does the endian switching go away in production?
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			v = (vid.conheight - lines + y)*200/vid.conheight;
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			src = conback->data + v*320;
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			f = 0;
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			fstep = 320*0x10000/vid.conwidth;
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (x=0 ; x<vid.conwidth ; x+=4)
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[x] = d_8to16table[src[f>>16]];
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				f += fstep;
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[x+1] = d_8to16table[src[f>>16]];
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				f += fstep;
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[x+2] = d_8to16table[src[f>>16]];
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				f += fstep;
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[x+3] = d_8to16table[src[f>>16]];
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				f += fstep;
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// put it back
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy(conback->data + 320*186, saveback, 320*8);
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawRect8
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawRect8 (vrect_t *prect, int rowbytes, byte *psrc,
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int transparent)
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	t;
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j, srcdelta, destdelta;
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*pdest;
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pdest = vid.buffer + (prect->y * vid.rowbytes) + prect->x;
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	srcdelta = rowbytes - prect->width;
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	destdelta = vid.rowbytes - prect->width;
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (transparent)
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<prect->height ; i++)
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<prect->width ; j++)
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				t = *psrc;
7609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (t != TRANSPARENT_COLOR)
7619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
7629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					*pdest = t;
7639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
7649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				psrc++;
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pdest++;
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
7689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			psrc += srcdelta;
7709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pdest += destdelta;
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<prect->height ; i++)
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			memcpy (pdest, psrc, prect->width);
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			psrc += rowbytes;
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pdest += vid.rowbytes;
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamR_DrawRect16
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid R_DrawRect16 (vrect_t *prect, int rowbytes, byte *psrc,
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int transparent)
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			t;
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				i, j, srcdelta, destdelta;
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pdest;
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: would it be better to pre-expand native-format versions?
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pdest = (unsigned short *)vid.buffer +
8009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			(prect->y * (vid.rowbytes >> 1)) + prect->x;
8019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	srcdelta = rowbytes - prect->width;
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	destdelta = (vid.rowbytes >> 1) - prect->width;
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (transparent)
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<prect->height ; i++)
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<prect->width ; j++)
8109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				t = *psrc;
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (t != TRANSPARENT_COLOR)
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					*pdest = d_8to16table[t];
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				psrc++;
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pdest++;
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			psrc += srcdelta;
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pdest += destdelta;
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (i=0 ; i<prect->height ; i++)
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<prect->width ; j++)
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				*pdest = d_8to16table[*psrc];
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				psrc++;
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pdest++;
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			psrc += srcdelta;
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			pdest += destdelta;
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_TileClear
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis repeats a 64*64 tile graphic to fill the screen around a sized down
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamrefresh window.
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_TileClear (int x, int y, int w, int h)
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				width, height, tileoffsetx, tileoffsety;
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*psrc;
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vrect_t			vr;
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.rect.x = x;
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.rect.y = y;
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.rect.width = w;
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	r_rectdesc.rect.height = h;
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vr.y = r_rectdesc.rect.y;
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	height = r_rectdesc.rect.height;
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tileoffsety = vr.y % r_rectdesc.height;
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (height > 0)
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vr.x = r_rectdesc.rect.x;
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		width = r_rectdesc.rect.width;
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (tileoffsety != 0)
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vr.height = r_rectdesc.height - tileoffsety;
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vr.height = r_rectdesc.height;
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (vr.height > height)
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vr.height = height;
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		tileoffsetx = vr.x % r_rectdesc.width;
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (width > 0)
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (tileoffsetx != 0)
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vr.width = r_rectdesc.width - tileoffsetx;
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vr.width = r_rectdesc.width;
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (vr.width > width)
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				vr.width = width;
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			psrc = r_rectdesc.ptexbytes +
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					(tileoffsety * r_rectdesc.rowbytes) + tileoffsetx;
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (r_pixbytes == 1)
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				R_DrawRect8 (&vr, r_rectdesc.rowbytes, psrc, 0);
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				R_DrawRect16 (&vr, r_rectdesc.rowbytes, psrc, 0);
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vr.x += vr.width;
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			width -= vr.width;
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			tileoffsetx = 0;	// only the left tile can be left-clipped
9079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		vr.y += vr.height;
9109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		height -= vr.height;
9119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		tileoffsety = 0;		// only the top tile can be top-clipped
9129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
9189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_Fill
9199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFills a box of pixels with a single color
9219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
9229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_Fill (int x, int y, int w, int h, int c)
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			*dest;
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned short	*pusdest;
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned		uc;
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				u, v;
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (x < 0 || x + w > vid.width ||
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		y < 0 || y + h > vid.height) {
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Bad Draw_Fill(%d, %d, %d, %d, %c)\n",
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			x, y, w, h, c);
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_pixbytes == 1)
9389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		dest = vid.buffer + y*vid.rowbytes + x;
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<h ; v++, dest += vid.rowbytes)
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=0 ; u<w ; u++)
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[u] = c;
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
9459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		uc = d_8to16table[c];
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pusdest = (unsigned short *)vid.buffer + y * (vid.rowbytes >> 1) + x;
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (v=0 ; v<h ; v++, pusdest += (vid.rowbytes >> 1))
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u=0 ; u<w ; u++)
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pusdest[u] = uc;
9529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//=============================================================================
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
9589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_FadeScreen
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_FadeScreen (void)
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
9649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			x,y;
9659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte		*pbuf;
9669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_UnlockBuffer ();
9689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_ExtraUpdate ();
9699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_LockBuffer ();
9709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (y=0 ; y<vid.height ; y++)
9729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
9739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		int	t;
9749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pbuf = (byte *)(vid.buffer + vid.rowbytes*y);
9769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		t = (y & 1) << 1;
9779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (x=0 ; x<vid.width ; x++)
9799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
9809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ((x & 3) != t)
9819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pbuf[x] = 0;
9829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_UnlockBuffer ();
9869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_ExtraUpdate ();
9879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VID_LockBuffer ();
9889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//=============================================================================
9919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
9939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
9949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_BeginDisc
9959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraws the little blue disc in the corner of the screen.
9979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCall before beginning any disc IO.
9989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
9999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_BeginDisc (void)
10019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	D_BeginDirectRect (vid.width - 24, 0, draw_disc->data, 24, 24);
10049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
10089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamDraw_EndDisc
10109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamErases the disc icon.
10129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCall after completing any disc IO
10139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream================
10149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
10159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid Draw_EndDisc (void)
10169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
10179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
10189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	D_EndDirectRect (vid.width - 24, 0, 24, 24);
10199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
10209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1021