s_lines.c revision 64b4298181373d64ef2226935f70e9062536de8b
164b4298181373d64ef2226935f70e9062536de8bBrian Paul/* $Id: s_lines.c,v 1.34 2003/01/20 15:21:41 brianp Exp $ */
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul * Version:  5.1
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
764b4298181373d64ef2226935f70e9062536de8bBrian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"),
11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation
12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions:
1522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
1822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
27e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h"
2946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell#include "colormac.h"
30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h"
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mmath.h"
320070d398d13759adc519f9bc764ffd39bc88890eBrian Paul#include "s_aaline.h"
33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h"
35cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_feedback.h"
36b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_lines.h"
37b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul#include "s_span.h"
38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
40b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*
41b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * Init the mask[] array to implement a line stipple.
42b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul */
43b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
44b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulcompute_stipple_mask( GLcontext *ctx, GLuint len, GLubyte mask[] )
45b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul{
46b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   SWcontext *swrast = SWRAST_CONTEXT(ctx);
47b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLuint i;
48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
49b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   for (i = 0; i < len; i++) {
50b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      GLuint bit = (swrast->StippleCounter / ctx->Line.StippleFactor) & 0xf;
51b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      if ((1 << bit) & ctx->Line.StipplePattern) {
52b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_TRUE;
53b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
54b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      else {
55b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         mask[i] = GL_FALSE;
56b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
57b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      swrast->StippleCounter++;
58b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
59b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul}
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
63b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul * To draw a wide line we can simply redraw the span N times, side by side.
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
65b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paulstatic void
66b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Pauldraw_wide_line( GLcontext *ctx, struct sw_span *span, GLboolean xMajor )
67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
68b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   GLint width, start;
69cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
70b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   ASSERT(span->end < MAX_WIDTH);
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
72b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   width = (GLint) CLAMP( ctx->Line.Width, MIN_LINE_WIDTH, MAX_LINE_WIDTH );
73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
74b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (width & 1)
75b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2;
76b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else
77b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      start = width / 2 - 1;
78b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
79b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (xMajor) {
8077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *y = span->array->y;
81a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
82a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
83b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
84b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
85b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
8677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i] -= start;
87b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
88b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
89b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
9077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               y[i]++;
91b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
92b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
93b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
94b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
95b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
96b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
97b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
98b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
99b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
100b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else {
10177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul      GLint *x = span->array->x;
102a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLuint i;
103a670c1280b78e6da3b298b61f623e4c733c6be94Brian Paul      GLint w;
104b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      for (w = 0; w < width; w++) {
105b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if (w == 0) {
106b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
10777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i] -= start;
108b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
109b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else {
110b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul            for (i = 0; i < span->end; i++)
11177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               x[i]++;
112b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         }
113b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         if ((span->interpMask | span->arrayMask) & SPAN_TEXTURE)
114b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_texture_span(ctx, span);
115b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else if ((span->interpMask | span->arrayMask) & SPAN_RGBA)
116b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_rgba_span(ctx, span);
117b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul         else
118b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul            _mesa_write_index_span(ctx, span);
119b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      }
120b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
125b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
126b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/*****                    Rasterization                           *****/
127b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul/**********************************************************************/
128b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
129b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
13022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple color index line (no stipple, width=1, no Z, no fog, no tex)*/
13122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_ci_line
13222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX
13322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) _mesa_write_index_span(ctx, &span)
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
13722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Simple RGBA index line (no stipple, width=1, no Z, no fog, no tex)*/
13822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME simple_rgba_line
13922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
14022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span) _mesa_write_rgba_span(ctx, &span);
141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
14422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple color index line */
14522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_ci_line
14622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_INDEX
14722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
14822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
14922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
15022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
15122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
15222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
15322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
15422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.Width > 1.0) {					\
15522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      draw_wide_line(ctx, &span, dx > dy);			\
15622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
15722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
15822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_write_index_span(ctx, &span);			\
159b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   }
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
16322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Z, fog, wide, stipple RGBA line */
16422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME general_rgba_line
16522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
16622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
16722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
16822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
16922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
17022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
17122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
17222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
17322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.Width > 1.0) {					\
17422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      draw_wide_line(ctx, &span, dx > dy);			\
17522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
17622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
17722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_write_rgba_span(ctx, &span);			\
178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
180b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
18222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Single-texture line, w/ fog, Z, specular, etc. */
18322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME textured_line
18422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
18522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
18622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
18722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_TEX
18822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
18922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
19022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
19122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
19222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
19322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.Width > 1.0) {					\
19422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      draw_wide_line(ctx, &span, dx > dy);			\
19522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
19622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
19722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_write_texture_span(ctx, &span);			\
198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
200b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
20222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul/* Multi-texture or separate specular line, w/ fog, Z, specular, etc. */
20322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define NAME multitextured_line
20422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_RGBA
20522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_SPEC
20622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_Z
20722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_FOG
20822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define INTERP_MULTITEX
20922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul#define RENDER_SPAN(span)					\
21022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.StippleFlag) {					\
21122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      span.arrayMask |= SPAN_MASK;				\
21222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      compute_stipple_mask(ctx, span.end, span.array->mask);	\
21322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
21422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (ctx->Line.Width > 1.0) {					\
21522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      draw_wide_line(ctx, &span, dx > dy);			\
21622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   }								\
21722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else {							\
21822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_write_texture_span(ctx, &span);			\
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_linetemp.h"
221b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul
222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
22422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paulvoid
22522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul_swrast_add_spec_terms_line( GLcontext *ctx,
22622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul                             const SWvertex *v0,
22722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul                             const SWvertex *v1 )
22846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell{
22946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv0 = (SWvertex *)v0;
23046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWvertex *ncv1 = (SWvertex *)v1;
23146b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   GLchan c[2][4];
23246b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[0], ncv0->color );
23346b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( c[1], ncv1->color );
23446b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv0->color, ncv0->specular );
23546b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   ACC_3V( ncv1->color, ncv1->specular );
23646b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   SWRAST_CONTEXT(ctx)->SpecLine( ctx, ncv0, ncv1 );
23746b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv0->color, c[0] );
23846b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell   COPY_CHAN4( ncv1->color, c[1] );
23946b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell}
24046b0988c673b28e072fd0cbf477632a9ab6f9f18Keith Whitwell
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DEBUG
243ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paulextern void
244ba41b8afb1b40b967cf5c0e604bbf09793eb8feeBrian Paul_mesa_print_line_function(GLcontext *ctx);  /* silence compiler warning */
245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_mesa_print_line_function(GLcontext *ctx)
247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
248cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
249cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
25068a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul   _mesa_printf("Line Func == ");
25122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   if (swrast->Line == simple_ci_line)
25222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("simple_ci_line\n");
25322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == simple_rgba_line)
25422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("simple_rgba_line\n");
25522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == general_ci_line)
25622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("general_ci_line\n");
25722a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == general_rgba_line)
25822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("general_rgba_line\n");
25922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == textured_line)
26022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("textured_line\n");
26122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul   else if (swrast->Line == multitextured_line)
26222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      _mesa_printf("multitextured_line\n");
263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else
26468a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul      _mesa_printf("Driver func %p\n", (void *) swrast->Line);
265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
270233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#ifdef DEBUG
271233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
272233aafbb30594d0193b00705d0532be97060ebd1Brian Paul/* record the current line function name */
273233aafbb30594d0193b00705d0532be97060ebd1Brian Paulstatic const char *lineFuncName = NULL;
274233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
275233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#define USE(lineFunc)                   \
276233aafbb30594d0193b00705d0532be97060ebd1Brian Pauldo {                                    \
277233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    lineFuncName = #lineFunc;           \
27868a7ee5cbbc93c0e746dc843e0fcc1e65ad1baf6Brian Paul    /*_mesa_printf("%s\n", lineFuncName);*/   \
279233aafbb30594d0193b00705d0532be97060ebd1Brian Paul    swrast->Line = lineFunc;            \
280233aafbb30594d0193b00705d0532be97060ebd1Brian Paul} while (0)
281233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
282233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#else
283233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
284c123a9b2edc5852cb50485f344219508254081a8Brian Paul#define USE(lineFunc)  swrast->Line = lineFunc
285233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
286233aafbb30594d0193b00705d0532be97060ebd1Brian Paul#endif
287233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
288233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
289233aafbb30594d0193b00705d0532be97060ebd1Brian Paul
290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which line drawing function to use given the current
292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_LINE if you add or remove
295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * tests to this code.
296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
298cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell_swrast_choose_line( GLcontext *ctx )
299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
300cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   SWcontext *swrast = SWRAST_CONTEXT(ctx);
301b6bcae5698df88f7730d40004ce7ce0462e97a20Brian Paul   const GLboolean rgbmode = ctx->Visual.rgbMode;
302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
303b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   if (ctx->RenderMode == GL_RENDER) {
304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Line.SmoothFlag) {
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* antialiased lines */
3060070d398d13759adc519f9bc764ffd39bc88890eBrian Paul         _swrast_choose_aa_line_function(ctx);
30764b4298181373d64ef2226935f70e9062536de8bBrian Paul         ASSERT(swrast->Line);
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
3098afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul      else if (ctx->Texture._EnabledUnits) {
31022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* textured lines */
31122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         if (ctx->Texture._EnabledUnits > 0x1 || (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)) {
312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* multi-texture and/or separate specular color */
31322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(multitextured_line);
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
31622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(textured_line);
317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
31922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      else if (ctx->Depth.Test || ctx->Fog.Enabled || ctx->Line.Width != 1.0
32022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul               || ctx->Line.StippleFlag) {
32122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* no texture, but Z, fog, width>1, stipple, etc. */
32222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         if (rgbmode)
32322a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(general_rgba_line);
32422a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         else
32522a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(general_ci_line);
32622a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul      }
327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
32822a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         /* simplest lines */
32922a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         if (rgbmode)
33022a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(simple_rgba_line);
33122a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul         else
33222a47c5251ee7b91dc8f7f4f7dbeb3ad5a117b70Brian Paul            USE(simple_ci_line);
333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
335b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul   else if (ctx->RenderMode == GL_FEEDBACK) {
336233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_feedback_line);
337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
339b37a084357dd08573b86d6d8c5ba43d65bdc1bd7Brian Paul      ASSERT(ctx->RenderMode == GL_SELECT);
340233aafbb30594d0193b00705d0532be97060ebd1Brian Paul      USE(_mesa_select_line);
341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*_mesa_print_line_function(ctx);*/
344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
345