s_tritemp.h revision c1b97d91c7e38290be85eb1ff56e6c108e1e47ca
1c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul/* $Id: s_tritemp.h,v 1.6 2000/12/08 00:09:24 brianp Exp $ */
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
5e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Version:  3.5
6e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
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:
15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
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/*
29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Triangle Rasterizer Template
30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This file is #include'd to generate custom triangle rasterizers.
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following macros may be defined to indicate what auxillary information
34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * must be interplated across the triangle:
35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_Z        - if defined, interpolate Z values
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_RGB      - if defined, interpolate RGB values
37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_SPEC     - if defined, interpolate specular RGB values
38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_ALPHA    - if defined, interpolate Alpha values
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_INDEX    - if defined, interpolate color index values
40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_INT_TEX  - if defined, interpolate integer ST texcoords
41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                         (fast, simple 2-D texture mapping)
42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_TEX      - if defined, interpolate set 0 float STRQ texcoords
43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                         NOTE:  OpenGL STRQ = Mesa STUV (R was taken for red)
44e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INTERP_MULTITEX - if defined, interpolate N units of STRQ texcoords
45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * When one can directly address pixels in the color buffer the following
47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * macros can be defined and used to compute pixel addresses during
48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rasterization (see pRow):
49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    PIXEL_TYPE          - the datatype of a pixel (GLubyte, GLushort, GLuint)
50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    BYTES_PER_ROW       - number of bytes per row in the color buffer
51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    PIXEL_ADDRESS(X,Y)  - returns the address of pixel at (X,Y) where
52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                          Y==0 at bottom of screen and increases upward.
53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Similarly, for direct depth buffer access, this type is used for depth
55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * buffer addressing:
56e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DEPTH_TYPE          - either GLushort or GLuint
57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Optionally, one may provide one-time setup code per triangle:
59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    SETUP_CODE    - code which is to be executed once per triangle
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following macro MUST be defined:
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    INNER_LOOP(LEFT,RIGHT,Y) - code to write a span of pixels.
63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *        Something like:
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                    for (x=LEFT; x<RIGHT;x++) {
66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                       put_pixel(x,Y);
67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                       // increment fixed point interpolants
68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *                    }
69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This code was designed for the origin to be in the lower-left corner.
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Inspired by triangle rasterizer code written by Allen Akin.  Thanks Allen!
73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
76cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell/*void triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 )*/
77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   typedef struct {
79a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul        const SWvertex *v0, *v1;   /* Y(v0) < Y(v1) */
80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfloat dx;	/* X(v1) - X(v0) */
81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfloat dy;	/* Y(v1) - Y(v0) */
82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfixed fdxdy;	/* dx/dy in fixed-point */
83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfixed fsx;	/* first sample point x coord */
84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfixed fsy;
85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfloat adjy;	/* adjust from v[0]->fy to fsy, scaled */
86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLint lines;	/* number of lines to be sampled on this edge */
87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	GLfixed fx0;	/* fixed pt X of lower endpoint */
88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   } EdgeT;
89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint depthBits = ctx->Visual.DepthBits;
92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint fixedToDepthShift = depthBits <= 16 ? FIXED_SHIFT : 0;
93e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat maxDepth = ctx->Visual.DepthMaxF;
94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define FixedToDepth(F)  ((F) >> fixedToDepthShift)
95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   EdgeT eMaj, eTop, eBot;
97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat oneOverArea;
98a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul   const SWvertex *vMin, *vMid, *vMax;  /* Y(vMin)<=Y(vMid)<=Y(vMax) */
991e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell   float bf = SWRAST_CONTEXT(ctx)->_backface_sign;
100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* find the order of the 3 vertices along the Y axis */
102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
103cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y0 = v0->win[1];
104cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y1 = v1->win[1];
105cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y2 = v2->win[1];
106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (y0<=y1) {
108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (y1<=y2) {
109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v0;   vMid = v1;   vMax = v2;   /* y0<=y1<=y2 */
110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else if (y2<=y0) {
112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v2;   vMid = v0;   vMax = v1;   /* y2<=y0<=y1 */
113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v0;   vMid = v2;   vMax = v1;  bf = -bf; /* y0<=y2<=y1 */
116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (y0<=y2) {
120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v1;   vMid = v0;   vMax = v2;  bf = -bf; /* y1<=y0<=y2 */
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else if (y2<=y1) {
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v2;   vMid = v1;   vMax = v0;  bf = -bf; /* y2<=y1<=y0 */
124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v1;   vMid = v2;   vMax = v0;   /* y1<=y2<=y0 */
127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* vertex/edge relationship */
132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   eMaj.v0 = vMin;   eMaj.v1 = vMax;   /*TODO: .v1's not needed */
133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   eTop.v0 = vMid;   eTop.v1 = vMax;
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   eBot.v0 = vMin;   eBot.v1 = vMid;
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* compute deltas for each edge:  vertex[v1] - vertex[v0] */
137cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eMaj.dx = vMax->win[0] - vMin->win[0];
138cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eMaj.dy = vMax->win[1] - vMin->win[1];
139cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eTop.dx = vMax->win[0] - vMid->win[0];
140cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eTop.dy = vMax->win[1] - vMid->win[1];
141cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eBot.dx = vMid->win[0] - vMin->win[0];
142cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   eBot.dy = vMid->win[1] - vMin->win[1];
143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* compute oneOverArea */
145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy;
147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* Do backface culling */
149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (area * bf < 0.0)
150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 return;
151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (area == 0.0F)
153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;
154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* check for very tiny triangle */
15626d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul      if (area * area < (0.05F * 0.05F))  /* square to ensure positive value */
15726d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul         oneOverArea = 1.0F / 0.05F;  /* a close-enough value */
158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else
159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         oneOverArea = 1.0F / area;
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifndef DO_OCCLUSION_TEST
163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ctx->OcclusionResult = GL_TRUE;
164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* Edge setup.  For a triangle strip these could be reused... */
167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* fixed point Y coordinates */
169cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfixed vMin_fx = FloatToFixed(vMin->win[0] + 0.5F);
170cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfixed vMin_fy = FloatToFixed(vMin->win[1] - 0.5F);
171cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfixed vMid_fx = FloatToFixed(vMid->win[0] + 0.5F);
172cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfixed vMid_fy = FloatToFixed(vMid->win[1] - 0.5F);
173cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfixed vMax_fy = FloatToFixed(vMax->win[1] - 0.5F);
174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eMaj.fsy = FixedCeil(vMin_fy);
17626d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul      eMaj.lines = FixedToInt(FixedCeil(vMax_fy - eMaj.fsy));
177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (eMaj.lines > 0) {
178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dxdy = eMaj.dx / eMaj.dy;
179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eMaj.fdxdy = SignedFloatToFixed(dxdy);
180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eMaj.adjy = (GLfloat) (eMaj.fsy - vMin_fy);  /* SCALED! */
181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eMaj.fx0 = vMin_fx;
182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eMaj.fsx = eMaj.fx0 + (GLfixed) (eMaj.adjy * dxdy);
183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;  /*CULLED*/
186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eTop.fsy = FixedCeil(vMid_fy);
18926d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul      eTop.lines = FixedToInt(FixedCeil(vMax_fy - eTop.fsy));
190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (eTop.lines > 0) {
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dxdy = eTop.dx / eTop.dy;
192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eTop.fdxdy = SignedFloatToFixed(dxdy);
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eTop.adjy = (GLfloat) (eTop.fsy - vMid_fy); /* SCALED! */
194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eTop.fx0 = vMid_fx;
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eTop.fsx = eTop.fx0 + (GLfixed) (eTop.adjy * dxdy);
196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eBot.fsy = FixedCeil(vMin_fy);
19926d729581fcf1991fbcc8320f64fa40d73170e95Brian Paul      eBot.lines = FixedToInt(FixedCeil(vMid_fy - eBot.fsy));
200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (eBot.lines > 0) {
201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dxdy = eBot.dx / eBot.dy;
202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eBot.fdxdy = SignedFloatToFixed(dxdy);
203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eBot.adjy = (GLfloat) (eBot.fsy - vMin_fy);  /* SCALED! */
204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eBot.fx0 = vMin_fx;
205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         eBot.fsx = eBot.fx0 + (GLfixed) (eBot.adjy * dxdy);
206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*
210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * Conceptually, we view a triangle as two subtriangles
211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * separated by a perfectly horizontal line.  The edge that is
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * intersected by this line is one with maximal absolute dy; we
213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * call it a ``major'' edge.  The other two edges are the
214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * ``top'' edge (for the upper subtriangle) and the ``bottom''
215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * edge (for the lower subtriangle).  If either of these two
216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * edges is horizontal or very close to horizontal, the
217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * corresponding subtriangle might cover zero sample points;
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * we take care to handle such cases, for performance as well
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * as correctness.
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    *
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * By stepping rasterization parameters along the major edge,
222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * we can avoid recomputing them at the discontinuity where
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * the top and bottom edges meet.  However, this forces us to
224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * be able to scan both left-to-right and right-to-left.
225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * Also, we must determine whether the major edge is at the
226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * left or right side of the triangle.  We do this by
227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * computing the magnitude of the cross-product of the major
228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * and top edges.  Since this magnitude depends on the sine of
229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * the angle between the two edges, its sign tells us whether
230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * we turn to the left or to the right when travelling along
231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * the major edge to the top edge, and from this we infer
232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * whether the major edge is on the left or the right.
233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    *
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * Serendipitously, this cross-product magnitude is also a
235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * value we need to compute the iteration parameter
236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * derivatives for the triangle, and it can be used to perform
237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * backface culling because its sign tells us whether the
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * triangle is clockwise or counterclockwise.  In this code we
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * refer to it as ``area'' because it's also proportional to
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    * the pixel area of the triangle.
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell    */
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint ltor;		/* true if scanning left-to-right */
245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dzdx, dzdy;      GLfixed fdzdx;
247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dfogdx, dfogdy;      GLfixed fdfogdx;
248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat drdx, drdy;      GLfixed fdrdx;
251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dgdx, dgdy;      GLfixed fdgdx;
252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dbdx, dbdy;      GLfixed fdbdx;
253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsrdx, dsrdy;    GLfixed fdsrdx;
256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsgdx, dsgdy;    GLfixed fdsgdx;
257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsbdx, dsbdy;    GLfixed fdsbdx;
258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dadx, dady;      GLfixed fdadx;
261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat didx, didy;      GLfixed fdidx;
264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsdx, dsdy;      GLfixed fdsdx;
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dtdx, dtdy;      GLfixed fdtdx;
268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsdx, dsdy;
271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dtdx, dtdy;
272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dudx, dudy;
273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dvdx, dvdy;
274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dsdx[MAX_TEXTURE_UNITS], dsdy[MAX_TEXTURE_UNITS];
277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dtdx[MAX_TEXTURE_UNITS], dtdy[MAX_TEXTURE_UNITS];
278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dudx[MAX_TEXTURE_UNITS], dudy[MAX_TEXTURE_UNITS];
279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat dvdx[MAX_TEXTURE_UNITS], dvdy[MAX_TEXTURE_UNITS];
280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /*
283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * Execute user-supplied setup code
284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       */
285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef SETUP_CODE
286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      SETUP_CODE
287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ltor = (oneOverArea < 0.0F);
290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* compute d?/dx and d?/dy derivatives */
292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dz, eBot_dz;
295cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dz = vMax->win[2] - vMin->win[2];
296cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dz = vMid->win[2] - vMin->win[2];
297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dzdx = oneOverArea * (eMaj_dz * eBot.dy - eMaj.dy * eBot_dz);
298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (dzdx > maxDepth || dzdx < -maxDepth) {
299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* probably a sliver triangle */
300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dzdx = 0.0;
301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dzdy = 0.0;
302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dzdy = oneOverArea * (eMaj.dx * eBot_dz - eMaj_dz * eBot.dx);
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (depthBits <= 16)
307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdzdx = SignedFloatToFixed(dzdx);
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else
309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdzdx = (GLint) dzdx;
310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dfog, eBot_dfog;
313cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dfog = (vMax->fog - vMin->fog) * 256;
314cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dfog = (vMid->fog - vMin->fog) * 256;
315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dfogdx = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog);
316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdfogdx = SignedFloatToFixed(dfogdx);
317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dfogdy = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx);
318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dr, eBot_dr;
323cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dr = (GLint) vMax->color[0]
324cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[0];
325cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dr = (GLint) vMid->color[0]
326cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[0];
327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         drdx = oneOverArea * (eMaj_dr * eBot.dy - eMaj.dy * eBot_dr);
328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdrdx = SignedFloatToFixed(drdx);
329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         drdy = oneOverArea * (eMaj.dx * eBot_dr - eMaj_dr * eBot.dx);
330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dg, eBot_dg;
333cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dg = (GLint) vMax->color[1]
334cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[1];
335cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eBot_dg = (GLint) vMid->color[1]
336cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[1];
337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dgdx = oneOverArea * (eMaj_dg * eBot.dy - eMaj.dy * eBot_dg);
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdgdx = SignedFloatToFixed(dgdx);
339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dgdy = oneOverArea * (eMaj.dx * eBot_dg - eMaj_dg * eBot.dx);
340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_db, eBot_db;
343cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_db = (GLint) vMax->color[2]
344cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[2];
345cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_db = (GLint) vMid->color[2]
346cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[2];
347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dbdx = oneOverArea * (eMaj_db * eBot.dy - eMaj.dy * eBot_db);
348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdbdx = SignedFloatToFixed(dbdx);
349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 dbdy = oneOverArea * (eMaj.dx * eBot_db - eMaj_db * eBot.dx);
350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dsr, eBot_dsr;
355cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dsr = (GLint) vMax->specular[0]
356cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[0];
357cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dsr = (GLint) vMid->specular[0]
358cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[0];
359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr);
360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdsrdx = SignedFloatToFixed(dsrdx);
361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx);
362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dsg, eBot_dsg;
365cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dsg = (GLint) vMax->specular[1]
366cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[1];
367cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eBot_dsg = (GLint) vMid->specular[1]
368cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[1];
369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg);
370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdsgdx = SignedFloatToFixed(dsgdx);
371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx);
372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dsb, eBot_dsb;
375cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dsb = (GLint) vMax->specular[2]
376cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[2];
377cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dsb = (GLint) vMid->specular[2]
378cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  - (GLint) vMin->specular[2];
379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb);
380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdsbdx = SignedFloatToFixed(dsbdx);
381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx);
382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_da, eBot_da;
387cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_da = (GLint) vMax->color[3]
388cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[3];
389cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_da = (GLint) vMid->color[3]
390cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->color[3];
391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dadx = oneOverArea * (eMaj_da * eBot.dy - eMaj.dy * eBot_da);
392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdadx = SignedFloatToFixed(dadx);
393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dady = oneOverArea * (eMaj.dx * eBot_da - eMaj_da * eBot.dx);
394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_di, eBot_di;
399cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_di = (GLint) vMax->index
400cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->index;
401cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_di = (GLint) vMid->index
402cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                 - (GLint) vMin->index;
403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         didx = oneOverArea * (eMaj_di * eBot.dy - eMaj.dy * eBot_di);
404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdidx = SignedFloatToFixed(didx);
405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         didy = oneOverArea * (eMaj.dx * eBot_di - eMaj_di * eBot.dx);
406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_ds, eBot_ds;
411cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_ds = (vMax->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;
412cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_ds = (vMid->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;
413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdsdx = SignedFloatToFixed(dsdx);
415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
417cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      {
418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dt, eBot_dt;
419cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_dt = (vMax->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;
420cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_dt = (vMid->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;
421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fdtdx = SignedFloatToFixed(dtdx);
423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
429cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMax = vMax->win[3];
430cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMin = vMin->win[3];
431cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMid = vMid->win[3];
432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_ds, eBot_ds;
433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dt, eBot_dt;
434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_du, eBot_du;
435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat eMaj_dv, eBot_dv;
436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
437cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eMaj_ds = vMax->texcoord[0][0] * wMax - vMin->texcoord[0][0] * wMin;
438cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         eBot_ds = vMid->texcoord[0][0] * wMid - vMin->texcoord[0][0] * wMin;
439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
442cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eMaj_dt = vMax->texcoord[0][1] * wMax - vMin->texcoord[0][1] * wMin;
443cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eBot_dt = vMid->texcoord[0][1] * wMid - vMin->texcoord[0][1] * wMin;
444cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
445cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
446cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
447cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eMaj_du = vMax->texcoord[0][2] * wMax - vMin->texcoord[0][2] * wMin;
448cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eBot_du = vMid->texcoord[0][2] * wMid - vMin->texcoord[0][2] * wMin;
449cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dudx = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
450cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dudy = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
453cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eMaj_dv = vMax->texcoord[0][3] * wMax - vMin->texcoord[0][3] * wMin;
454cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 eBot_dv = vMid->texcoord[0][3] * wMid - vMin->texcoord[0][3] * wMin;
455cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dvdx = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
456cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	 dvdy = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
461cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMax = vMax->win[3];
462cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMin = vMin->win[3];
463cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         GLfloat wMid = vMid->win[3];
464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLuint u;
465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
466cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            if (ctx->Texture.Unit[u]._ReallyEnabled) {
467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat eMaj_ds, eBot_ds;
468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat eMaj_dt, eBot_dt;
469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat eMaj_du, eBot_du;
470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat eMaj_dv, eBot_dv;
471cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               eMaj_ds = vMax->texcoord[u][0] * wMax
472cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                       - vMin->texcoord[u][0] * wMin;
473cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               eBot_ds = vMid->texcoord[u][0] * wMid
474cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                       - vMin->texcoord[u][0] * wMin;
475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dsdx[u] = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dsdy[u] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
478cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eMaj_dt = vMax->texcoord[u][1] * wMax
479c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul		       - vMin->texcoord[u][1] * wMin;
480cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eBot_dt = vMid->texcoord[u][1] * wMid
481c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul		       - vMin->texcoord[u][1] * wMin;
482cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dtdx[u] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
483cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dtdy[u] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
484cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
485cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eMaj_du = vMax->texcoord[u][2] * wMax
486c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul                       - vMin->texcoord[u][2] * wMin;
487cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eBot_du = vMid->texcoord[u][2] * wMid
488c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul                       - vMin->texcoord[u][2] * wMin;
489cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dudx[u] = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
490cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dudy[u] = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
491cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell
492cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eMaj_dv = vMax->texcoord[u][3] * wMax
493c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul                       - vMin->texcoord[u][3] * wMin;
494cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       eBot_dv = vMid->texcoord[u][3] * wMid
495c1b97d91c7e38290be85eb1ff56e6c108e1e47caBrian Paul                       - vMin->texcoord[u][3] * wMin;
496cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dvdx[u] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
497cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell	       dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /*
504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * We always sample at pixel centers.  However, we avoid
505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * explicit half-pixel offsets in this code by incorporating
506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * the proper offset in each of x and y during the
507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * transformation to window coordinates.
508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * We also apply the usual rasterization rules to prevent
510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * cracks and overlaps.  A pixel is considered inside a
511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * subtriangle if it meets all of four conditions: it is on or
512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * to the right of the left edge, strictly to the left of the
513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * right edge, on or below the top edge, and strictly above
514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * the bottom edge.  (Some edges may be degenerate.)
515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * The following discussion assumes left-to-right scanning
517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * (that is, the major edge is on the left); the right-to-left
518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * case is a straightforward variation.
519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * We start by finding the half-integral y coordinate that is
521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * at or below the top of the triangle.  This gives us the
522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * first scan line that could possibly contain pixels that are
523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * inside the triangle.
524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * Next we creep down the major edge until we reach that y,
526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * and compute the corresponding x coordinate on the edge.
527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * Then we find the half-integral x that lies on or just
528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * inside the edge.  This is the first pixel that might lie in
529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * the interior of the triangle.  (We won't know for sure
530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * until we check the other edges.)
531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * As we rasterize the triangle, we'll step down the major
533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * edge.  For each step in y, we'll move an integer number
534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * of steps in x.  There are two possible x step sizes, which
535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * we'll call the ``inner'' step (guaranteed to land on the
536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * edge or inside it) and the ``outer'' step (guaranteed to
537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * land on the edge or outside it).  The inner and outer steps
538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * differ by one.  During rasterization we maintain an error
539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * term that indicates our distance from the true edge, and
540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * select either the inner step or the outer step, whichever
541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * gets us to the first pixel that falls inside the triangle.
542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       *
543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * All parameters (z, red, etc.) as well as the buffer
544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * addresses for color and z have inner and outer step values,
545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * so that we can increment them appropriately.  This method
546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * eliminates the need to adjust parameters by creeping a
547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       * sub-pixel amount into the triangle at each scanline.
548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell       */
549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      {
551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         int subTriangle;
552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fx, fxLeftEdge, fxRightEdge, fdxLeftEdge, fdxRightEdge;
553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fdxOuter;
554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         int idxOuter;
555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         float dxOuter;
556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fError, fdError;
557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         float adjx, adjy;
558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fy;
559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         int iy;
560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS
561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         PIXEL_TYPE *pRow;
562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         int dPRowOuter, dPRowInner;  /* offset in bytes */
563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  ifdef DEPTH_TYPE
566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DEPTH_TYPE *zRow;
567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         int dZRowOuter, dZRowInner;  /* offset in bytes */
568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  endif
569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fz, fdzOuter, fdzInner;
570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed ffog, fdfogOuter, fdfogInner;
571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fr, fdrOuter, fdrInner;
574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fg, fdgOuter, fdgInner;
575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fb, fdbOuter, fdbInner;
576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fsr, fdsrOuter, fdsrInner;
579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fsg, fdsgOuter, fdsgInner;
580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fsb, fdsbOuter, fdsbInner;
581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fa, fdaOuter, fdaInner;
584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fi, fdiOuter, fdiInner;
587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed fs, fdsOuter, fdsInner;
590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfixed ft, fdtOuter, fdtInner;
591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat sLeft, dsOuter, dsInner;
594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat tLeft, dtOuter, dtInner;
595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat uLeft, duOuter, duInner;
596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat vLeft, dvOuter, dvInner;
597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat sLeft[MAX_TEXTURE_UNITS];
600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat tLeft[MAX_TEXTURE_UNITS];
601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat uLeft[MAX_TEXTURE_UNITS];
602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat vLeft[MAX_TEXTURE_UNITS];
603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dsOuter[MAX_TEXTURE_UNITS], dsInner[MAX_TEXTURE_UNITS];
604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dtOuter[MAX_TEXTURE_UNITS], dtInner[MAX_TEXTURE_UNITS];
605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat duOuter[MAX_TEXTURE_UNITS], duInner[MAX_TEXTURE_UNITS];
606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dvOuter[MAX_TEXTURE_UNITS], dvInner[MAX_TEXTURE_UNITS];
607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         for (subTriangle=0; subTriangle<=1; subTriangle++) {
610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            EdgeT *eLeft, *eRight;
611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            int setupLeft, setupRight;
612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            int lines;
613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (subTriangle==0) {
615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* bottom half */
616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (ltor) {
617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eLeft = &eMaj;
618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eRight = &eBot;
619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  lines = eRight->lines;
620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupLeft = 1;
621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupRight = 1;
622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else {
624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eLeft = &eBot;
625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eRight = &eMaj;
626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  lines = eLeft->lines;
627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupLeft = 1;
628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupRight = 1;
629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* top half */
633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (ltor) {
634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eLeft = &eMaj;
635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eRight = &eTop;
636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  lines = eRight->lines;
637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupLeft = 0;
638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupRight = 1;
639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else {
641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eLeft = &eTop;
642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  eRight = &eMaj;
643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  lines = eLeft->lines;
644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupLeft = 1;
645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  setupRight = 0;
646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (lines == 0)
648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  return;
649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (setupLeft && eLeft->lines > 0) {
652a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul               const SWvertex *vLower;
653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed fsx = eLeft->fsx;
654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fx = FixedCeil(fsx);
655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fError = fx - fsx - FIXED_ONE;
656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fxLeftEdge = fsx - FIXED_EPSILON;
657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdxLeftEdge = eLeft->fdxdy;
658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdxOuter = FixedFloor(fdxLeftEdge - FIXED_EPSILON);
659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdError = fdxOuter - fdxLeftEdge + FIXED_ONE;
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               idxOuter = FixedToInt(fdxOuter);
661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dxOuter = (float) idxOuter;
662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               (void) dxOuter;
663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fy = eLeft->fsy;
665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               iy = FixedToInt(fy);
666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               adjx = (float)(fx - eLeft->fx0);  /* SCALED! */
668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               adjy = eLeft->adjy;		 /* SCALED! */
669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               (void) adjx;  /* silence compiler warnings */
670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               (void) adjy;  /* silence compiler warnings */
671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               vLower = eLeft->v0;
673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               (void) vLower;  /* silence compiler warnings */
674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS
676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  pRow = PIXEL_ADDRESS( FixedToInt(fxLeftEdge), iy );
678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dPRowOuter = -((int)BYTES_PER_ROW) + idxOuter * sizeof(PIXEL_TYPE);
679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  /* negative because Y=0 at bottom and increases upward */
680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /*
683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * Now we need the set of parameter (z, color, etc.) values at
684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * the point (fx, fy).  This gives us properly-sampled parameter
685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * values that we can step from pixel to pixel.  Furthermore,
686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * although we might have intermediate results that overflow
687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * the normal parameter range when we step temporarily outside
688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * the triangle, we shouldn't overflow or underflow for any
689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * pixel that's actually inside the triangle.
690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                */
691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
694cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  GLfloat z0 = vLower->win[2];
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (depthBits <= 16) {
696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     /* interpolate fixed-pt values */
697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     GLfloat tmp = (z0 * FIXED_SCALE +
698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                    dzdx * adjx + dzdy * adjy) + FIXED_HALF;
699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     if (tmp < MAX_GLUINT / 2)
700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        fz = (GLfixed) tmp;
701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     else
702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        fz = MAX_GLUINT / 2;
703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     fdzOuter = SignedFloatToFixed(dzdy + dxOuter * dzdx);
704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else {
706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     /* interpolate depth values exactly */
707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     fz = (GLint) (z0 + dzdx*FixedToFloat(adjx) + dzdy*FixedToFloat(adjy));
708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     fdzOuter = (GLint) (dzdy + dxOuter * dzdx);
709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  ifdef DEPTH_TYPE
711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  zRow = (DEPTH_TYPE *) _mesa_zbuffer_address(ctx, FixedToInt(fxLeftEdge), iy);
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dZRowOuter = (ctx->DrawBuffer->Width + idxOuter) * sizeof(DEPTH_TYPE);
713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  endif
714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
7151e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell	       {
7161e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell		  ffog = FloatToFixed(vLower->fog) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF;
7171e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell		  fdfogOuter = SignedFloatToFixed(dfogdy + dxOuter * dfogdx);
7181e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell	       }
719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
721cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fr = (GLfixed)(IntToFixed(vLower->color[0])
722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              + drdx * adjx + drdy * adjy) + FIXED_HALF;
723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdrOuter = SignedFloatToFixed(drdy + dxOuter * drdx);
724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
725cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fg = (GLfixed)(IntToFixed(vLower->color[1])
726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              + dgdx * adjx + dgdy * adjy) + FIXED_HALF;
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdgOuter = SignedFloatToFixed(dgdy + dxOuter * dgdx);
728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
729cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fb = (GLfixed)(IntToFixed(vLower->color[2])
730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              + dbdx * adjx + dbdy * adjy) + FIXED_HALF;
731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdbOuter = SignedFloatToFixed(dbdy + dxOuter * dbdx);
732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
734cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fsr = (GLfixed)(IntToFixed(vLower->specular[0])
735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                               + dsrdx * adjx + dsrdy * adjy) + FIXED_HALF;
736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdsrOuter = SignedFloatToFixed(dsrdy + dxOuter * dsrdx);
737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
738cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fsg = (GLfixed)(IntToFixed(vLower->specular[1])
739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                               + dsgdx * adjx + dsgdy * adjy) + FIXED_HALF;
740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdsgOuter = SignedFloatToFixed(dsgdy + dxOuter * dsgdx);
741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
742cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fsb = (GLfixed)(IntToFixed(vLower->specular[2])
743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                               + dsbdx * adjx + dsbdy * adjy) + FIXED_HALF;
744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdsbOuter = SignedFloatToFixed(dsbdy + dxOuter * dsbdx);
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
747cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fa = (GLfixed)(IntToFixed(vLower->color[3])
748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              + dadx * adjx + dady * adjy) + FIXED_HALF;
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdaOuter = SignedFloatToFixed(dady + dxOuter * dadx);
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
752cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell               fi = (GLfixed)(vLower->index * FIXED_SCALE
753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              + didx * adjx + didy * adjy) + FIXED_HALF;
754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdiOuter = SignedFloatToFixed(didy + dxOuter * didx);
755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfloat s0, t0;
759cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  s0 = vLower->texcoord[0][0] * S_SCALE;
760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fs = (GLfixed)(s0 * FIXED_SCALE + dsdx * adjx + dsdy * adjy) + FIXED_HALF;
761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fdsOuter = SignedFloatToFixed(dsdy + dxOuter * dsdx);
762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
763cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  t0 = vLower->texcoord[0][1] * T_SCALE;
764cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  ft = (GLfixed)(t0 * FIXED_SCALE + dtdx * adjx + dtdy * adjy) + FIXED_HALF;
765cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  fdtOuter = SignedFloatToFixed(dtdy + dxOuter * dtdx);
766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
770cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  GLfloat invW = vLower->win[3];
771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfloat s0, t0, u0, v0;
772cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  s0 = vLower->texcoord[0][0] * invW;
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  sLeft = s0 + (dsdx * adjx + dsdy * adjy) * (1.0F/FIXED_SCALE);
774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dsOuter = dsdy + dxOuter * dsdx;
775cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  t0 = vLower->texcoord[0][1] * invW;
776cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  tLeft = t0 + (dtdx * adjx + dtdy * adjy) * (1.0F/FIXED_SCALE);
777cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  dtOuter = dtdy + dxOuter * dtdx;
778cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  u0 = vLower->texcoord[0][2] * invW;
779cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  uLeft = u0 + (dudx * adjx + dudy * adjy) * (1.0F/FIXED_SCALE);
780cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  duOuter = dudy + dxOuter * dudx;
781cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell		  v0 = vLower->texcoord[0][3] * invW;
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  vLeft = v0 + (dvdx * adjx + dvdy * adjy) * (1.0F/FIXED_SCALE);
783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  dvOuter = dvdy + dxOuter * dvdx;
784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLuint u;
789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
790cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                     if (ctx->Texture.Unit[u]._ReallyEnabled) {
791cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                        GLfloat invW = vLower->win[3];
792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        GLfloat s0, t0, u0, v0;
793cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                        s0 = vLower->texcoord[u][0] * invW;
794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        sLeft[u] = s0 + (dsdx[u] * adjx + dsdy[u] * adjy) * (1.0F/FIXED_SCALE);
795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        dsOuter[u] = dsdy[u] + dxOuter * dsdx[u];
796cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			t0 = vLower->texcoord[u][1] * invW;
797cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			tLeft[u] = t0 + (dtdx[u] * adjx + dtdy[u] * adjy) * (1.0F/FIXED_SCALE);
798cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			dtOuter[u] = dtdy[u] + dxOuter * dtdx[u];
799cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			u0 = vLower->texcoord[u][2] * invW;
800cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			uLeft[u] = u0 + (dudx[u] * adjx + dudy[u] * adjy) * (1.0F/FIXED_SCALE);
801cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			duOuter[u] = dudy[u] + dxOuter * dudx[u];
802cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell			v0 = vLower->texcoord[u][3] * invW;
803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        vLeft[u] = v0 + (dvdx[u] * adjx + dvdy[u] * adjy) * (1.0F/FIXED_SCALE);
804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        dvOuter[u] = dvdy[u] + dxOuter * dvdx[u];
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }
806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            } /*if setupLeft*/
811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (setupRight && eRight->lines>0) {
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fxRightEdge = eRight->fsx - FIXED_EPSILON;
815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fdxRightEdge = eRight->fdxdy;
816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (lines==0) {
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               continue;
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* Rasterize setup */
824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS
825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dPRowInner = dPRowOuter + sizeof(PIXEL_TYPE);
826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  ifdef DEPTH_TYPE
829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dZRowInner = dZRowOuter + sizeof(DEPTH_TYPE);
830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  endif
831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdzInner = fdzOuter + fdzdx;
832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdfogInner = fdfogOuter + fdfogdx;
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdrInner = fdrOuter + fdrdx;
836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdgInner = fdgOuter + fdgdx;
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdbInner = fdbOuter + fdbdx;
838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdsrInner = fdsrOuter + fdsrdx;
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdsgInner = fdsgOuter + fdsgdx;
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdsbInner = fdsbOuter + fdsbdx;
843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdaInner = fdaOuter + fdadx;
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdiInner = fdiOuter + fdidx;
849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdsInner = fdsOuter + fdsdx;
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            fdtInner = fdtOuter + fdtdx;
853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    dsInner = dsOuter + dsdx;
856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    dtInner = dtOuter + dtdx;
857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    duInner = duOuter + dudx;
858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    dvInner = dvOuter + dvdx;
859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            {
862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLuint u;
863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
864cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                  if (ctx->Texture.Unit[u]._ReallyEnabled) {
865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     dsInner[u] = dsOuter[u] + dsdx[u];
866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     dtInner[u] = dtOuter[u] + dtdx[u];
867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     duInner[u] = duOuter[u] + dudx[u];
868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     dvInner[u] = dvOuter[u] + dvdx[u];
869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            while (lines>0) {
875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* initialize the span interpolants to the leftmost value */
876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* ff = fixed-pt fragment */
877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLint left = FixedToInt(fxLeftEdge);
878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLint right = FixedToInt(fxRightEdge);
879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffz = fz;
881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed fffog = ffog;
882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffr = fr,  ffg = fg,  ffb = fb;
885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffsr = fsr,  ffsg = fsg,  ffsb = fsb;
888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffa = fa;
891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffi = fi;
894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfixed ffs = fs,  fft = ft;
897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat ss = sLeft, tt = tLeft, uu = uLeft, vv = vLeft;
900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat ss[MAX_TEXTURE_UNITS];
903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat tt[MAX_TEXTURE_UNITS];
904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat uu[MAX_TEXTURE_UNITS];
905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat vv[MAX_TEXTURE_UNITS];
906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLuint u;
908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
909cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                     if (ctx->Texture.Unit[u]._ReallyEnabled) {
910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        ss[u] = sLeft[u];
911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        tt[u] = tLeft[u];
912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        uu[u] = uLeft[u];
913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        vv[u] = vLeft[u];
914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }
915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  /* need this to accomodate round-off errors */
922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffrend = ffr+(right-left-1)*fdrdx;
923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffgend = ffg+(right-left-1)*fdgdx;
924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffbend = ffb+(right-left-1)*fdbdx;
925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffrend<0) ffr -= ffrend;
926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffgend<0) ffg -= ffgend;
927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffbend<0) ffb -= ffbend;
928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffr<0) ffr = 0;
929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffg<0) ffg = 0;
930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffb<0) ffb = 0;
931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  /* need this to accomodate round-off errors */
936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffsrend = ffsr+(right-left-1)*fdsrdx;
937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffsgend = ffsg+(right-left-1)*fdsgdx;
938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffsbend = ffsb+(right-left-1)*fdsbdx;
939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsrend<0) ffsr -= ffsrend;
940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsgend<0) ffsg -= ffsgend;
941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsbend<0) ffsb -= ffsbend;
942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsr<0) ffsr = 0;
943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsg<0) ffsg = 0;
944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffsb<0) ffsb = 0;
945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               {
949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  GLfixed ffaend = ffa+(right-left-1)*fdadx;
950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffaend<0) ffa -= ffaend;
951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ffa<0) ffa = 0;
952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (ffi<0) ffi = 0;
956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               INNER_LOOP( left, right, iy );
959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /*
961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * Advance to the next scan line.  Compute the
962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * new edge coordinates, and adjust the
963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * pixel-center x coordinate so that it stays
964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                * on or inside the major edge.
965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                */
966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               iy++;
967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               lines--;
968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fxLeftEdge += fdxLeftEdge;
970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fxRightEdge += fdxRightEdge;
971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fError += fdError;
974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (fError >= 0) {
975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fError -= FIXED_ONE;
976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS
977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  pRow = (PIXEL_TYPE *) ((GLubyte*)pRow + dPRowOuter);
978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  ifdef DEPTH_TYPE
981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  zRow = (DEPTH_TYPE *) ((GLubyte*)zRow + dZRowOuter);
982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  endif
983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fz += fdzOuter;
9841e1aac034c986a08248861363c0baa27dc2ae2d5Keith Whitwell                  ffog += fdfogOuter;
985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fr += fdrOuter;   fg += fdgOuter;   fb += fdbOuter;
988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fsr += fdsrOuter;   fsg += fdsgOuter;   fsb += fdsbOuter;
991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fa += fdaOuter;
994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fi += fdiOuter;
997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fs += fdsOuter;   ft += fdtOuter;
1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  sLeft += dsOuter;
1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  tLeft += dtOuter;
1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  uLeft += duOuter;
1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  vLeft += dvOuter;
1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  {
1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     GLuint u;
1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
1011cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                        if (ctx->Texture.Unit[u]._ReallyEnabled) {
1012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           sLeft[u] += dsOuter[u];
1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           tLeft[u] += dtOuter[u];
1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           uLeft[u] += duOuter[u];
1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           vLeft[u] += dvOuter[u];
1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }
1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }
1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else {
1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef PIXEL_ADDRESS
1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  pRow = (PIXEL_TYPE *) ((GLubyte*)pRow + dPRowInner);
1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_Z
1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  ifdef DEPTH_TYPE
1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  zRow = (DEPTH_TYPE *) ((GLubyte*)zRow + dZRowInner);
1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#  endif
1029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fz += fdzInner;
1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  ffog += fdfogInner;
1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_RGB
1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fr += fdrInner;   fg += fdgInner;   fb += fdbInner;
1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_SPEC
1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fsr += fdsrInner;   fsg += fdsgInner;   fsb += fdsbInner;
1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_ALPHA
1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fa += fdaInner;
1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INDEX
1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fi += fdiInner;
1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_INT_TEX
1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  fs += fdsInner;   ft += fdtInner;
1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_TEX
1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  sLeft += dsInner;
1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  tLeft += dtInner;
1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  uLeft += duInner;
1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  vLeft += dvInner;
1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef INTERP_MULTITEX
1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  {
1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     GLuint u;
1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
1057cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell                        if (ctx->Texture.Unit[u]._ReallyEnabled) {
1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           sLeft[u] += dsInner[u];
1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           tLeft[u] += dtInner[u];
1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           uLeft[u] += duInner[u];
1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           vLeft[u] += dvInner[u];
1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }
1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }
1064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            } /*while lines>0*/
1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         } /* for subTriangle */
1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SETUP_CODE
1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INNER_LOOP
1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef PIXEL_TYPE
1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef BYTES_PER_ROW
1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef PIXEL_ADDRESS
1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_Z
1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_RGB
1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_SPEC
1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_ALPHA
1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_INDEX
1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_INT_TEX
1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_TEX
1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef INTERP_MULTITEX
1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef S_SCALE
1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef T_SCALE
1093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef FixedToDepth
1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_OCCLUSION_TEST
1097