summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2016-07-23 16:14:36 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2016-07-23 16:14:36 +0200
commitd795a6bf978671155f97fc2e11151e4e520a75ae (patch)
treeae4f623eaca7da7846139c9763884539592ae1e8
parent3bfea88ad8c0af82022fe318738edfead732e1ce (diff)
downloadphp-git-d795a6bf978671155f97fc2e11151e4e520a75ae.tar.gz
Implement #52857: Access to gdImageSetClip() and gdImageGetClip()
We add the necessary PHP bindings for both functions which are available as of GD_2_0_12 (released 2006-04-05). The API of imagegetclip() is modelled according to imageftbbox().
-rw-r--r--ext/gd/gd.c61
-rw-r--r--ext/gd/php_gd.h2
-rw-r--r--ext/gd/tests/imagegetclip_basic.phpt38
-rw-r--r--ext/gd/tests/imagesetclip_basic.phpt26
4 files changed, 127 insertions, 0 deletions
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 119bc8fec4..88d8575a22 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -685,6 +685,18 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagesy, 0)
ZEND_ARG_INFO(0, im)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_imagesetclip, 0)
+ ZEND_ARG_INFO(0, im)
+ ZEND_ARG_INFO(0, x1)
+ ZEND_ARG_INFO(0, y1)
+ ZEND_ARG_INFO(0, x2)
+ ZEND_ARG_INFO(0, y2)
+ZEND_END_ARG_INFO()
+
+ZEND_BEGIN_ARG_INFO(arginfo_imagegetclip, 0)
+ ZEND_ARG_INFO(0, im)
+ZEND_END_ARG_INFO()
+
#ifdef ENABLE_GD_TTF
#if HAVE_LIBFREETYPE
ZEND_BEGIN_ARG_INFO_EX(arginfo_imageftbbox, 0, 0, 4)
@@ -936,6 +948,8 @@ const zend_function_entry gd_functions[] = {
PHP_FE(imagestringup, arginfo_imagestringup)
PHP_FE(imagesx, arginfo_imagesx)
PHP_FE(imagesy, arginfo_imagesy)
+ PHP_FE(imagesetclip, arginfo_imagesetclip)
+ PHP_FE(imagegetclip, arginfo_imagegetclip)
PHP_FE(imagedashedline, arginfo_imagedashedline)
#ifdef ENABLE_GD_TTF
@@ -3797,6 +3811,53 @@ PHP_FUNCTION(imagesy)
}
/* }}} */
+/* {{{ proto bool imagesetclip(resource im, int x1, int y1, int x2, int y2)
+ Set the clipping rectangle. */
+PHP_FUNCTION(imagesetclip)
+{
+ zval *im_zval;
+ gdImagePtr im;
+ zend_long x1, y1, x2, y2;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "rllll", &im_zval, &x1, &y1, &x2, &y2) == FAILURE) {
+ return;
+ }
+
+ if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(im_zval), "Image", le_gd)) == NULL) {
+ RETURN_FALSE;
+ }
+
+ gdImageSetClip(im, x1, y1, x2, y2);
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto array imagegetclip(resource im)
+ Get the clipping rectangle. */
+PHP_FUNCTION(imagegetclip)
+{
+ zval *im_zval;
+ gdImagePtr im;
+ int x1, y1, x2, y2;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &im_zval) == FAILURE) {
+ return;
+ }
+
+ if ((im = (gdImagePtr)zend_fetch_resource(Z_RES_P(im_zval), "Image", le_gd)) == NULL) {
+ RETURN_FALSE;
+ }
+
+ gdImageGetClip(im, &x1, &y1, &x2, &y2);
+
+ array_init(return_value);
+ add_next_index_long(return_value, x1);
+ add_next_index_long(return_value, y1);
+ add_next_index_long(return_value, x2);
+ add_next_index_long(return_value, y2);
+}
+/* }}} */
+
#ifdef ENABLE_GD_TTF
#define TTFTEXT_DRAW 0
#define TTFTEXT_BBOX 1
diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h
index 19e7063d9c..d2c4697322 100644
--- a/ext/gd/php_gd.h
+++ b/ext/gd/php_gd.h
@@ -182,6 +182,8 @@ PHP_FUNCTION(imagestring);
PHP_FUNCTION(imagestringup);
PHP_FUNCTION(imagesx);
PHP_FUNCTION(imagesy);
+PHP_FUNCTION(imagesetclip);
+PHP_FUNCTION(imagegetclip);
PHP_FUNCTION(imagedashedline);
PHP_FUNCTION(imagettfbbox);
PHP_FUNCTION(imagettftext);
diff --git a/ext/gd/tests/imagegetclip_basic.phpt b/ext/gd/tests/imagegetclip_basic.phpt
new file mode 100644
index 0000000000..f5f1893cf8
--- /dev/null
+++ b/ext/gd/tests/imagegetclip_basic.phpt
@@ -0,0 +1,38 @@
+--TEST--
+imagegetclip() - basic functionality
+--SKIP--
+<?php
+if (!extension_loaded('gd')) die('skip ext/gd required');
+?>
+--FILE--
+<?php
+$im = imagecreate(10, 10);
+echo '=== original ===', PHP_EOL;
+var_dump(imagegetclip($im));
+imagesetclip($im, 1,2, 3,4);
+echo '=== after imagesetclip() ===', PHP_EOL;
+var_dump(imagegetclip($im));
+?>
+--EXPECT--
+=== original ===
+array(4) {
+ [0]=>
+ int(0)
+ [1]=>
+ int(0)
+ [2]=>
+ int(9)
+ [3]=>
+ int(9)
+}
+=== after imagesetclip() ===
+array(4) {
+ [0]=>
+ int(1)
+ [1]=>
+ int(2)
+ [2]=>
+ int(3)
+ [3]=>
+ int(4)
+}
diff --git a/ext/gd/tests/imagesetclip_basic.phpt b/ext/gd/tests/imagesetclip_basic.phpt
new file mode 100644
index 0000000000..ced49c7eaf
--- /dev/null
+++ b/ext/gd/tests/imagesetclip_basic.phpt
@@ -0,0 +1,26 @@
+--TEST--
+imagesetclip() - basic functionality
+--SKIP--
+<?php
+if (!extension_loaded('gd')) die('skip ext/gd required');
+?>
+--FILE--
+<?php
+// draw a clipped diagonal line
+$im = imagecreate(100, 100);
+imagecolorallocate($im, 0, 0, 0);
+$white = imagecolorallocate($im, 255, 255, 255);
+imagesetclip($im, 10,10, 89,89);
+imageline($im, 0,0, 99,99, $white);
+
+// save image for manual inspection
+// imagepng($im, __FILE__ . '.png');
+
+// verify that the clipping has been respected
+imagesetclip($im, 0,0, 99,99);
+var_dump(imagecolorat($im, 9,9) !== $white);
+var_dump(imagecolorat($im, 90,90) !== $white);
+?>
+--EXPECT--
+bool(true)
+bool(true)