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