- GD:
. Fixed bug #77195 (Incorrect error handling of imagecreatefromjpeg()). (cmb)
+ . Fixed bug #77198 (auto cropping has insufficient precision). (cmb)
- Sockets:
. Fixed bug #77136 (Unsupported IPV6_RECVPKTINFO constants on macOS).
}
}
- /* Nothing to do > bye
- * Duplicate the image?
- */
- if (y == height - 1) {
+ /* Whole image would be cropped > bye */
+ if (match) {
return NULL;
}
- crop.y = y -1;
+ crop.y = y - 1;
+
match = 1;
for (y = height - 1; match && y >= 0; y--) {
for (x = 0; match && x < width; x++) {
match = (color == gdImageGetPixel(im, x,y));
}
}
-
- if (y == 0) {
- crop.height = height - crop.y + 1;
- } else {
- crop.height = y - crop.y + 2;
- }
+ crop.height = y - crop.y + 2;
match = 1;
for (x = 0; match && x < width; x++) {
- for (y = 0; match && y < crop.y + crop.height - 1; y++) {
+ for (y = 0; match && y < crop.y + crop.height; y++) {
match = (color == gdImageGetPixel(im, x,y));
}
}
match = 1;
for (x = width - 1; match && x >= 0; x--) {
- for (y = 0; match && y < crop.y + crop.height - 1; y++) {
+ for (y = 0; match && y < crop.y + crop.height; y++) {
match = (color == gdImageGetPixel(im, x,y));
}
}
crop.width = x - crop.x + 2;
- if (crop.x <= 0 || crop.y <= 0 || crop.width <= 0 || crop.height <= 0) {
+
+ if (crop.x < 0 || crop.y < 0 || crop.width <= 0 || crop.height <= 0) {
return NULL;
}
return gdImageCrop(im, &crop);
}
}
- /* Pierre
- * Nothing to do > bye
- * Duplicate the image?
- */
- if (y == height - 1) {
+ /* Whole image would be cropped > bye */
+ if (match) {
return NULL;
}
- crop.y = y -1;
+ crop.y = y - 1;
+
match = 1;
for (y = height - 1; match && y >= 0; y--) {
for (x = 0; match && x < width; x++) {
match = (gdColorMatch(im, color, gdImageGetPixel(im, x, y), threshold)) > 0;
}
}
-
- if (y == 0) {
- crop.height = height - crop.y + 1;
- } else {
- crop.height = y - crop.y + 2;
- }
+ crop.height = y - crop.y + 2;
match = 1;
for (x = 0; match && x < width; x++) {
- for (y = 0; match && y < crop.y + crop.height - 1; y++) {
+ for (y = 0; match && y < crop.y + crop.height; y++) {
match = (gdColorMatch(im, color, gdImageGetPixel(im, x,y), threshold)) > 0;
}
}
match = 1;
for (x = width - 1; match && x >= 0; x--) {
- for (y = 0; match && y < crop.y + crop.height - 1; y++) {
+ for (y = 0; match && y < crop.y + crop.height; y++) {
match = (gdColorMatch(im, color, gdImageGetPixel(im, x,y), threshold)) > 0;
}
}
--- /dev/null
+--TEST--
+Bug #77198 (auto cropping has insufficient precision)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+if (!GD_BUNDLED) die('upstream bugfix has not been released');
+?>
+--FILE--
+<?php
+
+function createWhiteImageWithBlackPixelAt($x, $y)
+{
+ $im = imagecreatetruecolor(8, 8);
+ imagefilledrectangle($im, 0, 0, 7, 7, 0xffffff);
+ imagesetpixel($im, $x, $y, 0x000000);
+ return $im;
+}
+
+for ($y = 0; $y < 8; $y++) {
+ for ($x = 0; $x < 8; $x++) {
+ if (($x == 0 && ($y == 0 || $y == 7)) || ($x == 7 && ($y == 0 || $y == 7))) {
+ continue; // skip the corners
+ }
+ $orig = createWhiteImageWithBlackPixelAt($x, $y);
+ $cropped = imagecropauto($orig, IMG_CROP_SIDES);
+ if (!$cropped) {
+ printf("Pixel at %d, %d: unexpected NULL crop\n", $x, $y);
+ } else {
+ $width = imagesx($cropped);
+ if ($width !== 1) {
+ printf("Pixel at %d, %d: unexpected width (%d)\n", $x, $y, $width);
+ }
+ $height = imagesy($cropped);
+ if ($height !== 1) {
+ printf("Pixel at %d, %d: unexpected height (%d)\n", $x, $y, $height);
+ }
+ $color = imagecolorat($cropped, 0, 0);
+ if ($color !== 0x000000) {
+ printf("Pixel at %d, %d: unexpected color (%d)\n", $x, $y, $color);
+ }
+ imagedestroy($cropped);
+ }
+ imagedestroy($orig);
+ }
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===
--- /dev/null
+--TEST--
+Bug #77198 (threshold cropping has insufficient precision)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+if (!GD_BUNDLED) die('upstream bugfix has not been released');
+?>
+--FILE--
+<?php
+
+function createWhiteImageWithBlackPixelAt($x, $y)
+{
+ $im = imagecreatetruecolor(8, 8);
+ imagefilledrectangle($im, 0, 0, 7, 7, 0xffffff);
+ imagesetpixel($im, $x, $y, 0x000000);
+ return $im;
+}
+
+for ($y = 0; $y < 8; $y++) {
+ for ($x = 0; $x < 8; $x++) {
+ $orig = createWhiteImageWithBlackPixelAt($x, $y);
+ $cropped = imagecropauto($orig, IMG_CROP_THRESHOLD, 1, 0xffffff);
+ if (!$cropped) {
+ printf("Pixel at %d, %d: unexpected NULL crop\n", $x, $y);
+ } else {
+ $width = imagesx($cropped);
+ if ($width !== 1) {
+ printf("Pixel at %d, %d: unexpected width (%d)\n", $x, $y, $width);
+ }
+ $height = imagesy($cropped);
+ if ($height !== 1) {
+ printf("Pixel at %d, %d: unexpected height (%d)\n", $x, $y, $height);
+ }
+ $color = imagecolorat($cropped, 0, 0);
+ if ($color !== 0x000000) {
+ printf("Pixel at %d, %d: unexpected color (%d)\n", $x, $y, $color);
+ }
+ imagedestroy($cropped);
+ }
+ imagedestroy($orig);
+ }
+}
+
+?>
+===DONE===
+--EXPECT--
+===DONE===