📄 image.c
字号:
* by the dstFormat, dstType and dstPacking. Used by glReadPixels, * glGetConvolutionFilter(), etc. * Incoming colors will be clamped to [0,1] if needed. * Note: the rgba values will be modified by this function when any pixel * transfer ops are enabled. */void_mesa_pack_rgba_span_float(GLcontext *ctx, GLuint n, GLfloat rgba[][4], GLenum dstFormat, GLenum dstType, GLvoid *dstAddr, const struct gl_pixelstore_attrib *dstPacking, GLbitfield transferOps){ GLfloat luminance[MAX_WIDTH]; const GLint comps = _mesa_components_in_format(dstFormat); GLuint i; if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) { /* need to clamp to [0, 1] */ transferOps |= IMAGE_CLAMP_BIT; } if (transferOps) { _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba); if ((transferOps & IMAGE_MIN_MAX_BIT) && ctx->MinMax.Sink) { return; } } if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) { /* compute luminance values */ if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) { for (i = 0; i < n; i++) { GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; luminance[i] = CLAMP(sum, 0.0F, 1.0F); } } else { for (i = 0; i < n; i++) { luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP]; } } } /* * Pack/store the pixels. Ugh! Lots of cases!!! */ switch (dstType) { case GL_UNSIGNED_BYTE: { GLubyte *dst = (GLubyte *) dstAddr; switch (dstFormat) { case GL_RED: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); break; case GL_GREEN: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); break; case GL_BLUE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); break; case GL_ALPHA: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); break; case GL_LUMINANCE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UBYTE(luminance[i]); break; case GL_LUMINANCE_ALPHA: for (i=0;i<n;i++) { dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]); dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); } break; case GL_RGB: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); } break; case GL_RGBA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); } break; case GL_BGR: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); } break; case GL_BGRA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); } break; case GL_ABGR_EXT: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]); dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]); dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]); dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]); } break; default: _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); } } break; case GL_BYTE: { GLbyte *dst = (GLbyte *) dstAddr; switch (dstFormat) { case GL_RED: for (i=0;i<n;i++) dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]); break; case GL_GREEN: for (i=0;i<n;i++) dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]); break; case GL_BLUE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]); break; case GL_ALPHA: for (i=0;i<n;i++) dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]); break; case GL_LUMINANCE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_BYTE(luminance[i]); break; case GL_LUMINANCE_ALPHA: for (i=0;i<n;i++) { dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]); dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]); } break; case GL_RGB: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); } break; case GL_RGBA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]); dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]); dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); } break; case GL_BGR: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); } break; case GL_BGRA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]); dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]); dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]); } break; case GL_ABGR_EXT: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]); dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]); dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]); dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]); } break; default: _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); } } break; case GL_UNSIGNED_SHORT: { GLushort *dst = (GLushort *) dstAddr; switch (dstFormat) { case GL_RED: for (i=0;i<n;i++) CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]); break; case GL_GREEN: for (i=0;i<n;i++) CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]); break; case GL_BLUE: for (i=0;i<n;i++) CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]); break; case GL_ALPHA: for (i=0;i<n;i++) CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]); break; case GL_LUMINANCE: for (i=0;i<n;i++) UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]); break; case GL_LUMINANCE_ALPHA: for (i=0;i<n;i++) { UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]); CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]); } break; case GL_RGB: for (i=0;i<n;i++) { CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]); } break; case GL_RGBA: for (i=0;i<n;i++) { CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); } break; case GL_BGR: for (i=0;i<n;i++) { CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]); } break; case GL_BGRA: for (i=0;i<n;i++) { CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]); } break; case GL_ABGR_EXT: for (i=0;i<n;i++) { CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]); CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]); } break; default: _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); } } break; case GL_SHORT: { GLshort *dst = (GLshort *) dstAddr; switch (dstFormat) { case GL_RED: for (i=0;i<n;i++) dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]); break; case GL_GREEN: for (i=0;i<n;i++) dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]); break; case GL_BLUE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]); break; case GL_ALPHA: for (i=0;i<n;i++) dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]); break; case GL_LUMINANCE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_SHORT(luminance[i]); break; case GL_LUMINANCE_ALPHA: for (i=0;i<n;i++) { dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]); dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]); } break; case GL_RGB: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); } break; case GL_RGBA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]); dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]); dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); } break; case GL_BGR: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); } break; case GL_BGRA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]); dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]); dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]); } break; case GL_ABGR_EXT: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]); dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]); dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]); dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]); } break; default: _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n"); } } break; case GL_UNSIGNED_INT: { GLuint *dst = (GLuint *) dstAddr; switch (dstFormat) { case GL_RED: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]); break; case GL_GREEN: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]); break; case GL_BLUE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]); break; case GL_ALPHA: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]); break; case GL_LUMINANCE: for (i=0;i<n;i++) dst[i] = FLOAT_TO_UINT(luminance[i]); break; case GL_LUMINANCE_ALPHA: for (i=0;i<n;i++) { dst[i*2+0] = FLOAT_TO_UINT(luminance[i]); dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]); } break; case GL_RGB: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); } break; case GL_RGBA: for (i=0;i<n;i++) { dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]); dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]); dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]); } break; case GL_BGR: for (i=0;i<n;i++) { dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]); dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]); dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]); } break; case GL_BGRA:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -