util/u_debug: Cleanup/fix debug_dump_image.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 2 Dec 2012 18:57:53 +0000 (18:57 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Tue, 4 Dec 2012 19:35:19 +0000 (19:35 +0000)
- Handle other formats.
- Prevent CRLF on Windows.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/util/u_debug.c
src/gallium/auxiliary/util/u_debug.h

index b26192a8b58a254789e8d37805a9fd41fe9c0269..ee97b7adb81ad8e1e20b676c437c1b597c0be597 100644 (file)
@@ -436,7 +436,7 @@ void debug_funclog_enter_exit(const char* f, const int line, const char* file)
 
 #ifdef DEBUG
 /**
- * Dump an image to a .raw or .ppm file (depends on OS).
+ * Dump an image to .ppm file.
  * \param format  PIPE_FORMAT_x
  * \param cpp  bytes per pixel
  * \param width  width in pixels
@@ -444,56 +444,48 @@ void debug_funclog_enter_exit(const char* f, const int line, const char* file)
  * \param stride  row stride in bytes
  */
 void debug_dump_image(const char *prefix,
-                      unsigned format, unsigned cpp,
+                      enum pipe_format format, unsigned cpp,
                       unsigned width, unsigned height,
                       unsigned stride,
                       const void *data)     
 {
    /* write a ppm file */
    char filename[256];
+   unsigned char *rgb8;
    FILE *f;
 
    util_snprintf(filename, sizeof(filename), "%s.ppm", prefix);
 
-   f = fopen(filename, "w");
-   if (f) {
-      int i, x, y;
-      int r, g, b;
-      const uint8_t *ptr = (uint8_t *) data;
-
-      /* XXX this is a hack */
-      switch (format) {
-      case PIPE_FORMAT_B8G8R8A8_UNORM:
-         r = 2;
-         g = 1;
-         b = 0;
-         break;
-      default:
-         r = 0;
-         g = 1;
-         b = 1;
-      }
+   rgb8 = MALLOC(height * width * 3);
+   if (!rgb8) {
+      return;
+   }
+
+   util_format_translate(
+         PIPE_FORMAT_R8G8B8_UNORM,
+         rgb8, width * 3,
+         0, 0,
+         format,
+         data, stride,
+         0, 0, width, height);
 
+   /* Must be opened in binary mode or DOS line ending causes data
+    * to be read with one byte offset.
+    */
+   f = fopen(filename, "wb");
+   if (f) {
       fprintf(f, "P6\n");
-      fprintf(f, "# ppm-file created by osdemo.c\n");
+      fprintf(f, "# ppm-file created by gallium\n");
       fprintf(f, "%i %i\n", width, height);
       fprintf(f, "255\n");
-      fclose(f);
-
-      f = fopen(filename, "ab");  /* reopen in binary append mode */
-      for (y = 0; y < height; y++) {
-         for (x = 0; x < width; x++) {
-            i = y * stride + x * cpp;
-            fputc(ptr[i + r], f); /* write red */
-            fputc(ptr[i + g], f); /* write green */
-            fputc(ptr[i + b], f); /* write blue */
-         }
-      }
+      fwrite(rgb8, 1, height * width * 3, f);
       fclose(f);
    }
    else {
       fprintf(stderr, "Can't open %s for writing\n", filename);
    }
+
+   FREE(rgb8);
 }
 
 /* FIXME: dump resources, not surfaces... */
index 3b42c2f07f74fadc4b214cf7a766d2f2fc8ebf0d..0eb74433379960715f310b11a539674c6d3bfa85 100644 (file)
@@ -41,6 +41,8 @@
 
 #include "os/os_misc.h"
 
+#include "pipe/p_format.h"
+
 
 #ifdef __cplusplus
 extern "C" {
@@ -418,7 +420,7 @@ struct pipe_transfer;
 struct pipe_resource;
 
 void debug_dump_image(const char *prefix,
-                      unsigned format, unsigned cpp,
+                      enum pipe_format format, unsigned cpp,
                       unsigned width, unsigned height,
                       unsigned stride,
                       const void *data);