diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2016-10-02 20:27:58 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2016-10-02 20:27:58 +0200 |
commit | 2a305b38b76f3a3ab0a91cbffb43f675f95917c4 (patch) | |
tree | 935511708b4e5d4275d966f9842ca68528f1252d | |
parent | 82a8e57f37b9f28357c9ab9fc3df88bafd46ef62 (diff) | |
download | php-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.c | 31 | ||||
-rw-r--r-- | ext/gd/libgd/gd.c | 12 | ||||
-rw-r--r-- | ext/gd/libgd/gd.h | 1 | ||||
-rw-r--r-- | ext/gd/php_gd.h | 1 | ||||
-rw-r--r-- | ext/gd/tests/imageopenpolygon.png | bin | 0 -> 1325 bytes | |||
-rw-r--r-- | ext/gd/tests/imageopenpolygon_basic.phpt | 29 |
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 Binary files differnew file mode 100644 index 0000000000..33bcf32223 --- /dev/null +++ b/ext/gd/tests/imageopenpolygon.png 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===
|