s_lines.c revision a670c1280b78e6da3b298b61f623e4c733c6be94
1a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul/* $Id: s_lines.c,v 1.28 2002/04/19 00:38:27 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) {
80a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
81a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
82b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
84b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul               span->yArray[i] -= start;
86b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
88b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul               span->yArray[i]++;
90b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
92b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
93b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
94b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
95b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
96b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
97b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
100a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
101a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
102b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
103b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
104b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul               span->xArray[i] -= start;
106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
107b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
109b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul               span->xArray[i]++;
110b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
111b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
112b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
114b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
116b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
117b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
118b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
123b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
124b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*****                    Rasterization                           *****/
125b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
126b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
127b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
128b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/* Flat, color index line */
129b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void flat_ci_line( GLcontext *ctx,
130b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                          const SWvertex *vert0,
131b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul			  const SWvertex *vert1 )
132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
133b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
134b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
135b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
136b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
137b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
138b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
139b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX, SPAN_XY);
140b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= SPAN_XY;
141b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= SPAN_INDEX;*/
142b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.index = IntToFixed(vert1->index);
143b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.indexStep = 0;
144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
146b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)			\
147b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {					\
148b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;	\
149b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;	\
150b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;			\
151b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
155b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   _mesa_write_index_span(ctx, &span);
156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, RGBA line */
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_rgba_line( GLcontext *ctx,
161a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                            const SWvertex *vert0,
162a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			    const SWvertex *vert1 )
163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
164b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
165b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
166b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
167b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
168b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
169b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
170b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA, SPAN_XY);
171b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= SPAN_XY;
172b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= SPAN_RGBA;*/
173b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
174b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
175b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
176b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
177b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.redStep = 0;
178b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.greenStep = 0;
179b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blueStep = 0;
180b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alphaStep = 0;
181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
183b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)			\
184b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {					\
185b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;	\
186b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;	\
187b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;			\
188b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
192b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   _mesa_write_rgba_span(ctx, &span);
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth shaded, color index line */
197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_ci_line( GLcontext *ctx,
198a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                            const SWvertex *vert0,
199a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			    const SWvertex *vert1 )
200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
201b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
203b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
204b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
205b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
207b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_INDEX);
208b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_INDEX);*/
209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1
212b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)			\
213b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {					\
214b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;	\
215b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;	\
216b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.index[span.end] = I;	\
217b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;			\
218b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
222b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   _mesa_write_index_span(ctx, &span);
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, RGBA line */
227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_rgba_line( GLcontext *ctx,
228a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                       	      const SWvertex *vert0,
229a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul			      const SWvertex *vert1 )
230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
231b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
233b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
234b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(!ctx->Line.StippleFlag);
235b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Line.Width == 1.0F);
236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
237b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0, SPAN_XY | SPAN_RGBA);
238b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_RGBA);*/
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
243b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
244b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
245b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;				\
246b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;				\
247b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][RCOMP] = FixedToInt(r0);	\
248b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][GCOMP] = FixedToInt(g0);	\
249b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][BCOMP] = FixedToInt(b0);	\
250b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][ACOMP] = FixedToInt(a0);	\
251b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;						\
252b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
256b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   _mesa_write_rgba_span(ctx, &span);
257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth shaded, color index, any width, maybe stippled */
261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_smooth_ci_line( GLcontext *ctx,
262a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                           	    const SWvertex *vert0,
263a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *vert1 )
264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
265b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
266b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
268b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
270b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
271b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_INDEX);
272b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_INDEX);*/
273b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
274b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
27795e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1
279b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)			\
280b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {					\
281b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;	\
282b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;	\
283b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;	\
284b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;	\
285b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.index[span.end] = I;	\
286b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;			\
287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
289b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
290b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
291b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
292b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
295b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
296b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
297b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
298b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
299b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_index_span(ctx, &span);
300b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat shaded, color index, any width, maybe stippled */
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_flat_ci_line( GLcontext *ctx,
306a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *vert0,
307a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *vert1 )
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
309b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
310b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
312b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
313b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
314b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_INDEX,
315b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG);
316b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG);
317b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= SPAN_INDEX;*/
318b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.index = IntToFixed(vert1->index);
319b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.indexStep = 0;
320b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
321b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
32495e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
325b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)			\
326b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {					\
327b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;	\
328b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;	\
329b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;	\
330b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;	\
331b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;			\
332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
334b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
335b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
336b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
337b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
340b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
341b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
342b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
343b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
344b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_index_span(ctx, &span);
345b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_smooth_rgba_line( GLcontext *ctx,
351a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                      const SWvertex *vert0,
352a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				      const SWvertex *vert1 )
353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
354b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
355b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
357b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
359b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
360b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA);
361b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA);*/
362b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
363b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
36695e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
369b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
370b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
371b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;				\
372b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;				\
373b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;				\
374b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][RCOMP] = FixedToInt(r0);	\
375b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][GCOMP] = FixedToInt(g0);	\
376b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][BCOMP] = FixedToInt(b0);	\
377b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][ACOMP] = FixedToInt(a0);	\
378b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;				\
379b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;						\
380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
382b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
383b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
384b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
385b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
388b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
389b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
390b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
391b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
392b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_rgba_span(ctx, &span);
393b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_flat_rgba_line( GLcontext *ctx,
398a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                    const SWvertex *vert0,
399a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				    const SWvertex *vert1 )
400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
401b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
402b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
403b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
404b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
405b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
406b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA,
407b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG);
408b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG);
409b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= SPAN_RGBA;*/
410b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
411b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
412b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
413b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
414b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.redStep = 0;
415b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.greenStep = 0;
416b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blueStep = 0;
417b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alphaStep = 0;
418b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
419b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
42295e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
423b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
424b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
425b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;				\
426b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;				\
427b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;				\
428b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;				\
429b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;						\
430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
432b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
433b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
434b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
435b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
438b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
439b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
440b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
441b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
442b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_rgba_span(ctx, &span);
443b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, textured, any width, maybe stippled */
448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_textured_line( GLcontext *ctx,
449a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                const SWvertex *vert0,
450a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				const SWvertex *vert1 )
451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
452b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
453b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
454b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
455b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
456b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
457b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
458b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_RGBA);
459b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
460b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= (SPAN_RGBA | SPAN_SPEC);*/
461b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
462b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
463b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
464b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
465b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.redStep = 0;
466b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.greenStep = 0;
467b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blueStep = 0;
468b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alphaStep = 0;
469b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specRed = ChanToFixed(vert1->specular[0]);
470b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specGreen = ChanToFixed(vert1->specular[1]);
471b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specBlue = ChanToFixed(vert1->specular[2]);
472b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specRedStep = 0;
473b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specGreenStep = 0;
474b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specBlueStep = 0;
475b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
476b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
47995e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
481b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
482b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
483b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;				\
484b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;				\
485b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;				\
486b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;				\
487b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][0] = fragTexcoord[0];		\
488b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][1] = fragTexcoord[1];		\
489b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][2] = fragTexcoord[2];		\
490b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.lambda[0][span.end] = 0.0;				\
491b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;						\
492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
494b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
495b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
496b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
497b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
500b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
501b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
502b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
503b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
504b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_texture_span(ctx, &span);
505b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, textured, any width, maybe stippled */
511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_textured_line( GLcontext *ctx,
512a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                  const SWvertex *vert0,
513a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				  const SWvertex *vert1 )
514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
515b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
516b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
517cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
518b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
520b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
521b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_TEXTURE | SPAN_LAMBDA);
522b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_TEXTURE | SPAN_LAMBDA);*/
523b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
524b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
52795e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
531b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)						\
532b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {								\
533b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;				\
534b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;				\
535b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;				\
536b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;				\
537b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][RCOMP] = FixedToInt(r0);	\
538b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][GCOMP] = FixedToInt(g0);	\
539b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][BCOMP] = FixedToInt(b0);	\
540b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][ACOMP] = FixedToInt(a0);	\
541b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][0] = fragTexcoord[0];		\
542b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][1] = fragTexcoord[1];		\
543b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.texcoords[0][span.end][2] = fragTexcoord[2];		\
544b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.lambda[0][span.end] = 0.0;				\
545b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;						\
546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
548b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
549b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
550b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
551b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
554b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
555b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
556b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
557b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
558b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_texture_span(ctx, &span);
559b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Smooth-shaded, multitextured, any width, maybe stippled, separate specular
564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation.
565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_multitextured_line( GLcontext *ctx,
567a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				       const SWvertex *vert0,
568a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				       const SWvertex *vert1 )
569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
570b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
571b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
572b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint u;
573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
574b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_SMOOTH);
575b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
576b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, 0,
577b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_SPEC | SPAN_TEXTURE | SPAN_LAMBDA);
578b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_RGBA | SPAN_SPEC | SPAN_TEXTURE | SPAN_LAMBDA);*/
579b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
580b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
58395e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1
586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1
588b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)							\
589b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {									\
590b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;					\
591b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;					\
592b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;					\
593b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;					\
594b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][RCOMP] = FixedToInt(r0);		\
595b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][GCOMP] = FixedToInt(g0);		\
596b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][BCOMP] = FixedToInt(b0);		\
597b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.color.rgba[span.end][ACOMP] = FixedToInt(a0);		\
598b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.specArray[span.end][RCOMP] = FixedToInt(sr0);		\
599b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.specArray[span.end][GCOMP] = FixedToInt(sb0);		\
600b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.specArray[span.end][BCOMP] = FixedToInt(sb0);		\
601b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {		\
602b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (ctx->Texture.Unit[u]._ReallyEnabled) {			\
603b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][0] = fragTexcoord[u][0];	\
604b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][1] = fragTexcoord[u][1];	\
605b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][2] = fragTexcoord[u][2];	\
606b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.lambda[u][span.end] = 0.0;				\
607b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }								\
608b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }									\
609b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;							\
610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
612b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
613b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
614b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
615b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
618b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
619b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
620b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
621b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
622b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_texture_span(ctx, &span);
623b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* Flat-shaded, multitextured, any width, maybe stippled, separate specular
628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation.
629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_multitextured_line( GLcontext *ctx,
631a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul                                     const SWvertex *vert0,
632a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul				     const SWvertex *vert1 )
633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
634b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLboolean xMajor = GL_FALSE;
635b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   struct sw_span span;
636b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint u;
637b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
638b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(ctx->Light.ShadeModel == GL_FLAT);
639b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
640b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_LINE, 0, SPAN_RGBA | SPAN_SPEC,
641b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul	     SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
642b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   /*span.arrayMask |= (SPAN_XY | SPAN_Z | SPAN_FOG | SPAN_TEXTURE | SPAN_LAMBDA);
643b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul     span.interpMask |= (SPAN_RGBA | SPAN_SPEC);*/
644b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.red = ChanToFixed(vert1->color[0]);
645b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.green = ChanToFixed(vert1->color[1]);
646b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blue = ChanToFixed(vert1->color[2]);
647b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alpha = ChanToFixed(vert1->color[3]);
648b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.redStep = 0;
649b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.greenStep = 0;
650b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.blueStep = 0;
651b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.alphaStep = 0;
652b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specRed = ChanToFixed(vert1->specular[0]);
653b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specGreen = ChanToFixed(vert1->specular[1]);
654b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specBlue = ChanToFixed(vert1->specular[2]);
655b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specRedStep = 0;
656b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specGreenStep = 0;
657b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   span.specBlueStep = 0;
658b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
659b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define SET_XMAJOR 1
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_XY 1
661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
66295e02a210ed339ad20b0c16284dcdcf9af2dc755Brian Paul#define INTERP_FOG 1
663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1
664b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#define PLOT(X,Y)							\
665b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   {									\
666b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.xArray[span.end] = X;					\
667b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.yArray[span.end] = Y;					\
668b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.zArray[span.end] = Z;					\
669b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.fogArray[span.end] = fog0;					\
670b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {		\
671b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (ctx->Texture.Unit[u]._ReallyEnabled) {			\
672b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][0] = fragTexcoord[u][0];	\
673b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][1] = fragTexcoord[u][1];	\
674b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.texcoords[u][span.end][2] = fragTexcoord[u][2];	\
675b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            span.lambda[u][span.end] = 0.0;				\
676b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }								\
677b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }									\
678b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.end++;							\
679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
681b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
682b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.StippleFlag) {
683b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      span.arrayMask |= SPAN_MASK;
684b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      compute_stipple_mask(ctx, span.end, span.mask);
685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
687b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->Line.Width > 1.0) {
688b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      draw_wide_line(ctx, &span, xMajor);
689b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
690b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
691b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      _mesa_write_texture_span(ctx, &span);
692b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
69622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesvoid _swrast_add_spec_terms_line( GLcontext *ctx,
69746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell				  const SWvertex *v0,
69846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell				  const SWvertex *v1 )
69946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{
70046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv0 = (SWvertex *)v0;
70146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv1 = (SWvertex *)v1;
70246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   GLchan c[2][4];
70346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[0], ncv0->color );
70446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[1], ncv1->color );
70546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv0->color, ncv0->specular );
70646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv1->color, ncv1->specular );
70746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
70846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv0->color, c[0] );
70946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv1->color, c[1] );
71046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell}
71146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG
714ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void
715ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx);  /* silence compiler warning */
716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx)
718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
719cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
720cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   printf("Line Func == ");
722cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   if (swrast->Line == flat_ci_line)
723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_ci_line\n");
724cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_rgba_line)
725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_rgba_line\n");
726cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_ci_line)
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_ci_line\n");
728cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_rgba_line)
729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_rgba_line\n");
730cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_smooth_ci_line)
731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_smooth_ci_line\n");
732cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_flat_ci_line)
733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_flat_ci_line\n");
734cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_smooth_rgba_line)
735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_smooth_rgba_line\n");
736cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == general_flat_rgba_line)
737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("general_flat_rgba_line\n");
738cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_textured_line)
739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_textured_line\n");
740cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_textured_line)
741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_textured_line\n");
742cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == smooth_multitextured_line)
743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("smooth_multitextured_line\n");
744cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   else if (swrast->Line == flat_multitextured_line)
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      printf("flat_multitextured_line\n");
746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else
7474b7ccad6829d11c07f1ceac3b3d12f8aec9e640bBrian Paul      printf("Driver func %p\n", (void *) swrast->Line);
748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
753233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG
754233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
755233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */
756233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL;
757233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
758233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc)                   \
759233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo {                                    \
760233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    lineFuncName = #lineFunc;           \
761233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    /*printf("%s\n", lineFuncName);*/   \
762233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    swrast->Line = lineFunc;            \
763233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0)
764233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
765233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else
766233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
767c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc)  swrast->Line = lineFunc
768233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
769233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif
770233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
771233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
772233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current
775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code.
779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
781cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx )
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
783cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
784b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul   const GLboolean rgbmode = ctx->Visual.rgbMode;
785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
786b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->RenderMode == GL_RENDER) {
787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Line.SmoothFlag) {
788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* antialiased lines */
7890070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         _swrast_choose_aa_line_function(ctx);
7900070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         ASSERT(swrast->Triangle);
791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
792cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      else if (ctx->Texture._ReallyEnabled) {
79389dae684aa1d74b06a4f70cb76b33671d0cef9e6Keith Whitwell         if (ctx->Texture._ReallyEnabled > TEXTURE0_ANY ||
794ee403ff0ba272f5be539ddc921d3fffb3d250cc4Brian Paul	     (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)) {
795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* multi-texture and/or separate specular color */
796b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Light.ShadeModel == GL_SMOOTH)
797233aafbb30594d0193b00705d0532be97060ebd1Brian Paul               USE(smooth_multitextured_line);
798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else
799233aafbb30594d0193b00705d0532be97060ebd1Brian Paul               USE(flat_multitextured_line);
800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
802b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Light.ShadeModel == GL_SMOOTH) {
803233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                USE(smooth_textured_line);
804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
806233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                USE(flat_textured_line);
807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
811b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul	 if (ctx->Light.ShadeModel == GL_SMOOTH) {
812b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0
813b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                || ctx->Line.StippleFlag) {
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
815b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_smooth_rgba_line);
816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
817b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_smooth_ci_line);
818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
821233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(smooth_rgba_line);
822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
823233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(smooth_ci_line);
824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
827b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0
828b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                || ctx->Line.StippleFlag) {
829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
830b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_flat_rgba_line);
831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
832b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul                  USE(general_flat_ci_line);
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (rgbmode)
836233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(flat_rgba_line);
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else
838233aafbb30594d0193b00705d0532be97060ebd1Brian Paul                  USE(flat_ci_line);
839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
843b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else if (ctx->RenderMode == GL_FEEDBACK) {
844233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_feedback_line);
845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
847b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      ASSERT(ctx->RenderMode == GL_SELECT);
848233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_select_line);
849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*_mesa_print_line_function(ctx);*/
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
853