]> icculus.org git repositories - taylor/freespace2.git/blob - src/graphics/rect.cpp
Screenshot function filled, will output into ~/.freespace(2)/Data
[taylor/freespace2.git] / src / graphics / rect.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell 
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 /*
10  * $Logfile: /Freespace2/code/Graphics/Rect.cpp $
11  * $Revision$
12  * $Date$
13  * $Author$
14  *
15  * Routines to draw rectangles.
16  *
17  * $Log$
18  * Revision 1.2  2002/06/09 04:41:18  relnev
19  * added copyright header
20  *
21  * Revision 1.1.1.1  2002/05/03 03:28:09  root
22  * Initial import.
23  *
24  * 
25  * 3     12/02/98 5:47p Dave
26  * Put in interface xstr code. Converted barracks screen to new format.
27  * 
28  * 2     10/07/98 10:53a Dave
29  * Initial checkin.
30  * 
31  * 1     10/07/98 10:49a Dave
32  * 
33  * 3     3/10/98 4:18p John
34  * Cleaned up graphics lib.  Took out most unused gr functions.   Made D3D
35  * & Glide have popups and print screen.  Took out all >8bpp software
36  * support.  Made Fred zbuffer.  Made zbuffer allocate dynamically to
37  * support Fred.  Made zbuffering key off of functions rather than one
38  * global variable.
39  * 
40  * 2     10/26/96 2:56p John
41  * Got gradient code working.
42  * 
43  * 1     10/26/96 1:32p John
44  * Initial rev
45  *
46  * $NoKeywords: $
47  */
48
49 #include "2d.h"
50 #include "grinternal.h"
51
52 void grx_rect(int x,int y,int w,int h)
53 {
54         int i;
55         int x1 = x, x2;
56         int y1 = y, y2;
57
58         if ( w > 0 )
59                  x2 = x + w - 1;
60         else
61                  x2 = x + w + 1;
62
63         if ( h > 0 )
64                 y2 = y + h - 1;
65         else
66                 y2 = y + h + 1;
67                 
68         if ( x2 < x1 )  {
69                 int tmp;        
70                 tmp = x1;
71                 x1 = x2;
72                 x2 = tmp;
73         }
74
75         if ( y2 < y1 )  {
76                 int tmp;        
77                 tmp = y1;
78                 y1 = y2;
79                 y2 = tmp;
80         }
81
82         // Check for completely offscreen!
83         if ( x1 > gr_screen.clip_right )
84                 return;
85
86         if ( x2 < gr_screen.clip_left )
87                 return;
88
89         if ( y1 > gr_screen.clip_bottom )
90                 return;
91
92         if ( y2 < gr_screen.clip_top )
93                 return;
94
95         // Now clip
96         if ( x1 < gr_screen.clip_left ) 
97                 x1 = gr_screen.clip_left;
98
99         if ( x2 > gr_screen.clip_right ) 
100                 x2 = gr_screen.clip_right;
101
102         if ( y1 < gr_screen.clip_top ) 
103                 y1 = gr_screen.clip_top;
104
105         if ( y2 > gr_screen.clip_bottom ) 
106                 y2 = gr_screen.clip_bottom;
107
108         w = x2-x1+1;
109         if ( w < 1 ) return;
110
111         h = y2-y1+1;
112         if ( h < 1 ) return;
113
114         gr_lock();
115
116         ubyte *dptr;
117
118         /* HARDWARE_ONLY
119         if ( Current_alphacolor )       {
120                 for (i=0; i<h; i++ )    {
121                         dptr = GR_SCREEN_PTR(ubyte,x1,y1+i);
122
123                         int j;
124                         for( j=0; j<w; j++ )    {
125                                 *dptr++ = Current_alphacolor->table.lookup[14][*dptr];
126                         }
127                 }
128         } else {
129         */
130                 for (i=0; i<h; i++ )    {
131                         dptr = GR_SCREEN_PTR(ubyte,x1,y1+i);
132                         memset( dptr, gr_screen.current_color.raw8, w );
133                 }       
134         gr_unlock();
135
136 }
137