com php-src: Implement request #33066: Add GD Image Function gdImageOpenPolygon(): ext/gd/gd.c ext/gd/libgd/gd.c ext/gd/libgd/gd.h ext/gd/php_gd.h
ext/gd/tests/imageopenpolygon.png ext /gd/tests/imageopenpolygon_basic.phpt

From: Date: Sun, 02 Oct 2016 18:27:58 +0000
Subject: com php-src: Implement request #33066: Add GD Image Function gdImageOpenPolygon(): ext/gd/gd.c ext/gd/libgd/gd.c ext/gd/libgd/gd.h ext/gd/php_gd.h
ext/gd/tests/imageopenpolygon.png ext /gd/tests/imageopenpolygon_basic.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-95126@lists.php.net to get a copy of this message
Commit: 2a305b38b76f3a3ab0a91cbffb43f675f95917c4 Author: Christoph M. Becker <cmbecker69@gmx.de> Sun, 2 Oct 2016 20:27:58 +0200 Parents: 82a8e57f37b9f28357c9ab9fc3df88bafd46ef62 Branches: master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=2a305b38b76f3a3ab0a91cbffb43f675f95917c4 Log: 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. Bugs: https://bugs.php.net/33066 Changed paths: M ext/gd/gd.c M ext/gd/libgd/gd.c M ext/gd/libgd/gd.h M ext/gd/php_gd.h A ext/gd/tests/imageopenpolygon.png A ext/gd/tests/imageopenpolygon_basic.phpt Diff: diff --git a/ext/gd/gd.c b/ext/gd/gd.c index f856977..caac3a9 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 afa8e28..b312c57 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 4b6f86e..85dbe9b 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 0b35423..a6a6601 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 0000000..33bcf32 Binary files /dev/null and b/ext/gd/tests/imageopenpolygon.png differ diff --git a/ext/gd/tests/imageopenpolygon_basic.phpt b/ext/gd/tests/imageopenpolygon_basic.phpt new file mode 100644 index 0000000..569cb30 --- /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===

« previous php.cvs (#95126) next »