s_lines.c revision 77df88727cb0a423dd5cb41498c2302d9df4fce7
177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul/* $Id: s_lines.c,v 1.31 2002/08/07 00:45:07 brianp Exp $ */
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
5b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Version:  4.1
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
7b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"),
11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation
12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions:
1522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
1822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
27e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h"
2946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell#include "colormac.h"
30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h"
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mmath.h"
320070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h"
33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h"
35cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h"
36b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h"
37b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h"
38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*
41b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple.
42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */
43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulcompute_stipple_mask( GLcontext *ctx, GLuint len, GLubyte mask[] )
45b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{
46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint i;
48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   for (i = 0; i < len; i++) {
50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf;
51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      if ((1 << bit) & ctx->Line.StipplePattern) {
52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_TRUE;
53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      else {
55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_FALSE;
56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
57b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      swrast->StippleCounter++;
58b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
59b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul}
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
63b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side.
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
65b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
66b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Pauldraw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor )
67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
68b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLint width, start;
69cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
70b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(span->end < MAX_WIDTH);
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
72b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   width = (GLint) CLAMP( ctx->Line.Width, MIN_LINE_WIDTH, MAX_LINE_WIDTH );
73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (width & 1)
75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2;
76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else
77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2 - 1;
78b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
79b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (xMajor) {
8077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *y = span->array->y;
81a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
82a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
84b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
8677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i] -= start;
87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
88b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
9077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i]++;
91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
93b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
94b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
95b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
96b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
97b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
100b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
10177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *x = span->array->x;
102a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
103a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
104b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i] -= start;
108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
109b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
110b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
11177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i]++;
112b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
114b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
116b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
117b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
118b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
119b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
120b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
125b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
126b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*****                    Rasterization                           *****/
127b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
128b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
129b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
130b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/* Flat, color index line */
131b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void flat_ci_line( GLcontext *ctx,
132b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                          const SWvertex *vert0,
133b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul			  const SWvertex *vert1 )
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
13577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
13677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
137b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
138b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
139b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
140b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
141b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
142b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX, SPAN_XY);
14377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.index = IntToFixed(vert1->index);
14477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.indexStep = 0;
14577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
14677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
14977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
15077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
15177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
15277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
15377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
154b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
15877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   _mesa_write_index_span(ctx, &span);
159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, RGBA line */
163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_rgba_line( GLcontext *ctx,
164a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                            const SWvertex *vert0,
165a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			    const SWvertex *vert1 )
166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
16777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
16877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
169b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
170b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
171b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
172b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
173b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
174b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA, SPAN_XY);
17577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
17677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
17777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
17877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
17977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.redStep = 0;
18077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.greenStep = 0;
18177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blueStep = 0;
18277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alphaStep = 0;
18377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
18477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
18777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
18877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
18977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
19077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
19177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
192b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
19677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   _mesa_write_rgba_span(ctx, &span);
197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth shaded, color index line */
201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_ci_line( GLcontext *ctx,
202a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                            const SWvertex *vert0,
203a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			    const SWvertex *vert1 )
204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
20577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
20677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
20777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLuint *index;
208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
209b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
210b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
211b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
213b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_INDEX);
21477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
21577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
21677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   index = span.array->index;
217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1
22077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
22177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
22277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
22377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
22477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      index[span.end] = I;	\
22577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
226b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
23077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   _mesa_write_index_span(ctx, &span);
231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, RGBA line */
235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_rgba_line( GLcontext *ctx,
236a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                       	      const SWvertex *vert0,
237a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			      const SWvertex *vert1 )
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
23977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
24077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
24177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLchan (*rgba)[4];
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
243b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
244b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
245b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
247b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_RGBA);
24877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
24977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
25077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   rgba = span.array->rgba;
251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
25577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)				\
25677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {						\
25777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;				\
25877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;				\
25977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][RCOMP] = FixedToInt(r0);	\
26077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][GCOMP] = FixedToInt(g0);	\
26177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][BCOMP] = FixedToInt(b0);	\
26277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][ACOMP] = FixedToInt(a0);	\
26377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;				\
264b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
26877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   _mesa_write_rgba_span(ctx, &span);
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth shaded, color index, any width, maybe stippled */
273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_smooth_ci_line( GLcontext *ctx,
274a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                           	    const SWvertex *vert0,
275a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *vert1 )
276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
277b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
27877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
27977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
28077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLdepth *z;
28177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLfloat *fog;
28277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLuint *index;
283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
284b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
286b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
287b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_INDEX);
28877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
28977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
29077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   z = span.array->z;
29177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   fog = span.array->fog;
29277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   index = span.array->index;
293b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
294b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
29795e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1
29977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
30077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
30177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
30277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
30377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      z[span.end] = Z;		\
30477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      fog[span.end] = fog0;	\
30577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      index[span.end] = I;	\
30677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
309b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
310b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
31177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
31277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
315b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
31677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
317b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
318b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
31977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_index_span(ctx, &span);
320b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat shaded, color index, any width, maybe stippled */
325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_flat_ci_line( GLcontext *ctx,
326a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *vert0,
327a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *vert1 )
328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
329b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
33077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
33177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
33277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLdepth *z;
33377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLfloat *fog;
334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
335b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
336b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
337b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX,
338b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG);
33977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.index = IntToFixed(vert1->index);
34077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.indexStep = 0;
34177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
34277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
34377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   z = span.array->z;
34477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   fog = span.array->fog;
345b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
346b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
34995e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
35077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
35177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
35277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
35377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
35477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      z[span.end] = Z;		\
35577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      fog[span.end] = fog0;	\
35677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
359b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
360b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
36177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
36277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
365b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
36677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
367b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
368b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
36977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_index_span(ctx, &span);
370b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_smooth_rgba_line( GLcontext *ctx,
376a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                      const SWvertex *vert0,
377a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				      const SWvertex *vert1 )
378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
379b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
38077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
38177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
38277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLdepth *z;
38377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLchan (*rgba)[4];
38477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLfloat *fog;
385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
386b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
388b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
389b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA);
39077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
39177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
39277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   z = span.array->z;
39377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   rgba = span.array->rgba;
39477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   fog = span.array->fog;
395b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
396b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
39995e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
40277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)				\
40377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {						\
40477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;				\
40577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;				\
40677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      z[span.end] = Z;				\
40777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][RCOMP] = FixedToInt(r0);	\
40877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][GCOMP] = FixedToInt(g0);	\
40977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][BCOMP] = FixedToInt(b0);	\
41077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      rgba[span.end][ACOMP] = FixedToInt(a0);	\
41177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      fog[span.end] = fog0;			\
41277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;				\
413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
415b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
416b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
41777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
41877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
421b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
42277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
423b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
424b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
42577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_rgba_span(ctx, &span);
426b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_flat_rgba_line( GLcontext *ctx,
431a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *vert0,
432a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *vert1 )
433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
434b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
43577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
43677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLint *x, *y;
43777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLdepth *z;
43877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLfloat *fog;
439b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
440b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
441b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
442b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA,
443b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG);
44477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
44577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
44677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
44777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
44877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.redStep = 0;
44977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.greenStep = 0;
45077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blueStep = 0;
45177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alphaStep = 0;
45277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   x = span.array->x;
45377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   y = span.array->y;
45477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   z = span.array->z;
45577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   fog = span.array->fog;
456b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
457b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
46095e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
46177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul#define PLOT(X,Y)		\
46277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   {				\
46377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      x[span.end] = X;		\
46477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      y[span.end] = Y;		\
46577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      z[span.end] = Z;		\
46677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      fog[span.end] = fog0;	\
46777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;		\
468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
470b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
471b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
47277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
47377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
476b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
47777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
478b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
479b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
48077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_rgba_span(ctx, &span);
481b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, textured, any width, maybe stippled */
486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_textured_line( GLcontext *ctx,
487a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                const SWvertex *vert0,
488a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				const SWvertex *vert1 )
489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
490b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
49177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
492b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
493b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
494b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
495b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
496bf80e1ed620836e2ca0dd3f7d2d4cb187d17563dBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
49777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
49877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
49977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
50077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
50177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.redStep = 0;
50277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.greenStep = 0;
50377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blueStep = 0;
50477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alphaStep = 0;
50577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specRed = ChanToFixed(vert1->specular[0]);
50677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specGreen = ChanToFixed(vert1->specular[1]);
50777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specBlue = ChanToFixed(vert1->specular[2]);
50877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specRedStep = 0;
50977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specGreenStep = 0;
51077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specBlueStep = 0;
511b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
512b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
51595e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
517b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
518b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
51977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->x[span.end] = X;				\
52077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->y[span.end] = Y;				\
52177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->z[span.end] = Z;				\
52277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->fog[span.end] = fog0;				\
52377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][0] = fragTexcoord[0];	\
52477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][1] = fragTexcoord[1];	\
52577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][2] = fragTexcoord[2];	\
52677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->lambda[0][span.end] = 0.0;			\
52777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;						\
528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
530b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
531b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
53277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
53377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
536b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
53777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
538b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
539b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
54077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_texture_span(ctx, &span);
541b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, textured, any width, maybe stippled */
547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_textured_line( GLcontext *ctx,
548a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *vert0,
549a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *vert1 )
550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
551b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
55277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
553cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
554b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
556b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
557b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_TEXTURE | SPAN_LAMBDA);
558b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
559b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
56295e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
566b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
567b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
56877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->x[span.end] = X;				\
56977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->y[span.end] = Y;				\
57077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->z[span.end] = Z;				\
57177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->fog[span.end] = fog0;				\
57277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][RCOMP] = FixedToInt(r0);	\
57377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][GCOMP] = FixedToInt(g0);	\
57477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][BCOMP] = FixedToInt(b0);	\
57577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][ACOMP] = FixedToInt(a0);	\
57677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][0] = fragTexcoord[0];	\
57777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][1] = fragTexcoord[1];	\
57877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->texcoords[0][span.end][2] = fragTexcoord[2];	\
57977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->lambda[0][span.end] = 0.0;			\
58077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;						\
581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
583b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
584b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
58577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
58677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
589b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
59077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
591b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
592b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
59377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_texture_span(ctx, &span);
594b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, multitextured, any width, maybe stippled, separate specular
599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation.
600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_multitextured_line( GLcontext *ctx,
602a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				       const SWvertex *vert0,
603a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				       const SWvertex *vert1 )
604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
605b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
60677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
607b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint u;
608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
609b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
610b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
611b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
612b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_SPEC | SPAN_TEXTURE | SPAN_LAMBDA);
613b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
614b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
61795e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1
620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1
622b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)							\
623b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {									\
62477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->x[span.end] = X;					\
62577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->y[span.end] = Y;					\
62677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->z[span.end] = Z;					\
62777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->fog[span.end] = fog0;					\
62877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][RCOMP] = FixedToInt(r0);		\
62977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][GCOMP] = FixedToInt(g0);		\
63077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][BCOMP] = FixedToInt(b0);		\
63177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->rgba[span.end][ACOMP] = FixedToInt(a0);		\
63277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->spec[span.end][RCOMP] = FixedToInt(sr0);		\
63377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->spec[span.end][GCOMP] = FixedToInt(sg0);		\
63477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->spec[span.end][BCOMP] = FixedToInt(sb0);		\
635b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {		\
636b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (ctx->Texture.Unit[u]._ReallyEnabled) {			\
63777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][0] = fragTexcoord[u][0];	\
63877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][1] = fragTexcoord[u][1];	\
63977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][2] = fragTexcoord[u][2];	\
64077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->lambda[u][span.end] = 0.0;			\
641b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }								\
642b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }									\
64377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;							\
644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
646b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
647b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
64877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
64977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
652b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
65377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
654b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
655b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
65677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_texture_span(ctx, &span);
657b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, multitextured, any width, maybe stippled, separate specular
662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation.
663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_multitextured_line( GLcontext *ctx,
665a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                     const SWvertex *vert0,
666a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				     const SWvertex *vert1 )
667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
668b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
66977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
670b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint u;
671b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
672b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
673b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
674b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
675b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
67677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
67777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
67877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
67977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
68077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.redStep = 0;
68177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.greenStep = 0;
68277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.blueStep = 0;
68377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.alphaStep = 0;
68477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specRed = ChanToFixed(vert1->specular[0]);
68577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specGreen = ChanToFixed(vert1->specular[1]);
68677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specBlue = ChanToFixed(vert1->specular[2]);
68777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specRedStep = 0;
68877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specGreenStep = 0;
68977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.specBlueStep = 0;
690b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
691b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
69495e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1
696b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)							\
697b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {									\
69877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->x[span.end] = X;					\
69977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->y[span.end] = Y;					\
70077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->z[span.end] = Z;					\
70177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.array->fog[span.end] = fog0;					\
702b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {		\
703b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (ctx->Texture.Unit[u]._ReallyEnabled) {			\
70477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][0] = fragTexcoord[u][0];	\
70577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][1] = fragTexcoord[u][1];	\
70677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->texcoords[u][span.end][2] = fragTexcoord[u][2];	\
70777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            span.array->lambda[u][span.end] = 0.0;			\
708b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }								\
709b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }									\
71077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.end++;							\
711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
713b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
714b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
71577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      span.arrayMask |= SPAN_MASK;
71677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);
717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
719b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
72077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      draw_wide_line(ctx, &span, xMajor);
721b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
722b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
72377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      _mesa_write_texture_span(ctx, &span);
724b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
72822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesvoid _swrast_add_spec_terms_line( GLcontext *ctx,
72946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell				  const SWvertex *v0,
73046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell				  const SWvertex *v1 )
73146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{
73246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv0 = (SWvertex *)v0;
73346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv1 = (SWvertex *)v1;
73446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   GLchan c[2][4];
73546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[0], ncv0->color );
73646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[1], ncv1->color );
73746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv0->color, ncv0->specular );
73846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv1->color, ncv1->specular );
73946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
74046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv0->color, c[0] );
74146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv1->color, c[1] );
74246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell}
74346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell
744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG
746ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void
747ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx);  /* silence compiler warning */
748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx)
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
751cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
752cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   printf("Line Func == ");
754cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   if (swrast->Line == flat_ci_line)
755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_ci_line\n");
756cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_rgba_line)
757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_rgba_line\n");
758cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_ci_line)
759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_ci_line\n");
760cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_rgba_line)
761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_rgba_line\n");
762cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_smooth_ci_line)
763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_smooth_ci_line\n");
764cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_flat_ci_line)
765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_flat_ci_line\n");
766cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_smooth_rgba_line)
767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_smooth_rgba_line\n");
768cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_flat_rgba_line)
769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_flat_rgba_line\n");
770cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_textured_line)
771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_textured_line\n");
772cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_textured_line)
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_textured_line\n");
774cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_multitextured_line)
775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_multitextured_line\n");
776cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_multitextured_line)
777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_multitextured_line\n");
778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else
7794b7ccad6829d11c07f1ceac3b3d12f8aec9e640bBrian Paul      printf("Driver func %p\n", (void *) swrast->Line);
780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
785233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG
786233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
787233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */
788233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL;
789233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
790233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc)                   \
791233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo {                                    \
792233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    lineFuncName = #lineFunc;           \
793233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    /*printf("%s\n", lineFuncName);*/   \
794233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    swrast->Line = lineFunc;            \
795233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0)
796233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
797233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else
798233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
799c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc)  swrast->Line = lineFunc
800233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
801233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif
802233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
803233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
804233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current
807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code.
811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
813cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx )
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
815cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
816b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul   const GLboolean rgbmode = ctx->Visual.rgbMode;
817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
818b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->RenderMode == GL_RENDER) {
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Line.SmoothFlag) {
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* antialiased lines */
8210070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         _swrast_choose_aa_line_function(ctx);
8220070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         ASSERT(swrast->Triangle);
823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
8248afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul      else if (ctx->Texture._EnabledUnits) {
8258afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul         if (ctx->Texture._EnabledUnits > 1 ||
826ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul	     (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)) {
827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* multi-texture and/or separate specular color */
828b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Light.ShadeModel == GL_SMOOTH)
829233aafbb30594d0193b00705d0532be97060ebd1Brian Paul               USE(smooth_multitextured_line);
830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else
831233aafbb30594d0193b00705d0532be97060ebd1Brian Paul               USE(flat_multitextured_line);
832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
834b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Light.ShadeModel == GL_SMOOTH) {
835233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                USE(smooth_textured_line);
836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
838233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                USE(flat_textured_line);
839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
843b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul	 if (ctx->Light.ShadeModel == GL_SMOOTH) {
844b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0
845b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                || ctx->Line.StippleFlag) {
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
847b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_smooth_rgba_line);
848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
849b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_smooth_ci_line);
850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
853233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(smooth_rgba_line);
854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
855233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(smooth_ci_line);
856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
859b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0
860b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                || ctx->Line.StippleFlag) {
861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
862b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_flat_rgba_line);
863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
864b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_flat_ci_line);
865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
868233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(flat_rgba_line);
869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
870233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(flat_ci_line);
871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
875b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else if (ctx->RenderMode == GL_FEEDBACK) {
876233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_feedback_line);
877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
879b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      ASSERT(ctx->RenderMode == GL_SELECT);
880233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_select_line);
881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*_mesa_print_line_function(ctx);*/
884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
885