1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-22 14:52:41 +01:00

Fix PHP 8.1 "implicit conversion from float to int" exception on certain avatar colors which blocks rendering user pages

Summary:
Since PHP 8.1, conversion from float to integer should be explicit.

https://wiki.php.net/rfc/implicit-float-int-deprecate

According to `phlog`, the alpha channel value of the automatically created user
avatar image for a new user account sometimes is a float.

Thus always `round()` the alpha channel value to be an integer.

Closes T15375

Test Plan: Applied this change, created five user accounts via http://phorge.localhost/people/new/standard/ , and each resulting alpha value in `PhabricatorFilesComposeAvatarBuiltinFile.php` was an integer according to `phlog` (see corresponding Maniphest task). Rendering of each new user page always succeeded.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15375

Differential Revision: https://we.phorge.it/D25209
This commit is contained in:
Andre Klapper 2023-05-12 11:57:31 +02:00
parent 4d97195397
commit c2856b479f

View file

@ -183,12 +183,21 @@ final class PhabricatorFilesComposeAvatarBuiltinFile
'image/png'); 'image/png');
} }
/**
* Convert a color from RGBA to a value usable in PHP-GD.
* Each RGB color should be expressed as an integer from 0 to 255.
* The Alpha Channel should be expressed as a float from 0 to 1.
* @param array $rgba array( int Red, int Green, int Blue, float Alpha )
* @return int
*/
private static function rgba2gd($rgba) { private static function rgba2gd($rgba) {
// When working with a truecolor image, we can use bitwise operations
// https://www.php.net/manual/en/function.imagecolorallocate.php#49168
$r = $rgba[0]; $r = $rgba[0];
$g = $rgba[1]; $g = $rgba[1];
$b = $rgba[2]; $b = $rgba[2];
$a = $rgba[3]; $a = $rgba[3];
$a = (1 - $a) * 255; $a = round(((1 - $a) * 255), 0);
return ($a << 24) | ($r << 16) | ($g << 8) | $b; return ($a << 24) | ($r << 16) | ($g << 8) | $b;
} }