- added more type-hints
- added missing documentation
This commit is contained in:
Roland Häder 2022-06-21 23:34:14 +02:00
parent fa973d3b0f
commit 84bfc37bf1
Signed by: roland
GPG key ID: C82EDE5DDFA0BA77
5 changed files with 453 additions and 431 deletions

View file

@ -34,7 +34,7 @@ abstract class HTTPException extends Exception
protected $httpdesc = ''; protected $httpdesc = '';
protected $explanation = ''; protected $explanation = '';
public function __construct($message = '', Exception $previous = null) public function __construct(string $message = '', Exception $previous = null)
{ {
parent::__construct($message, $this->code, $previous); parent::__construct($message, $this->code, $previous);
} }

File diff suppressed because it is too large Load diff

View file

@ -47,12 +47,13 @@ class Image
/** /**
* Constructor * Constructor
* @param string $data *
* @param boolean $type optional, default null * @param string $data Image data
* @param string $type optional, default null
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public function __construct($data, $type = null) public function __construct(string $data, string $type = null)
{ {
$this->imagick = class_exists('Imagick'); $this->imagick = class_exists('Imagick');
$this->types = Images::supportedTypes(); $this->types = Images::supportedTypes();
@ -62,12 +63,12 @@ class Image
$this->type = $type; $this->type = $type;
if ($this->isImagick() && $this->loadData($data)) { if ($this->isImagick() && $this->loadData($data)) {
return true; return;
} else { } else {
// Failed to load with Imagick, fallback // Failed to load with Imagick, fallback
$this->imagick = false; $this->imagick = false;
} }
return $this->loadData($data); $this->loadData($data);
} }
/** /**
@ -98,12 +99,14 @@ class Image
} }
/** /**
* @param string $data data * Loads image data into handler class
* @return boolean *
* @param string $data Image data
* @return boolean Success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private function loadData($data) private function loadData(string $data): bool
{ {
if ($this->isImagick()) { if ($this->isImagick()) {
$this->image = new Imagick(); $this->image = new Imagick();
@ -132,7 +135,7 @@ class Image
* setup the compression here, so we'll do it only once * setup the compression here, so we'll do it only once
*/ */
switch ($this->getType()) { switch ($this->getType()) {
case "image/png": case 'image/png':
$quality = DI::config()->get('system', 'png_quality'); $quality = DI::config()->get('system', 'png_quality');
/* /*
* From http://www.imagemagick.org/script/command-line-options.php#quality: * From http://www.imagemagick.org/script/command-line-options.php#quality:
@ -145,7 +148,9 @@ class Image
$quality = $quality * 10; $quality = $quality * 10;
$this->image->setCompressionQuality($quality); $this->image->setCompressionQuality($quality);
break; break;
case "image/jpeg":
case 'image/jpg':
case 'image/jpeg':
$quality = DI::config()->get('system', 'jpeg_quality'); $quality = DI::config()->get('system', 'jpeg_quality');
$this->image->setCompressionQuality($quality); $this->image->setCompressionQuality($quality);
} }
@ -185,7 +190,7 @@ class Image
/** /**
* @return boolean * @return boolean
*/ */
public function isValid() public function isValid(): bool
{ {
if ($this->isImagick()) { if ($this->isImagick()) {
return ($this->image !== false); return ($this->image !== false);
@ -269,10 +274,12 @@ class Image
} }
/** /**
* Scales image down
*
* @param integer $max max dimension * @param integer $max max dimension
* @return mixed * @return mixed
*/ */
public function scaleDown($max) public function scaleDown(int $max)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -327,10 +334,12 @@ class Image
} }
/** /**
* Rotates image
*
* @param integer $degrees degrees to rotate image * @param integer $degrees degrees to rotate image
* @return mixed * @return mixed
*/ */
public function rotate($degrees) public function rotate(int $degrees)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -351,11 +360,13 @@ class Image
} }
/** /**
* Flips image
*
* @param boolean $horiz optional, default true * @param boolean $horiz optional, default true
* @param boolean $vert optional, default false * @param boolean $vert optional, default false
* @return mixed * @return mixed
*/ */
public function flip($horiz = true, $vert = false) public function flip(bool $horiz = true, bool $vert = false)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -391,10 +402,12 @@ class Image
} }
/** /**
* @param string $filename filename * Fixes orientation and maybe returns EXIF data (?)
*
* @param string $filename Filename
* @return mixed * @return mixed
*/ */
public function orient($filename) public function orient(string $filename)
{ {
if ($this->isImagick()) { if ($this->isImagick()) {
// based off comment on http://php.net/manual/en/imagick.getimageorientation.php // based off comment on http://php.net/manual/en/imagick.getimageorientation.php
@ -470,10 +483,12 @@ class Image
} }
/** /**
* @param integer $min minimum dimension * Rescales image to minimum size
*
* @param integer $min Minimum dimension
* @return mixed * @return mixed
*/ */
public function scaleUp($min) public function scaleUp(int $min)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -513,10 +528,12 @@ class Image
} }
/** /**
* @param integer $dim dimension * Scales image to square
*
* @param integer $dim Dimension
* @return mixed * @return mixed
*/ */
public function scaleToSquare($dim) public function scaleToSquare(int $dim)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -528,11 +545,11 @@ class Image
/** /**
* Scale image to target dimensions * Scale image to target dimensions
* *
* @param int $dest_width * @param int $dest_width Destination width
* @param int $dest_height * @param int $dest_height Destination height
* @return boolean * @return boolean Success
*/ */
private function scale($dest_width, $dest_height) private function scale(int $dest_width, int $dest_height): bool
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -584,6 +601,8 @@ class Image
/** /**
* Convert a GIF to a PNG to make it static * Convert a GIF to a PNG to make it static
*
* @return void
*/ */
public function toStatic() public function toStatic()
{ {
@ -598,6 +617,8 @@ class Image
} }
/** /**
* Crops image
*
* @param integer $max maximum * @param integer $max maximum
* @param integer $x x coordinate * @param integer $x x coordinate
* @param integer $y y coordinate * @param integer $y y coordinate
@ -605,7 +626,7 @@ class Image
* @param integer $h height * @param integer $h height
* @return mixed * @return mixed
*/ */
public function crop($max, $x, $y, $w, $h) public function crop(int $max, int $x, int $y, int $w, int $h)
{ {
if (!$this->isValid()) { if (!$this->isValid()) {
return false; return false;
@ -638,6 +659,9 @@ class Image
$this->image = $dest; $this->image = $dest;
$this->width = imagesx($this->image); $this->width = imagesx($this->image);
$this->height = imagesy($this->image); $this->height = imagesy($this->image);
// All successful
return true;
} }
/** /**
@ -650,11 +674,14 @@ class Image
* @return string * @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public function __toString() { public function __toString(): string
return $this->asString(); {
return (string) $this->asString();
} }
/** /**
* Returns image as string or false on failure
*
* @return mixed * @return mixed
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
@ -681,13 +708,16 @@ class Image
imageinterlace($this->image, true); imageinterlace($this->image, true);
switch ($this->getType()) { switch ($this->getType()) {
case "image/png": case 'image/png':
$quality = DI::config()->get('system', 'png_quality'); $quality = DI::config()->get('system', 'png_quality');
imagepng($this->image, null, $quality); imagepng($this->image, null, $quality);
break; break;
case "image/jpeg":
case 'image/jpeg':
case 'image/jpg':
$quality = DI::config()->get('system', 'jpeg_quality'); $quality = DI::config()->get('system', 'jpeg_quality');
imagejpeg($this->image, null, $quality); imagejpeg($this->image, null, $quality);
break;
} }
$string = ob_get_contents(); $string = ob_get_contents();
ob_end_clean(); ob_end_clean();

View file

@ -34,23 +34,23 @@ class Images
/** /**
* Maps Mime types to Imagick formats * Maps Mime types to Imagick formats
* *
* @return array * @return array Format map
*/ */
public static function getFormatsMap() public static function getFormatsMap()
{ {
$m = [ return [
'image/jpeg' => 'JPG', 'image/jpeg' => 'JPG',
'image/jpg' => 'JPG',
'image/png' => 'PNG', 'image/png' => 'PNG',
'image/gif' => 'GIF' 'image/gif' => 'GIF',
]; ];
return $m;
} }
/** /**
* Return file extension for mime type * Return file extension for MIME type
* @param string $mimetype *
* @return string * @param string $mimetype MIME type
* @return string File extension for MIME type
*/ */
public static function getExtensionByMimeType(string $mimetype): string public static function getExtensionByMimeType(string $mimetype): string
{ {
@ -63,9 +63,14 @@ class Images
$imagetype = IMAGETYPE_GIF; $imagetype = IMAGETYPE_GIF;
break; break;
default: case 'image/jpeg':
case 'image/jpg':
$imagetype = IMAGETYPE_JPEG; $imagetype = IMAGETYPE_JPEG;
break; break;
default: // Unknown type must be a blob then
return 'blob';
break;
} }
return image_type_to_extension($imagetype); return image_type_to_extension($imagetype);
@ -76,11 +81,13 @@ class Images
* *
* @return array * @return array
*/ */
public static function supportedTypes() public static function supportedTypes(): array
{ {
$types = [ $types = [
'image/jpeg' => 'jpg' 'image/jpeg' => 'jpg',
'image/jpg' => 'jpg',
]; ];
if (class_exists('Imagick')) { if (class_exists('Imagick')) {
// Imagick::queryFormats won't help us a lot there... // Imagick::queryFormats won't help us a lot there...
// At least, not yet, other parts of friendica uses this array // At least, not yet, other parts of friendica uses this array
@ -102,21 +109,20 @@ class Images
* *
* @param string $image_data Image data * @param string $image_data Image data
* @param string $filename File name (for guessing the type via the extension) * @param string $filename File name (for guessing the type via the extension)
* @param string $mime default mime type * @param string $default Default MIME type
* * @return string MIME type
* @return string
* @throws \Exception * @throws \Exception
*/ */
public static function getMimeTypeByData(string $image_data, string $filename = '', string $mime = '') public static function getMimeTypeByData(string $image_data, string $filename = '', string $default = ''): string
{ {
if (substr($mime, 0, 6) == 'image/') { if (substr($default, 0, 6) == 'image/') {
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]); Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $default]);
return $mime; return $default;
} }
$image = @getimagesizefromstring($image_data); $image = @getimagesizefromstring($image_data);
if (!empty($image['mime'])) { if (!empty($image['mime'])) {
Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mime, 'mime' => $image['mime']]); Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $default, 'mime' => $image['mime']]);
return $image['mime']; return $image['mime'];
} }
@ -128,12 +134,11 @@ class Images
* *
* @param string $sourcefile Source file of the image * @param string $sourcefile Source file of the image
* @param string $filename File name (for guessing the type via the extension) * @param string $filename File name (for guessing the type via the extension)
* @param string $mime default mime type * @param string $default default MIME type
* * @return string MIME type
* @return string
* @throws \Exception * @throws \Exception
*/ */
public static function getMimeTypeBySource(string $sourcefile, string $filename = '', string $mime = '') public static function getMimeTypeBySource(string $sourcefile, string $filename = '', string $default = ''): string
{ {
if (substr($mime, 0, 6) == 'image/') { if (substr($mime, 0, 6) == 'image/') {
Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]); Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]);
@ -150,14 +155,13 @@ class Images
} }
/** /**
* Guess image mimetype from the filename * Guess image MIME type from the filename's extension
* *
* @param string $filename Image filename * @param string $filename Image filename
* * @return string Guessed MIME type by extension
* @return string
* @throws \Exception * @throws \Exception
*/ */
public static function guessTypeByExtension(string $filename) public static function guessTypeByExtension(string $filename): string
{ {
$ext = pathinfo(parse_url($filename, PHP_URL_PATH), PATHINFO_EXTENSION); $ext = pathinfo(parse_url($filename, PHP_URL_PATH), PATHINFO_EXTENSION);
$types = self::supportedTypes(); $types = self::supportedTypes();
@ -173,11 +177,13 @@ class Images
} }
/** /**
* @param string $url * Gets info array from given URL, cached data has priority
* @return array *
* @param string $url URL
* @return array Info
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function getInfoFromURLCached($url) public static function getInfoFromURLCached(string $url): array
{ {
$data = []; $data = [];
@ -199,11 +205,12 @@ class Images
} }
/** /**
* @param string $url * Gets info from URL uncached
* @return array * @param string $url URL
* @return array Info array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function getInfoFromURL($url) public static function getInfoFromURL(string $url): array
{ {
$data = []; $data = [];
@ -243,12 +250,14 @@ class Images
} }
/** /**
* @param integer $width * Returns scaling information
* @param integer $height *
* @param integer $max * @param integer $width Width
* @return array * @param integer $height Height
* @param integer $max Max width/height
* @return array Scaling dimensions
*/ */
public static function getScalingDimensions($width, $height, $max) public static function getScalingDimensions(int $width, int $height, int $max): array
{ {
if ((!$width) || (!$height)) { if ((!$width) || (!$height)) {
return ['width' => 0, 'height' => 0]; return ['width' => 0, 'height' => 0];

View file

@ -31,10 +31,9 @@ class Image
* Give all available options for the background image * Give all available options for the background image
* *
* @param array $arr Array with the present user settings * @param array $arr Array with the present user settings
*
* @return array Array with the immage options * @return array Array with the immage options
*/ */
public static function get_options($arr) public static function get_options(array $arr): array
{ {
$bg_image_options = [ $bg_image_options = [
'stretch' => ['frio_bg_image_option', DI::l10n()->t('Top Banner'), 'stretch', DI::l10n()->t('Resize image to the width of the screen and show background color below on long pages.'), ($arr['bg_image_option'] == 'stretch')], 'stretch' => ['frio_bg_image_option', DI::l10n()->t('Top Banner'), 'stretch', DI::l10n()->t('Resize image to the width of the screen and show background color below on long pages.'), ($arr['bg_image_option'] == 'stretch')],