polygon.c revision 485f04074151686fa24d40e3eeb83029d3d8c425
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 54void 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 75void 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 97void 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 */ 143void 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 159void 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 171void 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 183