Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-08-23 13:47:16 +0000
committerStijn Buys <ingar@osirion.org>2008-08-23 13:47:16 +0000
commit37bfbfbd234cce09b67c1d53e1ef7d91a46e53cc (patch)
tree3ed13293a1825009b6ef776fcca06ec542838953 /src/render/pngfile.cc
parent02e9a70009f79064043033abc5e597930aa11079 (diff)
png screenshots
Diffstat (limited to 'src/render/pngfile.cc')
-rw-r--r--src/render/pngfile.cc69
1 files changed, 68 insertions, 1 deletions
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;
}
}