]> git.notmuchmail.org Git - apitrace/commitdiff
Write PNG images instead.
authorJosé Fonseca <jfonseca@vmware.com>
Sat, 4 Dec 2010 13:13:47 +0000 (13:13 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 4 Dec 2010 13:13:47 +0000 (13:13 +0000)
.gitignore
glretrace.py
image.cpp
image.hpp

index 6e2b74caf710bf56b188f2d4697081e6962aa69e..3673b5220f9392448f594798a4ce07b2ad5a665c 100644 (file)
@@ -12,6 +12,7 @@
 *.o
 *.obj
 *.pdb
+*.png
 *.pyc
 *.pyo
 *.so
index bee6728bb7c8798d42f6572cb847f29f33db9ba4..28b47c15d3969b840ed6e0fdf99fbcdbe6d5157b 100644 (file)
@@ -223,10 +223,10 @@ static void frame_complete(void) {
     
     if (__screenshots && !__reshape_window) {
         char filename[PATH_MAX];
-        snprintf(filename, sizeof filename, "screenshot_%04u.bmp", __frame);
+        snprintf(filename, sizeof filename, "screenshot_%04u.png", __frame);
         Image::Image image(__window_width, __window_height, true);
         glReadPixels(0, 0, __window_width, __window_height, GL_RGBA, GL_UNSIGNED_BYTE, image.pixels);
-        image.writeBMP(filename);
+        image.writePNG(filename);
     }
 
 }
index 6cd39b2f09ce64e2d0b07b4b14348de9c77aab3e..7cb7c0240eacdb7eeff7c1521af2b309f49ceb50 100644 (file)
--- a/image.cpp
+++ b/image.cpp
@@ -24,6 +24,8 @@
  **************************************************************************/
 
 
+#include <png.h>
+
 #include <stdint.h>
 
 #include <fstream>
@@ -132,5 +134,79 @@ Image::writeBMP(const char *filename) const {
     return true;
 }
 
+bool
+Image::writePNG(const char *filename) const {
+    FILE *fp;
+    png_structp png_ptr;
+    png_infop info_ptr;
+
+    /* Open the file */
+    fp = fopen(filename, "wb");
+    if (!fp)
+        goto no_fp;
+
+    /* Create and initialize the png_struct with the desired error handler
+     * functions.  If you want to use the default stderr and longjump method,
+     * you can supply NULL for the last three parameters.  We also check that
+     * the library version is compatible with the one used at compile time,
+     * in case we are using dynamically linked libraries.  REQUIRED.
+     */
+    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+    if (!png_ptr)
+        goto no_png;
+
+    /* Allocate/initialize the image information data.  REQUIRED */
+    info_ptr = png_create_info_struct(png_ptr);
+    if (!info_ptr) {
+        png_destroy_write_struct(&png_ptr,  NULL);
+        goto no_png;
+    }
+
+    /* Set error handling.  REQUIRED if you aren't supplying your own
+     * error handling functions in the png_create_write_struct() call.
+     */
+    if (setjmp(png_jmpbuf(png_ptr))) {
+        png_destroy_write_struct(&png_ptr, &info_ptr);
+        goto no_png;
+    }
+
+#if 1
+    png_init_io(png_ptr, fp);
+#else
+    png_set_write_fn(png_ptr, (void *)user_io_ptr, user_write_fn,
+        user_IO_flush_function);
+#endif
+
+    png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA,
+        PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
+    png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
+
+    png_write_info(png_ptr, info_ptr);
+
+    if (!flipped) {
+        for (unsigned y = 0; y < height; ++y) {
+            png_byte *row = (png_byte *)(pixels + y*width*4);
+            png_write_rows(png_ptr, &row, 1);
+        }
+    } else {
+        unsigned y = height;
+        while (y--) {
+            png_byte *row = (png_byte *)(pixels + y*width*4);
+            png_write_rows(png_ptr, &row, 1);
+        }
+    }
+
+    png_write_end(png_ptr, info_ptr);
+    png_destroy_write_struct(&png_ptr, &info_ptr);
+
+    fclose(fp);
+    return true;
+
+no_png:
+    fclose(fp);
+no_fp:
+    return false;
+}
 
 } /* namespace Image */
index 4d57de112f96c104f6ccd71a2b97c78b1cee0d04..190b093adc1ea9e9ab136ccc29040545a2e53de7 100644 (file)
--- a/image.hpp
+++ b/image.hpp
@@ -60,6 +60,7 @@ public:
     }
 
     bool writeBMP(const char *filename) const;
+    bool writePNG(const char *filename) const;
 };