summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2016-10-02 20:27:58 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2016-10-02 20:27:58 +0200
commit2a305b38b76f3a3ab0a91cbffb43f675f95917c4 (patch)
tree935511708b4e5d4275d966f9842ca68528f1252d
parent82a8e57f37b9f28357c9ab9fc3df88bafd46ef62 (diff)
downloadphp-git-2a305b38b76f3a3ab0a91cbffb43f675f95917c4.tar.gz
Implement request #33066: Add GD Image Function gdImageOpenPolygon()
gdImageOpenPolygon() has been introduced with líbgd 2.0.29, so we finally add a PHP binding for it, and port the respective libgd functionality to PHP's bundled libgd.
-rw-r--r--ext/gd/gd.c31
-rw-r--r--ext/gd/libgd/gd.c12
-rw-r--r--ext/gd/libgd/gd.h1
-rw-r--r--ext/gd/php_gd.h1
-rw-r--r--ext/gd/tests/imageopenpolygon.pngbin0 -> 1325 bytes
-rw-r--r--ext/gd/tests/imageopenpolygon_basic.phpt29
6 files changed, 69 insertions, 5 deletions
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index f8569779ba..caac3a994d 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -578,6 +578,13 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagepolygon, 0)
ZEND_ARG_INFO(0, col)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_imageopenpolygon, 0)
+ ZEND_ARG_INFO(0, im)
+ ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
+ ZEND_ARG_INFO(0, num_pos)
+ ZEND_ARG_INFO(0, col)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO(arginfo_imagefilledpolygon, 0)
ZEND_ARG_INFO(0, im)
ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */
@@ -938,6 +945,7 @@ const zend_function_entry gd_functions[] = {
PHP_FE(imageline, arginfo_imageline)
PHP_FE(imageloadfont, arginfo_imageloadfont)
PHP_FE(imagepolygon, arginfo_imagepolygon)
+ PHP_FE(imageopenpolygon, arginfo_imageopenpolygon)
PHP_FE(imagerectangle, arginfo_imagerectangle)
PHP_FE(imagesetpixel, arginfo_imagesetpixel)
PHP_FE(imagestring, arginfo_imagestring)
@@ -3346,6 +3354,7 @@ PHP_FUNCTION(imageinterlace)
/* }}} */
/* {{{ php_imagepolygon
+ arg = -1 open polygon
arg = 0 normal polygon
arg = 1 filled polygon */
/* im, points, num_points, col */
@@ -3398,10 +3407,16 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled)
gdImageSetAntiAliased(im, col);
col = gdAntiAliased;
}
- if (filled) {
- gdImageFilledPolygon(im, points, npoints, col);
- } else {
- gdImagePolygon(im, points, npoints, col);
+ switch (filled) {
+ case -1:
+ gdImageOpenPolygon(im, points, npoints, col);
+ break;
+ case 0:
+ gdImagePolygon(im, points, npoints, col);
+ break;
+ case 1:
+ gdImageFilledPolygon(im, points, npoints, col);
+ break;
}
efree(points);
@@ -3417,6 +3432,14 @@ PHP_FUNCTION(imagepolygon)
}
/* }}} */
+/* {{{ proto bool imageopenpolygon(resource im, array point, int num_points, int col)
+ Draw a polygon */
+PHP_FUNCTION(imageopenpolygon)
+{
+ php_imagepolygon(INTERNAL_FUNCTION_PARAM_PASSTHRU, -1);
+}
+/* }}} */
+
/* {{{ proto bool imagefilledpolygon(resource im, array point, int num_points, int col)
Draw a filled polygon */
PHP_FUNCTION(imagefilledpolygon)
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index afa8e287cc..b312c574c3 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -2606,6 +2606,17 @@ void gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, i
void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c)
{
+ if (n <= 0) {
+ return;
+ }
+
+
+ gdImageLine (im, p->x, p->y, p[n - 1].x, p[n - 1].y, c);
+ gdImageOpenPolygon (im, p, n, c);
+}
+
+void gdImageOpenPolygon (gdImagePtr im, gdPointPtr p, int n, int c)
+{
int i;
int lx, ly;
@@ -2615,7 +2626,6 @@ void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c)
lx = p->x;
ly = p->y;
- gdImageLine(im, lx, ly, p[n - 1].x, p[n - 1].y, c);
for (i = 1; i < n; i++) {
p++;
gdImageLine(im, lx, ly, p->x, p->y, c);
diff --git a/ext/gd/libgd/gd.h b/ext/gd/libgd/gd.h
index 4b6f86e28c..85dbe9b7e0 100644
--- a/ext/gd/libgd/gd.h
+++ b/ext/gd/libgd/gd.h
@@ -493,6 +493,7 @@ typedef struct {
} gdPoint, *gdPointPtr;
void gdImagePolygon(gdImagePtr im, gdPointPtr p, int n, int c);
+void gdImageOpenPolygon(gdImagePtr im, gdPointPtr p, int n, int c);
void gdImageFilledPolygon(gdImagePtr im, gdPointPtr p, int n, int c);
/* These functions still work with truecolor images,
diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h
index 0b35423f88..a6a660184f 100644
--- a/ext/gd/php_gd.h
+++ b/ext/gd/php_gd.h
@@ -174,6 +174,7 @@ PHP_FUNCTION(imageinterlace);
PHP_FUNCTION(imageline);
PHP_FUNCTION(imageloadfont);
PHP_FUNCTION(imagepolygon);
+PHP_FUNCTION(imageopenpolygon);
PHP_FUNCTION(imagerectangle);
PHP_FUNCTION(imagesetpixel);
PHP_FUNCTION(imagestring);
diff --git a/ext/gd/tests/imageopenpolygon.png b/ext/gd/tests/imageopenpolygon.png
new file mode 100644
index 0000000000..33bcf32223
--- /dev/null
+++ b/ext/gd/tests/imageopenpolygon.png
Binary files differ
diff --git a/ext/gd/tests/imageopenpolygon_basic.phpt b/ext/gd/tests/imageopenpolygon_basic.phpt
new file mode 100644
index 0000000000..569cb305b6
--- /dev/null
+++ b/ext/gd/tests/imageopenpolygon_basic.phpt
@@ -0,0 +1,29 @@
+--TEST--
+imageopenpolygon(): basic test
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'func.inc';
+
+$im = imagecreatetruecolor(100, 100);
+$white = imagecolorallocate($im, 255, 255, 255);
+$black = imagecolorallocate($im, 0, 0, 0);
+$red = imagecolorallocate($im, 255, 0, 0);
+$green = imagecolorallocate($im, 0, 128, 0);
+$blue = imagecolorallocate($im, 0, 0, 255);
+imagefilledrectangle($im, 0,0, 99,99, $white);
+
+imageopenpolygon($im, [10,10, 49,89, 89,10], 3, $black);
+imageopenpolygon($im, [10,89, 35,10, 60,89, 85,10], 4, $red);
+imageopenpolygon($im, [10,49, 30,89, 50,10, 70,89, 90,10], 5, $green);
+imageopenpolygon($im, [10,50, 25,10, 40,89, 55,10, 80,89, 90,50], 6, $blue);
+
+test_image_equals_file(__DIR__ . DIRECTORY_SEPARATOR . 'imageopenpolygon.png', $im);
+?>
+===DONE===
+--EXPECT--
+The images are equal.
+===DONE===