pajoye Sun Feb 5 15:53:58 2006 UTC Modified files: (Branch: PHP_5_1) /php-src/ext/gd gd.c /php-src/ext/gd/libgd gd.h gd_jpeg.c Log: - MFH: add a weak/tolerant mode to the jpeg loader http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/gd.c?r1=1.312.2.18&r2=1.312.2.19&diff_format=u Index: php-src/ext/gd/gd.c diff -u php-src/ext/gd/gd.c:1.312.2.18 php-src/ext/gd/gd.c:1.312.2.19 --- php-src/ext/gd/gd.c:1.312.2.18 Fri Jan 27 20:46:02 2006 +++ php-src/ext/gd/gd.c Sun Feb 5 15:53:58 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c,v 1.312.2.18 2006/01/27 20:46:02 mike Exp $ */ +/* $Id: gd.c,v 1.312.2.19 2006/02/05 15:53:58 pajoye Exp $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -35,6 +35,7 @@ #endif #include "php.h" +#include "php_ini.h" #include "ext/standard/head.h" #include <math.h> #include "SAPI.h" @@ -357,6 +358,12 @@ ZEND_GET_MODULE(gd) #endif +/* {{{ PHP_INI_BEGIN */ +PHP_INI_BEGIN() + PHP_INI_ENTRY("gd.jpeg_ignore_warning", "0", PHP_INI_ALL, NULL) +PHP_INI_END() +/* }}} */ + /* {{{ php_free_gd_image */ static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC) @@ -405,6 +412,8 @@ le_ps_enc = zend_register_list_destructors_ex(php_free_ps_enc, NULL, "gd PS encoding", module_number); #endif + REGISTER_INI_ENTRIES(); + REGISTER_LONG_CONSTANT("IMG_GIF", 1, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_JPG", 2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_JPEG", 2, CONST_CS | CONST_PERSISTENT); @@ -1540,6 +1549,8 @@ php_stream *stream; FILE * fp = NULL; int argc=ZEND_NUM_ARGS(); + long ignore_warning; + if ((image_type == PHP_GDIMG_TYPE_GD2PART && argc != 5) || (image_type != PHP_GDIMG_TYPE_GD2PART && argc != 1) || @@ -1620,6 +1631,14 @@ im = gdImageCreateFromXpm(fn); break; #endif + +#ifdef HAVE_GD_JPG + case PHP_GDIMG_TYPE_JPG: + ignore_warning = INI_INT("gd.jpeg_ignore_warning"); + im = gdImageCreateFromJpeg(fp, ignore_warning); + break; +#endif + default: im = (*func_p)(fp); break; @@ -3841,7 +3860,8 @@ int int_threshold; int x, y; float x_ratio, y_ratio; - + long ignore_warning; + if (argc != 5 || zend_get_parameters_ex(argc, &f_org, &f_dest, &height, &width, &threshold) == FAILURE) { ZEND_WRONG_PARAM_COUNT(); } @@ -3897,7 +3917,8 @@ #ifdef HAVE_GD_JPG case PHP_GDIMG_TYPE_JPG: - im_org = gdImageCreateFromJpeg(org); + ignore_warning = INI_INT("gd.jpeg_ignore_warning"); + im_org = gdImageCreateFromJpeg(org, ignore_warning); if (im_org == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open '%s' Not a valid JPEG file", fn_dest); RETURN_FALSE; http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/libgd/gd.h?r1=1.26.2.2&r2=1.26.2.3&diff_format=u Index: php-src/ext/gd/libgd/gd.h diff -u php-src/ext/gd/libgd/gd.h:1.26.2.2 php-src/ext/gd/libgd/gd.h:1.26.2.3 --- php-src/ext/gd/libgd/gd.h:1.26.2.2 Fri Jan 27 13:36:30 2006 +++ php-src/ext/gd/libgd/gd.h Sun Feb 5 15:53:58 2006 @@ -237,8 +237,8 @@ gdImagePtr gdImageCreateFromPngCtx(gdIOCtxPtr in); gdImagePtr gdImageCreateFromWBMP(FILE *inFile); gdImagePtr gdImageCreateFromWBMPCtx(gdIOCtx *infile); -gdImagePtr gdImageCreateFromJpeg(FILE *infile); -gdImagePtr gdImageCreateFromJpegCtx(gdIOCtx *infile); +gdImagePtr gdImageCreateFromJpeg(FILE *infile, int ignore_warning); +gdImagePtr gdImageCreateFromJpegCtx(gdIOCtx *infile, int ignore_warning); /* A custom data source. */ /* The source function must return -1 on error, otherwise the number http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/libgd/gd_jpeg.c?r1=1.18.4.1&r2=1.18.4.2&diff_format=u Index: php-src/ext/gd/libgd/gd_jpeg.c diff -u php-src/ext/gd/libgd/gd_jpeg.c:1.18.4.1 php-src/ext/gd/libgd/gd_jpeg.c:1.18.4.2 --- php-src/ext/gd/libgd/gd_jpeg.c:1.18.4.1 Thu Aug 18 12:54:43 2005 +++ php-src/ext/gd/libgd/gd_jpeg.c Sun Feb 5 15:53:58 2006 @@ -43,8 +43,44 @@ typedef struct _jmpbuf_wrapper { jmp_buf jmpbuf; + int ignore_warning; } jmpbuf_wrapper; +static long php_jpeg_emit_message(j_common_ptr jpeg_info, int level) +{ + char message[JMSG_LENGTH_MAX]; + jmpbuf_wrapper *jmpbufw; + int ignore_warning = 0; + + jmpbufw = (jmpbuf_wrapper *) jpeg_info->client_data; + + if (jmpbufw != 0) { + ignore_warning = jmpbufw->ignore_warning; + } + + (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(ignore_warning ? E_NOTICE : E_WARNING, "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 +243,21 @@ 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 +267,12 @@ 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; @@ -253,8 +290,13 @@ memset (&cinfo, 0, sizeof (cinfo)); memset (&jerr, 0, sizeof (jerr)); + jmpbufw.ignore_warning = ignore_warning; + cinfo.err = jpeg_std_error (&jerr); cinfo.client_data = &jmpbufw; + + 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 +428,12 @@ 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);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php