Home | History | Annotate | Download | only in client
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 // d_clear: clears a specified rectangle to the specified color
     21 
     22 #include "quakedef.h"
     23 
     24 
     25 /*
     26 ================
     27 D_FillRect
     28 ================
     29 */
     30 void D_FillRect (vrect_t *rect, int color)
     31 {
     32 	int				rx, ry, rwidth, rheight;
     33 	unsigned char	*dest;
     34 	unsigned		*ldest;
     35 
     36 	rx = rect->x;
     37 	ry = rect->y;
     38 	rwidth = rect->width;
     39 	rheight = rect->height;
     40 
     41 	if (rx < 0)
     42 	{
     43 		rwidth += rx;
     44 		rx = 0;
     45 	}
     46 	if (ry < 0)
     47 	{
     48 		rheight += ry;
     49 		ry = 0;
     50 	}
     51 	if (rx+rwidth > vid.width)
     52 		rwidth = vid.width - rx;
     53 	if (ry+rheight > vid.height)
     54 		rheight = vid.height - rx;
     55 
     56 	if (rwidth < 1 || rheight < 1)
     57 		return;
     58 
     59 	dest = ((byte *)vid.buffer + ry*vid.rowbytes + rx);
     60 
     61 	if (((rwidth & 0x03) == 0) && (((long)dest & 0x03) == 0))
     62 	{
     63 	// faster aligned dword clear
     64 		ldest = (unsigned *)dest;
     65 		color += color << 16;
     66 
     67 		rwidth >>= 2;
     68 		color += color << 8;
     69 
     70 		for (ry=0 ; ry<rheight ; ry++)
     71 		{
     72 			for (rx=0 ; rx<rwidth ; rx++)
     73 				ldest[rx] = color;
     74 			ldest = (unsigned *)((byte*)ldest + vid.rowbytes);
     75 		}
     76 	}
     77 	else
     78 	{
     79 	// slower byte-by-byte clear for unaligned cases
     80 		for (ry=0 ; ry<rheight ; ry++)
     81 		{
     82 			for (rx=0 ; rx<rwidth ; rx++)
     83 				dest[rx] = color;
     84 			dest += vid.rowbytes;
     85 		}
     86 	}
     87 }
     88 
     89