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