From 8b6e2f54348ccabdc02cf73faf36a3d280f6ad09 Mon Sep 17 00:00:00 2001 From: Zankaria Date: Tue, 25 Mar 2025 22:06:35 +0100 Subject: [PATCH] GdMediaHandler.php: bring in orientation detection, reducing abstraction by 1 layer --- inc/Service/Media/GdMediaHandler.php | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/inc/Service/Media/GdMediaHandler.php b/inc/Service/Media/GdMediaHandler.php index 270239a6..c76f63da 100644 --- a/inc/Service/Media/GdMediaHandler.php +++ b/inc/Service/Media/GdMediaHandler.php @@ -13,7 +13,7 @@ class GdMediaHandler implements MediaHandler { private bool $strip_redraw; - private ImageMetadataReader $image_metadata_reader; + private array $exif_readers; private static function imageCreateFrom(string $file, string $mime): mixed { @@ -74,6 +74,14 @@ class GdMediaHandler implements MediaHandler { return $gd; } + private function getOrientation(string $file_path, string $file_mime): ?int { + $exif_reader = $this->exif_readers[$file_mime] ?? null; + if ($exif_reader !== null) { + return $exif_reader->getOrientation($file_path); + } + return null; + } + private function generateThumbImpl( mixed $gd, string $source_file_path, @@ -134,10 +142,11 @@ class GdMediaHandler implements MediaHandler { /** * @param bool $strip_redraw If the EXIF metadata should be stripped by redrawing it. * May cause the loss of color profiles. Orientation is still handled in JPG and PNG. + * @param array $exif_readers A map of mime types to {@link Vichan\Data\Driver\Metadata\ExifReader} instances. */ - public function __construct(bool $strip_redraw, ImageMetadataReader $image_metadata_reader) { + public function __construct(bool $strip_redraw, array $exif_readers) { $this->strip_redraw = $strip_redraw; - $this->image_metadata_reader = $image_metadata_reader; + $this->exif_readers = $exif_readers; } public function supportsMime(string $mime): bool { @@ -151,20 +160,16 @@ class GdMediaHandler implements MediaHandler { } public function openHandle(string $file_path, string $file_mime, int $file_kind): mixed { - $metadata = $this->image_metadata_reader->getMetadata($file_path); - if ($file_mime !== $file_mime) { - throw new \RuntimeException("Mime mismatch on '$file_path'"); - } - $gd = self::imageCreateFrom($file_path, $file_mime); if ($gd === false) { throw new \RuntimeException("Could not open '$file_path'"); } // Fix the orientation once and for all. - if ($metadata->exif_orientation !== null) { - $degrees = Exif::exifOrientationDegrees($metadata->exif_orientation); - $flipped = Exif::exifOrientationIsFlipped($metadata->exif_orientation); + $exif_orientation = $this->getOrientation($file_path, $file_mime); + if ($exif_orientation !== null) { + $degrees = Exif::exifOrientationDegrees($exif_orientation); + $flipped = Exif::exifOrientationIsFlipped($exif_orientation); if ($degrees !== 0) { self::enableTransparency($gd, $file_mime);