s_lines.c revision ba6f47132d057937cb55f5aaf9b79bd667b7a48d
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
3efda5cb6263631175aa2efe46df9322b3c5775eeBrian * Version:  7.1
422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
59ede048127ea71282fd97e01516dedcfb03e2a23Brian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"),
9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation
10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions:
1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h"
28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/colormac.h"
29bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
300070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h"
31cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
32cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h"
33b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h"
34b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h"
35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
37b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*
38b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple.
39b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */
40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
41f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompute_stipple_mask( struct gl_context *ctx, GLuint len, GLubyte mask[] )
42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{
43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint i;
45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   for (i = 0; i < len; i++) {
47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf;
48b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      if ((1 << bit) & ctx->Line.StipplePattern) {
49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_TRUE;
50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      else {
52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_FALSE;
53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      swrast->StippleCounter++;
55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul}
57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
60b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side.
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
62b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
63f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdraw_wide_line( struct gl_context *ctx, SWspan *span, GLboolean xMajor )
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
65af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   const GLint width = (GLint) CLAMP(ctx->Line.Width,
66af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian                                     ctx->Const.MinLineWidth,
67af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian                                     ctx->Const.MaxLineWidth);
68af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   GLint start;
69cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
7047d88ef204b42a9220c6be3e98c92df9c9aa0860Brian Paul   ASSERT(span->end < SWRAST_MAX_WIDTH);
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
72b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (width & 1)
73b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2;
74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else
75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2 - 1;
76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (xMajor) {
7877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *y = span->array->y;
79a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
80a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
81b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
82b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
8477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i] -= start;
85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
86b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
8877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i]++;
89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
90e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick	 _swrast_write_rgba_span(ctx, span);
91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
93b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
9477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *x = span->array->x;
95a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
96a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
97b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i] -= start;
101b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
102b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
103b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i]++;
105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
106e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick	 _swrast_write_rgba_span(ctx, span);
107b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
114b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*****                    Rasterization                           *****/
115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
116b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
11722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/
1189e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME simple_no_z_rgba_line
11922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
12045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span);
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
12422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */
1259e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME rgba_line
12622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
12722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
12822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
12922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
13222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
133af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   if (ctx->Line.Width > 1.0) {					\
134dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
13522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
13622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
13745bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      _swrast_write_rgba_span(ctx, &span);			\
138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
140b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/* General-purpose line (any/all features). */
1439e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian#define NAME general_line
14422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
14522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
1469ede048127ea71282fd97e01516dedcfb03e2a23Brian#define INTERP_ATTRIBS
14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
15022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
15122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
152af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian   if (ctx->Line.Width > 1.0) {					\
153dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
15422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
15522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
156a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul      _swrast_write_rgba_span(ctx, &span);			\
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
159b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
16222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid
163f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_add_spec_terms_line(struct gl_context *ctx,
1649e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                            const SWvertex *v0, const SWvertex *v1)
16546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{
16646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv0 = (SWvertex *)v0;
16746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv1 = (SWvertex *)v1;
1689e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   GLfloat rSum, gSum, bSum;
1699e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   GLchan cSave[2][4];
1709e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian
1719e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /* save original colors */
1729e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   COPY_CHAN4(cSave[0], ncv0->color);
1739e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   COPY_CHAN4(cSave[1], ncv1->color);
1749e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /* sum v0 */
1759e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   rSum = CHAN_TO_FLOAT(ncv0->color[0]) + ncv0->attrib[FRAG_ATTRIB_COL1][0];
1769e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   gSum = CHAN_TO_FLOAT(ncv0->color[1]) + ncv0->attrib[FRAG_ATTRIB_COL1][1];
1779e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   bSum = CHAN_TO_FLOAT(ncv0->color[2]) + ncv0->attrib[FRAG_ATTRIB_COL1][2];
1789e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[0], rSum);
1799e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[1], gSum);
1809e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv0->color[2], bSum);
1819e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /* sum v1 */
1829e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   rSum = CHAN_TO_FLOAT(ncv1->color[0]) + ncv1->attrib[FRAG_ATTRIB_COL1][0];
1839e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   gSum = CHAN_TO_FLOAT(ncv1->color[1]) + ncv1->attrib[FRAG_ATTRIB_COL1][1];
1849e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   bSum = CHAN_TO_FLOAT(ncv1->color[2]) + ncv1->attrib[FRAG_ATTRIB_COL1][2];
1859e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[0], rSum);
1869e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[1], gSum);
1879e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   UNCLAMPED_FLOAT_TO_CHAN(ncv1->color[2], bSum);
1889e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /* draw */
18946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
1909e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   /* restore original colors */
191ba6f47132d057937cb55f5aaf9b79bd667b7a48dBrian Paul   COPY_CHAN4(ncv0->color, cSave[0]);
192ba6f47132d057937cb55f5aaf9b79bd667b7a48dBrian Paul   COPY_CHAN4(ncv1->color, cSave[1]);
19346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell}
19446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
197233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG
198233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
199233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */
200233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL;
201233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
202233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc)                   \
203233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo {                                    \
204233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    lineFuncName = #lineFunc;           \
205298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg    /*printf("%s\n", lineFuncName);*/   \
206233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    swrast->Line = lineFunc;            \
207233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0)
208233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
209233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else
210233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
211c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc)  swrast->Line = lineFunc
212233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
213233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif
214233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
215233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
216233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
2179e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian/**
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code.
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
225f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_choose_line( struct gl_context *ctx )
226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
227cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
2289e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian   GLboolean specular = (ctx->Fog.ColorSumEnabled ||
2299e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                         (ctx->Light.Enabled &&
2309e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian                          ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR));
231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
232b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->RenderMode == GL_RENDER) {
233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Line.SmoothFlag) {
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* antialiased lines */
2350070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         _swrast_choose_aa_line_function(ctx);
23664b4298181373d64ef2226935f70e9062536de8bBrian Paul         ASSERT(swrast->Line);
237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
238ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian      else if (ctx->Texture._EnabledCoordUnits
2391c0f1dd42a50464eeb81de4aad8eecf24b3d6c89Chad Versace               || _swrast_use_fragment_program(ctx)
2409e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian               || swrast->_FogEnabled
2419e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian               || specular) {
2429e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         USE(general_line);
243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2449e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian      else if (ctx->Depth.Test
245af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian               || ctx->Line.Width != 1.0
24622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul               || ctx->Line.StippleFlag) {
24722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* no texture, but Z, fog, width>1, stipple, etc. */
248efda5cb6263631175aa2efe46df9322b3c5775eeBrian#if CHAN_BITS == 32
249e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick         USE(general_line);
250efda5cb6263631175aa2efe46df9322b3c5775eeBrian#else
251e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick         USE(rgba_line);
252efda5cb6263631175aa2efe46df9322b3c5775eeBrian#endif
25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      }
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
2559e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         ASSERT(!ctx->Depth.Test);
256af2aa8e9cf88a9ee3ec338eddc9a47bf2f142cb7Brian         ASSERT(ctx->Line.Width == 1.0);
2579e8a961dd7d7b717a9fb4ecdea1c1b60ea355efeBrian         /* simple lines */
258e6df80184b0c7e83eba382b3161ba11db497c55dIan Romanick         USE(simple_no_z_rgba_line);
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
261b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else if (ctx->RenderMode == GL_FEEDBACK) {
26245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      USE(_swrast_feedback_line);
263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
265b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      ASSERT(ctx->RenderMode == GL_SELECT);
26645bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      USE(_swrast_select_line);
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
269