mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-8.4'
* PHP-8.4: Fix libgd 223: gdImageRotateGeneric() does not properly interpolate
This commit is contained in:
commit
e4df0cbe1c
3 changed files with 30 additions and 16 deletions
|
@ -755,8 +755,8 @@ static int getPixelInterpolateWeight(gdImagePtr im, const double x, const double
|
||||||
*/
|
*/
|
||||||
int getPixelInterpolated(gdImagePtr im, const double x, const double y, const int bgColor)
|
int getPixelInterpolated(gdImagePtr im, const double x, const double y, const int bgColor)
|
||||||
{
|
{
|
||||||
const int xi=(int)((x) < 0 ? x - 1: x);
|
const int xi=(int)(x);
|
||||||
const int yi=(int)((y) < 0 ? y - 1: y);
|
const int yi=(int)(y);
|
||||||
int yii;
|
int yii;
|
||||||
int i;
|
int i;
|
||||||
double kernel, kernel_cache_y;
|
double kernel, kernel_cache_y;
|
||||||
|
@ -1702,13 +1702,6 @@ gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor)
|
||||||
int new_width, new_height;
|
int new_width, new_height;
|
||||||
gdRect bbox;
|
gdRect bbox;
|
||||||
|
|
||||||
const gdFixed f_slop_y = f_sin;
|
|
||||||
const gdFixed f_slop_x = f_cos;
|
|
||||||
const gdFixed f_slop = f_slop_x > 0 && f_slop_y > 0 ?
|
|
||||||
(f_slop_x > f_slop_y ? gd_divfx(f_slop_y, f_slop_x) : gd_divfx(f_slop_x, f_slop_y))
|
|
||||||
: 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (bgColor < 0) {
|
if (bgColor < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1734,15 +1727,10 @@ gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor)
|
||||||
long m = gd_fxtoi(f_m);
|
long m = gd_fxtoi(f_m);
|
||||||
long n = gd_fxtoi(f_n);
|
long n = gd_fxtoi(f_n);
|
||||||
|
|
||||||
if ((n <= 0) || (m <= 0) || (m >= src_h) || (n >= src_w)) {
|
if (m < -1 || n < -1 || m >= src_h || n >= src_w ) {
|
||||||
dst->tpixels[dst_offset_y][dst_offset_x++] = bgColor;
|
dst->tpixels[dst_offset_y][dst_offset_x++] = bgColor;
|
||||||
} else if ((n <= 1) || (m <= 1) || (m >= src_h - 1) || (n >= src_w - 1)) {
|
|
||||||
register int c = getPixelInterpolated(src, n, m, bgColor);
|
|
||||||
c = c | (( gdTrueColorGetAlpha(c) + ((int)(127* gd_fxtof(f_slop)))) << 24);
|
|
||||||
|
|
||||||
dst->tpixels[dst_offset_y][dst_offset_x++] = _color_blend(bgColor, c);
|
|
||||||
} else {
|
} else {
|
||||||
dst->tpixels[dst_offset_y][dst_offset_x++] = getPixelInterpolated(src, n, m, bgColor);
|
dst->tpixels[dst_offset_y][dst_offset_x++] = getPixelInterpolated(src, gd_fxtod(f_n), gd_fxtod(f_m), bgColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dst_offset_y++;
|
dst_offset_y++;
|
||||||
|
|
26
ext/gd/tests/gd223.phpt
Normal file
26
ext/gd/tests/gd223.phpt
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
--TEST--
|
||||||
|
libgd bug 223 (gdImageRotateGeneric() does not properly interpolate)
|
||||||
|
--EXTENSIONS--
|
||||||
|
gd
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!GD_BUNDLED) die("skip only for bundled libgd");
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
require_once __DIR__ . "/func.inc";
|
||||||
|
|
||||||
|
$im = imagecreatetruecolor(64, 64);
|
||||||
|
for ($j = 0; $j < 64; $j++) {
|
||||||
|
for ($i = 0; $i < 64; $i++) {
|
||||||
|
imagesetpixel($im, $i, $j, ($i % 2 || $j % 2) ? 0x000000 : 0xffffff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
imagesetinterpolation($im, IMG_BICUBIC);
|
||||||
|
$im = imagerotate($im, 45, 0xff0000);
|
||||||
|
|
||||||
|
test_image_equals_file(__DIR__ . "/gd223.png", $im);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
The images are equal.
|
BIN
ext/gd/tests/gd223.png
Normal file
BIN
ext/gd/tests/gd223.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
Loading…
Add table
Add a link
Reference in a new issue