#include "wx/defs.h"
-#if wxUSE_LIBJPEG
+#if wxUSE_IMAGE && wxUSE_LIBJPEG
#include "wx/imagjpeg.h"
#include "wx/bitmap.h"
#include "wx/debug.h"
#include "wx/log.h"
#include "wx/app.h"
-extern "C"
-{
-#ifdef __WATCOMC__
+
+// NB: Some compilers define boolean type in Windows headers (e.g. Watcom C++).
+// This causes a conflict with jmorecfg.h header from libjpeg, so we have
+// to make sure libjpeg won't try to define boolean itself. This is done by
+// defining HAVE_BOOLEAN.
+#if defined(__WXMSW__) && (defined(__MWERKS__) || defined(__WATCOMC__))
#define HAVE_BOOLEAN
+ #include <windows.h>
#endif
+
+extern "C"
+{
#include "jpeglib.h"
}
+
#include "wx/filefn.h"
#include "wx/wfstream.h"
#include "wx/intl.h"
#endif
#endif
-#ifdef __WXMSW__
-#include <windows.h>
-#endif
+// we can't use METHODDEF here as it includes static yet the functions must be
+// extern "C" and these can't be used together!
+#undef METHODDEF
+#define METHODDEF(type) extern "C" type wxC_CALLING_CONV
//-----------------------------------------------------------------------------
// wxJPEGHandler
{
my_src_ptr src = (my_src_ptr) cinfo->src;
- while (num_bytes > (long)src->pub.bytes_in_buffer)
+ while (num_bytes > (long)src->pub.bytes_in_buffer)
{
num_bytes -= (long) src->pub.bytes_in_buffer;
src->pub.fill_input_buffer(cinfo);
delete[] src->buffer;
}
-void jpeg_wxio_src( j_decompress_ptr cinfo, wxInputStream& infile )
-{
- my_src_ptr src;
-
- if (cinfo->src == NULL) { /* first time for this JPEG object? */
- cinfo->src = (struct jpeg_source_mgr *)
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
- sizeof(my_source_mgr));
- src = (my_src_ptr) cinfo->src;
- }
- src = (my_src_ptr) cinfo->src;
- src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
- src->buffer = new JOCTET[JPEG_IO_BUFFER_SIZE];
- src->pub.next_input_byte = NULL; /* until buffer loaded */
- src->stream = &infile;
-
- src->pub.init_source = my_init_source;
- src->pub.fill_input_buffer = my_fill_input_buffer;
- src->pub.skip_input_data = my_skip_input_data;
- src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
- src->pub.term_source = my_term_source;
-}
-
// JPEG error manager:
* Here's the routine that will replace the standard error_exit method:
*/
-METHODDEF(void)
-my_error_exit (j_common_ptr cinfo)
+METHODDEF(void) my_error_exit (j_common_ptr cinfo)
{
/* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
my_error_ptr myerr = (my_error_ptr) cinfo->err;
longjmp(myerr->setjmp_buffer, 1);
}
+void jpeg_wxio_src( j_decompress_ptr cinfo, wxInputStream& infile )
+{
+ my_src_ptr src;
+
+ if (cinfo->src == NULL) { /* first time for this JPEG object? */
+ cinfo->src = (struct jpeg_source_mgr *)
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+ sizeof(my_source_mgr));
+ src = (my_src_ptr) cinfo->src;
+ }
+ src = (my_src_ptr) cinfo->src;
+ src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
+ src->buffer = new JOCTET[JPEG_IO_BUFFER_SIZE];
+ src->pub.next_input_byte = NULL; /* until buffer loaded */
+ src->stream = &infile;
+
+ src->pub.init_source = my_init_source;
+ src->pub.fill_input_buffer = my_fill_input_buffer;
+ src->pub.skip_input_data = my_skip_input_data;
+ src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */
+ src->pub.term_source = my_term_source;
+}
+
+
// temporarily disable the warning C4611 (interaction between '_setjmp' and
// C++ object destruction is non-portable) - I don't see any dtors here
#ifdef __VISUALC__
/* If we get here, the JPEG code has signaled an error.
* We need to clean up the JPEG object, close the input file, and return.
*/
- if (verbose)
+ if (verbose)
wxLogError(_("JPEG: Couldn't load - file is probably corrupted."));
+ (cinfo.src->term_source)(&cinfo);
jpeg_destroy_decompress(&cinfo);
if (image->Ok()) image->Destroy();
return FALSE;
if (!verbose) cinfo.err->output_message=NULL;
/* Establish the setjmp return context for my_error_exit to use. */
- if (setjmp(jerr.setjmp_buffer))
+ if (setjmp(jerr.setjmp_buffer))
{
/* If we get here, the JPEG code has signaled an error.
* We need to clean up the JPEG object, close the input file, and return.
*/
- if (verbose)
+ if (verbose)
wxLogError(_("JPEG: Couldn't save image."));
jpeg_destroy_compress(&cinfo);
return FALSE;
{
unsigned char hdr[2];
- stream.Read(&hdr, 2);
+ stream.Read(hdr, 2);
stream.SeekI(-2, wxFromCurrent);
return (hdr[0] == 0xFF && hdr[1] == 0xD8);
}