texFormat was a random value in _mesa_store_teximage3d(), fix by undoing last changes
[mesa.git] / src / mesa / main / polygon.c
1 /* $Id: polygon.c,v 1.21 2001/03/22 00:36:27 gareth Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 3.5
6 *
7 * Copyright (C) 1999-2001 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 #ifdef PC_HEADER
29 #include "all.h"
30 #else
31 #include "glheader.h"
32 #include "context.h"
33 #include "image.h"
34 #include "enums.h"
35 #include "macros.h"
36 #include "mem.h"
37 #include "polygon.h"
38 #include "mtypes.h"
39 #endif
40
41
42
43 void
44 _mesa_CullFace( GLenum mode )
45 {
46 GET_CURRENT_CONTEXT(ctx);
47 ASSERT_OUTSIDE_BEGIN_END(ctx);
48
49 if (MESA_VERBOSE&VERBOSE_API)
50 fprintf(stderr, "glCullFace %s\n", _mesa_lookup_enum_by_nr(mode));
51
52 if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
53 _mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" );
54 return;
55 }
56
57 if (ctx->Polygon.CullFaceMode == mode)
58 return;
59
60 FLUSH_VERTICES(ctx, _NEW_POLYGON);
61 ctx->Polygon.CullFaceMode = mode;
62
63 if (ctx->Driver.CullFace)
64 ctx->Driver.CullFace( ctx, mode );
65 }
66
67
68
69 void
70 _mesa_FrontFace( GLenum mode )
71 {
72 GET_CURRENT_CONTEXT(ctx);
73 ASSERT_OUTSIDE_BEGIN_END(ctx);
74
75 if (MESA_VERBOSE&VERBOSE_API)
76 fprintf(stderr, "glFrontFace %s\n", _mesa_lookup_enum_by_nr(mode));
77
78 if (mode!=GL_CW && mode!=GL_CCW) {
79 _mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
80 return;
81 }
82
83 if (ctx->Polygon.FrontFace == mode)
84 return;
85
86 FLUSH_VERTICES(ctx, _NEW_POLYGON);
87 ctx->Polygon.FrontFace = mode;
88
89 ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW);
90
91 if (ctx->Driver.FrontFace)
92 ctx->Driver.FrontFace( ctx, mode );
93 }
94
95
96
97 void
98 _mesa_PolygonMode( GLenum face, GLenum mode )
99 {
100 GET_CURRENT_CONTEXT(ctx);
101 ASSERT_OUTSIDE_BEGIN_END(ctx);
102
103 if (MESA_VERBOSE&VERBOSE_API)
104 fprintf(stderr, "glPolygonMode %s %s\n",
105 _mesa_lookup_enum_by_nr(face),
106 _mesa_lookup_enum_by_nr(mode));
107
108 if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
109 _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
110 return;
111 }
112
113 switch (face) {
114 case GL_FRONT:
115 if (ctx->Polygon.FrontMode == mode)
116 return;
117 FLUSH_VERTICES(ctx, _NEW_POLYGON);
118 ctx->Polygon.FrontMode = mode;
119 break;
120 case GL_FRONT_AND_BACK:
121 if (ctx->Polygon.FrontMode == mode &&
122 ctx->Polygon.BackMode == mode)
123 return;
124 FLUSH_VERTICES(ctx, _NEW_POLYGON);
125 ctx->Polygon.FrontMode = mode;
126 ctx->Polygon.BackMode = mode;
127 break;
128 case GL_BACK:
129 if (ctx->Polygon.BackMode == mode)
130 return;
131 FLUSH_VERTICES(ctx, _NEW_POLYGON);
132 ctx->Polygon.BackMode = mode;
133 break;
134 default:
135 _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
136 return;
137 }
138
139 ctx->_TriangleCaps &= ~DD_TRI_UNFILLED;
140 if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL)
141 ctx->_TriangleCaps |= DD_TRI_UNFILLED;
142
143 if (ctx->Driver.PolygonMode) {
144 (*ctx->Driver.PolygonMode)( ctx, face, mode );
145 }
146 }
147
148
149
150 void
151 _mesa_PolygonStipple( const GLubyte *pattern )
152 {
153 GET_CURRENT_CONTEXT(ctx);
154 ASSERT_OUTSIDE_BEGIN_END(ctx);
155
156 if (MESA_VERBOSE&VERBOSE_API)
157 fprintf(stderr, "glPolygonStipple\n");
158
159 FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE);
160 _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
161
162 if (ctx->Driver.PolygonStipple)
163 ctx->Driver.PolygonStipple( ctx, (const GLubyte *) ctx->PolygonStipple );
164 }
165
166
167
168 void
169 _mesa_GetPolygonStipple( GLubyte *dest )
170 {
171 GET_CURRENT_CONTEXT(ctx);
172 ASSERT_OUTSIDE_BEGIN_END(ctx);
173
174 if (MESA_VERBOSE&VERBOSE_API)
175 fprintf(stderr, "glGetPolygonStipple\n");
176
177 _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
178 }
179
180
181
182 void
183 _mesa_PolygonOffset( GLfloat factor, GLfloat units )
184 {
185 GET_CURRENT_CONTEXT(ctx);
186 ASSERT_OUTSIDE_BEGIN_END(ctx);
187
188 if (MESA_VERBOSE&VERBOSE_API)
189 fprintf(stderr, "glPolygonOffset %f %f\n", factor, units);
190
191 if (ctx->Polygon.OffsetFactor == factor &&
192 ctx->Polygon.OffsetUnits == units)
193 return;
194
195 FLUSH_VERTICES(ctx, _NEW_POLYGON);
196 ctx->Polygon.OffsetFactor = factor;
197 ctx->Polygon.OffsetUnits = units;
198 ctx->Polygon.OffsetMRD = units * ctx->MRD;
199
200 if (ctx->Driver.PolygonOffset)
201 ctx->Driver.PolygonOffset( ctx, factor, units );
202 }
203
204
205
206 void
207 _mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
208 {
209 GET_CURRENT_CONTEXT(ctx);
210 _mesa_PolygonOffset(factor, bias * ctx->DepthMaxF );
211 }