pajoye Fri Jan 27 01:59:26 2006 UTC Modified files: /php-src/ext/gd gd_ctx.c /php-src/ext/gd/libgd gd.h gd_png.c Log: - add filter mode support for imagepng imagepng("file", $comp_mode, $filter_mode); The filters are defined in the libpng docs for png_set_filter allow to divide the size of png images by more than 2. Constants will be added later BC kept, by default no filter are set Fine to MFH? With the constants? http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/gd_ctx.c?r1=1.28&r2=1.29&diff_format=u Index: php-src/ext/gd/gd_ctx.c diff -u php-src/ext/gd/gd_ctx.c:1.28 php-src/ext/gd/gd_ctx.c:1.29 --- php-src/ext/gd/gd_ctx.c:1.28 Sun Jan 1 13:09:50 2006 +++ php-src/ext/gd/gd_ctx.c Fri Jan 27 01:59:26 2006 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd_ctx.c,v 1.28 2006/01/01 13:09:50 sniper Exp $ */ +/* $Id: gd_ctx.c,v 1.29 2006/01/27 01:59:26 pajoye Exp $ */ #include "php_gd.h" @@ -49,12 +49,13 @@ /* {{{ _php_image_output_ctx */ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) { - zval **imgind, **file, **quality; + zval **imgind, **file, **quality, **basefilter; gdImagePtr im; char *fn = NULL; FILE *fp = NULL; int argc = ZEND_NUM_ARGS(); int q = -1, i; + int f = -1; gdIOCtx *ctx; /* The third (quality) parameter for Wbmp stands for the threshold when called from image2wbmp(). @@ -65,7 +66,7 @@ if (argc < 2 && image_type == PHP_GDIMG_TYPE_XBM) { WRONG_PARAM_COUNT; } - if (argc < 1 || argc > 3 || zend_get_parameters_ex(argc, &imgind, &file, &quality) == FAILURE) + if (argc < 1 || argc > 4 || zend_get_parameters_ex(argc, &imgind, &file, &quality, &basefilter) == FAILURE) { WRONG_PARAM_COUNT; } @@ -75,11 +76,16 @@ if (argc > 1) { convert_to_string_ex(file); fn = Z_STRVAL_PP(file); - if (argc == 3) { + if (argc >= 3) { convert_to_long_ex(quality); q = Z_LVAL_PP(quality);/* or colorindex for foreground of BW images (defaults to black) */ + if (argc == 4) { + convert_to_long_ex(basefilter); + f = Z_LVAL_PP(basefilter); + } } } + if ((argc == 2) || (argc > 2 && Z_STRLEN_PP(file))) { PHP_GD_CHECK_OPEN_BASEDIR(fn, "Invalid filename"); @@ -104,9 +110,11 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid threshold value '%d'. It must be between 0 and 255", q); } case PHP_GDIMG_TYPE_JPG: - case PHP_GDIMG_TYPE_PNG: (*func_p)(im, ctx, q); break; + case PHP_GDIMG_TYPE_PNG: + (*func_p)(im, ctx, q, f); + break; case PHP_GDIMG_TYPE_XBM: case PHP_GDIMG_TYPE_WBM: if (argc < 3) { http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/libgd/gd.h?r1=1.26&r2=1.27&diff_format=u Index: php-src/ext/gd/libgd/gd.h diff -u php-src/ext/gd/libgd/gd.h:1.26 php-src/ext/gd/libgd/gd.h:1.27 --- php-src/ext/gd/libgd/gd.h:1.26 Sun Mar 27 23:43:52 2005 +++ php-src/ext/gd/libgd/gd.h Fri Jan 27 01:59:26 2006 @@ -440,8 +440,8 @@ * compression (smallest files) but takes a long time to compress, and * -1 selects the default compiled into the zlib library. */ -void gdImagePngEx(gdImagePtr im, FILE * out, int level); -void gdImagePngCtxEx(gdImagePtr im, gdIOCtx * out, int level); +void gdImagePngEx(gdImagePtr im, FILE * out, int level, int basefilter); +void gdImagePngCtxEx(gdImagePtr im, gdIOCtx * out, int level, int basefilter); void gdImageWBMP(gdImagePtr image, int fg, FILE *out); void gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out); @@ -485,7 +485,7 @@ /* Best to free this memory with gdFree(), not free() */ void* gdImageGdPtr(gdImagePtr im, int *size); -void *gdImagePngPtrEx(gdImagePtr im, int *size, int level); +void *gdImagePngPtrEx(gdImagePtr im, int *size, int level, int basefilter); /* Best to free this memory with gdFree(), not free() */ void* gdImageGd2Ptr(gdImagePtr im, int cs, int fmt, int *size); http://cvs.php.net/viewcvs.cgi/php-src/ext/gd/libgd/gd_png.c?r1=1.18&r2=1.19&diff_format=u Index: php-src/ext/gd/libgd/gd_png.c diff -u php-src/ext/gd/libgd/gd_png.c:1.18 php-src/ext/gd/libgd/gd_png.c:1.19 --- php-src/ext/gd/libgd/gd_png.c:1.18 Thu Aug 18 12:54:30 2005 +++ php-src/ext/gd/libgd/gd_png.c Fri Jan 27 01:59:26 2006 @@ -384,17 +384,17 @@ return im; } -void gdImagePngEx (gdImagePtr im, FILE * outFile, int level) +void gdImagePngEx (gdImagePtr im, FILE * outFile, int level, int basefilter) { gdIOCtx *out = gdNewFileCtx(outFile); - gdImagePngCtxEx(im, out, level); + gdImagePngCtxEx(im, out, level, -1); out->gd_free(out); } void gdImagePng (gdImagePtr im, FILE * outFile) { gdIOCtx *out = gdNewFileCtx(outFile); - gdImagePngCtxEx(im, out, -1); + gdImagePngCtxEx(im, out, -1, -1); out->gd_free(out); } @@ -402,18 +402,18 @@ { void *rv; gdIOCtx *out = gdNewDynamicCtx(2048, NULL); - gdImagePngCtxEx(im, out, -1); + gdImagePngCtxEx(im, out, -1, -1); rv = gdDPExtractData(out, size); out->gd_free(out); return rv; } -void * gdImagePngPtrEx (gdImagePtr im, int *size, int level) +void * gdImagePngPtrEx (gdImagePtr im, int *size, int level, int basefilter) { void *rv; gdIOCtx *out = gdNewDynamicCtx(2048, NULL); - gdImagePngCtxEx(im, out, level); + gdImagePngCtxEx(im, out, level, basefilter); rv = gdDPExtractData(out, size); out->gd_free(out); return rv; @@ -421,14 +421,14 @@ void gdImagePngCtx (gdImagePtr im, gdIOCtx * outfile) { - gdImagePngCtxEx(im, outfile, -1); + gdImagePngCtxEx(im, outfile, -1, -1); } /* This routine is based in part on code from Dale Lutz (Safe Software Inc.) * and in part on demo code from Chapter 15 of "PNG: The Definitive Guide" * (http://www.cdrom.com/pub/png/pngbook.html). */ -void gdImagePngCtxEx (gdImagePtr im, gdIOCtx * outfile, int level) +void gdImagePngCtxEx (gdImagePtr im, gdIOCtx * outfile, int level, int basefilter) { int i, j, bit_depth = 0, interlace_type; int width = im->sx; @@ -484,6 +484,9 @@ /* 2.0.12: this is finally a parameter */ png_set_compression_level(png_ptr, level); + if (basefilter >= 0) { + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, basefilter); + } /* can set this to a smaller value without compromising compression if all * image data is 16K or less; will save some decoder memory [min == 8]
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php