[Mesa-dev] [PATCH 2/6] mesa: Add Pixman usage to texstore.c

Juha-Pekka Heikkila juhapekka.heikkila at gmail.com
Wed Jun 25 05:38:45 PDT 2014


This patch adds 'pixman_texture_conversion' function which will
be used by following patches for converting textures between
different pixel formats.

Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila at gmail.com>
---
 src/mesa/main/texstore.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
index cb81f3f..a32b406 100644
--- a/src/mesa/main/texstore.c
+++ b/src/mesa/main/texstore.c
@@ -75,6 +75,10 @@
 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
 
 
+#ifdef HAVE_PIXMAN
+#   include <pixman.h>
+#endif
+
 enum {
    ZERO = 4, 
    ONE = 5
@@ -966,6 +970,67 @@ memcpy_texture(struct gl_context *ctx,
    }
 }
 
+#ifdef HAVE_PIXMAN
+/**
+ * Use Pixman library to copy and convert src image to dst image.
+ * \param srcFormat pixman_format_code_t of the source image.
+ * \param srcBits pointer to source bits.
+ * \param srcStride the length of source stride.
+ * \param width of the source and destination images.
+ * \param height of the source and destination images.
+ * \param dstFormat pixman_format_code_t of the destination image.
+ * \param dstBits pointer to destination bits.
+ * \param dstStride the length of destination stride.
+ * \return GLboolean GL_TRUE if everything ok.
+ */
+static GLboolean
+pixman_texture_conversion(
+        const pixman_format_code_t srcFormat,
+        uint32_t *srcBits, const uint32_t srcStride,
+        const uint16_t width, const uint16_t height,
+        const pixman_format_code_t dstFormat,
+        uint32_t *dstBits, const uint32_t dstStride)
+{
+   pixman_image_t *pixmanImage[2];
+
+   if ((pixmanImage[0] = pixman_image_create_bits_no_clear(srcFormat,
+                                                           width,
+                                                           height,
+                                                           srcBits,
+                                                           srcStride))
+           == NULL)
+      return GL_FALSE;
+
+   /* Assumption source and destination images are same size here.
+    */
+   if ((pixmanImage[1] = pixman_image_create_bits_no_clear(dstFormat,
+                                                           width,
+                                                           height,
+                                                           dstBits,
+                                                           dstStride))
+           == NULL) {
+      pixman_image_unref(pixmanImage[0]);
+      return GL_FALSE;
+   }
+
+   pixman_image_composite(PIXMAN_OP_SRC,
+                          pixmanImage[0],
+                          (pixman_image_t*) NULL,
+                          pixmanImage[1],
+                          0,
+                          0,
+                          0,
+                          0,
+                          0,
+                          0,
+                          width,
+                          height);
+
+   pixman_image_unref(pixmanImage[0]);
+   pixman_image_unref(pixmanImage[1]);
+   return GL_TRUE;
+}
+#endif /* HAVE_PIXMAN */
 
 /**
  * General-case function for storing a color texture images with
-- 
1.8.1.2



More information about the mesa-dev mailing list