xref: /reactos/dll/opengl/mesa/scissor.c (revision 6b700c6a)
1 /* $Id: scissor.c,v 1.6 1997/11/25 03:38:58 brianp Exp $ */
2 
3 /*
4  * Mesa 3-D graphics library
5  * Version:  2.5
6  * Copyright (C) 1995-1997  Brian Paul
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the Free
20  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 
23 
24 /*
25  * $Log: scissor.c,v $
26  * Revision 1.6  1997/11/25 03:38:58  brianp
27  * small optimization to gl_Scissor()  (Daryll Strauss)
28  *
29  * Revision 1.5  1997/07/24 01:21:56  brianp
30  * changed precompiled header symbol from PCH to PC_HEADER
31  *
32  * Revision 1.4  1997/05/28 03:26:29  brianp
33  * added precompiled header (PCH) support
34  *
35  * Revision 1.3  1997/05/17 03:17:50  brianp
36  * faster gl_scissor_span() from Mats Lofkvist
37  *
38  * Revision 1.2  1996/09/15 14:18:37  brianp
39  * now use GLframebuffer and GLvisual
40  *
41  * Revision 1.1  1996/09/13 01:38:16  brianp
42  * Initial revision
43  *
44  */
45 
46 
47 #ifdef PC_HEADER
48 #include "all.h"
49 #else
50 #include "context.h"
51 #include "macros.h"
52 #include "dlist.h"
53 #include "scissor.h"
54 #include "types.h"
55 #endif
56 
57 
58 void gl_Scissor( GLcontext *ctx,
59                  GLint x, GLint y, GLsizei width, GLsizei height )
60 {
61    if (width<0 || height<0) {
62       gl_error( ctx, GL_INVALID_VALUE, "glScissor" );
63       return;
64    }
65    if (INSIDE_BEGIN_END(ctx)) {
66       gl_error( ctx, GL_INVALID_OPERATION, "glBegin" );
67       return;
68    }
69 
70    if (x!=ctx->Scissor.X || y!=ctx->Scissor.Y ||
71        width!=ctx->Scissor.Width || height!=ctx->Scissor.Height) {
72       ctx->Scissor.X = x;
73       ctx->Scissor.Y = y;
74       ctx->Scissor.Width = width;
75       ctx->Scissor.Height = height;
76       ctx->NewState |= NEW_ALL;  /* TODO: this is overkill */
77    }
78 }
79 
80 
81 
82 /*
83  * Apply the scissor test to a span of pixels.
84  * Return:  0 = all pixels in the span are outside the scissor box.
85  *          1 = one or more pixels passed the scissor test.
86  */
87 GLint gl_scissor_span( GLcontext *ctx,
88                        GLuint n, GLint x, GLint y, GLubyte mask[] )
89 {
90    /* first check if whole span is outside the scissor box */
91    if (y<ctx->Buffer->Ymin || y>ctx->Buffer->Ymax
92        || x>ctx->Buffer->Xmax || x+(GLint)n-1<ctx->Buffer->Xmin) {
93       return 0;
94    }
95    else {
96       GLint i;
97       GLint xMin = ctx->Buffer->Xmin;
98       GLint xMax = ctx->Buffer->Xmax;
99       for (i=0; x+i < xMin; i++) {
100          mask[i] = 0;
101       }
102       for (i=(GLint)n-1; x+i > xMax; i--) {
103          mask[i] = 0;
104       }
105 
106       return 1;
107    }
108 }
109 
110 
111 
112 
113 /*
114  * Apply the scissor test to an array of pixels.
115  */
116 GLuint gl_scissor_pixels( GLcontext *ctx,
117                           GLuint n, const GLint x[], const GLint y[],
118                           GLubyte mask[] )
119 {
120    GLint xmin = ctx->Buffer->Xmin;
121    GLint xmax = ctx->Buffer->Xmax;
122    GLint ymin = ctx->Buffer->Ymin;
123    GLint ymax = ctx->Buffer->Ymax;
124    GLuint i;
125 
126    for (i=0;i<n;i++) {
127       mask[i] &= (x[i]>=xmin) & (x[i]<=xmax) & (y[i]>=ymin) & (y[i]<=ymax);
128    }
129 
130    return 1;
131 }
132 
133