-typedef GLuint (*interp_func)( GLcontext *ctx,
- GLfloat t, GLuint in, GLuint out,
- GLboolean force_boundary );
-
-typedef void (*clip_line_func)( GLcontext *ctx,
- GLuint i, GLuint j,
- GLubyte mask);
-
-typedef void (*clip_poly_func)( GLcontext *ctx,
- GLuint n, GLuint vlist[],
- GLuint pv, GLubyte mask );
-
-
-typedef void (*render_func)( GLcontext *ctx,
- GLuint start,
- GLuint count,
- GLuint flags );
-
-
-
-struct render_stage_data {
-
- /* Clipping functions for current state.
- */
- interp_func interp; /* Clip interpolation function */
- GLuint _ClipInputs; /* Inputs referenced by interpfunc */
-
-};
-
-#define RENDER_STAGE_DATA(stage) ((struct render_stage_data *)stage->private)
-
-static void render_poly_pv_raw_elts( GLcontext *ctx,
- GLuint start,
- GLuint count,
- GLuint flags,
- GLuint pv );
-
-/**********************************************************************/
-/* Interpolate between pairs of vertices */
-/**********************************************************************/
-
-
-#define INTERP_RGBA 0x1
-#define INTERP_TEX 0x2
-#define INTERP_INDEX 0x4
-#define INTERP_SPEC 0x8
-#define INTERP_FOG 0x10
-#define INTERP_EDGE 0x20
-#define MAX_INTERP 0x40
-
-
-#define LINTERP_SZ( t, vec, to, a, b, sz ) \
-do { \
- switch (sz) { \
- case 4: vec[to][3] = LINTERP( t, vec[a][3], vec[b][3] ); \
- case 3: vec[to][2] = LINTERP( t, vec[a][2], vec[b][2] ); \
- case 2: vec[to][1] = LINTERP( t, vec[a][1], vec[b][1] ); \
- case 1: vec[to][0] = LINTERP( t, vec[a][0], vec[b][0] ); \
- } \
-} while(0)
-
-
-#if 1
-
-#define LINTERP_RGBA(nr, t, out, a, b) { \
- int i; \
- for (i = 0; i < nr; i++) { \
- GLfloat fa = CHAN_TO_FLOAT(a[i]); \
- GLfloat fb = CHAN_TO_FLOAT(b[i]); \
- GLfloat fo = LINTERP(t, fa, fb); \
- FLOAT_COLOR_TO_CHAN(out[i], fo); \
- } \
-}
-
-#else
-
-#define LINTERP_RGBA(nr, t, out, a, b) { \
- int n; \
- const GLuint ti = FloatToInt(t*256.0F); \
- const GLubyte *Ib = (const GLubyte *)&a[0]; \
- const GLubyte *Jb = (const GLubyte *)&b[0]; \
- GLubyte *Ob = (GLubyte *)&out[0]; \
- \
- for (n = 0 ; n < nr ; n++) \
- Ob[n] = (GLubyte) (Ib[n] + ((ti * (Jb[n] - Ib[n]))/256)); \
-}
-
-#endif
-
-
-
-static interp_func interp_tab[0x80];
-
-
-#define IND (INTERP_RGBA)
-#define NAME interp_RGBA
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC)
-#define NAME interp_RGBA_SPEC
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_FOG)
-#define NAME interp_RGBA_FOG
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_FOG)
-#define NAME interp_RGBA_SPEC_FOG
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_TEX)
-#define NAME interp_RGBA_TEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_TEX)
-#define NAME interp_RGBA_SPEC_TEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_FOG|INTERP_TEX)
-#define NAME interp_RGBA_FOG_TEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX)
-#define NAME interp_RGBA_SPEC_FOG_TEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_INDEX)
-#define NAME interp_INDEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_FOG|INTERP_INDEX)
-#define NAME interp_FOG_INDEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_TEX|INTERP_INDEX)
-#define NAME interp_TEX_INDEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_FOG|INTERP_TEX|INTERP_INDEX)
-#define NAME interp_FOG_TEX_INDEX
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_EDGE)
-#define NAME interp_RGBA_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_EDGE)
-#define NAME interp_RGBA_SPEC_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_FOG|INTERP_EDGE)
-#define NAME interp_RGBA_FOG_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_EDGE)
-#define NAME interp_RGBA_SPEC_FOG_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_TEX|INTERP_EDGE)
-#define NAME interp_RGBA_TEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_TEX|INTERP_EDGE)
-#define NAME interp_RGBA_SPEC_TEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_FOG|INTERP_TEX|INTERP_EDGE)
-#define NAME interp_RGBA_FOG_TEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX|INTERP_EDGE)
-#define NAME interp_RGBA_SPEC_FOG_TEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_INDEX|INTERP_EDGE)
-#define NAME interp_INDEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_FOG|INTERP_INDEX|INTERP_EDGE)
-#define NAME interp_FOG_INDEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_TEX|INTERP_INDEX|INTERP_EDGE)
-#define NAME interp_TEX_INDEX_EDGE
-#include "t_vb_interptmp.h"
-
-#define IND (INTERP_FOG|INTERP_TEX|INTERP_INDEX|INTERP_EDGE)
-#define NAME interp_FOG_TEX_INDEX_EDGE
-#include "t_vb_interptmp.h"
-
-
-
-static GLuint interp_invalid( GLcontext *ctx,
- GLfloat t,
- GLuint in, GLuint out,
- GLboolean boundary )
-{
- (void)(ctx && t && in && out && boundary);
- fprintf(stderr, "Invalid interpolation function in t_vbrender.c\n");
- return in;
-}
-
-
-static void interp_init( void )
-{
- GLuint i;
-
- /* Use the maximal function as the default. I don't believe any of
- * the non-implemented combinations are reachable, but this gives
- * some safety from crashes.
- */
- for (i = 0 ; i < Elements(interp_tab) ; i++)
- interp_tab[i] = interp_invalid;
-
- interp_tab[INTERP_RGBA] = interp_RGBA;
- interp_tab[INTERP_RGBA|INTERP_SPEC] = interp_RGBA_SPEC;
- interp_tab[INTERP_RGBA|INTERP_FOG] = interp_RGBA_FOG;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG] = interp_RGBA_SPEC_FOG;
- interp_tab[INTERP_RGBA|INTERP_TEX] = interp_RGBA_TEX;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_TEX] = interp_RGBA_SPEC_TEX;
- interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_TEX] = interp_RGBA_FOG_TEX;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX] = interp_RGBA_SPEC_FOG_TEX;
- interp_tab[INTERP_INDEX] = interp_INDEX;
- interp_tab[INTERP_FOG|INTERP_INDEX] = interp_FOG_INDEX;
- interp_tab[INTERP_TEX|INTERP_INDEX] = interp_TEX_INDEX;
- interp_tab[INTERP_FOG|INTERP_TEX|INTERP_INDEX] = interp_FOG_TEX_INDEX;
- interp_tab[INTERP_RGBA|INTERP_EDGE] = interp_RGBA_EDGE;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_EDGE] = interp_RGBA_SPEC_EDGE;
- interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_EDGE] = interp_RGBA_FOG_EDGE;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_EDGE] = interp_RGBA_SPEC_FOG_EDGE;
- interp_tab[INTERP_RGBA|INTERP_TEX|INTERP_EDGE] = interp_RGBA_TEX_EDGE;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_TEX|INTERP_EDGE] = interp_RGBA_SPEC_TEX_EDGE;
- interp_tab[INTERP_RGBA|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = interp_RGBA_FOG_TEX_EDGE;
- interp_tab[INTERP_RGBA|INTERP_SPEC|INTERP_FOG|INTERP_TEX|INTERP_EDGE] = interp_RGBA_SPEC_FOG_TEX_EDGE;
- interp_tab[INTERP_INDEX|INTERP_EDGE] = interp_INDEX_EDGE;
- interp_tab[INTERP_FOG|INTERP_INDEX|INTERP_EDGE] = interp_FOG_INDEX_EDGE;
- interp_tab[INTERP_TEX|INTERP_INDEX|INTERP_EDGE] = interp_TEX_INDEX_EDGE;
- interp_tab[INTERP_FOG|INTERP_TEX|INTERP_INDEX|INTERP_EDGE] = interp_FOG_TEX_INDEX_EDGE;
-}
-