1 /*! ========================================================================
4 ** $Id: mptr_jpeg.cpp,v 1.1.1.1 2005/01/04 01:23:11 darco Exp $
6 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
8 ** This package is free software; you can redistribute it and/or
9 ** modify it under the terms of the GNU General Public License as
10 ** published by the Free Software Foundation; either version 2 of
11 ** the License, or (at your option) any later version.
13 ** This package is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 ** General Public License for more details.
18 ** === N O T E S ===========================================================
20 ** ========================================================================= */
22 /*! \todo Support 16 bit JPEG files
23 ** \todo Support for paletted JPEG files
24 ** \todo Support GAMMA correction
25 ** \todo Fix memory leaks
28 /* === H E A D E R S ======================================================= */
37 #include "mptr_jpeg.h"
38 #include <synfig/importer.h>
39 #include <synfig/time.h>
40 #include <synfig/general.h>
48 /* === M A C R O S ========================================================= */
50 using namespace synfig;
54 #define JPEG_CHECK_BYTES 8
56 /* === G L O B A L S ======================================================= */
58 SYNFIG_IMPORTER_INIT(jpeg_mptr);
59 SYNFIG_IMPORTER_SET_NAME(jpeg_mptr,"jpeg");
60 SYNFIG_IMPORTER_SET_EXT(jpeg_mptr,"jpg");
61 SYNFIG_IMPORTER_SET_VERSION(jpeg_mptr,"0.1");
62 SYNFIG_IMPORTER_SET_CVS_ID(jpeg_mptr,"$Id: mptr_jpeg.cpp,v 1.1.1.1 2005/01/04 01:23:11 darco Exp $");
64 /* === M E T H O D S ======================================================= */
67 struct jpeg_error_mgr pub; /* "public" fields */
69 jmp_buf setjmp_buffer; /* for return to caller */
72 typedef struct my_error_mgr * my_error_ptr;
75 * Here's the routine that will replace the standard error_exit method:
79 jpeg_mptr::my_error_exit (j_common_ptr cinfo)
81 /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
82 my_error_ptr myerr = (my_error_ptr) cinfo->err;
84 /* Always display the message. */
85 /* We could postpone this until after returning, if we chose. */
86 (*cinfo->err->output_message) (cinfo);
88 /* Return control to the setjmp point */
89 longjmp(myerr->setjmp_buffer, 1);
96 jpeg_mptr::jpeg_mptr(const char *file_name)
98 struct my_error_mgr jerr;
101 /* Open the file pointer */
102 FILE *file = fopen(file_name, "rb");
105 //! \todo THROW SOMETHING
106 throw String("error on importer construction, *WRITEME*1");
110 /* Step 1: allocate and initialize JPEG decompression object */
112 /* We set up the normal JPEG error routines, then override error_exit. */
113 cinfo.err = jpeg_std_error(&jerr.pub);
114 jerr.pub.error_exit = my_error_exit;
115 /* Establish the setjmp return context for my_error_exit to use. */
116 if (setjmp(jerr.setjmp_buffer)) {
117 /* If we get here, the JPEG code has signaled an error.
118 * We need to clean up the JPEG object, close the input file, and return.
120 jpeg_destroy_decompress(&cinfo);
122 throw String("error on importer construction, *WRITEME*2");
124 /* Now we can initialize the JPEG decompression object. */
125 jpeg_create_decompress(&cinfo);
127 /* Step 2: specify data source (eg, a file) */
129 jpeg_stdio_src(&cinfo, file);
131 /* Step 3: read file parameters with jpeg_read_header() */
133 (void) jpeg_read_header(&cinfo, TRUE);
134 /* We can ignore the return value from jpeg_read_header since
135 * (a) suspension is not possible with the stdio data source, and
136 * (b) we passed TRUE to reject a tables-only JPEG file as an error.
137 * See libjpeg.doc for more info.
140 /* Step 4: set parameters for decompression */
142 /* In this example, we don't need to change any of the defaults set by
143 * jpeg_read_header(), so we do nothing here.
146 /* Step 5: Start decompressor */
148 (void) jpeg_start_decompress(&cinfo);
149 /* We can ignore the return value since suspension is not possible
150 * with the stdio data source.
153 JSAMPARRAY buffer; /* Output row buffer */
154 int row_stride; /* physical row width in output buffer */
155 row_stride = cinfo.output_width * cinfo.output_components;
156 /* Make a one-row-high sample array that will go away when done with image */
157 buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
161 synfig::error("jpeg_mptr: error: alloc of \"buffer\" failed (bug?)");
162 throw String("alloc of \"buffer\" failed (bug?)");
167 surface_buffer.set_wh(cinfo.output_width,cinfo.output_height);
169 switch(cinfo.output_components)
172 for(y=0;y<surface_buffer.get_h();y++)
175 jpeg_read_scanlines(&cinfo, buffer, 1);
176 for(x=0;x<surface_buffer.get_w();x++)
178 float r=gamma().g_U8_to_F32((unsigned char)buffer[0][x*3+0]);
179 float g=gamma().g_U8_to_F32((unsigned char)buffer[0][x*3+1]);
180 float b=gamma().g_U8_to_F32((unsigned char)buffer[0][x*3+2]);
181 surface_buffer[y][x]=Color(
188 surface_buffer[y][x]=Color(
189 (float)(unsigned char)buffer[0][x*3+0]*(1.0/255.0),
190 (float)(unsigned char)buffer[0][x*3+1]*(1.0/255.0),
191 (float)(unsigned char)buffer[0][x*3+2]*(1.0/255.0),
200 for(y=0;y<surface_buffer.get_h();y++)
202 jpeg_read_scanlines(&cinfo, buffer, 1);
203 for(x=0;x<surface_buffer.get_w();x++)
205 float gray=gamma().g_U8_to_F32((unsigned char)buffer[0][x]);
206 // float gray=(float)(unsigned char)buffer[0][x]*(1.0/255.0);
207 surface_buffer[y][x]=Color(
218 synfig::error("jpeg_mptr: error: Unsupported color type");
219 //! \todo THROW SOMETHING
220 throw String("error on importer construction, *WRITEME*6");
224 /* Step 7: Finish decompression */
226 (void) jpeg_finish_decompress(&cinfo);
227 /* We can ignore the return value since suspension is not possible
228 * with the stdio data source.
231 /* Step 8: Release JPEG decompression object */
233 /* This is an important step since it will release a good deal of memory. */
234 jpeg_destroy_decompress(&cinfo);
236 /* After finish_decompress, we can close the input file.
237 * Here we postpone it until after no more JPEG errors are possible,
238 * so as to simplify the setjmp error logic above. (Actually, I don't
239 * think that jpeg_destroy can do an error exit, but why assume anything...)
244 jpeg_mptr::~jpeg_mptr()
249 jpeg_mptr::get_frame(synfig::Surface &surface,Time, synfig::ProgressCallback *cb)
251 surface.mirror(surface_buffer);