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-24 18:52:10 +0000
committerStijn Buys <ingar@osirion.org>2008-08-24 18:52:10 +0000
commit9c4d134ab304794b755139e90ca6da9de73a1e9a (patch)
tree71373947f86aa5f72ea78fed695974cfb5117642 /src/render/jpgfile.cc
parent184598a43548642b9a4bfe8c2fce58e4a966d0bb (diff)
JPEG screenshots
Diffstat (limited to 'src/render/jpgfile.cc')
-rw-r--r--src/render/jpgfile.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/render/jpgfile.cc b/src/render/jpgfile.cc
new file mode 100644
index 0000000..74cdea9
--- /dev/null
+++ b/src/render/jpgfile.cc
@@ -0,0 +1,89 @@
+/*
+ render/jpgfile.cc
+ This file is part of the Osirion project and is distributed under
+ the terms of the GNU General Public License version 2
+*/
+
+/*
+Notes:
+
+http://www.zarb.org/~gc/html/libpng.html
+
+*/
+
+#include <cstring>
+#include <iostream>
+
+#include "filesystem/filesystem.h"
+#include "render/jpgfile.h"
+#include "sys/sys.h"
+
+extern "C" {
+ #include "jpeglib.h"
+}
+
+namespace render {
+
+Image *JPG::load(const char *filename)
+{
+ Image *image = 0;
+
+ if (!filename)
+ return 0;
+
+ filesystem::File *jpg_file = filesystem::open(filename);
+ if (!jpg_file) {
+ //con_warn << "Could not open " << filename << std::endl;
+ return 0;
+ }
+
+
+ filesystem::close(jpg_file);
+
+// con_debug << " " << filename << " " << png_width << "x" << png_height << "x" << channels * png_depth << "bpp" << std::endl;
+
+ return image;
+}
+
+void JPG::save(const char *filename, Image & image, int jpeg_quality)
+{
+ struct jpeg_compress_struct jpeg_compression_info;
+ struct jpeg_error_mgr jerr;
+
+ JSAMPROW row_pointer[1];
+ int row_stride;
+
+ FILE *jpg_file = fopen(filename, "wb");
+ if (!jpg_file) {
+ con_warn << "Could not write " << filename << std::endl;
+ return;
+ }
+
+ jpeg_compression_info.err = jpeg_std_error(&jerr);
+ jpeg_create_compress(&jpeg_compression_info);
+ jpeg_stdio_dest(&jpeg_compression_info, jpg_file);
+
+ jpeg_compression_info.image_width = image.width();
+ jpeg_compression_info.image_height = image.height();
+ jpeg_compression_info.input_components = image.channels();
+ jpeg_compression_info.in_color_space = JCS_RGB;
+
+ jpeg_set_defaults(&jpeg_compression_info);
+ jpeg_set_quality(&jpeg_compression_info, jpeg_quality, TRUE);
+ jpeg_start_compress(&jpeg_compression_info, TRUE);
+ row_stride = image.width() * image.channels();
+
+ while (jpeg_compression_info.next_scanline < jpeg_compression_info.image_height) {
+ row_pointer[0] = image[jpeg_compression_info.next_scanline * row_stride];
+ jpeg_write_scanlines(&jpeg_compression_info, row_pointer, 1);
+ }
+
+ jpeg_finish_compress(&jpeg_compression_info);
+ fclose(jpg_file);
+
+ jpeg_destroy_compress(&jpeg_compression_info);
+
+ con_print << "Wrote " << filename << std::endl;
+}
+
+}