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