X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/33ac7e6f01acbac1cff0ad400d8ea7f0bfd0a62f..21a77f6e5008e7c6e15fc5615c917f13793e6136:/src/common/imagjpeg.cpp diff --git a/src/common/imagjpeg.cpp b/src/common/imagjpeg.cpp index 1e8457fc9b..23c5e7aa36 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" @@ -42,13 +53,25 @@ extern "C" #include #ifdef __SALFORDC__ -#ifdef FAR #undef FAR #endif -#endif -#ifdef __WXMSW__ -#include +// ---------------------------------------------------------------------------- +// types +// ---------------------------------------------------------------------------- + +// the standard definition of METHODDEF(type) from jmorecfg.h is "static type" +// which means that we can't declare the method functions as extern "C" - the +// compiler (rightfully) complains about the multiple storage classes in +// declaration +// +// so we only add extern "C" when using our own, modified, jmorecfg.h - and use +// whatever we have in the system headers if this is what we use hoping that it +// should be ok (can't do anything else) +#ifdef JPEG_METHOD_LINKAGE + #define CPP_METHODDEF(type) extern "C" METHODDEF(type) +#else // not using our jmorecfg.h header + #define CPP_METHODDEF(type) METHODDEF(type) #endif //----------------------------------------------------------------------------- @@ -72,11 +95,11 @@ typedef struct { typedef my_source_mgr * my_src_ptr; -METHODDEF(void) my_init_source ( j_decompress_ptr WXUNUSED(cinfo) ) +CPP_METHODDEF(void) my_init_source ( j_decompress_ptr WXUNUSED(cinfo) ) { } -METHODDEF(boolean) my_fill_input_buffer ( j_decompress_ptr cinfo ) +CPP_METHODDEF(boolean) my_fill_input_buffer ( j_decompress_ptr cinfo ) { my_src_ptr src = (my_src_ptr) cinfo->src; @@ -93,7 +116,7 @@ METHODDEF(boolean) my_fill_input_buffer ( j_decompress_ptr cinfo ) return TRUE; } -METHODDEF(void) my_skip_input_data ( j_decompress_ptr cinfo, long num_bytes ) +CPP_METHODDEF(void) my_skip_input_data ( j_decompress_ptr cinfo, long num_bytes ) { if (num_bytes > 0) { @@ -109,7 +132,7 @@ METHODDEF(void) my_skip_input_data ( j_decompress_ptr cinfo, long num_bytes ) } } -METHODDEF(void) my_term_source ( j_decompress_ptr cinfo ) +CPP_METHODDEF(void) my_term_source ( j_decompress_ptr cinfo ) { my_src_ptr src = (my_src_ptr) cinfo->src; @@ -118,29 +141,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 +156,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) +CPP_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 +169,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,6 +220,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); jpeg_destroy_decompress(&cinfo); if (image->Ok()) image->Destroy(); return FALSE; @@ -241,7 +265,7 @@ typedef my_destination_mgr * my_dest_ptr; #define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ -METHODDEF(void) init_destination (j_compress_ptr cinfo) +CPP_METHODDEF(void) init_destination (j_compress_ptr cinfo) { my_dest_ptr dest = (my_dest_ptr) cinfo->dest; @@ -253,7 +277,7 @@ METHODDEF(void) init_destination (j_compress_ptr cinfo) dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; } -METHODDEF(boolean) empty_output_buffer (j_compress_ptr cinfo) +CPP_METHODDEF(boolean) empty_output_buffer (j_compress_ptr cinfo) { my_dest_ptr dest = (my_dest_ptr) cinfo->dest; @@ -263,7 +287,7 @@ METHODDEF(boolean) empty_output_buffer (j_compress_ptr cinfo) return TRUE; } -METHODDEF(void) term_destination (j_compress_ptr cinfo) +CPP_METHODDEF(void) term_destination (j_compress_ptr cinfo) { my_dest_ptr dest = (my_dest_ptr) cinfo->dest; size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer;