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