From 37bfbfbd234cce09b67c1d53e1ef7d91a46e53cc Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 23 Aug 2008 13:47:16 +0000 Subject: png screenshots --- src/render/pngfile.cc | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'src/render/pngfile.cc') diff --git a/src/render/pngfile.cc b/src/render/pngfile.cc index 14884f0..27cfd8f 100644 --- a/src/render/pngfile.cc +++ b/src/render/pngfile.cc @@ -116,7 +116,74 @@ Image *PNG::load(const char *filename) void PNG::save(const char *filename, Image & image) { - con_warn << "PNG::save stub" << std::endl; + + FILE *png_file = fopen(filename, "wb"); + if (!png_file) { + con_warn << "Could not write " << filename << std::endl; + return; + } + + /* initialize stuff */ + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) { + fclose(png_file); + con_warn << "Error writing " << filename << ": png_create_write_struct failed!" << std::endl; + return; + } + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + fclose(png_file); + con_warn << "Error writing " << filename << ": png_create_info_struct failed!" << std::endl; + return; + } + + if (setjmp(png_jmpbuf(png_ptr))) { + con_warn << "Error reading " << filename << ": error during init_io!" << std::endl; + fclose(png_file); + return; + } + + png_init_io(png_ptr, png_file); + + /* write header */ + if (setjmp(png_jmpbuf(png_ptr))) { + con_warn << "Error writing " << filename << ": error writing header!" << std::endl; + fclose(png_file); + return; + } + + png_set_IHDR(png_ptr, info_ptr, image.width(), image.height(), 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + png_write_info(png_ptr, info_ptr); + + /* write image data */ + if (setjmp(png_jmpbuf(png_ptr))) { + con_warn << "Error writing " << filename << ": error writing header!" << std::endl; + fclose(png_file); + return; + } + + png_bytep row_pointers[image.height()]; + + for (size_t i = 0; i < image.height(); i++) + row_pointers[i] = (png_bytep) image[i * image.width() * image.channels()]; + + png_write_image(png_ptr, row_pointers); + + /* end write */ + if (setjmp(png_jmpbuf(png_ptr))) { + con_warn << "Error writing " << filename << std::endl; + fclose(png_file); + return; + } + + png_write_end(png_ptr, NULL); + + fclose(png_file); + + con_print << "Wrote " << filename << std::endl; } } -- cgit v1.2.3