• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
D_FillRect(vrect_t * rect,int color)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