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.
This commit is contained in:
Christoph M. Becker 2016-10-02 20:27:58 +02:00
parent 82a8e57f37
commit 2a305b38b7
6 changed files with 69 additions and 5 deletions

View file

@ -578,6 +578,13 @@ ZEND_BEGIN_ARG_INFO(arginfo_imagepolygon, 0)
ZEND_ARG_INFO(0, col) ZEND_ARG_INFO(0, col)
ZEND_END_ARG_INFO() 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_BEGIN_ARG_INFO(arginfo_imagefilledpolygon, 0)
ZEND_ARG_INFO(0, im) ZEND_ARG_INFO(0, im)
ZEND_ARG_INFO(0, points) /* ARRAY_INFO(0, points, 0) */ 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(imageline, arginfo_imageline)
PHP_FE(imageloadfont, arginfo_imageloadfont) PHP_FE(imageloadfont, arginfo_imageloadfont)
PHP_FE(imagepolygon, arginfo_imagepolygon) PHP_FE(imagepolygon, arginfo_imagepolygon)
PHP_FE(imageopenpolygon, arginfo_imageopenpolygon)
PHP_FE(imagerectangle, arginfo_imagerectangle) PHP_FE(imagerectangle, arginfo_imagerectangle)
PHP_FE(imagesetpixel, arginfo_imagesetpixel) PHP_FE(imagesetpixel, arginfo_imagesetpixel)
PHP_FE(imagestring, arginfo_imagestring) PHP_FE(imagestring, arginfo_imagestring)
@ -3346,6 +3354,7 @@ PHP_FUNCTION(imageinterlace)
/* }}} */ /* }}} */
/* {{{ php_imagepolygon /* {{{ php_imagepolygon
arg = -1 open polygon
arg = 0 normal polygon arg = 0 normal polygon
arg = 1 filled polygon */ arg = 1 filled polygon */
/* im, points, num_points, col */ /* im, points, num_points, col */
@ -3398,10 +3407,16 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled)
gdImageSetAntiAliased(im, col); gdImageSetAntiAliased(im, col);
col = gdAntiAliased; col = gdAntiAliased;
} }
if (filled) { switch (filled) {
gdImageFilledPolygon(im, points, npoints, col); case -1:
} else { gdImageOpenPolygon(im, points, npoints, col);
gdImagePolygon(im, points, npoints, col); break;
case 0:
gdImagePolygon(im, points, npoints, col);
break;
case 1:
gdImageFilledPolygon(im, points, npoints, col);
break;
} }
efree(points); 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) /* {{{ proto bool imagefilledpolygon(resource im, array point, int num_points, int col)
Draw a filled polygon */ Draw a filled polygon */
PHP_FUNCTION(imagefilledpolygon) PHP_FUNCTION(imagefilledpolygon)

View file

@ -2605,6 +2605,17 @@ void gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, i
} }
void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c) 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 i;
int lx, ly; int lx, ly;
@ -2615,7 +2626,6 @@ void gdImagePolygon (gdImagePtr im, gdPointPtr p, int n, int c)
lx = p->x; lx = p->x;
ly = p->y; ly = p->y;
gdImageLine(im, lx, ly, p[n - 1].x, p[n - 1].y, c);
for (i = 1; i < n; i++) { for (i = 1; i < n; i++) {
p++; p++;
gdImageLine(im, lx, ly, p->x, p->y, c); gdImageLine(im, lx, ly, p->x, p->y, c);

View file

@ -493,6 +493,7 @@ typedef struct {
} gdPoint, *gdPointPtr; } gdPoint, *gdPointPtr;
void gdImagePolygon(gdImagePtr im, gdPointPtr p, int n, int c); 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); void gdImageFilledPolygon(gdImagePtr im, gdPointPtr p, int n, int c);
/* These functions still work with truecolor images, /* These functions still work with truecolor images,

View file

@ -174,6 +174,7 @@ PHP_FUNCTION(imageinterlace);
PHP_FUNCTION(imageline); PHP_FUNCTION(imageline);
PHP_FUNCTION(imageloadfont); PHP_FUNCTION(imageloadfont);
PHP_FUNCTION(imagepolygon); PHP_FUNCTION(imagepolygon);
PHP_FUNCTION(imageopenpolygon);
PHP_FUNCTION(imagerectangle); PHP_FUNCTION(imagerectangle);
PHP_FUNCTION(imagesetpixel); PHP_FUNCTION(imagesetpixel);
PHP_FUNCTION(imagestring); PHP_FUNCTION(imagestring);

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -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===