diff options
author | Stijn Buys <ingar@osirion.org> | 2008-08-26 17:42:30 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-08-26 17:42:30 +0000 |
commit | cc0a4412a4ac7f1f78ef7e644a0c06c6dd6dd129 (patch) | |
tree | 27271e45ca42c1039d149ab30637fe4fb08eb732 /src/render/jpgfile.cc | |
parent | 02e623574c4c12c40a0757ed934a93353f34a653 (diff) |
improved dust rendering
Diffstat (limited to 'src/render/jpgfile.cc')
-rw-r--r-- | src/render/jpgfile.cc | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/render/jpgfile.cc b/src/render/jpgfile.cc index 74cdea9..872233f 100644 --- a/src/render/jpgfile.cc +++ b/src/render/jpgfile.cc @@ -26,6 +26,10 @@ namespace render { Image *JPG::load(const char *filename) { + struct jpeg_decompress_struct jpeg_decompression_info; + struct jpeg_error_mgr jerr; + + int row_stride = 0; Image *image = 0; if (!filename) @@ -36,12 +40,34 @@ Image *JPG::load(const char *filename) //con_warn << "Could not open " << filename << std::endl; return 0; } + + // initialize decompression structures + jpeg_decompression_info.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&jpeg_decompression_info); + jpeg_stdio_src(&jpeg_decompression_info, jpg_file->handle()); + + // read JPEG header + jpeg_read_header(&jpeg_decompression_info, TRUE); + jpeg_start_decompress(&jpeg_decompression_info); + + row_stride = jpeg_decompression_info.output_width * jpeg_decompression_info.output_components; + image = new Image(jpeg_decompression_info.output_width, + jpeg_decompression_info.output_height, + jpeg_decompression_info.output_components); + + // read pixel data + JSAMPLE *row_pointer; + while (jpeg_decompression_info.output_scanline < jpeg_decompression_info.output_height) { + row_pointer = (*image)[jpeg_decompression_info.output_scanline*row_stride]; + jpeg_read_scanlines(&jpeg_decompression_info, &row_pointer, 1); + } + jpeg_finish_decompress(&jpeg_decompression_info); - + // destroy decompression structures + jpeg_destroy_decompress(&jpeg_decompression_info); filesystem::close(jpg_file); -// con_debug << " " << filename << " " << png_width << "x" << png_height << "x" << channels * png_depth << "bpp" << std::endl; - + con_debug << " " << filename << " " << image->width() << "x" << image->height() << "x" << image->bpp() << "bpp" << std::endl; return image; } |