X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c972e125b6a8d219da47fe729af717931e5076ff..86fdd27b451ec92f4573f125fec73c44421ee744:/src/common/imagjpeg.cpp?ds=sidebyside diff --git a/src/common/imagjpeg.cpp b/src/common/imagjpeg.cpp index e91863170c..07bc8934cb 100644 --- a/src/common/imagjpeg.cpp +++ b/src/common/imagjpeg.cpp @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// // Name: imagjpeg.cpp // Purpose: wxImage JPEG handler -// Author: Robert Roebling +// Author: Vaclav Slavik // RCS-ID: $Id$ -// Copyright: (c) Robert Roebling +// Copyright: (c) Vaclav Slavik // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -30,7 +30,7 @@ #include "wx/app.h" #if wxUSE_LIBJPEG extern "C" { -#include +#include "../jpeg/jpeglib.h" } #endif #include "wx/filefn.h" @@ -40,6 +40,8 @@ extern "C" { // For memcpy #include +// For JPEG library error handling +#include #ifdef __SALFORDC__ #ifdef FAR @@ -74,11 +76,11 @@ typedef struct { typedef my_source_mgr * my_src_ptr; -METHODDEF(void) my_init_source ( j_decompress_ptr cinfo ) +METHODDEF(void) my_init_source ( j_decompress_ptr WXUNUSED(cinfo) ) { } -METHODDEF(boolean) my_fill_input_buffer ( j_decompress_ptr cinfo ) +METHODDEF(boolean) my_fill_input_buffer ( j_decompress_ptr WXUNUSED(cinfo) ) { return TRUE; } @@ -122,17 +124,59 @@ void jpeg_wxio_src( j_decompress_ptr cinfo, wxInputStream& infile ) } +// JPEG error manager: + +struct my_error_mgr { + struct jpeg_error_mgr pub; /* "public" fields */ + + jmp_buf setjmp_buffer; /* for return to caller */ +}; + +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) +{ + /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ + my_error_ptr myerr = (my_error_ptr) cinfo->err; + + /* Always display the message. */ + /* We could postpone this until after returning, if we chose. */ + (*cinfo->err->output_message) (cinfo); + + /* Return control to the setjmp point */ + longjmp(myerr->setjmp_buffer, 1); +} + + bool wxJPEGHandler::LoadFile( wxImage *image, wxInputStream& stream ) { struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; + struct my_error_mgr jerr; JSAMPARRAY tempbuf; unsigned char *ptr; unsigned stride; image->Destroy(); - cinfo.err = jpeg_std_error( &jerr ); + cinfo.err = jpeg_std_error( &jerr.pub ); + jerr.pub.error_exit = my_error_exit; + + /* Establish the setjmp return context for my_error_exit to use. */ + 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. + */ + wxLogError(_("Couldn't load a JPEG image - probably file is corrupted.")); + jpeg_destroy_decompress(&cinfo); + if (image->Ok()) image->Destroy(); + return FALSE; + } + jpeg_create_decompress( &cinfo ); jpeg_wxio_src( &cinfo, stream ); jpeg_read_header( &cinfo, TRUE ); @@ -227,12 +271,24 @@ GLOBAL(void) jpeg_wxio_dest (j_compress_ptr cinfo, wxOutputStream& outfile) bool wxJPEGHandler::SaveFile( wxImage *image, wxOutputStream& stream ) { struct jpeg_compress_struct cinfo; - struct jpeg_error_mgr jerr; + struct my_error_mgr jerr; JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ JSAMPLE *image_buffer; int stride; /* physical row width in image buffer */ - cinfo.err = jpeg_std_error(&jerr); + cinfo.err = jpeg_std_error(&jerr.pub); + jerr.pub.error_exit = my_error_exit; + + /* Establish the setjmp return context for my_error_exit to use. */ + 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. + */ + wxLogError(_("Couldn't save a JPEG image - probably file is corrupted.")); + jpeg_destroy_compress(&cinfo); + return FALSE; + } + jpeg_create_compress(&cinfo); jpeg_wxio_dest(&cinfo, stream); @@ -260,3 +316,9 @@ bool wxJPEGHandler::SaveFile( wxImage *image, wxOutputStream& stream ) // wxUSE_LIBJPEG + + + + + +