diff options
-rw-r--r-- | src/mesa/swrast/s_texture.c | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c index 3a0da6e2531..a6ae844334e 100644 --- a/src/mesa/swrast/s_texture.c +++ b/src/mesa/swrast/s_texture.c @@ -1,4 +1,4 @@ -/* $Id: s_texture.c,v 1.15 2001/03/08 15:23:46 brianp Exp $ */ +/* $Id: s_texture.c,v 1.16 2001/03/15 16:45:30 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -65,11 +65,12 @@ I1 = (I0 + 1) & (SIZE - 1); \ } \ else { \ - U = S * SIZE; \ - if (U < 0.0F) \ + if (S <= 0.0F) \ U = 0.0F; \ - else if (U >= SIZE) \ + else if (S >= 1.0F) \ U = SIZE; \ + else \ + U = S * SIZE; \ U -= 0.5F; \ I0 = IFLOOR(U); \ I1 = I0 + 1; \ @@ -272,8 +273,8 @@ sample_1d_linear(GLcontext *ctx, { const GLfloat a = FRAC(u); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ - const GLint w0 = (GLint) ((1.0F-a) * WEIGHT_SCALE + 0.5F); - const GLint w1 = (GLint) ( a * WEIGHT_SCALE + 0.5F); + const GLint w0 = IROUND((1.0F-a) * WEIGHT_SCALE); + const GLint w1 = IROUND( a * WEIGHT_SCALE); GLchan t0[4], t1[4]; /* texels */ @@ -565,10 +566,10 @@ sample_2d_linear(GLcontext *ctx, const GLfloat a = FRAC(u); const GLfloat b = FRAC(v); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ - const GLint w00 = (GLint) ((1.0F-a)*(1.0F-b) * WEIGHT_SCALE + 0.5F); - const GLint w10 = (GLint) ( a *(1.0F-b) * WEIGHT_SCALE + 0.5F); - const GLint w01 = (GLint) ((1.0F-a)* b * WEIGHT_SCALE + 0.5F); - const GLint w11 = (GLint) ( a * b * WEIGHT_SCALE + 0.5F); + const GLint w00 = IROUND((1.0F-a) * (1.0F-b) * WEIGHT_SCALE); + const GLint w10 = IROUND( a * (1.0F-b) * WEIGHT_SCALE); + const GLint w01 = IROUND((1.0F-a) * b * WEIGHT_SCALE); + const GLint w11 = IROUND( a * b * WEIGHT_SCALE); GLchan t00[4]; GLchan t10[4]; GLchan t01[4]; @@ -752,22 +753,20 @@ sample_lambda_2d( GLcontext *ctx, GLuint texUnit, GLuint i; (void) u; - /* check if lambda is monotonous-array */ + /* since lambda is monotonous-array use this check first */ if (lambda[0] <= minMagThresh && lambda[n-1] <= minMagThresh) { - /* magnification */ + /* magnification for whole span */ switch (tObj->MagFilter) { case GL_NEAREST: - for (i = 0; i < n; i++) - sample_2d_nearest(ctx, tObj, tObj->Image[tObj->BaseLevel], - s[i], t[i], rgba[i] ); + sample_nearest_2d(ctx, texUnit, tObj, n, s, t, u, + lambda, rgba); break; case GL_LINEAR: - for (i = 0; i < n; i++) - sample_2d_linear(ctx, tObj, tObj->Image[tObj->BaseLevel], - s[i], t[i], rgba[i] ); + sample_linear_2d(ctx, texUnit, tObj, n, s, t, u, + lambda, rgba); break; default: - _mesa_problem(NULL, "Bad mag filter in sample_2d_texture"); + _mesa_problem(NULL, "Bad mag filter in sample_lambda_2d"); } } else { @@ -988,14 +987,14 @@ sample_3d_linear(GLcontext *ctx, const GLfloat b = FRAC(v); const GLfloat c = FRAC(w); /* compute sample weights in fixed point in [0,WEIGHT_SCALE] */ - GLint w000 = (GLint) ((1.0F-a)*(1.0F-b)*(1.0F-c) * WEIGHT_SCALE + 0.5F); - GLint w100 = (GLint) ( a *(1.0F-b)*(1.0F-c) * WEIGHT_SCALE + 0.5F); - GLint w010 = (GLint) ((1.0F-a)* b *(1.0F-c) * WEIGHT_SCALE + 0.5F); - GLint w110 = (GLint) ( a * b *(1.0F-c) * WEIGHT_SCALE + 0.5F); - GLint w001 = (GLint) ((1.0F-a)*(1.0F-b)* c * WEIGHT_SCALE + 0.5F); - GLint w101 = (GLint) ( a *(1.0F-b)* c * WEIGHT_SCALE + 0.5F); - GLint w011 = (GLint) ((1.0F-a)* b * c * WEIGHT_SCALE + 0.5F); - GLint w111 = (GLint) ( a * b * c * WEIGHT_SCALE + 0.5F); + GLint w000 = IROUND((1.0F-a) * (1.0F-b) * (1.0F-c) * WEIGHT_SCALE); + GLint w100 = IROUND( a * (1.0F-b) * (1.0F-c) * WEIGHT_SCALE); + GLint w010 = IROUND((1.0F-a) * b * (1.0F-c) * WEIGHT_SCALE); + GLint w110 = IROUND( a * b * (1.0F-c) * WEIGHT_SCALE); + GLint w001 = IROUND((1.0F-a) * (1.0F-b) * c * WEIGHT_SCALE); + GLint w101 = IROUND( a * (1.0F-b) * c * WEIGHT_SCALE); + GLint w011 = IROUND((1.0F-a) * b * c * WEIGHT_SCALE); + GLint w111 = IROUND( a * b * c * WEIGHT_SCALE); GLchan t000[4], t010[4], t001[4], t011[4]; GLchan t100[4], t110[4], t101[4], t111[4]; |