📄 pixel.c
字号:
return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.GreenScale = param; break; case GL_GREEN_BIAS: if (ctx->Pixel.GreenBias == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.GreenBias = param; break; case GL_BLUE_SCALE: if (ctx->Pixel.BlueScale == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.BlueScale = param; break; case GL_BLUE_BIAS: if (ctx->Pixel.BlueBias == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.BlueBias = param; break; case GL_ALPHA_SCALE: if (ctx->Pixel.AlphaScale == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.AlphaScale = param; break; case GL_ALPHA_BIAS: if (ctx->Pixel.AlphaBias == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.AlphaBias = param; break; case GL_DEPTH_SCALE: if (ctx->Pixel.DepthScale == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.DepthScale = param; break; case GL_DEPTH_BIAS: if (ctx->Pixel.DepthBias == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.DepthBias = param; break; case GL_POST_COLOR_MATRIX_RED_SCALE: if (ctx->Pixel.PostColorMatrixScale[0] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixScale[0] = param; break; case GL_POST_COLOR_MATRIX_RED_BIAS: if (ctx->Pixel.PostColorMatrixBias[0] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixBias[0] = param; break; case GL_POST_COLOR_MATRIX_GREEN_SCALE: if (ctx->Pixel.PostColorMatrixScale[1] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixScale[1] = param; break; case GL_POST_COLOR_MATRIX_GREEN_BIAS: if (ctx->Pixel.PostColorMatrixBias[1] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixBias[1] = param; break; case GL_POST_COLOR_MATRIX_BLUE_SCALE: if (ctx->Pixel.PostColorMatrixScale[2] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixScale[2] = param; break; case GL_POST_COLOR_MATRIX_BLUE_BIAS: if (ctx->Pixel.PostColorMatrixBias[2] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixBias[2] = param; break; case GL_POST_COLOR_MATRIX_ALPHA_SCALE: if (ctx->Pixel.PostColorMatrixScale[3] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixScale[3] = param; break; case GL_POST_COLOR_MATRIX_ALPHA_BIAS: if (ctx->Pixel.PostColorMatrixBias[3] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostColorMatrixBias[3] = param; break; case GL_POST_CONVOLUTION_RED_SCALE: if (ctx->Pixel.PostConvolutionScale[0] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionScale[0] = param; break; case GL_POST_CONVOLUTION_RED_BIAS: if (ctx->Pixel.PostConvolutionBias[0] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionBias[0] = param; break; case GL_POST_CONVOLUTION_GREEN_SCALE: if (ctx->Pixel.PostConvolutionScale[1] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionScale[1] = param; break; case GL_POST_CONVOLUTION_GREEN_BIAS: if (ctx->Pixel.PostConvolutionBias[1] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionBias[1] = param; break; case GL_POST_CONVOLUTION_BLUE_SCALE: if (ctx->Pixel.PostConvolutionScale[2] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionScale[2] = param; break; case GL_POST_CONVOLUTION_BLUE_BIAS: if (ctx->Pixel.PostConvolutionBias[2] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionBias[2] = param; break; case GL_POST_CONVOLUTION_ALPHA_SCALE: if (ctx->Pixel.PostConvolutionScale[3] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionScale[3] = param; break; case GL_POST_CONVOLUTION_ALPHA_BIAS: if (ctx->Pixel.PostConvolutionBias[3] == param) return; FLUSH_VERTICES(ctx, _NEW_PIXEL); ctx->Pixel.PostConvolutionBias[3] = param; break; default: _mesa_error( ctx, GL_INVALID_ENUM, "glPixelTransfer(pname)" ); return; }}void GLAPIENTRY_mesa_PixelTransferi( GLenum pname, GLint param ){ _mesa_PixelTransferf( pname, (GLfloat) 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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -