s_lines.c revision ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
3dcf4c17fb1624af47181c63af4c3ad29f919c17aBrian Paul * Version:  6.5
422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
5dcf4c17fb1624af47181c63af4c3ad29f919c17aBrian Paul * Copyright (C) 1999-2005  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
26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h"
2729b4076f9acff96a867760fc885f5eaeb7586977Brian Paul#include "context.h"
2846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell#include "colormac.h"
29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h"
300070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h"
31cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h"
33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h"
34b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h"
35b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h"
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
38b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*
39b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple.
40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */
41b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulcompute_stipple_mask( GLcontext *ctx, GLuint len, GLubyte mask[] )
43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{
44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
45b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint i;
46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   for (i = 0; i < len; i++) {
48b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf;
49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      if ((1 << bit) & ctx->Line.StipplePattern) {
50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_TRUE;
51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      else {
53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_FALSE;
54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      swrast->StippleCounter++;
56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
57b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul}
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
61b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side.
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
63b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
64cdb27e8242215271364602995d85607cfc06d441Brian Pauldraw_wide_line( GLcontext *ctx, SWspan *span, GLboolean xMajor )
65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
66b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLint width, start;
67cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
68b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(span->end < MAX_WIDTH);
69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
7054ef88109b3e135f7cc1feabbbc7dbf640a5d8ccKeith Whitwell   width = (GLint) CLAMP( ctx->Line._Width, MIN_LINE_WIDTH, MAX_LINE_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         }
90a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul         if (ctx->Visual.rgbMode)
9145bc887da226403f2c41077e40ca38b6f60f1359Brian Paul            _swrast_write_rgba_span(ctx, span);
92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
9345bc887da226403f2c41077e40ca38b6f60f1359Brian Paul            _swrast_write_index_span(ctx, span);
94b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
95b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
96b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
9777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *x = span->array->x;
98a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
99a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
100b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
101b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
102b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i] -= start;
104b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i]++;
108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
109a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul         if (ctx->Visual.rgbMode)
11045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul            _swrast_write_rgba_span(ctx, span);
111b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
11245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul            _swrast_write_index_span(ctx, span);
113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
114b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
119b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
120b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*****                    Rasterization                           *****/
121b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
122b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
12322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple color index line (no stipple, width=1, no Z, no fog, no tex)*/
12422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_ci_line
12522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX
12645bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_index_span(ctx, &span)
127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
12922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/
13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_rgba_line
13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
13245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul#define RENDER_SPAN(span) _swrast_write_rgba_span(ctx, &span);
133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
13622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple color index line */
13722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_ci_line
13822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX
13922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
14022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
14122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
14222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
14322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
144dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      compute_stipple_mask(ctx, span.end, span.array->mask);    \
14522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
14654ef88109b3e135f7cc1feabbbc7dbf640a5d8ccKeith Whitwell   if (ctx->Line._Width > 1.0) {					\
147dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
15045bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      _swrast_write_index_span(ctx, &span);			\
151b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
15522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */
15622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_rgba_line
15722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
15822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
15922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
16022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
16122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
16222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
16322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
16422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
16554ef88109b3e135f7cc1feabbbc7dbf640a5d8ccKeith Whitwell   if (ctx->Line._Width > 1.0) {					\
166dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
16722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
16822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
16945bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      _swrast_write_rgba_span(ctx, &span);			\
170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
172b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
17422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Single-texture line, w/ fog, Z, specular, etc. */
17522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME textured_line
17622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
17722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
17822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
17922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_TEX
18022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
18122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
18222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
18322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
18422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
18554ef88109b3e135f7cc1feabbbc7dbf640a5d8ccKeith Whitwell   if (ctx->Line._Width > 1.0) {					\
186dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
18722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
18822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
189a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul      _swrast_write_rgba_span(ctx, &span);			\
190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
192b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
19422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Multi-texture or separate specular line, w/ fog, Z, specular, etc. */
19522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME multitextured_line
19622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
19722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_SPEC
19822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
19922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
20022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_MULTITEX
201ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian#define INTERP_VARYING
20222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
20322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
20422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
20522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
20622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
20754ef88109b3e135f7cc1feabbbc7dbf640a5d8ccKeith Whitwell   if (ctx->Line._Width > 1.0) {					\
208dc24230de7f913969b52dee3579bb8fa3d50a8c0Karl Schultz      draw_wide_line(ctx, &span, (GLboolean)(dx > dy));		\
20922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
21022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
211a803b0c891404dcd7c376e91f6a033cd4e42abc3Brian Paul      _swrast_write_rgba_span(ctx, &span);			\
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
214b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
21722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid
21822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul_swrast_add_spec_terms_line( GLcontext *ctx,
21922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul                             const SWvertex *v0,
22022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul                             const SWvertex *v1 )
22146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{
22246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv0 = (SWvertex *)v0;
22346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv1 = (SWvertex *)v1;
22446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   GLchan c[2][4];
22546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[0], ncv0->color );
22646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[1], ncv1->color );
22746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv0->color, ncv0->specular );
22846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv1->color, ncv1->specular );
22946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
23046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv0->color, c[0] );
23146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv1->color, c[1] );
23246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell}
23346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG
236ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void
237ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx);  /* silence compiler warning */
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx)
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
241cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
242cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
24368a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul   _mesa_printf("Line Func == ");
24422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (swrast->Line == simple_ci_line)
24522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("simple_ci_line\n");
24622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == simple_rgba_line)
24722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("simple_rgba_line\n");
24822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == general_ci_line)
24922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("general_ci_line\n");
25022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == general_rgba_line)
25122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("general_rgba_line\n");
25222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == textured_line)
25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("textured_line\n");
25422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == multitextured_line)
25522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("multitextured_line\n");
256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else
257b5b8d22c4ee921dff99b898a5907023b20670a27Brian Paul      _mesa_printf("Driver func %p\n", (void *(*)()) swrast->Line);
258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
263233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG
264233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
265233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */
266233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL;
267233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
268233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc)                   \
269233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo {                                    \
270233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    lineFuncName = #lineFunc;           \
27168a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul    /*_mesa_printf("%s\n", lineFuncName);*/   \
272233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    swrast->Line = lineFunc;            \
273233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0)
274233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
275233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else
276233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
277c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc)  swrast->Line = lineFunc
278233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
279233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif
280233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
281233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
282233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current
285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code.
289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
291cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx )
292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
293cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
294b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul   const GLboolean rgbmode = ctx->Visual.rgbMode;
295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
296b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->RenderMode == GL_RENDER) {
297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Line.SmoothFlag) {
298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* antialiased lines */
2990070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         _swrast_choose_aa_line_function(ctx);
30064b4298181373d64ef2226935f70e9062536de8bBrian Paul         ASSERT(swrast->Line);
301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
302ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian      else if (ctx->Texture._EnabledCoordUnits
303ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian             || ctx->FragmentProgram._Current) {
30422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* textured lines */
30536a0a3252e1e20df69b53f70ba93bc74c4a4bf0eBrian Paul         if (ctx->Texture._EnabledCoordUnits > 0x1
306ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian             || NEED_SECONDARY_COLOR(ctx)
307ccea3ff8a9eae16d2ca11b9cedef1318cffe3fb4Brian             || ctx->FragmentProgram._Current) {
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* multi-texture and/or separate specular color */
30922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(multitextured_line);
310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
31222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(textured_line);
313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
315dcf4c17fb1624af47181c63af4c3ad29f919c17aBrian Paul      else if (ctx->Depth.Test || swrast->_FogEnabled || ctx->Line._Width != 1.0
31622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul               || ctx->Line.StippleFlag) {
31722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* no texture, but Z, fog, width>1, stipple, etc. */
31822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         if (rgbmode)
31922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(general_rgba_line);
32022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         else
32122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(general_ci_line);
32222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      }
323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
32422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* simplest lines */
32522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         if (rgbmode)
32622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(simple_rgba_line);
32722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         else
32822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(simple_ci_line);
329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
331b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else if (ctx->RenderMode == GL_FEEDBACK) {
33245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      USE(_swrast_feedback_line);
333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
335b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      ASSERT(ctx->RenderMode == GL_SELECT);
33645bc887da226403f2c41077e40ca38b6f60f1359Brian Paul      USE(_swrast_select_line);
337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*_mesa_print_line_function(ctx);*/
340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
341