⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pixel.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
      /* 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                        *****//**********************************************************************//* * Return a bitmask of IMAGE_*_BIT flags which to indicate which * pixel transfer operations are enabled. */static voidupdate_image_transfer_state(GLcontext *ctx){   GLuint mask = 0;   if (ctx->Pixel.RedScale   != 1.0F || ctx->Pixel.RedBias   != 0.0F ||       ctx->Pixel.GreenScale != 1.0F || ctx->Pixel.GreenBias != 0.0F ||       ctx->Pixel.BlueScale  != 1.0F || ctx->Pixel.BlueBias  != 0.0F ||       ctx->Pixel.AlphaScale != 1.0F || ctx->Pixel.AlphaBias != 0.0F)      mask |= IMAGE_SCALE_BIAS_BIT;   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset)      mask |= IMAGE_SHIFT_OFFSET_BIT;   if (ctx->Pixel.MapColorFlag)      mask |= IMAGE_MAP_COLOR_BIT;   if (ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION])      mask |= IMAGE_COLOR_TABLE_BIT;   if (ctx->Pixel.Convolution1DEnabled ||       ctx->Pixel.Convolution2DEnabled ||       ctx->Pixel.Separable2DEnabled) {      mask |= IMAGE_CONVOLUTION_BIT;      if (ctx->Pixel.PostConvolutionScale[0] != 1.0F ||          ctx->Pixel.PostConvolutionScale[1] != 1.0F ||          ctx->Pixel.PostConvolutionScale[2] != 1.0F ||          ctx->Pixel.PostConvolutionScale[3] != 1.0F ||          ctx->Pixel.PostConvolutionBias[0] != 0.0F ||          ctx->Pixel.PostConvolutionBias[1] != 0.0F ||          ctx->Pixel.PostConvolutionBias[2] != 0.0F ||          ctx->Pixel.PostConvolutionBias[3] != 0.0F) {         mask |= IMAGE_POST_CONVOLUTION_SCALE_BIAS;      }   }   if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION])      mask |= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT;   if (ctx->ColorMatrixStack.Top->type != MATRIX_IDENTITY ||       ctx->Pixel.PostColorMatrixScale[0] != 1.0F ||       ctx->Pixel.PostColorMatrixBias[0]  != 0.0F ||       ctx->Pixel.PostColorMatrixScale[1] != 1.0F ||       ctx->Pixel.PostColorMatrixBias[1]  != 0.0F ||       ctx->Pixel.PostColorMatrixScale[2] != 1.0F ||       ctx->Pixel.PostColorMatrixBias[2]  != 0.0F ||       ctx->Pixel.PostColorMatrixScale[3] != 1.0F ||       ctx->Pixel.PostColorMatrixBias[3]  != 0.0F)      mask |= IMAGE_COLOR_MATRIX_BIT;   if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX])      mask |= IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT;   if (ctx->Pixel.HistogramEnabled)      mask |= IMAGE_HISTOGRAM_BIT;   if (ctx->Pixel.MinMaxEnabled)      mask |= IMAGE_MIN_MAX_BIT;   ctx->_ImageTransferState = mask;}void _mesa_update_pixel( GLcontext *ctx, GLuint new_state ){   if (new_state & _NEW_COLOR_MATRIX)      _math_matrix_analyse( ctx->ColorMatrixStack.Top );   /* References ColorMatrix.type (derived above).    */   if (new_state & _IMAGE_NEW_TRANSFER_STATE)      update_image_transfer_state(ctx);}/**********************************************************************//*****                      Initialization                        *****//**********************************************************************/static voidinit_pixelmap(struct gl_pixelmap *map){   map->Size = 1;   map->Map[0] = 0.0;   map->Map8[0] = 0;}/** * Initialize the context's PIXEL attribute group. */void_mesa_init_pixel( GLcontext *ctx ){   int i;   /* Pixel group */   ctx->Pixel.RedBias = 0.0;   ctx->Pixel.RedScale = 1.0;   ctx->Pixel.GreenBias = 0.0;   ctx->Pixel.GreenScale = 1.0;   ctx->Pixel.BlueBias = 0.0;   ctx->Pixel.BlueScale = 1.0;   ctx->Pixel.AlphaBias = 0.0;   ctx->Pixel.AlphaScale = 1.0;   ctx->Pixel.DepthBias = 0.0;   ctx->Pixel.DepthScale = 1.0;   ctx->Pixel.IndexOffset = 0;   ctx->Pixel.IndexShift = 0;   ctx->Pixel.ZoomX = 1.0;   ctx->Pixel.ZoomY = 1.0;   ctx->Pixel.MapColorFlag = GL_FALSE;   ctx->Pixel.MapStencilFlag = GL_FALSE;   init_pixelmap(&ctx->PixelMaps.StoS);   init_pixelmap(&ctx->PixelMaps.ItoI);   init_pixelmap(&ctx->PixelMaps.ItoR);   init_pixelmap(&ctx->PixelMaps.ItoG);   init_pixelmap(&ctx->PixelMaps.ItoB);   init_pixelmap(&ctx->PixelMaps.ItoA);   init_pixelmap(&ctx->PixelMaps.RtoR);   init_pixelmap(&ctx->PixelMaps.GtoG);   init_pixelmap(&ctx->PixelMaps.BtoB);   init_pixelmap(&ctx->PixelMaps.AtoA);   ctx->Pixel.HistogramEnabled = GL_FALSE;   ctx->Pixel.MinMaxEnabled = GL_FALSE;   ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);   ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);   for (i = 0; i < COLORTABLE_MAX; i++) {      ASSIGN_4V(ctx->Pixel.ColorTableScale[i], 1.0, 1.0, 1.0, 1.0);      ASSIGN_4V(ctx->Pixel.ColorTableBias[i], 0.0, 0.0, 0.0, 0.0);      ctx->Pixel.ColorTableEnabled[i] = GL_FALSE;   }   ctx->Pixel.Convolution1DEnabled = GL_FALSE;   ctx->Pixel.Convolution2DEnabled = GL_FALSE;   ctx->Pixel.Separable2DEnabled = GL_FALSE;   for (i = 0; i < 3; i++) {      ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);      ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;      ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);      ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);   }   for (i = 0; i < MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_WIDTH * 4; i++) {      ctx->Convolution1D.Filter[i] = 0.0;      ctx->Convolution2D.Filter[i] = 0.0;      ctx->Separable2D.Filter[i] = 0.0;   }   ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);   ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);   /* GL_SGI_texture_color_table */   ASSIGN_4V(ctx->Pixel.TextureColorTableScale, 1.0, 1.0, 1.0, 1.0);   ASSIGN_4V(ctx->Pixel.TextureColorTableBias, 0.0, 0.0, 0.0, 0.0);   /* Pixel transfer */   ctx->Pack.Alignment = 4;   ctx->Pack.RowLength = 0;   ctx->Pack.ImageHeight = 0;   ctx->Pack.SkipPixels = 0;   ctx->Pack.SkipRows = 0;   ctx->Pack.SkipImages = 0;   ctx->Pack.SwapBytes = GL_FALSE;   ctx->Pack.LsbFirst = GL_FALSE;   ctx->Pack.ClientStorage = GL_FALSE;   ctx->Pack.Invert = GL_FALSE;#if FEATURE_EXT_pixel_buffer_object   ctx->Pack.BufferObj = ctx->Array.NullBufferObj;#endif   ctx->Unpack.Alignment = 4;   ctx->Unpack.RowLength = 0;   ctx->Unpack.ImageHeight = 0;   ctx->Unpack.SkipPixels = 0;   ctx->Unpack.SkipRows = 0;   ctx->Unpack.SkipImages = 0;   ctx->Unpack.SwapBytes = GL_FALSE;   ctx->Unpack.LsbFirst = GL_FALSE;   ctx->Unpack.ClientStorage = GL_FALSE;   ctx->Unpack.Invert = GL_FALSE;#if FEATURE_EXT_pixel_buffer_object   ctx->Unpack.BufferObj = ctx->Array.NullBufferObj;#endif   /*    * _mesa_unpack_image() returns image data in this format.  When we    * execute image commands (glDrawPixels(), glTexImage(), etc) from    * within display lists we have to be sure to set the current    * unpacking parameters to these values!    */   ctx->DefaultPacking.Alignment = 1;   ctx->DefaultPacking.RowLength = 0;   ctx->DefaultPacking.SkipPixels = 0;   ctx->DefaultPacking.SkipRows = 0;   ctx->DefaultPacking.ImageHeight = 0;   ctx->DefaultPacking.SkipImages = 0;   ctx->DefaultPacking.SwapBytes = GL_FALSE;   ctx->DefaultPacking.LsbFirst = GL_FALSE;   ctx->DefaultPacking.ClientStorage = GL_FALSE;   ctx->DefaultPacking.Invert = GL_FALSE;#if FEATURE_EXT_pixel_buffer_object   ctx->DefaultPacking.BufferObj = ctx->Array.NullBufferObj;#endif   if (ctx->Visual.doubleBufferMode) {      ctx->Pixel.ReadBuffer = GL_BACK;   }   else {      ctx->Pixel.ReadBuffer = GL_FRONT;   }   /* Miscellaneous */   ctx->_ImageTransferState = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -