@ -45,6 +45,33 @@ typedef struct _jmpbuf_wrapper
jmp_buf jmpbuf ;
} jmpbuf_wrapper ;
static long php_jpeg_emit_message ( j_common_ptr jpeg_info , int level )
{
char message [ JMSG_LENGTH_MAX ] ;
( jpeg_info - > err - > format_message ) ( jpeg_info , message ) ;
/* It is a warning message */
if ( level < 0 ) {
/* display only the 1st warning, as would do a default libjpeg
* unless strace_level > = 3
*/
if ( ( jpeg_info - > err - > num_warnings = = 0 ) | | ( jpeg_info - > err - > trace_level > = 3 ) ) {
php_gd_error_ex ( E_NOTICE , " gd-jpeg, libjpeg: recoverable error: %s \n " , message ) ;
}
jpeg_info - > err - > num_warnings + + ;
} else {
/* strace msg, Show it if trace_level >= level. */
if ( jpeg_info - > err - > trace_level > = level ) {
php_gd_error_ex ( E_NOTICE , " gd-jpeg, libjpeg: strace message: %s \n " , message ) ;
}
}
return 1 ;
}
/* Called by the IJG JPEG library upon encountering a fatal error */
static void fatal_jpeg_error ( j_common_ptr cinfo )
{
@ -207,21 +234,21 @@ void gdImageJpegCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
gdFree ( row ) ;
}
gdImagePtr gdImageCreateFromJpeg ( FILE * inFile )
gdImagePtr gdImageCreateFromJpeg ( FILE * inFile , int ignore_warning )
{
gdImagePtr im ;
gdIOCtx * in = gdNewFileCtx ( inFile ) ;
im = gdImageCreateFromJpegCtx ( in ) ;
im = gdImageCreateFromJpegCtx ( in , ignore_warning ) ;
in - > gd_free ( in ) ;
return im ;
}
gdImagePtr gdImageCreateFromJpegPtr ( int size , void * data )
gdImagePtr gdImageCreateFromJpegPtr ( int size , void * data , int ignore_warning )
{
gdImagePtr im ;
gdIOCtx * in = gdNewDynamicCtxEx ( size , data , 0 ) ;
im = gdImageCreateFromJpegCtx ( in ) ;
im = gdImageCreateFromJpegCtx ( in , ignore_warning ) ;
in - > gd_free ( in ) ;
return im ;
@ -231,11 +258,12 @@ void jpeg_gdIOCtx_src (j_decompress_ptr cinfo, gdIOCtx * infile);
static int CMYKToRGB ( int c , int m , int y , int k , int inverted ) ;
/*
* Create a gd - format image from the JPEG - format INFILE . Returns the
* image , or NULL upon error .
*/
gdImagePtr gdImageCreateFromJpegCtx ( gdIOCtx * infile )
gdImagePtr gdImageCreateFromJpegCtx ( gdIOCtx * infile , int ignore_warning )
{
struct jpeg_decompress_struct cinfo ;
struct jpeg_error_mgr jerr ;
@ -255,6 +283,11 @@ gdImagePtr gdImageCreateFromJpegCtx (gdIOCtx * infile)
cinfo . err = jpeg_std_error ( & jerr ) ;
cinfo . client_data = & jmpbufw ;
if ( ignore_warning ) {
cinfo . err - > emit_message = ( void ( * ) ( j_common_ptr , int ) ) php_jpeg_emit_message ;
}
if ( setjmp ( jmpbufw . jmpbuf ) ! = 0 ) {
/* we're here courtesy of longjmp */
if ( row ) {
@ -386,12 +419,12 @@ gdImagePtr gdImageCreateFromJpegCtx (gdIOCtx * infile)
if ( jpeg_finish_decompress ( & cinfo ) ! = TRUE ) {
php_gd_error ( " gd-jpeg: warning: jpeg_finish_decompress reports suspended data source " ) ;
}
/* Thanks to Truxton Fulton */
if ( cinfo . err - > num_warnings > 0 ) {
goto error ;
if ( ! ignore_warning ) {
if ( cinfo . err - > num_warnings > 0 ) {
goto error ;
}
}
jpeg_destroy_decompress ( & cinfo ) ;
gdFree ( row ) ;