-#define INNER_LOOP( LEFT, RIGHT, Y ) \
- { \
- GLint i = 0; \
- const GLint n = RIGHT-LEFT; \
- GLdepth zspan[MAX_WIDTH]; \
- GLfixed fogspan[MAX_WIDTH]; \
- GLchan rgba[MAX_WIDTH][4]; \
- (void)uu; /* please GCC */ \
- if (n > 0) { \
- GLchan *dest = rgba[0]; \
- GLfloat SS = ss * sscale; \
- GLfloat TT = tt * tscale; \
- GLfloat dSdx = dsdx * sscale; \
- GLfloat dTdx = dtdx * tscale; \
- GLfloat x_tex; \
- GLfloat y_tex; \
- GLfloat dx_tex; \
- GLfloat dy_tex; \
- if (n<5) /* When line very short, setup-time > speed-gain. */ \
- goto old_span; /* So: take old method */ \
- x_tex = SS / vv, \
- y_tex = TT / vv; \
- dx_tex = (SS + n * dSdx) / (vv + n * dvdx) - x_tex, \
- dy_tex = (TT + n * dTdx) / (vv + n * dvdx) - y_tex; \
- /* Choose between walking over texture or over pixelline: */ \
- /* If there are few texels, walk over texture otherwise */ \
- /* walk over pixelarray. The quotient on the right side */ \
- /* should give the timeratio needed to draw one texel in */ \
- /* comparison to one pixel. Depends on CPU. */ \
- if (dx_tex*dx_tex + dy_tex*dy_tex < (n*n)/16) { \
- x_tex += BIAS; \
- y_tex += BIAS; \
- if (dx_tex*dx_tex > dy_tex*dy_tex) { \
- /* if (FABSF(dx_tex) > FABSF(dy_tex)) */ \
- GLfloat nominator = - SS - vv * BIAS; \
- GLfloat denominator = dvdx * BIAS + dSdx; \
- GLfloat dy_dx; \
- GLfloat dx_dy; \
- if (dy_tex != 0.0f) { \
- dy_dx = dy_tex / dx_tex; \
- dx_dy = 1.0f/dy_dx; \
- } \
- else \
- dy_dx = 0.0f; \
- if (dx_tex > 0.0f) { \
- if (dy_tex > 0.0f) { \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN1(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN1(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN1(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN1(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN1(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN1(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN1(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN1(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN1(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- } \
- } \
- else { /* dy_tex <= 0.0f */ \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN2(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN2(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN2(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN2(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN2(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN2(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN2(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN2(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN2(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- } \
- } \
- } \
- else { /* dx_tex < 0.0f */ \
- if (dy_tex > 0.0f) { \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN3(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN3(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN3(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN3(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN3(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN3(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN3(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN3(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN3(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- } \
- } \
- else { /* dy_tex <= 0.0f */ \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN4(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN4(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN4(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN4(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN4(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN4(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN4(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN4(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN4(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- } \
- } \
- } \
- } \
- else { /* FABSF(dx_tex) > FABSF(dy_tex) */ \
- GLfloat swap; \
- GLfloat dy_dx; \
- GLfloat dx_dy; \
- GLfloat nominator, denominator; \
- if (dx_tex == 0.0f /* && dy_tex == 0.0f*/) \
- goto old_span; /* case so special, that use old */ \
- /* swap some x-values and y-values */ \
- SS = TT; \
- dSdx = dTdx; \
- swap = x_tex, x_tex = y_tex, y_tex = swap; \
- swap = dx_tex, dx_tex = dy_tex, dy_tex = swap; \
- nominator = - SS - vv * BIAS; \
- denominator = dvdx * BIAS + dSdx; \
- if (dy_tex != 0.0f) { \
- dy_dx = dy_tex / dx_tex; \
- dx_dy = 1.0f/dy_dx; \
- } \
- else \
- dy_dx = 0.0f; \
- if (dx_tex > 0.0f) { \
- if (dy_tex > 0.0f) { \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN1(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN1(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN1(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN1(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \
- break; \
- default: /* unexpected env mode */ \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN1(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN1(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN1(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN1(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN1(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
- break; \
- default: \
- abort(); \
- } \
- break; \
- } \
- } \
- else { /* dy_tex <= 0.0f */ \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN2(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN2(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN2(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN2(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN2(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN2(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN2(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN2(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN2(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
- break; \
- default: \
- abort(); \
- } \
- break; \
- } \
- } \
- } \
- else { /* dx_tex < 0.0f */ \
- if (dy_tex > 0.0f) { \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN3(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN3(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN3(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN3(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN3(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN3(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN3(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN3(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN3(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
- break; \
- default: \
- abort(); \
- } \
- break; \
- } \
- } \
- else { /* dy_tex <= 0.0f */ \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- SPAN4(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- SPAN4(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN4(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN4(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- SPAN4(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
- break; \
- case GL_DECAL: \
- SPAN4(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \
- break; \
- case GL_BLEND: \
- SPAN4(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \
- break; \
- case GL_ADD: \
- SPAN4(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \
- break; \
- case GL_REPLACE: \
- SPAN4(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
- break; \
- default: \
- abort(); \
- } \
- break; \
- } \
- } \
- } \
- } \
- } \
- else { \
- old_span: \
- switch (format) { \
- case GL_RGB: \
- switch (envmode) { \
- case GL_MODULATE: \
- OLD_SPAN(NEAREST_RGB;MODULATE,3); \
- break; \
- case GL_DECAL: \
- case GL_REPLACE: \
- OLD_SPAN(NEAREST_RGB_REPLACE,3); \
- break; \
- case GL_BLEND: \
- OLD_SPAN(NEAREST_RGB;BLEND,3); \
- break; \
- case GL_ADD: \
- OLD_SPAN(NEAREST_RGB;ADD,3); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- case GL_RGBA: \
- switch(envmode) { \
- case GL_MODULATE: \
- OLD_SPAN(NEAREST_RGBA;MODULATE,4); \
- break; \
- case GL_DECAL: \
- OLD_SPAN(NEAREST_RGBA;DECAL,4); \
- break; \
- case GL_BLEND: \
- OLD_SPAN(NEAREST_RGBA;BLEND,4); \
- break; \
- case GL_ADD: \
- OLD_SPAN(NEAREST_RGBA;ADD,4); \
- break; \
- case GL_REPLACE: \
- OLD_SPAN(NEAREST_RGBA_REPLACE,4); \
- break; \
- default: \
- abort(); \
- } \
- break; \
- } \
- } \
- _mesa_write_rgba_span( ctx, n, LEFT, Y, zspan, \
- fogspan, rgba, GL_POLYGON); \
- ffr = ffg = ffb = ffa = 0; \
- } \
- } \