[Mesa-dev] [PATCH 2/3] mesa: add _mesa_unpack_ubyte_rgba_row() function
Jose Fonseca
jfonseca at vmware.com
Mon Jan 9 10:34:57 PST 2012
Looks good to me AFAICT.
Jose
----- Original Message -----
> ---
> src/mesa/main/format_unpack.c | 499
> +++++++++++++++++++++++++++++++++++++++++
> src/mesa/main/format_unpack.h | 3 +
> 2 files changed, 502 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/main/format_unpack.c
> b/src/mesa/main/format_unpack.c
> index c723e89..a7308a1 100644
> --- a/src/mesa/main/format_unpack.c
> +++ b/src/mesa/main/format_unpack.c
> @@ -29,6 +29,22 @@
> #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
>
>
> +
> +/* Expand 1, 2, 3, 4, 5, 6-bit values to fill 8 bits */
> +
> +#define EXPAND_1_8(X) ( (X) ? 0xff : 0x0 )
> +
> +#define EXPAND_2_8(X) ( ((X) << 6) | ((X) << 4) | ((X) << 2) | (X)
> )
> +
> +#define EXPAND_3_8(X) ( ((X) << 5) | ((X) << 2) | ((X) > 1) )
> +
> +#define EXPAND_4_8(X) ( ((X) << 4) | (X) )
> +
> +#define EXPAND_5_8(X) ( ((X) << 3) | ((X) >> 2) )
> +
> +#define EXPAND_6_8(X) ( ((X) << 2) | ((X) >> 4) )
> +
> +
> /**
> * Convert an 8-bit sRGB value from non-linear space to a
> * linear RGB value in [0, 1].
> @@ -57,6 +73,10 @@ nonlinear_to_linear(GLubyte cs8)
> }
>
>
> +/**********************************************************************/
> +/* Unpack, returning GLfloat colors
> */
> +/**********************************************************************/
> +
> typedef void (*unpack_rgba_func)(const void *src, GLfloat dst[][4],
> GLuint n);
>
>
> @@ -1566,6 +1586,9 @@ get_unpack_rgba_function(gl_format format)
> }
>
>
> +/**
> + * Unpack rgba colors, returning as GLfloat values.
> + */
> void
> _mesa_unpack_rgba_row(gl_format format, GLuint n,
> const void *src, GLfloat dst[][4])
> @@ -1574,6 +1597,482 @@ _mesa_unpack_rgba_row(gl_format format,
> GLuint n,
> unpack(src, dst, n);
> }
>
> +
> +/**********************************************************************/
> +/* Unpack, returning GLubyte colors
> */
> +/**********************************************************************/
> +
> +
> +static void
> +unpack_ubyte_RGBA8888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 24);
> + dst[i][GCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][ACOMP] = (s[i] ) & 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGBA8888_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] ) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][ACOMP] = (s[i] >> 24);
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB8888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][BCOMP] = (s[i] ) & 0xff;
> + dst[i][ACOMP] = (s[i] >> 24);
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB8888_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 24);
> + dst[i][ACOMP] = (s[i] ) & 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGBX8888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 24);
> + dst[i][GCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGBX8888_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] ) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_XRGB8888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][BCOMP] = (s[i] ) & 0xff;
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_XRGB8888_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLuint *s = ((const GLuint *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = (s[i] >> 8) & 0xff;
> + dst[i][GCOMP] = (s[i] >> 16) & 0xff;
> + dst[i][BCOMP] = (s[i] >> 24);
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGB888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = (const GLubyte *) src;
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = s[i*3+2];
> + dst[i][GCOMP] = s[i*3+1];
> + dst[i][BCOMP] = s[i*3+0];
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_BGR888(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = (const GLubyte *) src;
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = s[i*3+0];
> + dst[i][GCOMP] = s[i*3+1];
> + dst[i][BCOMP] = s[i*3+2];
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGB565(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
> + dst[i][GCOMP] = EXPAND_6_8((s[i] >> 5 ) & 0x3f);
> + dst[i][BCOMP] = EXPAND_5_8( s[i] & 0x1f);
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGB565_REV(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + GLuint t = (s[i] >> 8) | (s[i] << 8); /* byte swap */
> + dst[i][RCOMP] = EXPAND_5_8((t >> 11) & 0x1f);
> + dst[i][GCOMP] = EXPAND_6_8((t >> 5 ) & 0x3f);
> + dst[i][BCOMP] = EXPAND_5_8( t & 0x1f);
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB4444(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
> + dst[i][GCOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
> + dst[i][BCOMP] = EXPAND_4_8((s[i] ) & 0xf);
> + dst[i][ACOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB4444_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_4_8((s[i] ) & 0xf);
> + dst[i][GCOMP] = EXPAND_4_8((s[i] >> 12) & 0xf);
> + dst[i][BCOMP] = EXPAND_4_8((s[i] >> 8) & 0xf);
> + dst[i][ACOMP] = EXPAND_4_8((s[i] >> 4) & 0xf);
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGBA5551(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_5_8((s[i] >> 11) & 0x1f);
> + dst[i][GCOMP] = EXPAND_5_8((s[i] >> 6) & 0x1f);
> + dst[i][BCOMP] = EXPAND_5_8((s[i] >> 1) & 0x1f);
> + dst[i][ACOMP] = EXPAND_1_8((s[i] ) & 0x01);
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB1555(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_5_8((s[i] >> 10) & 0x1f);
> + dst[i][GCOMP] = EXPAND_5_8((s[i] >> 5) & 0x1f);
> + dst[i][BCOMP] = EXPAND_5_8((s[i] >> 0) & 0x1f);
> + dst[i][ACOMP] = EXPAND_1_8((s[i] >> 15) & 0x01);
> + }
> +}
> +
> +static void
> +unpack_ubyte_ARGB1555_REV(const void *src, GLubyte dst[][4], GLuint
> n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
> + dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
> + dst[i][GCOMP] = EXPAND_5_8((tmp >> 5) & 0x1f);
> + dst[i][BCOMP] = EXPAND_5_8((tmp >> 0) & 0x1f);
> + dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
> + }
> +}
> +
> +static void
> +unpack_ubyte_AL44(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xf);
> + dst[i][ACOMP] = EXPAND_4_8(s[i] >> 4);
> + }
> +}
> +
> +static void
> +unpack_ubyte_AL88(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] = EXPAND_4_8(s[i] & 0xff);
> + dst[i][ACOMP] = EXPAND_4_8(s[i] >> 8);
> + }
> +}
> +
> +static void
> +unpack_ubyte_AL88_REV(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] = EXPAND_4_8(s[i] >> 8);
> + dst[i][ACOMP] = EXPAND_4_8(s[i] & 0xff);
> + }
> +}
> +
> +static void
> +unpack_ubyte_RGB332(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = EXPAND_3_8((s[i] >> 5) & 0x7);
> + dst[i][GCOMP] = EXPAND_3_8((s[i] >> 2) & 0x7);
> + dst[i][BCOMP] = EXPAND_2_8((s[i] ) & 0x3);
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_A8(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] = 0;
> + dst[i][ACOMP] = s[i];
> + }
> +}
> +
> +static void
> +unpack_ubyte_L8(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] = s[i];
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +
> +static void
> +unpack_ubyte_I8(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] =
> + dst[i][GCOMP] =
> + dst[i][BCOMP] =
> + dst[i][ACOMP] = s[i];
> + }
> +}
> +
> +static void
> +unpack_ubyte_R8(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLubyte *s = ((const GLubyte *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][0] = s[i];
> + dst[i][1] =
> + dst[i][2] = 0;
> + dst[i][3] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_GR88(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = s[i] & 0xff;
> + dst[i][GCOMP] = s[i] >> 8;
> + dst[i][BCOMP] = 0;
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +static void
> +unpack_ubyte_RG88(const void *src, GLubyte dst[][4], GLuint n)
> +{
> + const GLushort *s = ((const GLushort *) src);
> + GLuint i;
> + for (i = 0; i < n; i++) {
> + dst[i][RCOMP] = s[i] >> 8;
> + dst[i][GCOMP] = s[i] & 0xff;
> + dst[i][BCOMP] = 0;
> + dst[i][ACOMP] = 0xff;
> + }
> +}
> +
> +
> +/**
> + * Unpack rgba colors, returning as GLubyte values. This should
> usually
> + * only be used for unpacking formats that use 8 bits or less per
> channel.
> + */
> +void
> +_mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n,
> + const void *src, GLubyte dst[][4])
> +{
> + switch (format) {
> + case MESA_FORMAT_RGBA8888:
> + unpack_ubyte_RGBA8888(src, dst, n);
> + break;
> + case MESA_FORMAT_RGBA8888_REV:
> + unpack_ubyte_RGBA8888_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB8888:
> + unpack_ubyte_ARGB8888(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB8888_REV:
> + unpack_ubyte_ARGB8888_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_RGBX8888:
> + unpack_ubyte_RGBX8888(src, dst, n);
> + break;
> + case MESA_FORMAT_RGBX8888_REV:
> + unpack_ubyte_RGBX8888_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_XRGB8888:
> + unpack_ubyte_XRGB8888(src, dst, n);
> + break;
> + case MESA_FORMAT_XRGB8888_REV:
> + unpack_ubyte_XRGB8888_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_RGB888:
> + unpack_ubyte_RGB888(src, dst, n);
> + break;
> + case MESA_FORMAT_BGR888:
> + unpack_ubyte_BGR888(src, dst, n);
> + break;
> + case MESA_FORMAT_RGB565:
> + unpack_ubyte_RGB565(src, dst, n);
> + break;
> + case MESA_FORMAT_RGB565_REV:
> + unpack_ubyte_RGB565_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB4444:
> + unpack_ubyte_ARGB4444(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB4444_REV:
> + unpack_ubyte_ARGB4444_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_RGBA5551:
> + unpack_ubyte_RGBA5551(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB1555:
> + unpack_ubyte_ARGB1555(src, dst, n);
> + break;
> + case MESA_FORMAT_ARGB1555_REV:
> + unpack_ubyte_ARGB1555_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_AL44:
> + unpack_ubyte_AL44(src, dst, n);
> + break;
> + case MESA_FORMAT_AL88:
> + unpack_ubyte_AL88(src, dst, n);
> + break;
> + case MESA_FORMAT_AL88_REV:
> + unpack_ubyte_AL88_REV(src, dst, n);
> + break;
> + case MESA_FORMAT_RGB332:
> + unpack_ubyte_RGB332(src, dst, n);
> + break;
> + case MESA_FORMAT_A8:
> + unpack_ubyte_A8(src, dst, n);
> + break;
> + case MESA_FORMAT_L8:
> + unpack_ubyte_L8(src, dst, n);
> + break;
> + case MESA_FORMAT_I8:
> + unpack_ubyte_I8(src, dst, n);
> + break;
> + case MESA_FORMAT_R8:
> + unpack_ubyte_R8(src, dst, n);
> + break;
> + case MESA_FORMAT_GR88:
> + unpack_ubyte_GR88(src, dst, n);
> + break;
> + case MESA_FORMAT_RG88:
> + unpack_ubyte_RG88(src, dst, n);
> + break;
> + default:
> + /* get float values, convert to ubyte */
> + {
> + GLfloat *tmp = (GLfloat *) malloc(n * 4 * sizeof(GLfloat));
> + if (tmp) {
> + GLuint i;
> + _mesa_unpack_rgba_row(format, n, src, (GLfloat (*)[4])
> tmp);
> + for (i = 0; i < n; i++) {
> + UNCLAMPED_FLOAT_TO_UBYTE(dst[i][0], tmp[i*4+0]);
> + UNCLAMPED_FLOAT_TO_UBYTE(dst[i][1], tmp[i*4+1]);
> + UNCLAMPED_FLOAT_TO_UBYTE(dst[i][2], tmp[i*4+2]);
> + UNCLAMPED_FLOAT_TO_UBYTE(dst[i][3], tmp[i*4+3]);
> + }
> + free(tmp);
> + }
> + }
> + break;
> + }
> +}
> +
> +
> +/**********************************************************************/
> +/* Unpack, returning GLuint colors
> */
> +/**********************************************************************/
> +
> static void
> unpack_int_rgba_RGBA_UINT32(const GLuint *src, GLuint dst[][4],
> GLuint n)
> {
> diff --git a/src/mesa/main/format_unpack.h
> b/src/mesa/main/format_unpack.h
> index bab29f6..aad800d 100644
> --- a/src/mesa/main/format_unpack.h
> +++ b/src/mesa/main/format_unpack.h
> @@ -28,6 +28,9 @@ extern void
> _mesa_unpack_rgba_row(gl_format format, GLuint n,
> const void *src, GLfloat dst[][4]);
>
> +extern void
> +_mesa_unpack_ubyte_rgba_row(gl_format format, GLuint n,
> + const void *src, GLubyte dst[][4]);
>
> void
> _mesa_unpack_uint_rgba_row(gl_format format, GLuint n,
> --
> 1.7.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list