diff options
Diffstat (limited to 'mesalib/src/mesa')
-rw-r--r-- | mesalib/src/mesa/main/pack.c | 91 | ||||
-rw-r--r-- | mesalib/src/mesa/main/pack.h | 7 | ||||
-rw-r--r-- | mesalib/src/mesa/main/readpix.c | 4 | ||||
-rw-r--r-- | mesalib/src/mesa/main/texgetimage.c | 77 |
4 files changed, 106 insertions, 73 deletions
diff --git a/mesalib/src/mesa/main/pack.c b/mesalib/src/mesa/main/pack.c index 41485a1bf..4d4b4a825 100644 --- a/mesalib/src/mesa/main/pack.c +++ b/mesalib/src/mesa/main/pack.c @@ -5250,3 +5250,94 @@ _mesa_unpack_image( GLuint dimensions, } } + + +/** + * If we unpack colors from a luminance surface, we'll get pixel colors + * such as (l, l, l, a). + * When we call _mesa_pack_rgba_span_float(format=GL_LUMINANCE), that + * function will compute L=R+G+B before packing. The net effect is we'll + * accidentally store luminance values = 3*l. + * This function compensates for that by converting (aka rebasing) (l,l,l,a) + * to be (l,0,0,a). + * It's a similar story for other formats such as LUMINANCE_ALPHA, ALPHA + * and INTENSITY. + * + * Finally, we also need to do this when the actual surface format does + * not match the logical surface format. For example, suppose the user + * requests a GL_LUMINANCE texture but the driver stores it as RGBA. + * Again, we'll get pixel values like (l,l,l,a). + */ +void +_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat) +{ + GLuint i; + + switch (baseFormat) { + case GL_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][RCOMP] = 0.0F; + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + } + break; + case GL_INTENSITY: + /* fall-through */ + case GL_LUMINANCE: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + rgba[i][ACOMP] = 1.0F; + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0.0F; + rgba[i][BCOMP] = 0.0F; + } + break; + default: + /* no-op */ + ; + } +} + + +/** + * As above, but GLuint components. + */ +void +_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat) +{ + GLuint i; + + switch (baseFormat) { + case GL_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][RCOMP] = 0; + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + } + break; + case GL_INTENSITY: + /* fall-through */ + case GL_LUMINANCE: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + rgba[i][ACOMP] = 1; + } + break; + case GL_LUMINANCE_ALPHA: + for (i = 0; i < n; i++) { + rgba[i][GCOMP] = 0; + rgba[i][BCOMP] = 0; + } + break; + default: + /* no-op */ + ; + } +} + + diff --git a/mesalib/src/mesa/main/pack.h b/mesalib/src/mesa/main/pack.h index b1853cd59..cd49c7495 100644 --- a/mesalib/src/mesa/main/pack.h +++ b/mesalib/src/mesa/main/pack.h @@ -149,4 +149,11 @@ _mesa_pack_rgba_span_int(struct gl_context *ctx, GLuint n, GLuint rgba[][4], GLenum dstFormat, GLenum dstType, GLvoid *dstAddr); + +extern void +_mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat); + +extern void +_mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat); + #endif diff --git a/mesalib/src/mesa/main/readpix.c b/mesalib/src/mesa/main/readpix.c index 3384d8a38..491854955 100644 --- a/mesalib/src/mesa/main/readpix.c +++ b/mesalib/src/mesa/main/readpix.c @@ -291,10 +291,14 @@ slow_read_rgba_pixels( struct gl_context *ctx, for (j = 0; j < height; j++) { if (_mesa_is_integer_format(format)) { _mesa_unpack_uint_rgba_row(rbFormat, width, map, (GLuint (*)[4]) rgba); + _mesa_rebase_rgba_uint(width, (GLuint (*)[4]) rgba, + rb->_BaseFormat); _mesa_pack_rgba_span_int(ctx, width, (GLuint (*)[4]) rgba, format, type, dst); } else { _mesa_unpack_rgba_row(rbFormat, width, map, (GLfloat (*)[4]) rgba); + _mesa_rebase_rgba_float(width, (GLfloat (*)[4]) rgba, + rb->_BaseFormat); _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, type, dst, packing, transferOps); } diff --git a/mesalib/src/mesa/main/texgetimage.c b/mesalib/src/mesa/main/texgetimage.c index a02a49156..44a828adf 100644 --- a/mesalib/src/mesa/main/texgetimage.c +++ b/mesalib/src/mesa/main/texgetimage.c @@ -266,13 +266,8 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions, if (baseFormat == GL_LUMINANCE || baseFormat == GL_LUMINANCE_ALPHA) { - /* Set green and blue to zero since the pack function here will - * compute L=R+G+B. - */ - GLuint i; - for (i = 0; i < width * height; i++) { - tempImage[i * 4 + GCOMP] = tempImage[i * 4 + BCOMP] = 0.0f; - } + _mesa_rebase_rgba_float(width * height, (GLfloat (*)[4]) tempImage, + baseFormat); } srcRow = tempImage; @@ -340,76 +335,12 @@ get_tex_rgba_uncompressed(struct gl_context *ctx, GLuint dimensions, if (is_integer) { _mesa_unpack_uint_rgba_row(texFormat, width, src, rgba_uint); - - if (texImage->_BaseFormat == GL_ALPHA) { - GLuint col; - for (col = 0; col < width; col++) { - rgba_uint[col][RCOMP] = 0; - rgba_uint[col][GCOMP] = 0; - rgba_uint[col][BCOMP] = 0; - } - } - else if (texImage->_BaseFormat == GL_LUMINANCE) { - GLuint col; - for (col = 0; col < width; col++) { - rgba_uint[col][GCOMP] = 0; - rgba_uint[col][BCOMP] = 0; - rgba_uint[col][ACOMP] = 1; - } - } - else if (texImage->_BaseFormat == GL_LUMINANCE_ALPHA) { - GLuint col; - for (col = 0; col < width; col++) { - rgba_uint[col][GCOMP] = 0; - rgba_uint[col][BCOMP] = 0; - } - } - else if (texImage->_BaseFormat == GL_INTENSITY) { - GLuint col; - for (col = 0; col < width; col++) { - rgba_uint[col][GCOMP] = 0; - rgba_uint[col][BCOMP] = 0; - rgba_uint[col][ACOMP] = 1; - } - } - + _mesa_rebase_rgba_uint(width, rgba_uint, texImage->_BaseFormat); _mesa_pack_rgba_span_int(ctx, width, rgba_uint, format, type, dest); } else { _mesa_unpack_rgba_row(texFormat, width, src, rgba); - - if (texImage->_BaseFormat == GL_ALPHA) { - GLuint col; - for (col = 0; col < width; col++) { - rgba[col][RCOMP] = 0.0F; - rgba[col][GCOMP] = 0.0F; - rgba[col][BCOMP] = 0.0F; - } - } - else if (texImage->_BaseFormat == GL_LUMINANCE) { - GLuint col; - for (col = 0; col < width; col++) { - rgba[col][GCOMP] = 0.0F; - rgba[col][BCOMP] = 0.0F; - rgba[col][ACOMP] = 1.0F; - } - } - else if (texImage->_BaseFormat == GL_LUMINANCE_ALPHA) { - GLuint col; - for (col = 0; col < width; col++) { - rgba[col][GCOMP] = 0.0F; - rgba[col][BCOMP] = 0.0F; - } - } - else if (texImage->_BaseFormat == GL_INTENSITY) { - GLuint col; - for (col = 0; col < width; col++) { - rgba[col][GCOMP] = 0.0F; - rgba[col][BCOMP] = 0.0F; - rgba[col][ACOMP] = 1.0F; - } - } - + _mesa_rebase_rgba_float(width, rgba, texImage->_BaseFormat); _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) rgba, format, type, dest, &ctx->Pack, transferOps); |