mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
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:
parent
82a8e57f37
commit
2a305b38b7
6 changed files with 69 additions and 5 deletions
31
ext/gd/gd.c
31
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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
BIN
ext/gd/tests/imageopenpolygon.png
Normal file
BIN
ext/gd/tests/imageopenpolygon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
29
ext/gd/tests/imageopenpolygon_basic.phpt
Normal file
29
ext/gd/tests/imageopenpolygon_basic.phpt
Normal 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===
|
Loading…
Add table
Add a link
Reference in a new issue