📄 pixel.c
字号:
/* 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 + -