Merge pull request #14075 from mexon/mat/empty-picture-scale

round scaled dimensions up to avoid zero size
This commit is contained in:
Hypolite Petovan 2024-04-13 18:30:44 -04:00 committed by GitHub
commit ed01b0f409
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 108 additions and 5 deletions

View file

@ -591,6 +591,9 @@ class Image
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
} }
if ($dest_width <= 0 || $dest_height <= 0) {
return false;
}
if ($this->isImagick()) { if ($this->isImagick()) {
/* /*

View file

@ -418,19 +418,19 @@ class Images
if ((($height * 9) / 16) > $width) { if ((($height * 9) / 16) > $width) {
$dest_width = $max; $dest_width = $max;
$dest_height = intval(($height * $max) / $width); $dest_height = intval(ceil(($height * $max) / $width));
} elseif ($width > $height) { } elseif ($width > $height) {
// else constrain both dimensions // else constrain both dimensions
$dest_width = $max; $dest_width = $max;
$dest_height = intval(($height * $max) / $width); $dest_height = intval(ceil(($height * $max) / $width));
} else { } else {
$dest_width = intval(($width * $max) / $height); $dest_width = intval(ceil(($width * $max) / $height));
$dest_height = $max; $dest_height = $max;
} }
} else { } else {
if ($width > $max) { if ($width > $max) {
$dest_width = $max; $dest_width = $max;
$dest_height = intval(($height * $max) / $width); $dest_height = intval(ceil(($height * $max) / $width));
} else { } else {
if ($height > $max) { if ($height > $max) {
// very tall image (greater than 16:9) // very tall image (greater than 16:9)
@ -440,7 +440,7 @@ class Images
$dest_width = $width; $dest_width = $width;
$dest_height = $height; $dest_height = $height;
} else { } else {
$dest_width = intval(($width * $max) / $height); $dest_width = intval(ceil(($width * $max) / $height));
$dest_height = $max; $dest_height = $max;
} }
} else { } else {

View file

@ -96,4 +96,104 @@ class ImagesTest extends MockedTest
self::assertArraySubset($assertion, Images::getInfoFromURL($url)); self::assertArraySubset($assertion, Images::getInfoFromURL($url));
} }
public function dataScalingDimensions()
{
return [
'landscape' => [
'width' => 640,
'height' => 480,
'max' => 320,
'assertion' => [
'width' => 320,
'height' => 240,
]
],
'wide_landscape' => [
'width' => 640,
'height' => 120,
'max' => 320,
'assertion' => [
'width' => 320,
'height' => 60,
]
],
'landscape_round_up' => [
'width' => 640,
'height' => 479,
'max' => 320,
'assertion' => [
'width' => 320,
'height' => 240,
]
],
'landscape_zero_height' => [
'width' => 640,
'height' => 1,
'max' => 160,
'assertion' => [
'width' => 160,
'height' => 1,
]
],
'portrait' => [
'width' => 480,
'height' => 640,
'max' => 320,
'assertion' => [
'width' => 240,
'height' => 320,
]
],
// For portrait with aspect ratio <= 16:9, constrain height
'portrait_16_9' => [
'width' => 1080,
'height' => 1920,
'max' => 320,
'assertion' => [
'width' => 180,
'height' => 320,
]
],
// For portrait with aspect ratio > 16:9, constrain width
'portrait_over_16_9_too_wide' => [
'width' => 1080,
'height' => 1921,
'max' => 320,
'assertion' => [
'width' => 320,
'height' => 570,
]
],
// For portrait with aspect ratio > 16:9, constrain width
'portrait_over_16_9_not_too_wide' => [
'width' => 1080,
'height' => 1921,
'max' => 1080,
'assertion' => [
'width' => 1080,
'height' => 1921,
]
],
'portrait_round_up' => [
'width' => 479,
'height' => 640,
'max' => 320,
'assertion' => [
'width' => 240,
'height' => 320,
]
],
];
}
/**
* Test the Images::getScalingDimensions() method
*
* @dataProvider dataScalingDimensions
*/
public function testGetScalingDimensions(int $width, int $height, int $max, array $assertion)
{
self::assertArraySubset($assertion, Images::getScalingDimensions($width, $height, $max));
}
} }