1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h"
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_aaline.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_context.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_feedback.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_lines.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_span.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Init the mask[] array to implement a line stipple.
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_stipple_mask( struct gl_context *ctx, GLuint len, GLubyte mask[] )
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWcontext *swrast = SWRAST_CONTEXT(ctx);
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < len; i++) {
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((1 << bit) & ctx->Line.StipplePattern) {
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mask[i] = GL_TRUE;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mask[i] = GL_FALSE;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      swrast->StippleCounter++;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * To draw a wide line we can simply redraw the span N times, side by side.
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdraw_wide_line( struct gl_context *ctx, SWspan *span, GLboolean xMajor )
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint width = (GLint) CLAMP(ctx->Line.Width,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     ctx->Const.MinLineWidth,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     ctx->Const.MaxLineWidth);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint start;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(span->end < SWRAST_MAX_WIDTH);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (width & 1)
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      start = width / 2;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      start = width / 2 - 1;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (xMajor) {
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint *y = span->array->y;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint w;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (w = 0; w < width; w++) {
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (w == 0) {
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < span->end; i++)
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               y[i] -= start;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < span->end; i++)
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               y[i]++;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _swrast_write_rgba_span(ctx, span);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint *x = span->array->x;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLint w;
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (w = 0; w < width; w++) {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (w == 0) {
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < span->end; i++)
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               x[i] -= start;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < span->end; i++)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               x[i]++;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _swrast_write_rgba_span(ctx, span);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*****                    Rasterization                           *****/
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME simple_no_z_rgba_line
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h"
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Z, fog, wide, stipple RGBA line */
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME rgba_line
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span)					\
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Line.StippleFlag) {					\
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      span.arrayMask |= SPAN_MASK;				\
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_stipple_mask(ctx, span.end, span.array->mask);	\
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }								\
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Line.Width > 1.0) {					\
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }								\
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {							\
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _swrast_write_rgba_span(ctx, &span);			\
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h"
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* General-purpose line (any/all features). */
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NAME general_line
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_RGBA
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_Z
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INTERP_ATTRIBS
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_SPAN(span)					\
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Line.StippleFlag) {					\
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      span.arrayMask |= SPAN_MASK;				\
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      compute_stipple_mask(ctx, span.end, span.array->mask);	\
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }								\
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Line.Width > 1.0) {					\
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }								\
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {							\
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _swrast_write_rgba_span(ctx, &span);			\
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "s_linetemp.h"
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_add_spec_terms_line(struct gl_context *ctx,
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const SWvertex *v0, const SWvertex *v1)
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWvertex *ncv0 = (SWvertex *)v0;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWvertex *ncv1 = (SWvertex *)v1;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLfloat rSum, gSum, bSum;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLchan cSave[2][4];
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* save original colors */
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_CHAN4(cSave[0], ncv0->color);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_CHAN4(cSave[1], ncv1->color);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sum v0 */
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rSum = CHAN_TO_FLOAT(ncv0->color[0]) + ncv0->attrib[FRAG_ATTRIB_COL1][0];
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gSum = CHAN_TO_FLOAT(ncv0->color[1]) + ncv0->attrib[FRAG_ATTRIB_COL1][1];
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bSum = CHAN_TO_FLOAT(ncv0->color[2]) + ncv0->attrib[FRAG_ATTRIB_COL1][2];
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[0], rSum);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[1], gSum);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[2], bSum);
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* sum v1 */
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   rSum = CHAN_TO_FLOAT(ncv1->color[0]) + ncv1->attrib[FRAG_ATTRIB_COL1][0];
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   gSum = CHAN_TO_FLOAT(ncv1->color[1]) + ncv1->attrib[FRAG_ATTRIB_COL1][1];
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bSum = CHAN_TO_FLOAT(ncv1->color[2]) + ncv1->attrib[FRAG_ATTRIB_COL1][2];
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[0], rSum);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[1], gSum);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[2], bSum);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* draw */
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* restore original colors */
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_CHAN4(ncv0->color, cSave[0]);
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COPY_CHAN4(ncv1->color, cSave[1]);
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* record the current line function name */
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *lineFuncName = NULL;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE(lineFunc)                   \
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo {                                    \
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    lineFuncName = #lineFunc;           \
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    /*printf("%s\n", lineFuncName);*/   \
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    swrast->Line = lineFunc;            \
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define USE(lineFunc)  swrast->Line = lineFunc
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine which line drawing function to use given the current
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering context.
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tests to this code.
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_swrast_choose_line( struct gl_context *ctx )
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SWcontext *swrast = SWRAST_CONTEXT(ctx);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean specular = (ctx->Fog.ColorSumEnabled ||
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         (ctx->Light.Enabled &&
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR));
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->RenderMode == GL_RENDER) {
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Line.SmoothFlag) {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* antialiased lines */
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _swrast_choose_aa_line_function(ctx);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(swrast->Line);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (ctx->Texture._EnabledCoordUnits
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               || _swrast_use_fragment_program(ctx)
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               || swrast->_FogEnabled
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               || specular) {
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         USE(general_line);
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (ctx->Depth.Test
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               || ctx->Line.Width != 1.0
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               || ctx->Line.StippleFlag) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* no texture, but Z, fog, width>1, stipple, etc. */
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if CHAN_BITS == 32
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         USE(general_line);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         USE(rgba_line);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(!ctx->Depth.Test);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ASSERT(ctx->Line.Width == 1.0);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* simple lines */
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         USE(simple_no_z_rgba_line);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (ctx->RenderMode == GL_FEEDBACK) {
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      USE(_swrast_feedback_line);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ASSERT(ctx->RenderMode == GL_SELECT);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      USE(_swrast_select_line);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
269