summaryrefslogtreecommitdiff
path: root/source/sw_draw.c
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2010-09-15 22:41:27 +0400
committerAndrey Nazarov <skuller@skuller.net>2010-09-15 22:41:27 +0400
commitcd8d25aa0b96b48e1a6d0edf9893afe9cbf796c1 (patch)
tree322d2ed47d1ab4c7afdd5e70f34829f252877872 /source/sw_draw.c
parentde41ad148d857184ead919fa488fd58cec5b1864 (diff)
Renamed source tree subdirectory into ‘src’, moved ‘asm’ subdirectory there and renamed it into ‘i386’.
Diffstat (limited to 'source/sw_draw.c')
-rw-r--r--source/sw_draw.c758
1 files changed, 0 insertions, 758 deletions
diff --git a/source/sw_draw.c b/source/sw_draw.c
deleted file mode 100644
index eabdbd3..0000000
--- a/source/sw_draw.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/*
-Copyright (C) 1997-2001 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.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-*/
-
-// draw.c
-
-#include "sw_local.h"
-
-
-//=============================================================================
-
-
-
-#define DOSTEP do { \
- tbyte = *src++; \
- if( tbyte != 255 ) \
- *dst = tbyte; \
- dst++; \
- } while( 0 )
-
-#define DOMSTEP do { \
- if( *src++ != 255 ) \
- *dst = tbyte; \
- dst++; \
- } while( 0 )
-
-#define DOSTRETCH do { \
- tbyte = src[u >> 16]; \
- if( tbyte != 255 ) \
- *dst = tbyte; \
- dst++; \
- u += ustep; \
- } while( 0 )
-
-#define ROW1 do { \
- DOSTEP; \
- } while( --count );
-
-#define ROW4 do { \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- \
- count -= 4; \
- } while( count );
-
-#define ROW8 do { \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- DOSTEP; \
- \
- count -= 8; \
- } while( count );
-
-#define MROW8 do { \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- DOMSTEP; \
- \
- count -= 8; \
- } while( count );
-
-#define STRETCH1 do { \
- DOSTRETCH; \
- } while( --count );
-
-#define STRETCH4 do { \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- \
- count -= 4; \
- } while( count );
-
-#define STRETCH8 do { \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- DOSTRETCH; \
- \
- count -= 8; \
- } while( count );
-
-typedef struct {
- int colorIndex;
- int colorFlags;
- clipRect_t clipRect;
- int flags;
-} drawStatic_t;
-
-static drawStatic_t draw;
-
-static int colorIndices[8];
-
-void R_SetScale( float *scale ) {
- if( scale ) {
- *scale = 1;
- }
-}
-
-void R_InitDraw( void ) {
- int i;
-
- memset( &draw, 0, sizeof( draw ) );
- draw.colorIndex = -1;
-
- for( i = 0; i < 8; i++ ) {
- colorIndices[i] = R_IndexForColor( colorTable[i] );
- }
-}
-
-void R_SetColor( int flags, const color_t color ) {
- draw.flags &= ~DRAW_COLOR_MASK;
-
- if( flags == DRAW_COLOR_CLEAR ) {
- draw.colorIndex = -1;
- return;
- }
-
- if( flags == DRAW_COLOR_ALPHA ) {
- return;
- }
-
- if( flags == DRAW_COLOR_INDEXED ) {
- draw.colorIndex = *( uint32_t * )color & 255;
- return;
- }
-
- if( flags & DRAW_COLOR_RGB ) {
- draw.colorIndex = R_IndexForColor( color );
- }
- if( flags & DRAW_COLOR_ALPHA ) {
- }
-
- draw.flags |= flags;
-}
-
-void R_SetClipRect( int flags, const clipRect_t *clip ) {
- draw.flags &= ~DRAW_CLIP_MASK;
-
- if( flags == DRAW_CLIP_DISABLED ) {
- return;
- }
- draw.flags |= flags;
- draw.clipRect = *clip;
-}
-
-/*
-=============
-R_GetPicSize
-=============
-*/
-qboolean R_GetPicSize( int *w, int *h, qhandle_t pic ) {
- image_t *image = IMG_ForHandle( pic );
-
- if( w ) {
- *w = image->width;
- }
- if( h ) {
- *h = image->height;
- }
- return image->flags & if_transparent;
-}
-
-/*
-=============
-R_DrawStretchData
-=============
-*/
-static void R_DrawStretchData( int x, int y, int w, int h, int xx, int yy,
- int ww, int hh, int pitch, byte *data )
-{
- byte *srcpixels, *dstpixels, *dst, *src;
- int v, u;
- int ustep, vstep;
- int skipv, skipu;
- int width, height;
- byte tbyte;
- int count;
-
- skipv = skipu = 0;
- width = w;
- height = h;
-
- if( draw.flags & DRAW_CLIP_MASK ) {
- clipRect_t *clip = &draw.clipRect;
-
- if( draw.flags & DRAW_CLIP_LEFT ) {
- if( x < clip->left ) {
- skipu = clip->left - x;
- if( w <= skipu ) {
- return;
- }
- w -= skipu;
- x = clip->left;
- }
- }
-
- if( draw.flags & DRAW_CLIP_RIGHT ) {
- if( x >= clip->right ) {
- return;
- }
- if( x + w > clip->right ) {
- w = clip->right - x;
- }
- }
-
- if( draw.flags & DRAW_CLIP_TOP ) {
- if( y < clip->top ) {
- skipv = clip->top - y;
- if( h <= skipv ) {
- return;
- }
- h -= skipv;
- y = clip->top;
- }
- }
-
- if( draw.flags & DRAW_CLIP_BOTTOM ) {
- if( y >= clip->bottom ) {
- return;
- }
- if( y + h > clip->bottom ) {
- h = clip->bottom - y;
- }
- }
- }
-
- srcpixels = data + yy * pitch + xx;
- dstpixels = vid.buffer + y * vid.rowbytes + x;
-
- vstep = hh * 0x10000 / height;
-
- v = skipv * vstep;
- if( width == ww ) {
- dstpixels += skipu;
- do {
- src = &srcpixels[( v >> 16 ) * pitch];
- dst = dstpixels;
- count = w;
-
- if( !( w & 7 ) ) {
- ROW8;
- } else if( !( w & 3 ) ) {
- ROW4;
- } else {
- ROW1;
- }
-
- v += vstep;
- dstpixels += vid.rowbytes;
- } while( --h );
- } else {
- ustep = ww * 0x10000 / width;
- skipu = skipu * ustep;
- do {
- src = &srcpixels[( v >> 16 ) * pitch];
- dst = dstpixels;
- count = w;
-
- u = skipu;
- if( !( w & 7 ) ) {
- STRETCH8;
- } else if( !( w & 3 ) ) {
- STRETCH4;
- } else {
- STRETCH1;
- }
-
- v += vstep;
- dstpixels += vid.rowbytes;
- } while( --h );
- }
-
-}
-
-/*
-=============
-R_DrawFixedData
-=============
-*/
-static void R_DrawFixedData( int x, int y, int w, int h,
- int pitch, byte *data )
-{
- byte *srcpixels, *dstpixels;
- byte *dst, *src;
- int skipv, skipu;
- byte tbyte;
- int count;
-
- skipv = skipu = 0;
-
- if( draw.flags & DRAW_CLIP_MASK ) {
- clipRect_t *clip = &draw.clipRect;
-
- if( draw.flags & DRAW_CLIP_LEFT ) {
- if( x < clip->left ) {
- skipu = clip->left - x;
- if( w <= skipu ) {
- return;
- }
- w -= skipu;
- x = clip->left;
- }
- }
-
- if( draw.flags & DRAW_CLIP_RIGHT ) {
- if( x >= clip->right ) {
- return;
- }
- if( x + w > clip->right ) {
- w = clip->right - x;
- }
- }
-
- if( draw.flags & DRAW_CLIP_TOP ) {
- if( y < clip->top ) {
- skipv = clip->top - y;
- if( h <= skipv ) {
- return;
- }
- h -= skipv;
- y = clip->top;
- }
- }
-
- if( draw.flags & DRAW_CLIP_BOTTOM ) {
- if( y >= clip->bottom ) {
- return;
- }
- if( y + h > clip->bottom ) {
- h = clip->bottom - y;
- }
- }
- }
-
- srcpixels = data + skipv * pitch + skipu;
- dstpixels = vid.buffer + y * vid.rowbytes + x;
-
- if( !( w & 7 ) ) {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; ROW8;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- } else if( !( w & 3 ) ) {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; ROW4;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- } else {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; ROW1;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- }
-
-}
-
-static void R_DrawFixedDataAsMask( int x, int y, int w, int h,
- int pitch, byte *data, byte tbyte )
-{
- byte *srcpixels, *dstpixels;
- byte *dst, *src;
- int skipv, skipu;
- int count;
-
- skipv = skipu = 0;
-
- if( draw.flags & DRAW_CLIP_MASK ) {
- clipRect_t *clip = &draw.clipRect;
-
- if( draw.flags & DRAW_CLIP_LEFT ) {
- if( x < clip->left ) {
- skipu = clip->left - x;
- if( w <= skipu ) {
- return;
- }
- w -= skipu;
- x = clip->left;
- }
- }
-
- if( draw.flags & DRAW_CLIP_RIGHT ) {
- if( x >= clip->right ) {
- return;
- }
- if( x + w > clip->right ) {
- w = clip->right - x;
- }
- }
-
- if( draw.flags & DRAW_CLIP_TOP ) {
- if( y < clip->top ) {
- skipv = clip->top - y;
- if( h <= skipv ) {
- return;
- }
- h -= skipv;
- y = clip->top;
- }
- }
-
- if( draw.flags & DRAW_CLIP_BOTTOM ) {
- if( y <= clip->bottom ) {
- return;
- }
- if( y + h > clip->bottom ) {
- h = clip->bottom - y;
- }
- }
- }
-
- srcpixels = data + skipv * pitch + skipu;
- dstpixels = vid.buffer + y * vid.rowbytes + x;
-
- if( !( w & 7 ) ) {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; MROW8;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- } else if( !( w & 3 ) ) {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; ROW4;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- } else {
- do {
- src = srcpixels;
- dst = dstpixels;
- count = w; ROW1;
- srcpixels += pitch;
- dstpixels += vid.rowbytes;
- } while( --h );
- }
-
-}
-
-/*
-=============
-R_DrawStretcpic
-=============
-*/
-void R_DrawStretcPicST( int x, int y, int w, int h, float s1, float t1,
- float s2, float t2, qhandle_t pic )
-{
- image_t *image = IMG_ForHandle( pic );
- int xx, yy, ww, hh;
-
- xx = image->width * s1;
- yy = image->height * t1;
- ww = image->width * ( s2 - s1 );
- hh = image->height * ( t2 - t1 );
-
- R_DrawStretchData( x, y, w, h, xx, yy, ww, hh,
- image->width, image->pixels[0] );
-}
-
-/*
-=============
-R_DrawStretchPic
-=============
-*/
-void R_DrawStretchPic( int x, int y, int w, int h, qhandle_t pic ) {
- image_t *image = IMG_ForHandle( pic );
-
- if( w == image->width && h == image->height ) {
- R_DrawFixedData( x, y, image->width, image->height,
- image->width, image->pixels[0] );
- return;
- }
-
- R_DrawStretchData( x, y, w, h, 0, 0, image->width, image->height,
- image->width, image->pixels[0] );
-}
-
-/*
-=============
-R_DrawStretcpic
-=============
-*/
-void R_DrawPic( int x, int y, qhandle_t pic ) {
- image_t *image = IMG_ForHandle( pic );
-
- R_DrawFixedData( x, y, image->width, image->height,
- image->width, image->pixels[0] );
-}
-
-void R_DrawChar( int x, int y, int flags, int ch, qhandle_t font ) {
- image_t *image;
- int xx, yy;
- byte *data;
-
- if( !font ) {
- return;
- }
- image = IMG_ForHandle( font );
- if( image->width != 128 || image->height != 128 ) {
- return;
- }
-
- xx = ( ch & 15 ) << 3;
- yy = ( ( ch >> 4 ) & 15 ) << 3;
- data = image->pixels[0] + yy * image->width + xx;
- if( draw.colorIndex != -1 && !( ch & 128 ) ) {
- R_DrawFixedDataAsMask( x, y, 8, 8, image->width, data, draw.colorIndex );
- } else {
- R_DrawFixedData( x, y, 8, 8, image->width, data );
- }
-}
-
-/*
-===============
-R_DrawString
-===============
-*/
-int R_DrawString( int x, int y, int flags, size_t maxChars,
- const char *string, qhandle_t font )
-{
- image_t *image;
- byte c, *data;
- int xx, yy;
- int color;
- qboolean alt;
-
- if( !font ) {
- return x;
- }
- image = IMG_ForHandle( font );
- if( image->width != 128 || image->height != 128 ) {
- return x;
- }
-
- alt = ( flags & UI_ALTCOLOR ) ? qtrue : qfalse;
- color = draw.colorIndex;
-
- while( maxChars-- && *string ) {
- c = *string++;
- if( ( c & 127 ) == 32 ) {
- x += 8;
- continue;
- }
-
- c |= alt << 7;
- xx = ( c & 15 ) << 3;
- yy = ( c >> 4 ) << 3;
-
- data = image->pixels[0] + yy * image->width + xx;
- if( color != -1 && !( c & 128 ) ) {
- R_DrawFixedDataAsMask( x, y, 8, 8, image->width, data, color );
- } else {
- R_DrawFixedData( x, y, 8, 8, image->width, data );
- }
-
- x += 8;
- }
- return x;
-}
-
-/*
-=============
-R_TileClear
-
-This repeats a 64*64 tile graphic to fill the screen around a sized down
-refresh window.
-=============
-*/
-void R_TileClear( int x, int y, int w, int h, qhandle_t pic ) {
- int i, j;
- byte *psrc;
- byte *pdest;
- image_t *image;
- int x2;
-
- if( !pic ) {
- return;
- }
-
- if (x < 0) {
- w += x;
- x = 0;
- }
- if (y < 0) {
- h += y;
- y = 0;
- }
- if (x + w > vid.width)
- w = vid.width - x;
- if (y + h > vid.height)
- h = vid.height - y;
- if (w <= 0 || h <= 0)
- return;
-
- image = IMG_ForHandle( pic );
- if( image->width != 64 || image->height != 64 ) {
- return;
- }
- x2 = x + w;
- pdest = vid.buffer + y*vid.rowbytes;
- for (i=0 ; i<h ; i++, pdest += vid.rowbytes) {
- psrc = image->pixels[0] + image->width * ((i+y)&63);
- for (j=x ; j<x2 ; j++)
- pdest[j] = psrc[j&63];
- }
-}
-
-
-/*
-=============
-R_DrawFill
-
-Fills a box of pixels with a single color
-=============
-*/
-void R_DrawFill( int x, int y, int w, int h, int c ) {
- byte *dest;
- int u, v;
-
- if( x + w > vid.width )
- w = vid.width - x;
- if( y + h > vid.height )
- h = vid.height - y;
- if( x < 0 ) {
- w += x;
- x = 0;
- }
- if( y < 0 ) {
- h += y;
- y = 0;
- }
- if( w < 0 || h < 0 )
- return;
-
- dest = vid.buffer + y * vid.rowbytes + x;
- for( v = 0; v < h; v++, dest += vid.rowbytes )
- for( u = 0; u < w; u++ )
- dest[u] = c;
-}
-
-void R_DrawFillEx( int x, int y, int w, int h, const color_t color ) {
- int c;
- byte *dest;
- int u, v;
-
- if( x + w > vid.width )
- w = vid.width - x;
- if( y + h > vid.height )
- h = vid.height - y;
- if( x < 0 ) {
- w += x;
- x = 0;
- }
- if( y < 0 ) {
- h += y;
- y = 0;
- }
- if( w < 0 || h < 0 )
- return;
-
- c = color ? R_IndexForColor( color ) : 0xD7;
-
- dest = vid.buffer + y * vid.rowbytes + x;
- if( color[3] < 172 ) {
- if( color[3] > 84 ) {
- for( v = 0; v < h; v++, dest += vid.rowbytes ) {
- for( u = 0 ; u < w; u++ ) {
- dest[u] = vid.alphamap[c * 256 + dest[u]];
- }
- }
- } else {
- for( v = 0; v < h; v++, dest += vid.rowbytes ) {
- for( u = 0 ; u < w; u++ ) {
- dest[u] = vid.alphamap[c + dest[u] * 256];
- }
- }
- }
- } else {
- for( v = 0; v < h; v++, dest += vid.rowbytes ) {
- for( u = 0 ; u < w; u++ ) {
- dest[u] = c;
- }
- }
- }
-}
-
-
-//=============================================================================
-
-/*
-================
-R_DrawFadeScreen
-
-================
-*/
-void R_DrawFadeScreen (void)
-{
- int x,y;
- byte *pbuf;
- int t;
-
- for (y=0 ; y<vid.height ; y++)
- {
- pbuf = (byte *)(vid.buffer + vid.rowbytes*y);
- t = (y & 1) << 1;
-
- for (x=0 ; x<vid.width ; x++)
- {
- if ((x & 3) != t)
- pbuf[x] = 0;
- }
- }
-}