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

Reply via email to