tabe Wed Jan 14 19:06:13 2009 UTC
Added files: (Branch: PHP_5_3)
/php-src/ext/gd/libgd gd_pixelate.c
Modified files:
/php-src/ext/gd config.m4 config.w32 gd.c
/php-src/ext/gd/libgd gd.h
/php-src/ext/gd/tests imagefilter.phpt
Log:
MFH: added pixelate filter.
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/config.m4?r1=1.154.2.1.2.6.2.1&r2=1.154.2.1.2.6.2.2&diff_format=u
Index: php-src/ext/gd/config.m4
diff -u php-src/ext/gd/config.m4:1.154.2.1.2.6.2.1
php-src/ext/gd/config.m4:1.154.2.1.2.6.2.2
--- php-src/ext/gd/config.m4:1.154.2.1.2.6.2.1 Fri Jul 18 01:16:25 2008
+++ php-src/ext/gd/config.m4 Wed Jan 14 19:05:59 2009
@@ -1,5 +1,5 @@
dnl
-dnl $Id: config.m4,v 1.154.2.1.2.6.2.1 2008/07/18 01:16:25 scottmac Exp $
+dnl $Id: config.m4,v 1.154.2.1.2.6.2.2 2009/01/14 19:05:59 tabe Exp $
dnl
dnl
@@ -268,7 +268,7 @@
libgd/gdxpm.c libgd/gdfontt.c libgd/gdfonts.c
libgd/gdfontmb.c libgd/gdfontl.c \
libgd/gdfontg.c libgd/gdtables.c libgd/gdft.c libgd/gdcache.c
libgd/gdkanji.c \
libgd/wbmp.c libgd/gd_wbmp.c libgd/gdhelpers.c
libgd/gd_topal.c libgd/gd_gif_in.c \
- libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c"
+ libgd/xbm.c libgd/gd_gif_out.c libgd/gd_security.c
libgd/gd_pixelate.c"
dnl check for fabsf and floorf which are available since C99
AC_CHECK_FUNCS(fabsf floorf)
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/config.w32?r1=1.10.4.4.2.8&r2=1.10.4.4.2.9&diff_format=u
Index: php-src/ext/gd/config.w32
diff -u php-src/ext/gd/config.w32:1.10.4.4.2.8
php-src/ext/gd/config.w32:1.10.4.4.2.9
--- php-src/ext/gd/config.w32:1.10.4.4.2.8 Sun Jul 20 19:03:18 2008
+++ php-src/ext/gd/config.w32 Wed Jan 14 19:06:01 2009
@@ -1,4 +1,4 @@
-// $Id: config.w32,v 1.10.4.4.2.8 2008/07/20 19:03:18 kalle Exp $
+// $Id: config.w32,v 1.10.4.4.2.9 2009/01/14 19:06:01 tabe Exp $
// vim:ft=javascript
ARG_WITH("gd", "Bundled GD support", "yes,shared");
@@ -33,7 +33,7 @@
gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c
gdfontt.c \
gdft.c gd_gd2.c gd_gd.c gd_gif_in.c gd_gif_out.c
gdhelpers.c gd_io.c gd_io_dp.c \
gd_io_file.c gd_io_ss.c gd_jpeg.c gdkanji.c gd_png.c
gd_ss.c \
- gdtables.c gd_topal.c gd_wbmp.c gdxpm.c wbmp.c xbm.c
gd_security.c", "gd");
+ gdtables.c gd_topal.c gd_wbmp.c gdxpm.c wbmp.c xbm.c
gd_security.c gd_pixelate.c", "gd");
AC_DEFINE('HAVE_LIBGD', 1, 'GD support');
ADD_FLAG("CFLAGS_GD", " \
/D HAVE_GD_DYNAMIC_CTX_EX=1 \
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/gd.c?r1=1.312.2.20.2.32.2.27&r2=1.312.2.20.2.32.2.28&diff_format=u
Index: php-src/ext/gd/gd.c
diff -u php-src/ext/gd/gd.c:1.312.2.20.2.32.2.27
php-src/ext/gd/gd.c:1.312.2.20.2.32.2.28
--- php-src/ext/gd/gd.c:1.312.2.20.2.32.2.27 Wed Dec 31 11:15:37 2008
+++ php-src/ext/gd/gd.c Wed Jan 14 19:06:01 2009
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: gd.c,v 1.312.2.20.2.32.2.27 2008/12/31 11:15:37 sebastian Exp $ */
+/* $Id: gd.c,v 1.312.2.20.2.32.2.28 2009/01/14 19:06:01 tabe Exp $ */
/* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center,
Cold Spring Harbor Labs. */
@@ -141,7 +141,8 @@
#define IMAGE_FILTER_SELECTIVE_BLUR 8
#define IMAGE_FILTER_MEAN_REMOVAL 9
#define IMAGE_FILTER_SMOOTH 10
-#define IMAGE_FILTER_MAX 10
+#define IMAGE_FILTER_PIXELATE 11
+#define IMAGE_FILTER_MAX 11
#define IMAGE_FILTER_MAX_ARGS 5
static void php_image_filter_negate(INTERNAL_FUNCTION_PARAMETERS);
static void php_image_filter_grayscale(INTERNAL_FUNCTION_PARAMETERS);
@@ -154,6 +155,7 @@
static void php_image_filter_selective_blur(INTERNAL_FUNCTION_PARAMETERS);
static void php_image_filter_mean_removal(INTERNAL_FUNCTION_PARAMETERS);
static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS);
+static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS);
#endif
/* End Section filters declarations */
static gdImagePtr _php_image_create_from_string (zval **Data, char *tn,
gdImagePtr (*ioctx_func_p)() TSRMLS_DC);
@@ -1187,6 +1189,7 @@
REGISTER_LONG_CONSTANT("IMG_FILTER_EMBOSS", IMAGE_FILTER_EMBOSS,
CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IMG_FILTER_MEAN_REMOVAL",
IMAGE_FILTER_MEAN_REMOVAL, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("IMG_FILTER_SMOOTH", IMAGE_FILTER_SMOOTH,
CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("IMG_FILTER_PIXELATE", IMAGE_FILTER_PIXELATE,
CONST_CS | CONST_PERSISTENT);
/* End Section Filters */
#else
REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);
@@ -4915,6 +4918,29 @@
RETURN_FALSE;
}
+static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS)
+{
+ zval *IM;
+ gdImagePtr im;
+ long tmp, blocksize, mode = 0;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rll|l", &IM,
&tmp, &blocksize, &mode) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
+
+ if (im == NULL) {
+ RETURN_FALSE;
+ }
+
+ if (gdImagePixelate(im, (int) blocksize, (const unsigned int) mode)) {
+ RETURN_TRUE;
+ }
+
+ RETURN_FALSE;
+}
+
/* {{{ proto bool imagefilter(resource src_im, int filtertype, [args] )
Applies Filter an image using a custom angle */
PHP_FUNCTION(imagefilter)
@@ -4935,7 +4961,8 @@
php_image_filter_gaussian_blur,
php_image_filter_selective_blur,
php_image_filter_mean_removal,
- php_image_filter_smooth
+ php_image_filter_smooth,
+ php_image_filter_pixelate
};
if (ZEND_NUM_ARGS() < 2 || ZEND_NUM_ARGS() > 6) {
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/libgd/gd.h?r1=1.26.2.3.2.6.2.1&r2=1.26.2.3.2.6.2.2&diff_format=u
Index: php-src/ext/gd/libgd/gd.h
diff -u php-src/ext/gd/libgd/gd.h:1.26.2.3.2.6.2.1
php-src/ext/gd/libgd/gd.h:1.26.2.3.2.6.2.2
--- php-src/ext/gd/libgd/gd.h:1.26.2.3.2.6.2.1 Thu Nov 6 10:14:37 2008
+++ php-src/ext/gd/libgd/gd.h Wed Jan 14 19:06:03 2009
@@ -580,6 +580,13 @@
void gdImageAntialias(gdImagePtr im, int antialias);
void gdImageSaveAlpha(gdImagePtr im, int saveAlphaArg);
+enum gdPixelateMode {
+ GD_PIXELATE_UPPERLEFT,
+ GD_PIXELATE_AVERAGE
+};
+
+int gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode);
+
/* Macros to access information about images. */
/* Returns nonzero if the image is a truecolor image,
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/tests/imagefilter.phpt?r1=1.4.4.1&r2=1.4.4.1.2.1&diff_format=u
Index: php-src/ext/gd/tests/imagefilter.phpt
diff -u php-src/ext/gd/tests/imagefilter.phpt:1.4.4.1
php-src/ext/gd/tests/imagefilter.phpt:1.4.4.1.2.1
--- php-src/ext/gd/tests/imagefilter.phpt:1.4.4.1 Sat Jun 2 15:35:34 2007
+++ php-src/ext/gd/tests/imagefilter.phpt Wed Jan 14 19:06:12 2009
@@ -21,7 +21,7 @@
$SAVE_DIR = dirname(__FILE__);
$SOURCE_IMG = $SAVE_DIR . "/test.png";
-
+
foreach ($no_arg_filters as $filt) {
$im = imagecreatefrompng($SOURCE_IMG);
if (imagefilter($im, constant($filt))) {
@@ -34,7 +34,7 @@
}
$im = imagecreatefrompng($SOURCE_IMG);
-
+
if (imagefilter($im, IMG_FILTER_SMOOTH, -1924.124)) {
imagepng($im, $SAVE_DIR . "/IMG_FILTER_SMOOTH.png");
echo "IMG_FILTER_SMOOTH success\n";
@@ -42,9 +42,9 @@
} else {
echo "IMG_FILTER_SMOOTH failed\n";
}
-
+
$im = imagecreatefrompng($SOURCE_IMG);
-
+
if (imagefilter($im, IMG_FILTER_COLORIZE, -127.12, -127.98, 127)) {
imagepng($im, $SAVE_DIR . "/IMG_FILTER_COLORIZE.png");
echo "IMG_FILTER_COLORIZE success\n";
@@ -52,9 +52,9 @@
} else {
echo "IMG_FILTER_COLORIZE failed\n";
}
-
+
$im = imagecreatefrompng($SOURCE_IMG);
-
+
if (imagefilter($im, IMG_FILTER_CONTRAST, -90)) {
imagepng($im, $SAVE_DIR . "/IMG_FILTER_CONTRAST.png");
echo "IMG_FILTER_CONTRAST success\n";
@@ -64,7 +64,7 @@
}
$im = imagecreatefrompng($SOURCE_IMG);
-
+
if (imagefilter($im, IMG_FILTER_BRIGHTNESS, 98)) {
imagepng($im, $SAVE_DIR . "/IMG_FILTER_BRIGHTNESS.png");
echo "IMG_FILTER_BRIGHTNESS success\n";
@@ -72,6 +72,16 @@
} else {
echo "IMG_FILTER_BRIGHTNESS failed\n";
}
+
+ $im = imagecreatefrompng($SOURCE_IMG);
+
+ if (imagefilter($im, IMG_FILTER_PIXELATE, 5, 1)) {
+ imagepng($im, $SAVE_DIR . "/IMG_FILTER_PIXELATE.png");
+ echo "IMG_FILTER_PIXELATE success\n";
+ unlink($SAVE_DIR . "/IMG_FILTER_PIXELATE.png");
+ } else {
+ echo "IMG_FILTER_PIXELATE failed\n";
+ }
?>
--EXPECT--
IMG_FILTER_NEGATE success
@@ -85,3 +95,4 @@
IMG_FILTER_COLORIZE success
IMG_FILTER_CONTRAST success
IMG_FILTER_BRIGHTNESS success
+IMG_FILTER_PIXELATE success
http://cvs.php.net/viewvc.cgi/php-src/ext/gd/libgd/gd_pixelate.c?view=markup&rev=1.1
Index: php-src/ext/gd/libgd/gd_pixelate.c
+++ php-src/ext/gd/libgd/gd_pixelate.c
#include "gd.h"
int gdImagePixelate(gdImagePtr im, int block_size, const unsigned int mode)
{
int x, y;
if (block_size <= 0) {
return 0;
} else if (block_size == 1) {
return 1;
}
switch (mode) {
case GD_PIXELATE_UPPERLEFT:
for (y = 0; y < im->sy; y += block_size) {
for (x = 0; x < im->sx; x += block_size) {
if (gdImageBoundsSafe(im, x, y)) {
int c = gdImageGetPixel(im, x, y);
gdImageFilledRectangle(im, x, y, x +
block_size - 1, y + block_size - 1, c);
}
}
}
break;
case GD_PIXELATE_AVERAGE:
for (y = 0; y < im->sy; y += block_size) {
for (x = 0; x < im->sx; x += block_size) {
int a, r, g, b, c;
int total;
int cx, cy;
a = r = g = b = c = total = 0;
/* sampling */
for (cy = 0; cy < block_size; cy++) {
for (cx = 0; cx < block_size; cx++) {
if (!gdImageBoundsSafe(im, x +
cx, y + cy)) {
continue;
}
c = gdImageGetPixel(im, x + cx,
y + cy);
a += gdImageAlpha(im, c);
r += gdImageRed(im, c);
g += gdImageGreen(im, c);
b += gdImageBlue(im, c);
total++;
}
}
/* drawing */
if (total > 0) {
c = gdImageColorResolveAlpha(im, r /
total, g / total, b / total, a / total);
gdImageFilledRectangle(im, x, y, x +
block_size - 1, y + block_size - 1, c);
}
}
}
break;
default:
return 0;
}
return 1;
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php