ca284c2fff26f3cf0d407933310c11638c8f6b40
1 /* $Id: polygon.c,v 1.5 1999/11/08 07:36:44 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
28 /* $XFree86: xc/lib/GL/mesa/src/polygon.c,v 1.3 1999/04/04 00:20:29 dawes Exp $ */
39 #include "GL/xf86glx.h"
51 void gl_CullFace( GLcontext
*ctx
, GLenum mode
)
53 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glCullFace");
55 if (MESA_VERBOSE
&VERBOSE_API
)
56 fprintf(stderr
, "glCullFace %s\n", gl_lookup_enum_by_nr(mode
));
58 if (mode
!=GL_FRONT
&& mode
!=GL_BACK
&& mode
!=GL_FRONT_AND_BACK
) {
59 gl_error( ctx
, GL_INVALID_ENUM
, "glCullFace" );
63 ctx
->Polygon
.CullFaceMode
= mode
;
64 ctx
->NewState
|= NEW_POLYGON
;
66 if (ctx
->Driver
.CullFace
)
67 ctx
->Driver
.CullFace( ctx
, mode
);
72 void gl_FrontFace( GLcontext
*ctx
, GLenum mode
)
74 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glFrontFace");
76 if (MESA_VERBOSE
&VERBOSE_API
)
77 fprintf(stderr
, "glFrontFace %s\n", gl_lookup_enum_by_nr(mode
));
79 if (mode
!=GL_CW
&& mode
!=GL_CCW
) {
80 gl_error( ctx
, GL_INVALID_ENUM
, "glFrontFace" );
84 ctx
->Polygon
.FrontFace
= mode
;
85 ctx
->Polygon
.FrontBit
= (mode
== GL_CW
);
86 ctx
->NewState
|= NEW_POLYGON
;
88 if (ctx
->Driver
.FrontFace
)
89 ctx
->Driver
.FrontFace( ctx
, mode
);
94 void gl_PolygonMode( GLcontext
*ctx
, GLenum face
, GLenum mode
)
96 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glPolygonMode");
98 if (MESA_VERBOSE
&VERBOSE_API
)
99 fprintf(stderr
, "glPolygonMode %s %s\n",
100 gl_lookup_enum_by_nr(face
),
101 gl_lookup_enum_by_nr(mode
));
103 if (face
!=GL_FRONT
&& face
!=GL_BACK
&& face
!=GL_FRONT_AND_BACK
) {
104 gl_error( ctx
, GL_INVALID_ENUM
, "glPolygonMode(face)" );
107 else if (mode
!=GL_POINT
&& mode
!=GL_LINE
&& mode
!=GL_FILL
) {
108 gl_error( ctx
, GL_INVALID_ENUM
, "glPolygonMode(mode)" );
112 if (face
==GL_FRONT
|| face
==GL_FRONT_AND_BACK
) {
113 ctx
->Polygon
.FrontMode
= mode
;
115 if (face
==GL_BACK
|| face
==GL_FRONT_AND_BACK
) {
116 ctx
->Polygon
.BackMode
= mode
;
119 /* Compute a handy "shortcut" value: */
120 ctx
->TriangleCaps
&= ~DD_TRI_UNFILLED
;
121 ctx
->Polygon
.Unfilled
= GL_FALSE
;
123 if (ctx
->Polygon
.FrontMode
!=GL_FILL
|| ctx
->Polygon
.BackMode
!=GL_FILL
) {
124 ctx
->Polygon
.Unfilled
= GL_TRUE
;
125 ctx
->TriangleCaps
|= DD_TRI_UNFILLED
;
128 ctx
->NewState
|= (NEW_POLYGON
| NEW_RASTER_OPS
);
130 if (ctx
->Driver
.PolygonMode
) {
131 (*ctx
->Driver
.PolygonMode
)( ctx
, face
, mode
);
138 * NOTE: stipple pattern has already been unpacked.
140 void gl_PolygonStipple( GLcontext
*ctx
, const GLuint pattern
[32] )
142 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glPolygonStipple");
144 if (MESA_VERBOSE
&VERBOSE_API
)
145 fprintf(stderr
, "glPolygonStipple\n");
147 MEMCPY( ctx
->PolygonStipple
, pattern
, 32 * 4 );
149 if (ctx
->Polygon
.StippleFlag
) {
150 ctx
->NewState
|= NEW_RASTER_OPS
;
156 void gl_GetPolygonStipple( GLcontext
*ctx
, GLubyte
*dest
)
158 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glPolygonOffset");
160 if (MESA_VERBOSE
&VERBOSE_API
)
161 fprintf(stderr
, "glGetPolygonStipple\n");
163 gl_pack_polygon_stipple( ctx
, ctx
->PolygonStipple
, dest
);
168 void gl_PolygonOffset( GLcontext
*ctx
,
169 GLfloat factor
, GLfloat units
)
171 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx
, "glPolygonOffset");
173 if (MESA_VERBOSE
&VERBOSE_API
)
174 fprintf(stderr
, "glPolygonOffset %f %f\n", factor
, units
);
176 ctx
->Polygon
.OffsetFactor
= factor
;
177 ctx
->Polygon
.OffsetUnits
= units
;