00fe2f1e399f18fbbac5ea8daa1d982958c0abf4
[mesa.git] / src / mesa / main / polygon.c
1 /* $Id: polygon.c,v 1.4 1999/10/08 09:27:11 keithw Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 3.1
6 *
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28 /* $XFree86: xc/lib/GL/mesa/src/polygon.c,v 1.3 1999/04/04 00:20:29 dawes Exp $ */
29
30 #ifdef PC_HEADER
31 #include "all.h"
32 #else
33 #ifndef XFree86Server
34 #include <assert.h>
35 #include <stdlib.h>
36 #include <stdio.h>
37 #include <string.h>
38 #else
39 #include "GL/xf86glx.h"
40 #endif
41 #include "context.h"
42 #include "image.h"
43 #include "enums.h"
44 #include "macros.h"
45 #include "polygon.h"
46 #include "types.h"
47 #ifdef XFree86Server
48 #include "GL/xf86glx.h"
49 #endif
50 #endif
51
52
53
54 void gl_CullFace( GLcontext *ctx, GLenum mode )
55 {
56 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCullFace");
57
58 if (MESA_VERBOSE&VERBOSE_API)
59 fprintf(stderr, "glCullFace %s\n", gl_lookup_enum_by_nr(mode));
60
61 if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
62 gl_error( ctx, GL_INVALID_ENUM, "glCullFace" );
63 return;
64 }
65
66 ctx->Polygon.CullFaceMode = mode;
67 ctx->NewState |= NEW_POLYGON;
68
69 if (ctx->Driver.CullFace)
70 ctx->Driver.CullFace( ctx, mode );
71 }
72
73
74
75 void gl_FrontFace( GLcontext *ctx, GLenum mode )
76 {
77 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFrontFace");
78
79 if (MESA_VERBOSE&VERBOSE_API)
80 fprintf(stderr, "glFrontFace %s\n", gl_lookup_enum_by_nr(mode));
81
82 if (mode!=GL_CW && mode!=GL_CCW) {
83 gl_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
84 return;
85 }
86
87 ctx->Polygon.FrontFace = mode;
88 ctx->Polygon.FrontBit = (mode == GL_CW);
89 ctx->NewState |= NEW_POLYGON;
90
91 if (ctx->Driver.FrontFace)
92 ctx->Driver.FrontFace( ctx, mode );
93 }
94
95
96
97 void gl_PolygonMode( GLcontext *ctx, GLenum face, GLenum mode )
98 {
99 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonMode");
100
101 if (MESA_VERBOSE&VERBOSE_API)
102 fprintf(stderr, "glPolygonMode %s %s\n",
103 gl_lookup_enum_by_nr(face),
104 gl_lookup_enum_by_nr(mode));
105
106 if (face!=GL_FRONT && face!=GL_BACK && face!=GL_FRONT_AND_BACK) {
107 gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
108 return;
109 }
110 else if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
111 gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
112 return;
113 }
114
115 if (face==GL_FRONT || face==GL_FRONT_AND_BACK) {
116 ctx->Polygon.FrontMode = mode;
117 }
118 if (face==GL_BACK || face==GL_FRONT_AND_BACK) {
119 ctx->Polygon.BackMode = mode;
120 }
121
122 /* Compute a handy "shortcut" value: */
123 ctx->TriangleCaps &= ~DD_TRI_UNFILLED;
124 ctx->Polygon.Unfilled = GL_FALSE;
125
126 if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL) {
127 ctx->Polygon.Unfilled = GL_TRUE;
128 ctx->TriangleCaps |= DD_TRI_UNFILLED;
129 }
130
131 ctx->NewState |= (NEW_POLYGON | NEW_RASTER_OPS);
132
133 if (ctx->Driver.PolygonMode) {
134 (*ctx->Driver.PolygonMode)( ctx, face, mode );
135 }
136 }
137
138
139
140 /*
141 * NOTE: stipple pattern has already been unpacked.
142 */
143 void gl_PolygonStipple( GLcontext *ctx, const GLuint pattern[32] )
144 {
145 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonStipple");
146
147 if (MESA_VERBOSE&VERBOSE_API)
148 fprintf(stderr, "glPolygonStipple\n");
149
150 MEMCPY( ctx->PolygonStipple, pattern, 32 * 4 );
151
152 if (ctx->Polygon.StippleFlag) {
153 ctx->NewState |= NEW_RASTER_OPS;
154 }
155 }
156
157
158
159 void gl_GetPolygonStipple( GLcontext *ctx, GLubyte *dest )
160 {
161 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
162
163 if (MESA_VERBOSE&VERBOSE_API)
164 fprintf(stderr, "glGetPolygonStipple\n");
165
166 gl_pack_polygon_stipple( ctx, ctx->PolygonStipple, dest );
167 }
168
169
170
171 void gl_PolygonOffset( GLcontext *ctx,
172 GLfloat factor, GLfloat units )
173 {
174 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
175
176 if (MESA_VERBOSE&VERBOSE_API)
177 fprintf(stderr, "glPolygonOffset %f %f\n", factor, units);
178
179 ctx->Polygon.OffsetFactor = factor;
180 ctx->Polygon.OffsetUnits = units;
181 }
182