X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/717510eb58c5c58f0ae9dabf1f4279d91109a4e7..c43430bbacbf26414693fcf47fe54a8090c6bfcb:/src/common/imagjpeg.cpp diff --git a/src/common/imagjpeg.cpp b/src/common/imagjpeg.cpp index 58ee909282..c8db0ce961 100644 --- a/src/common/imagjpeg.cpp +++ b/src/common/imagjpeg.cpp @@ -27,10 +27,21 @@ #include "wx/debug.h" #include "wx/log.h" #include "wx/app.h" + +// 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 +#endif + extern "C" { #include "jpeglib.h" } + #include "wx/filefn.h" #include "wx/wfstream.h" #include "wx/intl.h" @@ -47,9 +58,10 @@ extern "C" #endif #endif -#ifdef __WXMSW__ -#include -#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 @@ -118,29 +130,6 @@ METHODDEF(void) my_term_source ( j_decompress_ptr 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: @@ -156,8 +145,7 @@ typedef struct my_error_mgr * my_error_ptr; * 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; @@ -170,6 +158,30 @@ my_error_exit (j_common_ptr cinfo) 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__ @@ -197,7 +209,7 @@ bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbos */ if (verbose) wxLogError(_("JPEG: Couldn't load - file is probably corrupted.")); - (cinfo.src->term_source) (&cinfo);; + (cinfo.src->term_source)(&cinfo); jpeg_destroy_decompress(&cinfo); if (image->Ok()) image->Destroy(); return FALSE;