lines.c revision 29512df6355706cc678d3994185c20c4d66b57c4
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Mesa 3-D graphics library 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Version: 6.5.3 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Permission is hereby granted, free of charge, to any person obtaining a 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * copy of this software and associated documentation files (the "Software"), 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * to deal in the Software without restriction, including without limitation 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * and/or sell copies of the Software, and to permit persons to whom the 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Software is furnished to do so, subject to the following conditions: 13b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org * 14f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org * The above copyright notice and this permission notice shall be included 15f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org * in all copies or substantial portions of the Software. 16f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org * 17f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org */ 24f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org 25f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org 26f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "glheader.h" 27f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "context.h" 2801f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.org#include "lines.h" 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "macros.h" 3001f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.org#include "mtypes.h" 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/** 34d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org * Set the line width. 35d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org * 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \param width line width in pixels. 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \sa glLineWidth(). 39f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org */ 40f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.orgvoid GLAPIENTRY 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_mesa_LineWidth( GLfloat width ) 42708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org{ 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GET_CURRENT_CONTEXT(ctx); 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_OUTSIDE_BEGIN_END(ctx); 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (MESA_VERBOSE & VERBOSE_API) 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _mesa_debug(ctx, "glLineWidth %f\n", width); 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (width<=0.0) { 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _mesa_error( ctx, GL_INVALID_VALUE, "glLineWidth" ); 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 52b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org } 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says (in the list 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * of deprecated functionality): 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * "Wide lines and line stipple - LineWidth is not deprecated, but 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * values greater than 1.0 will generate an INVALID_VALUE error;" 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This is one of the very few cases where functionality was deprecated but 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * *NOT* removed in a later spec. Therefore, we only disallow this in a 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * forward compatible context. 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ctx->API == API_OPENGL_CORE 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org && ((ctx->Const.ContextFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org != 0)) { 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _mesa_error( ctx, GL_INVALID_VALUE, "glLineWidth" ); 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 70b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ctx->Line.Width == width) 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FLUSH_VERTICES(ctx, _NEW_LINE); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Line.Width = width; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ctx->Driver.LineWidth) 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Driver.LineWidth(ctx, width); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/** 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Set the line stipple pattern. 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \param factor pattern scale factor. 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \param pattern bit pattern. 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \sa glLineStipple(). 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Updates gl_line_attrib::StippleFactor and gl_line_attrib::StipplePattern. On 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * change flushes the vertices and notifies the driver via 92b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org * the dd_function_table::LineStipple callback. 93b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org */ 94b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.orgvoid GLAPIENTRY 95b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org_mesa_LineStipple( GLint factor, GLushort pattern ) 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org GET_CURRENT_CONTEXT(ctx); 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ASSERT_OUTSIDE_BEGIN_END(ctx); 99b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (MESA_VERBOSE & VERBOSE_API) 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org _mesa_debug(ctx, "glLineStipple %d %u\n", factor, pattern); 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org factor = CLAMP( factor, 1, 256 ); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ctx->Line.StippleFactor == factor && 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Line.StipplePattern == pattern) 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FLUSH_VERTICES(ctx, _NEW_LINE); 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Line.StippleFactor = factor; 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Line.StipplePattern = pattern; 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (ctx->Driver.LineStipple) 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ctx->Driver.LineStipple( ctx, factor, pattern ); 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/** 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Initialize the context line state. 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * \param ctx GL context. 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Initializes __struct gl_contextRec::Line and line related constants in 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * __struct gl_contextRec::Const. 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid GLAPIENTRY 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org_mesa_init_line( struct gl_context * ctx ) 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 12901f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.org ctx->Line.SmoothFlag = GL_FALSE; 130708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org ctx->Line.StippleFlag = GL_FALSE; 131708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org ctx->Line.Width = 1.0; 132708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org ctx->Line.StipplePattern = 0xffff; 133708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org ctx->Line.StippleFactor = 1; 134708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org} 135b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org