diff options
| author | Brian Paul <brian.paul@tungstengraphics.com> | 2008-06-09 14:32:27 -0600 | 
|---|---|---|
| committer | Keith Whitwell <keith@tungstengraphics.com> | 2008-09-21 22:13:51 -0700 | 
| commit | 18d2822905ac3187318bd662f80c2836bdfa7c1f (patch) | |
| tree | 13de4329376b9c268a71d0a69c8faac2bf07e361 | |
| parent | 533c1dbe7582bdd72f671eef02e085f0c43159e2 (diff) | |
mesa: refactor: move pixel map/scale/bias code into image.c
pixel.c is just the API-related code now.
| -rw-r--r-- | src/mesa/main/image.c | 422 | ||||
| -rw-r--r-- | src/mesa/main/image.h | 47 | ||||
| -rw-r--r-- | src/mesa/main/pixel.c | 418 | ||||
| -rw-r--r-- | src/mesa/main/pixel.h | 15 | 
4 files changed, 486 insertions, 416 deletions
diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index 8034daecae..3b62eb34ed 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -2,7 +2,7 @@   * Mesa 3-D graphics library   * Version:  7.1   * - * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -1011,6 +1011,426 @@ _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,  } +/**********************************************************************/ +/*****                  Pixel processing functions               ******/ +/**********************************************************************/ + +/* + * Apply scale and bias factors to an array of RGBA pixels. + */ +void +_mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4], +                          GLfloat rScale, GLfloat gScale, +                          GLfloat bScale, GLfloat aScale, +                          GLfloat rBias, GLfloat gBias, +                          GLfloat bBias, GLfloat aBias) +{ +   if (rScale != 1.0 || rBias != 0.0) { +      GLuint i; +      for (i = 0; i < n; i++) { +         rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias; +      } +   } +   if (gScale != 1.0 || gBias != 0.0) { +      GLuint i; +      for (i = 0; i < n; i++) { +         rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias; +      } +   } +   if (bScale != 1.0 || bBias != 0.0) { +      GLuint i; +      for (i = 0; i < n; i++) { +         rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias; +      } +   } +   if (aScale != 1.0 || aBias != 0.0) { +      GLuint i; +      for (i = 0; i < n; i++) { +         rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias; +      } +   } +} + + +/* + * Apply pixel mapping to an array of floating point RGBA pixels. + */ +void +_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] ) +{ +   const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1); +   const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1); +   const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1); +   const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1); +   const GLfloat *rMap = ctx->PixelMaps.RtoR.Map; +   const GLfloat *gMap = ctx->PixelMaps.GtoG.Map; +   const GLfloat *bMap = ctx->PixelMaps.BtoB.Map; +   const GLfloat *aMap = ctx->PixelMaps.AtoA.Map; +   GLuint i; +   for (i=0;i<n;i++) { +      GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); +      GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); +      GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); +      GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); +      rgba[i][RCOMP] = rMap[IROUND(r * rscale)]; +      rgba[i][GCOMP] = gMap[IROUND(g * gscale)]; +      rgba[i][BCOMP] = bMap[IROUND(b * bscale)]; +      rgba[i][ACOMP] = aMap[IROUND(a * ascale)]; +   } +} + + +/* + * Apply the color matrix and post color matrix scaling and biasing. + */ +void +_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]) +{ +   const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0]; +   const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0]; +   const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1]; +   const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1]; +   const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2]; +   const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2]; +   const GLfloat as = ctx->Pixel.PostColorMatrixScale[3]; +   const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3]; +   const GLfloat *m = ctx->ColorMatrixStack.Top->m; +   GLuint i; +   for (i = 0; i < n; i++) { +      const GLfloat r = rgba[i][RCOMP]; +      const GLfloat g = rgba[i][GCOMP]; +      const GLfloat b = rgba[i][BCOMP]; +      const GLfloat a = rgba[i][ACOMP]; +      rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb; +      rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb; +      rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb; +      rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab; +   } +} + + +/** + * Apply a color table lookup to an array of floating point RGBA colors. + */ +void +_mesa_lookup_rgba_float(const struct gl_color_table *table, +                        GLuint n, GLfloat rgba[][4]) +{ +   const GLint max = table->Size - 1; +   const GLfloat scale = (GLfloat) max; +   const GLfloat *lut = table->TableF; +   GLuint i; + +   if (!table->TableF || table->Size == 0) +      return; + +   switch (table->_BaseFormat) { +      case GL_INTENSITY: +         /* replace RGBA with I */ +         for (i = 0; i < n; i++) { +            GLint j = IROUND(rgba[i][RCOMP] * scale); +            GLfloat c = lut[CLAMP(j, 0, max)]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = +            rgba[i][ACOMP] = c; +         } +         break; +      case GL_LUMINANCE: +         /* replace RGB with L */ +         for (i = 0; i < n; i++) { +            GLint j = IROUND(rgba[i][RCOMP] * scale); +            GLfloat c = lut[CLAMP(j, 0, max)]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = c; +         } +         break; +      case GL_ALPHA: +         /* replace A with A */ +         for (i = 0; i < n; i++) { +            GLint j = IROUND(rgba[i][ACOMP] * scale); +            rgba[i][ACOMP] = lut[CLAMP(j, 0, max)]; +         } +         break; +      case GL_LUMINANCE_ALPHA: +         /* replace RGBA with LLLA */ +         for (i = 0; i < n; i++) { +            GLint jL = IROUND(rgba[i][RCOMP] * scale); +            GLint jA = IROUND(rgba[i][ACOMP] * scale); +            GLfloat luminance, alpha; +            jL = CLAMP(jL, 0, max); +            jA = CLAMP(jA, 0, max); +            luminance = lut[jL * 2 + 0]; +            alpha     = lut[jA * 2 + 1]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = luminance; +            rgba[i][ACOMP] = alpha;; +         } +         break; +      case GL_RGB: +         /* replace RGB with RGB */ +         for (i = 0; i < n; i++) { +            GLint jR = IROUND(rgba[i][RCOMP] * scale); +            GLint jG = IROUND(rgba[i][GCOMP] * scale); +            GLint jB = IROUND(rgba[i][BCOMP] * scale); +            jR = CLAMP(jR, 0, max); +            jG = CLAMP(jG, 0, max); +            jB = CLAMP(jB, 0, max); +            rgba[i][RCOMP] = lut[jR * 3 + 0]; +            rgba[i][GCOMP] = lut[jG * 3 + 1]; +            rgba[i][BCOMP] = lut[jB * 3 + 2]; +         } +         break; +      case GL_RGBA: +         /* replace RGBA with RGBA */ +         for (i = 0; i < n; i++) { +            GLint jR = IROUND(rgba[i][RCOMP] * scale); +            GLint jG = IROUND(rgba[i][GCOMP] * scale); +            GLint jB = IROUND(rgba[i][BCOMP] * scale); +            GLint jA = IROUND(rgba[i][ACOMP] * scale); +            jR = CLAMP(jR, 0, max); +            jG = CLAMP(jG, 0, max); +            jB = CLAMP(jB, 0, max); +            jA = CLAMP(jA, 0, max); +            rgba[i][RCOMP] = lut[jR * 4 + 0]; +            rgba[i][GCOMP] = lut[jG * 4 + 1]; +            rgba[i][BCOMP] = lut[jB * 4 + 2]; +            rgba[i][ACOMP] = lut[jA * 4 + 3]; +         } +         break; +      default: +         _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_float"); +         return; +   } +} + + + +/** + * Apply a color table lookup to an array of ubyte/RGBA colors. + */ +void +_mesa_lookup_rgba_ubyte(const struct gl_color_table *table, +                        GLuint n, GLubyte rgba[][4]) +{ +   const GLubyte *lut = table->TableUB; +   const GLfloat scale = (GLfloat) (table->Size - 1) / (GLfloat)255.0; +   GLuint i; + +   if (!table->TableUB || table->Size == 0) +      return; + +   switch (table->_BaseFormat) { +   case GL_INTENSITY: +      /* replace RGBA with I */ +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            const GLubyte c = lut[rgba[i][RCOMP]]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = +            rgba[i][ACOMP] = c; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale); +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = +            rgba[i][ACOMP] = lut[j]; +         } +      } +      break; +   case GL_LUMINANCE: +      /* replace RGB with L */ +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            const GLubyte c = lut[rgba[i][RCOMP]]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = c; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale); +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = lut[j]; +         } +      } +      break; +   case GL_ALPHA: +      /* replace A with A */ +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            rgba[i][ACOMP] = lut[rgba[i][ACOMP]]; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale); +            rgba[i][ACOMP] = lut[j]; +         } +      } +      break; +   case GL_LUMINANCE_ALPHA: +      /* replace RGBA with LLLA */ +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            GLubyte l = lut[rgba[i][RCOMP] * 2 + 0]; +            GLubyte a = lut[rgba[i][ACOMP] * 2 + 1];; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = l; +            rgba[i][ACOMP] = a; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale); +            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale); +            GLubyte luminance = lut[jL * 2 + 0]; +            GLubyte alpha     = lut[jA * 2 + 1]; +            rgba[i][RCOMP] = +            rgba[i][GCOMP] = +            rgba[i][BCOMP] = luminance; +            rgba[i][ACOMP] = alpha; +         } +      } +      break; +   case GL_RGB: +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0]; +            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1]; +            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2]; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale); +            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale); +            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale); +            rgba[i][RCOMP] = lut[jR * 3 + 0]; +            rgba[i][GCOMP] = lut[jG * 3 + 1]; +            rgba[i][BCOMP] = lut[jB * 3 + 2]; +         } +      } +      break; +   case GL_RGBA: +      if (table->Size == 256) { +         for (i = 0; i < n; i++) { +            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0]; +            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1]; +            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2]; +            rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3]; +         } +      } +      else { +         for (i = 0; i < n; i++) { +            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale); +            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale); +            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale); +            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale); +            CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]); +            CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]); +            CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]); +            CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]); +         } +      } +      break; +   default: +      _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan"); +      return; +   } +} + + + +/* + * Map color indexes to float rgba values. + */ +void +_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n, +                      const GLuint index[], GLfloat rgba[][4] ) +{ +   GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; +   GLuint gmask = ctx->PixelMaps.ItoG.Size - 1; +   GLuint bmask = ctx->PixelMaps.ItoB.Size - 1; +   GLuint amask = ctx->PixelMaps.ItoA.Size - 1; +   const GLfloat *rMap = ctx->PixelMaps.ItoR.Map; +   const GLfloat *gMap = ctx->PixelMaps.ItoG.Map; +   const GLfloat *bMap = ctx->PixelMaps.ItoB.Map; +   const GLfloat *aMap = ctx->PixelMaps.ItoA.Map; +   GLuint i; +   for (i=0;i<n;i++) { +      rgba[i][RCOMP] = rMap[index[i] & rmask]; +      rgba[i][GCOMP] = gMap[index[i] & gmask]; +      rgba[i][BCOMP] = bMap[index[i] & bmask]; +      rgba[i][ACOMP] = aMap[index[i] & amask]; +   } +} + + +/** + * Map ubyte color indexes to ubyte/RGBA values. + */ +void +_mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[], +                       GLubyte rgba[][4]) +{ +   GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; +   GLuint gmask = ctx->PixelMaps.ItoG.Size - 1; +   GLuint bmask = ctx->PixelMaps.ItoB.Size - 1; +   GLuint amask = ctx->PixelMaps.ItoA.Size - 1; +   const GLubyte *rMap = ctx->PixelMaps.ItoR.Map8; +   const GLubyte *gMap = ctx->PixelMaps.ItoG.Map8; +   const GLubyte *bMap = ctx->PixelMaps.ItoB.Map8; +   const GLubyte *aMap = ctx->PixelMaps.ItoA.Map8; +   GLuint i; +   for (i=0;i<n;i++) { +      rgba[i][RCOMP] = rMap[index[i] & rmask]; +      rgba[i][GCOMP] = gMap[index[i] & gmask]; +      rgba[i][BCOMP] = bMap[index[i] & bmask]; +      rgba[i][ACOMP] = aMap[index[i] & amask]; +   } +} + + +void +_mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n, +                           GLfloat depthValues[]) +{ +   const GLfloat scale = ctx->Pixel.DepthScale; +   const GLfloat bias = ctx->Pixel.DepthBias; +   GLuint i; +   for (i = 0; i < n; i++) { +      GLfloat d = depthValues[i] * scale + bias; +      depthValues[i] = CLAMP(d, 0.0F, 1.0F); +   } +} + + +void +_mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, +                                GLuint depthValues[]) +{ +   const GLdouble max = (double) 0xffffffff; +   const GLdouble scale = ctx->Pixel.DepthScale; +   const GLdouble bias = ctx->Pixel.DepthBias * max; +   GLuint i; +   for (i = 0; i < n; i++) { +      GLdouble d = (GLdouble) depthValues[i] * scale + bias; +      d = CLAMP(d, 0.0, max); +      depthValues[i] = (GLuint) d; +   } +} + +  /**   * Apply various pixel transfer operations to an array of RGBA pixels   * as indicated by the transferOps bitmask diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h index 2a16989fa7..465665b073 100644 --- a/src/mesa/main/image.h +++ b/src/mesa/main/image.h @@ -2,7 +2,7 @@   * Mesa 3-D graphics library   * Version:  7.1   * - * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -111,6 +111,51 @@ _mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,                     GLubyte *dest, const struct gl_pixelstore_attrib *packing ); +/** \name Pixel processing functions */ +/*@{*/ + +extern void +_mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4], +                          GLfloat rScale, GLfloat gScale, +                          GLfloat bScale, GLfloat aScale, +                          GLfloat rBias, GLfloat gBias, +                          GLfloat bBias, GLfloat aBias); + +extern void +_mesa_map_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]); + + +extern void +_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]); + + +extern void +_mesa_lookup_rgba_float(const struct gl_color_table *table, +                        GLuint n, GLfloat rgba[][4]); + +extern void +_mesa_lookup_rgba_ubyte(const struct gl_color_table *table, +                        GLuint n, GLubyte rgba[][4]); + + +extern void +_mesa_map_ci_to_rgba(const GLcontext *ctx, +                     GLuint n, const GLuint index[], GLfloat rgba[][4]); + + +extern void +_mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[], +                       GLubyte rgba[][4]); + + +extern void +_mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n, +                           GLfloat depthValues[]); + +extern void +_mesa_scale_and_bias_depth_uint(const GLcontext *ctx, GLuint n, +                                GLuint depthValues[]); +  extern void  _mesa_apply_rgba_transfer_ops(GLcontext *ctx, GLbitfield transferOps,                                GLuint n, GLfloat rgba[][4]); diff --git a/src/mesa/main/pixel.c b/src/mesa/main/pixel.c index 19b4525cb6..3f52ecd4b2 100644 --- a/src/mesa/main/pixel.c +++ b/src/mesa/main/pixel.c @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.3 + * Version:  7.1   * - * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -22,6 +22,12 @@   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.   */ + +/** + * \file pixel.c + * Pixel transfer functions (glPixelZoom, glPixelMap, glPixelTransfer) + */ +  #include "glheader.h"  #include "bufferobj.h"  #include "colormac.h" @@ -742,411 +748,6 @@ _mesa_PixelTransferi( GLenum pname, GLint param )  /**********************************************************************/ -/*****                  Pixel processing functions               ******/ -/**********************************************************************/ - -/* - * Apply scale and bias factors to an array of RGBA pixels. - */ -void -_mesa_scale_and_bias_rgba(GLuint n, GLfloat rgba[][4], -                          GLfloat rScale, GLfloat gScale, -                          GLfloat bScale, GLfloat aScale, -                          GLfloat rBias, GLfloat gBias, -                          GLfloat bBias, GLfloat aBias) -{ -   if (rScale != 1.0 || rBias != 0.0) { -      GLuint i; -      for (i = 0; i < n; i++) { -         rgba[i][RCOMP] = rgba[i][RCOMP] * rScale + rBias; -      } -   } -   if (gScale != 1.0 || gBias != 0.0) { -      GLuint i; -      for (i = 0; i < n; i++) { -         rgba[i][GCOMP] = rgba[i][GCOMP] * gScale + gBias; -      } -   } -   if (bScale != 1.0 || bBias != 0.0) { -      GLuint i; -      for (i = 0; i < n; i++) { -         rgba[i][BCOMP] = rgba[i][BCOMP] * bScale + bBias; -      } -   } -   if (aScale != 1.0 || aBias != 0.0) { -      GLuint i; -      for (i = 0; i < n; i++) { -         rgba[i][ACOMP] = rgba[i][ACOMP] * aScale + aBias; -      } -   } -} - - -/* - * Apply pixel mapping to an array of floating point RGBA pixels. - */ -void -_mesa_map_rgba( const GLcontext *ctx, GLuint n, GLfloat rgba[][4] ) -{ -   const GLfloat rscale = (GLfloat) (ctx->PixelMaps.RtoR.Size - 1); -   const GLfloat gscale = (GLfloat) (ctx->PixelMaps.GtoG.Size - 1); -   const GLfloat bscale = (GLfloat) (ctx->PixelMaps.BtoB.Size - 1); -   const GLfloat ascale = (GLfloat) (ctx->PixelMaps.AtoA.Size - 1); -   const GLfloat *rMap = ctx->PixelMaps.RtoR.Map; -   const GLfloat *gMap = ctx->PixelMaps.GtoG.Map; -   const GLfloat *bMap = ctx->PixelMaps.BtoB.Map; -   const GLfloat *aMap = ctx->PixelMaps.AtoA.Map; -   GLuint i; -   for (i=0;i<n;i++) { -      GLfloat r = CLAMP(rgba[i][RCOMP], 0.0F, 1.0F); -      GLfloat g = CLAMP(rgba[i][GCOMP], 0.0F, 1.0F); -      GLfloat b = CLAMP(rgba[i][BCOMP], 0.0F, 1.0F); -      GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, 1.0F); -      rgba[i][RCOMP] = rMap[IROUND(r * rscale)]; -      rgba[i][GCOMP] = gMap[IROUND(g * gscale)]; -      rgba[i][BCOMP] = bMap[IROUND(b * bscale)]; -      rgba[i][ACOMP] = aMap[IROUND(a * ascale)]; -   } -} - - -/* - * Apply the color matrix and post color matrix scaling and biasing. - */ -void -_mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4]) -{ -   const GLfloat rs = ctx->Pixel.PostColorMatrixScale[0]; -   const GLfloat rb = ctx->Pixel.PostColorMatrixBias[0]; -   const GLfloat gs = ctx->Pixel.PostColorMatrixScale[1]; -   const GLfloat gb = ctx->Pixel.PostColorMatrixBias[1]; -   const GLfloat bs = ctx->Pixel.PostColorMatrixScale[2]; -   const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2]; -   const GLfloat as = ctx->Pixel.PostColorMatrixScale[3]; -   const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3]; -   const GLfloat *m = ctx->ColorMatrixStack.Top->m; -   GLuint i; -   for (i = 0; i < n; i++) { -      const GLfloat r = rgba[i][RCOMP]; -      const GLfloat g = rgba[i][GCOMP]; -      const GLfloat b = rgba[i][BCOMP]; -      const GLfloat a = rgba[i][ACOMP]; -      rgba[i][RCOMP] = (m[0] * r + m[4] * g + m[ 8] * b + m[12] * a) * rs + rb; -      rgba[i][GCOMP] = (m[1] * r + m[5] * g + m[ 9] * b + m[13] * a) * gs + gb; -      rgba[i][BCOMP] = (m[2] * r + m[6] * g + m[10] * b + m[14] * a) * bs + bb; -      rgba[i][ACOMP] = (m[3] * r + m[7] * g + m[11] * b + m[15] * a) * as + ab; -   } -} - - -/** - * Apply a color table lookup to an array of floating point RGBA colors. - */ -void -_mesa_lookup_rgba_float(const struct gl_color_table *table, -                        GLuint n, GLfloat rgba[][4]) -{ -   const GLint max = table->Size - 1; -   const GLfloat scale = (GLfloat) max; -   const GLfloat *lut = table->TableF; -   GLuint i; - -   if (!table->TableF || table->Size == 0) -      return; - -   switch (table->_BaseFormat) { -      case GL_INTENSITY: -         /* replace RGBA with I */ -         for (i = 0; i < n; i++) { -            GLint j = IROUND(rgba[i][RCOMP] * scale); -            GLfloat c = lut[CLAMP(j, 0, max)]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = -            rgba[i][ACOMP] = c; -         } -         break; -      case GL_LUMINANCE: -         /* replace RGB with L */ -         for (i = 0; i < n; i++) { -            GLint j = IROUND(rgba[i][RCOMP] * scale); -            GLfloat c = lut[CLAMP(j, 0, max)]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = c; -         } -         break; -      case GL_ALPHA: -         /* replace A with A */ -         for (i = 0; i < n; i++) { -            GLint j = IROUND(rgba[i][ACOMP] * scale); -            rgba[i][ACOMP] = lut[CLAMP(j, 0, max)]; -         } -         break; -      case GL_LUMINANCE_ALPHA: -         /* replace RGBA with LLLA */ -         for (i = 0; i < n; i++) { -            GLint jL = IROUND(rgba[i][RCOMP] * scale); -            GLint jA = IROUND(rgba[i][ACOMP] * scale); -            GLfloat luminance, alpha; -            jL = CLAMP(jL, 0, max); -            jA = CLAMP(jA, 0, max); -            luminance = lut[jL * 2 + 0]; -            alpha     = lut[jA * 2 + 1]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = luminance; -            rgba[i][ACOMP] = alpha;; -         } -         break; -      case GL_RGB: -         /* replace RGB with RGB */ -         for (i = 0; i < n; i++) { -            GLint jR = IROUND(rgba[i][RCOMP] * scale); -            GLint jG = IROUND(rgba[i][GCOMP] * scale); -            GLint jB = IROUND(rgba[i][BCOMP] * scale); -            jR = CLAMP(jR, 0, max); -            jG = CLAMP(jG, 0, max); -            jB = CLAMP(jB, 0, max); -            rgba[i][RCOMP] = lut[jR * 3 + 0]; -            rgba[i][GCOMP] = lut[jG * 3 + 1]; -            rgba[i][BCOMP] = lut[jB * 3 + 2]; -         } -         break; -      case GL_RGBA: -         /* replace RGBA with RGBA */ -         for (i = 0; i < n; i++) { -            GLint jR = IROUND(rgba[i][RCOMP] * scale); -            GLint jG = IROUND(rgba[i][GCOMP] * scale); -            GLint jB = IROUND(rgba[i][BCOMP] * scale); -            GLint jA = IROUND(rgba[i][ACOMP] * scale); -            jR = CLAMP(jR, 0, max); -            jG = CLAMP(jG, 0, max); -            jB = CLAMP(jB, 0, max); -            jA = CLAMP(jA, 0, max); -            rgba[i][RCOMP] = lut[jR * 4 + 0]; -            rgba[i][GCOMP] = lut[jG * 4 + 1]; -            rgba[i][BCOMP] = lut[jB * 4 + 2]; -            rgba[i][ACOMP] = lut[jA * 4 + 3]; -         } -         break; -      default: -         _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_float"); -         return; -   } -} - - - -/** - * Apply a color table lookup to an array of ubyte/RGBA colors. - */ -void -_mesa_lookup_rgba_ubyte(const struct gl_color_table *table, -                        GLuint n, GLubyte rgba[][4]) -{ -   const GLubyte *lut = table->TableUB; -   const GLfloat scale = (GLfloat) (table->Size - 1) / 255.0; -   GLuint i; - -   if (!table->TableUB || table->Size == 0) -      return; - -   switch (table->_BaseFormat) { -   case GL_INTENSITY: -      /* replace RGBA with I */ -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            const GLubyte c = lut[rgba[i][RCOMP]]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = -            rgba[i][ACOMP] = c; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale); -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = -            rgba[i][ACOMP] = lut[j]; -         } -      } -      break; -   case GL_LUMINANCE: -      /* replace RGB with L */ -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            const GLubyte c = lut[rgba[i][RCOMP]]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = c; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint j = IROUND((GLfloat) rgba[i][RCOMP] * scale); -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = lut[j]; -         } -      } -      break; -   case GL_ALPHA: -      /* replace A with A */ -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            rgba[i][ACOMP] = lut[rgba[i][ACOMP]]; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint j = IROUND((GLfloat) rgba[i][ACOMP] * scale); -            rgba[i][ACOMP] = lut[j]; -         } -      } -      break; -   case GL_LUMINANCE_ALPHA: -      /* replace RGBA with LLLA */ -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            GLubyte l = lut[rgba[i][RCOMP] * 2 + 0]; -            GLubyte a = lut[rgba[i][ACOMP] * 2 + 1];; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = l; -            rgba[i][ACOMP] = a; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint jL = IROUND((GLfloat) rgba[i][RCOMP] * scale); -            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale); -            GLubyte luminance = lut[jL * 2 + 0]; -            GLubyte alpha     = lut[jA * 2 + 1]; -            rgba[i][RCOMP] = -            rgba[i][GCOMP] = -            rgba[i][BCOMP] = luminance; -            rgba[i][ACOMP] = alpha; -         } -      } -      break; -   case GL_RGB: -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 3 + 0]; -            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 3 + 1]; -            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 3 + 2]; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale); -            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale); -            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale); -            rgba[i][RCOMP] = lut[jR * 3 + 0]; -            rgba[i][GCOMP] = lut[jG * 3 + 1]; -            rgba[i][BCOMP] = lut[jB * 3 + 2]; -         } -      } -      break; -   case GL_RGBA: -      if (table->Size == 256) { -         for (i = 0; i < n; i++) { -            rgba[i][RCOMP] = lut[rgba[i][RCOMP] * 4 + 0]; -            rgba[i][GCOMP] = lut[rgba[i][GCOMP] * 4 + 1]; -            rgba[i][BCOMP] = lut[rgba[i][BCOMP] * 4 + 2]; -            rgba[i][ACOMP] = lut[rgba[i][ACOMP] * 4 + 3]; -         } -      } -      else { -         for (i = 0; i < n; i++) { -            GLint jR = IROUND((GLfloat) rgba[i][RCOMP] * scale); -            GLint jG = IROUND((GLfloat) rgba[i][GCOMP] * scale); -            GLint jB = IROUND((GLfloat) rgba[i][BCOMP] * scale); -            GLint jA = IROUND((GLfloat) rgba[i][ACOMP] * scale); -            CLAMPED_FLOAT_TO_CHAN(rgba[i][RCOMP], lut[jR * 4 + 0]); -            CLAMPED_FLOAT_TO_CHAN(rgba[i][GCOMP], lut[jG * 4 + 1]); -            CLAMPED_FLOAT_TO_CHAN(rgba[i][BCOMP], lut[jB * 4 + 2]); -            CLAMPED_FLOAT_TO_CHAN(rgba[i][ACOMP], lut[jA * 4 + 3]); -         } -      } -      break; -   default: -      _mesa_problem(NULL, "Bad format in _mesa_lookup_rgba_chan"); -      return; -   } -} - - - -/* - * Map color indexes to float rgba values. - */ -void -_mesa_map_ci_to_rgba( const GLcontext *ctx, GLuint n, -                      const GLuint index[], GLfloat rgba[][4] ) -{ -   GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; -   GLuint gmask = ctx->PixelMaps.ItoG.Size - 1; -   GLuint bmask = ctx->PixelMaps.ItoB.Size - 1; -   GLuint amask = ctx->PixelMaps.ItoA.Size - 1; -   const GLfloat *rMap = ctx->PixelMaps.ItoR.Map; -   const GLfloat *gMap = ctx->PixelMaps.ItoG.Map; -   const GLfloat *bMap = ctx->PixelMaps.ItoB.Map; -   const GLfloat *aMap = ctx->PixelMaps.ItoA.Map; -   GLuint i; -   for (i=0;i<n;i++) { -      rgba[i][RCOMP] = rMap[index[i] & rmask]; -      rgba[i][GCOMP] = gMap[index[i] & gmask]; -      rgba[i][BCOMP] = bMap[index[i] & bmask]; -      rgba[i][ACOMP] = aMap[index[i] & amask]; -   } -} - - -/** - * Map ubyte color indexes to ubyte/RGBA values. - */ -void -_mesa_map_ci8_to_rgba8(const GLcontext *ctx, GLuint n, const GLubyte index[], -                       GLubyte rgba[][4]) -{ -   GLuint rmask = ctx->PixelMaps.ItoR.Size - 1; -   GLuint gmask = ctx->PixelMaps.ItoG.Size - 1; -   GLuint bmask = ctx->PixelMaps.ItoB.Size - 1; -   GLuint amask = ctx->PixelMaps.ItoA.Size - 1; -   const GLubyte *rMap = ctx->PixelMaps.ItoR.Map8; -   const GLubyte *gMap = ctx->PixelMaps.ItoG.Map8; -   const GLubyte *bMap = ctx->PixelMaps.ItoB.Map8; -   const GLubyte *aMap = ctx->PixelMaps.ItoA.Map8; -   GLuint i; -   for (i=0;i<n;i++) { -      rgba[i][RCOMP] = rMap[index[i] & rmask]; -      rgba[i][GCOMP] = gMap[index[i] & gmask]; -      rgba[i][BCOMP] = bMap[index[i] & bmask]; -      rgba[i][ACOMP] = aMap[index[i] & amask]; -   } -} - - -void -_mesa_scale_and_bias_depth(const GLcontext *ctx, GLuint n, -                           GLfloat depthValues[]) -{ -   const GLfloat scale = ctx->Pixel.DepthScale; -   const GLfloat bias = ctx->Pixel.DepthBias; -   GLuint i; -   for (i = 0; i < n; i++) { -      GLfloat d = depthValues[i] * scale + bias; -      depthValues[i] = CLAMP(d, 0.0F, 1.0F); -   } -} - - - -/**********************************************************************/  /*****                    State Management                        *****/  /**********************************************************************/ @@ -1217,6 +818,9 @@ update_image_transfer_state(GLcontext *ctx)  } +/** + * Update meas pixel transfer derived state. + */  void _mesa_update_pixel( GLcontext *ctx, GLuint new_state )  {     if (new_state & _NEW_COLOR_MATRIX) diff --git a/src/mesa/main/pixel.h b/src/mesa/main/pixel.h index ad874e9f0f..32e2bd1075 100644 --- a/src/mesa/main/pixel.h +++ b/src/mesa/main/pixel.h @@ -1,13 +1,8 @@ -/** - * \file pixel.h - * Pixel operations. - */ -  /*   * Mesa 3-D graphics library - * Version:  6.5.2 + * Version:  7.1   * - * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -28,6 +23,12 @@   */ +/** + * \file pixel.h + * Pixel operations. + */ + +  #ifndef PIXEL_H  #define PIXEL_H  | 
