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