[Mesa-dev] [PATCH 10/29] mesa: Add RGBA to Luminance conversion helpers

Iago Toral Quiroga itoral at igalia.com
Tue Nov 18 01:23:51 PST 2014


For glReadPixels with a Luminance destination format we compute luminance
values from RGBA as L=R+G+B. This, however, requires ad-hoc implementation,
since pack/unpack functions or _mesa_swizzle_and_convert won't do this
(and thus, neither will _mesa_format_convert). This patch adds helpers
to do this computation so they can be used to support conversion to luminance
formats.

The current implementation of glReadPixels does this computation as part
of the span functions in pack.c (see _mesa_pack_rgba_span_float), that do
this together with other things like type conversion, etc. We do not want
to use these functions but use _mesa_format_convert instead (later patches
will remove the color span functions), so we need to extract this functionality
as helpers.
---
 src/mesa/main/pack.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/mesa/main/pack.h |  9 ++++++++
 2 files changed, 72 insertions(+)

diff --git a/src/mesa/main/pack.c b/src/mesa/main/pack.c
index de6ab27..fa4046c 100644
--- a/src/mesa/main/pack.c
+++ b/src/mesa/main/pack.c
@@ -4334,4 +4334,67 @@ _mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat)
    }
 }
 
+void
+_mesa_pack_luminance_from_rgba_float(GLuint n, GLfloat rgba[][4],
+                                     GLvoid *dstAddr, GLenum dst_format,
+                                     GLbitfield transferOps)
+{
+   int i;
+   GLfloat *dst = (GLfloat *) dstAddr;
+
+   switch (dst_format) {
+   case GL_LUMINANCE:
+      if (transferOps & IMAGE_CLAMP_BIT) {
+         for (i = 0; i < n; i++) {
+            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+            dst[i] = CLAMP(sum, 0.0F, 1.0F);
+         }
+      } else {
+         for (i = 0; i < n; i++) {
+            dst[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+         }
+      }
+      return;
+   case GL_LUMINANCE_ALPHA:
+      if (transferOps & IMAGE_CLAMP_BIT) {
+         for (i = 0; i < n; i++) {
+            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+            dst[2*i] = CLAMP(sum, 0.0F, 1.0F);
+            dst[2*i+1] = rgba[i][ACOMP];
+         }
+      } else {
+         for (i = 0; i < n; i++) {
+            dst[2*i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+            dst[2*i+1] = rgba[i][ACOMP];
+         }
+      }
+      return;
+   default:
+      assert(!"Unsupported format");
+   }
+}
+
+void
+_mesa_pack_luminance_from_rgba_integer(GLuint n, GLuint rgba[][4],
+                                       GLvoid *dstAddr, GLenum dst_format)
+{
+   int i;
+   GLuint *dst = (GLuint *) dstAddr;
+
+   switch (dst_format) {
+   case GL_LUMINANCE:
+      for (i = 0; i < n; i++) {
+         dst[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+      }
+      return;
+   case GL_LUMINANCE_ALPHA:
+      for (i = 0; i < n; i++) {
+         dst[2*i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+         dst[2*i+1] = rgba[i][ACOMP];
+      }
+      return;
+   default:
+      assert(!"Unsupported format");
+   }
+}
 
diff --git a/src/mesa/main/pack.h b/src/mesa/main/pack.h
index 2173b65..2783f23 100644
--- a/src/mesa/main/pack.h
+++ b/src/mesa/main/pack.h
@@ -155,4 +155,13 @@ _mesa_rebase_rgba_float(GLuint n, GLfloat rgba[][4], GLenum baseFormat);
 extern void
 _mesa_rebase_rgba_uint(GLuint n, GLuint rgba[][4], GLenum baseFormat);
 
+extern void
+_mesa_pack_luminance_from_rgba_float(GLuint n, GLfloat rgba[][4],
+                                     GLvoid *dstAddr, GLenum dst_format,
+                                     GLbitfield transferOps);
+
+extern void
+_mesa_pack_luminance_from_rgba_integer(GLuint n, GLuint rgba[][4],
+                                       GLvoid *dstAddr, GLenum dst_format);
+
 #endif
-- 
1.9.1



More information about the mesa-dev mailing list