diff --git a/src/Analyzers/AbstractAnalyzer.php b/src/Analyzers/AbstractAnalyzer.php index 74509e9b..2768547d 100644 --- a/src/Analyzers/AbstractAnalyzer.php +++ b/src/Analyzers/AbstractAnalyzer.php @@ -4,8 +4,9 @@ use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializableInterface; -abstract class AbstractAnalyzer implements AnalyzerInterface +abstract class AbstractAnalyzer implements AnalyzerInterface, SpecializableInterface { /** * {@inheritdoc} diff --git a/src/Decoders/AbstractDecoder.php b/src/Decoders/AbstractDecoder.php new file mode 100644 index 00000000..3b586d65 --- /dev/null +++ b/src/Decoders/AbstractDecoder.php @@ -0,0 +1,17 @@ +isExternal($input)) { - return $input; + if (!($object instanceof SpecializableInterface)) { + return $object; } $driver_namespace = (new ReflectionClass($this))->getNamespaceName(); - $class_path = substr(get_class($input), strlen("Intervention\\Image\\")); - $specialized = $driver_namespace . "\\" . $class_path; + $class_path = substr(get_class($object), strlen("Intervention\\Image\\")); + $classname = $driver_namespace . "\\" . $class_path; - if (! class_exists($specialized)) { + if (!class_exists($classname)) { throw new NotSupportedException( "Class '" . $class_path . "' is not supported by " . $this->id() . " driver." ); } - return new $specialized($input, $this); + return forward_static_call([ + $classname, + 'buildSpecialized' + ], $object, $this); } /** - * Determine if given object is external custom modifier, analyzer or encoder + * {@inheritdoc} * - * @param object $input - * @return bool + * @see DriverInterface::specializeMultiple() */ - private function isExternal(object $input): bool + public function specializeMultiple(array $objects): array { - if ($input instanceof AbstractModifier) { - return false; - } - - if ($input instanceof AbstractAnalyzer) { - return false; - } - - if ($input instanceof AbstractEncoder) { - return false; - } - - return true; + return array_map(function ($classname) { + return $this->specialize(new $classname()); + }, $objects); } } diff --git a/src/Drivers/AbstractTextModifier.php b/src/Drivers/AbstractTextModifier.php index 01c9af0c..f0691c7d 100644 --- a/src/Drivers/AbstractTextModifier.php +++ b/src/Drivers/AbstractTextModifier.php @@ -6,13 +6,14 @@ use Intervention\Image\Geometry\Polygon; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\FontInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Typography\TextBlock; use Intervention\Image\Typography\Line; /** * @property FontInterface $font */ -abstract class AbstractTextModifier extends DriverSpecializedModifier +abstract class AbstractTextModifier extends DriverSpecialized implements ModifierInterface { abstract protected function boxSize(string $text): Polygon; diff --git a/src/Drivers/DriverSpecialized.php b/src/Drivers/DriverSpecialized.php new file mode 100644 index 00000000..4cd173aa --- /dev/null +++ b/src/Drivers/DriverSpecialized.php @@ -0,0 +1,58 @@ +generic = $generic; + $specialized->driver = $driver; + + return $specialized; + } + + public function driver(): DriverInterface + { + return $this->driver; + } + + public function generic(): object + { + return $this->generic; + } + + /** + * Magic method to read attributes of underlying modifier + * + * @param string $name + * @return mixed + */ + public function __get(string $name): mixed + { + return $this->generic->$name; + } + + /** + * Magic method to call methods of underlying modifier + * + * @param string $name + * @param array $arguments + * @return mixed + */ + public function __call(string $name, array $arguments): mixed + { + return $this->generic->$name(...$arguments); + } +} diff --git a/src/Drivers/DriverSpecializedAnalyzer.php b/src/Drivers/DriverSpecializedAnalyzer.php deleted file mode 100644 index 9f69f7d1..00000000 --- a/src/Drivers/DriverSpecializedAnalyzer.php +++ /dev/null @@ -1,31 +0,0 @@ -driver; - } - - /** - * Magic method to read attributes of underlying analyzer - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->analyzer->$name; - } -} diff --git a/src/Drivers/DriverSpecializedEncoder.php b/src/Drivers/DriverSpecializedEncoder.php index 4c98da8b..038ccd7f 100644 --- a/src/Drivers/DriverSpecializedEncoder.php +++ b/src/Drivers/DriverSpecializedEncoder.php @@ -2,33 +2,10 @@ namespace Intervention\Image\Drivers; -use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\EncoderInterface; -abstract class DriverSpecializedEncoder implements EncoderInterface +abstract class DriverSpecializedEncoder extends DriverSpecialized implements EncoderInterface { - public function __construct( - protected EncoderInterface $encoder, - protected DriverInterface $driver - ) { - } - - public function driver(): DriverInterface - { - return $this->driver; - } - - /** - * Magic method to read attributes of underlying encoder - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->encoder->$name; - } - /** * Get return value of callback through output buffer * diff --git a/src/Drivers/DriverSpecializedModifier.php b/src/Drivers/DriverSpecializedModifier.php deleted file mode 100644 index 8f71a3b8..00000000 --- a/src/Drivers/DriverSpecializedModifier.php +++ /dev/null @@ -1,43 +0,0 @@ -driver; - } - - /** - * Magic method to read attributes of underlying modifier - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->modifier->$name; - } - - /** - * Magic method to call methods of underlying modifier - * - * @param string $name - * @param array $arguments - * @return mixed - */ - public function __call(string $name, array $arguments): mixed - { - return $this->modifier->$name(...$arguments); - } -} diff --git a/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php b/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php index c35b40aa..2ae446d2 100644 --- a/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php +++ b/src/Drivers/Gd/Analyzers/ColorspaceAnalyzer.php @@ -3,10 +3,11 @@ namespace Intervention\Image\Drivers\Gd\Analyzers; use Intervention\Image\Colors\Rgb\Colorspace; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class ColorspaceAnalyzer extends DriverSpecializedAnalyzer +class ColorspaceAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Gd/Analyzers/HeightAnalyzer.php b/src/Drivers/Gd/Analyzers/HeightAnalyzer.php index f29cdc70..6eccce5e 100644 --- a/src/Drivers/Gd/Analyzers/HeightAnalyzer.php +++ b/src/Drivers/Gd/Analyzers/HeightAnalyzer.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class HeightAnalyzer extends DriverSpecializedAnalyzer +class HeightAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php b/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php index a6cb2ab3..cebd0beb 100644 --- a/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php +++ b/src/Drivers/Gd/Analyzers/PixelColorAnalyzer.php @@ -3,8 +3,9 @@ namespace Intervention\Image\Drivers\Gd\Analyzers; use GdImage; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\GeometryException; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ImageInterface; @@ -14,7 +15,7 @@ * @property int $y * @property int $frame_key */ -class PixelColorAnalyzer extends DriverSpecializedAnalyzer +class PixelColorAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php b/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php index 04a07f92..39efde0d 100644 --- a/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php +++ b/src/Drivers/Gd/Analyzers/ResolutionAnalyzer.php @@ -2,11 +2,12 @@ namespace Intervention\Image\Drivers\Gd\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Resolution; -class ResolutionAnalyzer extends DriverSpecializedAnalyzer +class ResolutionAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Gd/Analyzers/WidthAnalyzer.php b/src/Drivers/Gd/Analyzers/WidthAnalyzer.php index 242dec6d..fbe4522b 100644 --- a/src/Drivers/Gd/Analyzers/WidthAnalyzer.php +++ b/src/Drivers/Gd/Analyzers/WidthAnalyzer.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class WidthAnalyzer extends DriverSpecializedAnalyzer +class WidthAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Gd/Driver.php b/src/Drivers/Gd/Driver.php index e8efe59c..9268887d 100644 --- a/src/Drivers/Gd/Driver.php +++ b/src/Drivers/Gd/Driver.php @@ -103,9 +103,9 @@ public function __invoke(): ImageInterface * * @see DriverInterface::handleInput() */ - public function handleInput(mixed $input): ImageInterface|ColorInterface + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface { - return (new InputHandler())->handle($input); + return (new InputHandler($this->specializeMultiple($decoders)))->handle($input); } /** diff --git a/src/Drivers/Gd/Modifiers/BlurModifier.php b/src/Drivers/Gd/Modifiers/BlurModifier.php index 1c24ee01..557583ad 100644 --- a/src/Drivers/Gd/Modifiers/BlurModifier.php +++ b/src/Drivers/Gd/Modifiers/BlurModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $amount */ -class BlurModifier extends DriverSpecializedModifier +class BlurModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/BrightnessModifier.php b/src/Drivers/Gd/Modifiers/BrightnessModifier.php index 9e6c97e4..7ea8474e 100644 --- a/src/Drivers/Gd/Modifiers/BrightnessModifier.php +++ b/src/Drivers/Gd/Modifiers/BrightnessModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $level */ -class BrightnessModifier extends DriverSpecializedModifier +class BrightnessModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/src/Drivers/Gd/Modifiers/ColorizeModifier.php index 99424cd1..536922d1 100644 --- a/src/Drivers/Gd/Modifiers/ColorizeModifier.php +++ b/src/Drivers/Gd/Modifiers/ColorizeModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $red * @property int $green * @property int $blue */ -class ColorizeModifier extends DriverSpecializedModifier +class ColorizeModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ColorspaceModifier.php b/src/Drivers/Gd/Modifiers/ColorspaceModifier.php index 61e95ce7..790afcec 100644 --- a/src/Drivers/Gd/Modifiers/ColorspaceModifier.php +++ b/src/Drivers/Gd/Modifiers/ColorspaceModifier.php @@ -3,14 +3,15 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\NotSupportedException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method ColorspaceInterface targetColorspace() */ -class ColorspaceModifier extends DriverSpecializedModifier +class ColorspaceModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ContrastModifier.php b/src/Drivers/Gd/Modifiers/ContrastModifier.php index d6cfba69..d069f232 100644 --- a/src/Drivers/Gd/Modifiers/ContrastModifier.php +++ b/src/Drivers/Gd/Modifiers/ContrastModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $level */ -class ContrastModifier extends DriverSpecializedModifier +class ContrastModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/DrawPixelModifier.php b/src/Drivers/Gd/Modifiers/DrawPixelModifier.php index fec4cbdc..319f7ace 100644 --- a/src/Drivers/Gd/Modifiers/DrawPixelModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawPixelModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\PointInterface; /** * @property PointInterface $position * @property mixed $color */ -class DrawPixelModifier extends DriverSpecializedModifier +class DrawPixelModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/FillModifier.php b/src/Drivers/Gd/Modifiers/FillModifier.php index 4d2f14bd..59488ae9 100644 --- a/src/Drivers/Gd/Modifiers/FillModifier.php +++ b/src/Drivers/Gd/Modifiers/FillModifier.php @@ -2,17 +2,18 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Frame; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Geometry\Point; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method bool hasPosition() * @property mixed $color * @property null|Point $position */ -class FillModifier extends DriverSpecializedModifier +class FillModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/FlipModifier.php b/src/Drivers/Gd/Modifiers/FlipModifier.php index f24556ad..c0f45b28 100644 --- a/src/Drivers/Gd/Modifiers/FlipModifier.php +++ b/src/Drivers/Gd/Modifiers/FlipModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class FlipModifier extends DriverSpecializedModifier +class FlipModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/FlopModifier.php b/src/Drivers/Gd/Modifiers/FlopModifier.php index db756a27..00cb322d 100644 --- a/src/Drivers/Gd/Modifiers/FlopModifier.php +++ b/src/Drivers/Gd/Modifiers/FlopModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class FlopModifier extends DriverSpecializedModifier +class FlopModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/GammaModifier.php b/src/Drivers/Gd/Modifiers/GammaModifier.php index bab4f7f1..372d0ed2 100644 --- a/src/Drivers/Gd/Modifiers/GammaModifier.php +++ b/src/Drivers/Gd/Modifiers/GammaModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property float $gamma */ -class GammaModifier extends DriverSpecializedModifier +class GammaModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/GreyscaleModifier.php b/src/Drivers/Gd/Modifiers/GreyscaleModifier.php index be625492..b31d052d 100644 --- a/src/Drivers/Gd/Modifiers/GreyscaleModifier.php +++ b/src/Drivers/Gd/Modifiers/GreyscaleModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class GreyscaleModifier extends DriverSpecializedModifier +class GreyscaleModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/InvertModifier.php b/src/Drivers/Gd/Modifiers/InvertModifier.php index 6e3b926d..8f8a353b 100644 --- a/src/Drivers/Gd/Modifiers/InvertModifier.php +++ b/src/Drivers/Gd/Modifiers/InvertModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class InvertModifier extends DriverSpecializedModifier +class InvertModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/PixelateModifier.php b/src/Drivers/Gd/Modifiers/PixelateModifier.php index 72c45c1c..29fac83e 100644 --- a/src/Drivers/Gd/Modifiers/PixelateModifier.php +++ b/src/Drivers/Gd/Modifiers/PixelateModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $size */ -class PixelateModifier extends DriverSpecializedModifier +class PixelateModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/PlaceModifier.php b/src/Drivers/Gd/Modifiers/PlaceModifier.php index e37399a2..7376693b 100644 --- a/src/Drivers/Gd/Modifiers/PlaceModifier.php +++ b/src/Drivers/Gd/Modifiers/PlaceModifier.php @@ -2,8 +2,9 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method mixed getPosition(ImageInterface $image, ImageInterface $watermark) @@ -12,7 +13,7 @@ * @property int $offset_x * @property int $offset_y */ -class PlaceModifier extends DriverSpecializedModifier +class PlaceModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ProfileModifier.php b/src/Drivers/Gd/Modifiers/ProfileModifier.php index 251c8a6a..caa5bcd4 100644 --- a/src/Drivers/Gd/Modifiers/ProfileModifier.php +++ b/src/Drivers/Gd/Modifiers/ProfileModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\NotSupportedException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\ProfileInterface; /** * @property ProfileInterface $profile */ -class ProfileModifier extends DriverSpecializedModifier +class ProfileModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php b/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php index 1e89ebed..00da90da 100644 --- a/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php +++ b/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class ProfileRemovalModifier extends DriverSpecializedModifier +class ProfileRemovalModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php index 9238b97c..1ac85d33 100644 --- a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php @@ -2,14 +2,15 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method mixed chosenFrame(ImageInterface $image, int|string $position) * @property int|string $position */ -class RemoveAnimationModifier extends DriverSpecializedModifier +class RemoveAnimationModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ResolutionModifier.php b/src/Drivers/Gd/Modifiers/ResolutionModifier.php index 3544a9ff..e594e2be 100644 --- a/src/Drivers/Gd/Modifiers/ResolutionModifier.php +++ b/src/Drivers/Gd/Modifiers/ResolutionModifier.php @@ -2,14 +2,15 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $x * @property int $y */ -class ResolutionModifier extends DriverSpecializedModifier +class ResolutionModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/SharpenModifier.php b/src/Drivers/Gd/Modifiers/SharpenModifier.php index 05d6c955..92d74021 100644 --- a/src/Drivers/Gd/Modifiers/SharpenModifier.php +++ b/src/Drivers/Gd/Modifiers/SharpenModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $amount */ -class SharpenModifier extends DriverSpecializedModifier +class SharpenModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/SpecializedModifier.php b/src/Drivers/Gd/SpecializedModifier.php index d006ace5..e6d2f655 100644 --- a/src/Drivers/Gd/SpecializedModifier.php +++ b/src/Drivers/Gd/SpecializedModifier.php @@ -3,9 +3,10 @@ namespace Intervention\Image\Drivers\Gd; use GdImage; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\ModifierInterface; -abstract class SpecializedModifier extends DriverSpecializedModifier +abstract class SpecializedModifier extends DriverSpecialized implements ModifierInterface { protected function copyResolution(GdImage $source, GdImage $target): void { diff --git a/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php b/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php index d9bff5db..f1aef4b1 100644 --- a/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php @@ -3,12 +3,13 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; +use Intervention\Image\Interfaces\AnalyzerInterface; -class ColorspaceAnalyzer extends DriverSpecializedAnalyzer +class ColorspaceAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php b/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php index 93a90594..2eaf7362 100644 --- a/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class HeightAnalyzer extends DriverSpecializedAnalyzer +class HeightAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php b/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php index f4005ecd..b8cfb1df 100644 --- a/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php @@ -3,7 +3,8 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ImageInterface; @@ -13,7 +14,7 @@ * @property int $y * @property int $frame_key */ -class PixelColorAnalyzer extends DriverSpecializedAnalyzer +class PixelColorAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php b/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php index d763147e..6518c180 100644 --- a/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php @@ -3,11 +3,12 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; use Intervention\Image\Colors\Profile; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\ColorException; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class ProfileAnalyzer extends DriverSpecializedAnalyzer +class ProfileAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php b/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php index 8335315c..6ef5f13d 100644 --- a/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php @@ -2,11 +2,12 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Resolution; -class ResolutionAnalyzer extends DriverSpecializedAnalyzer +class ResolutionAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php b/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php index 16246298..27d3d657 100644 --- a/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecializedAnalyzer; +use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; -class WidthAnalyzer extends DriverSpecializedAnalyzer +class WidthAnalyzer extends DriverSpecialized implements AnalyzerInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Driver.php b/src/Drivers/Imagick/Driver.php index cc3cc10e..11c4c42c 100644 --- a/src/Drivers/Imagick/Driver.php +++ b/src/Drivers/Imagick/Driver.php @@ -105,9 +105,9 @@ public function __invoke(): ImageInterface * * @see DriverInterface::handleInput() */ - public function handleInput(mixed $input): ImageInterface|ColorInterface + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface { - return (new InputHandler())->handle($input); + return (new InputHandler($this->specializeMultiple($decoders)))->handle($input); } /** diff --git a/src/Drivers/Imagick/Modifiers/BlurModifier.php b/src/Drivers/Imagick/Modifiers/BlurModifier.php index 0c274ea2..155d5b2b 100644 --- a/src/Drivers/Imagick/Modifiers/BlurModifier.php +++ b/src/Drivers/Imagick/Modifiers/BlurModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $amount */ -class BlurModifier extends DriverSpecializedModifier +class BlurModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/BrightnessModifier.php b/src/Drivers/Imagick/Modifiers/BrightnessModifier.php index f82c456d..ddf20be3 100644 --- a/src/Drivers/Imagick/Modifiers/BrightnessModifier.php +++ b/src/Drivers/Imagick/Modifiers/BrightnessModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $level */ -class BrightnessModifier extends DriverSpecializedModifier +class BrightnessModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php index b8987597..acfc3576 100644 --- a/src/Drivers/Imagick/Modifiers/ColorizeModifier.php +++ b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php @@ -3,15 +3,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $red * @property int $green * @property int $blue */ -class ColorizeModifier extends DriverSpecializedModifier +class ColorizeModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php b/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php index eee6ba6f..f1b83226 100644 --- a/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php +++ b/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php @@ -3,17 +3,18 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\NotSupportedException; use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method ColorspaceInterface targetColorspace() */ -class ColorspaceModifier extends DriverSpecializedModifier +class ColorspaceModifier extends DriverSpecialized implements ModifierInterface { protected static $mapping = [ RgbColorspace::class => Imagick::COLORSPACE_SRGB, diff --git a/src/Drivers/Imagick/Modifiers/ContainModifier.php b/src/Drivers/Imagick/Modifiers/ContainModifier.php index a39eea4a..d80445ee 100644 --- a/src/Drivers/Imagick/Modifiers/ContainModifier.php +++ b/src/Drivers/Imagick/Modifiers/ContainModifier.php @@ -4,8 +4,9 @@ use ImagickDraw; use ImagickPixel; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; /** @@ -16,7 +17,7 @@ * @property mixed $background * @property string $position */ -class ContainModifier extends DriverSpecializedModifier +class ContainModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ContrastModifier.php b/src/Drivers/Imagick/Modifiers/ContrastModifier.php index d5e38d74..17a0a6e2 100644 --- a/src/Drivers/Imagick/Modifiers/ContrastModifier.php +++ b/src/Drivers/Imagick/Modifiers/ContrastModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $level */ -class ContrastModifier extends DriverSpecializedModifier +class ContrastModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/CoverModifier.php b/src/Drivers/Imagick/Modifiers/CoverModifier.php index 8e5c09f1..e484681e 100644 --- a/src/Drivers/Imagick/Modifiers/CoverModifier.php +++ b/src/Drivers/Imagick/Modifiers/CoverModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; /** * @method SizeInterface getResizeSize(ImageInterface $image) * @method SizeInterface getCropSize(ImageInterface $image) */ -class CoverModifier extends DriverSpecializedModifier +class CoverModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/CropModifier.php b/src/Drivers/Imagick/Modifiers/CropModifier.php index a4becc1b..5e87b4cd 100644 --- a/src/Drivers/Imagick/Modifiers/CropModifier.php +++ b/src/Drivers/Imagick/Modifiers/CropModifier.php @@ -2,8 +2,9 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; /** @@ -11,7 +12,7 @@ * @property int $offset_x * @property int $offset_y */ -class CropModifier extends DriverSpecializedModifier +class CropModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php b/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php index 982a0f74..f4689aef 100644 --- a/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php @@ -3,15 +3,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\PointInterface; /** * @property PointInterface $position * @property mixed $color */ -class DrawPixelModifier extends DriverSpecializedModifier +class DrawPixelModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/FillModifier.php b/src/Drivers/Imagick/Modifiers/FillModifier.php index d33d9746..8c9354ae 100644 --- a/src/Drivers/Imagick/Modifiers/FillModifier.php +++ b/src/Drivers/Imagick/Modifiers/FillModifier.php @@ -5,17 +5,18 @@ use Imagick; use ImagickDraw; use ImagickPixel; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Imagick\Frame; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Geometry\Point; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method bool hasPosition() * @property mixed $color * @property null|Point $position */ -class FillModifier extends DriverSpecializedModifier +class FillModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/FlipModifier.php b/src/Drivers/Imagick/Modifiers/FlipModifier.php index e9a6bcc9..0f8d568c 100644 --- a/src/Drivers/Imagick/Modifiers/FlipModifier.php +++ b/src/Drivers/Imagick/Modifiers/FlipModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class FlipModifier extends DriverSpecializedModifier +class FlipModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/FlopModifier.php b/src/Drivers/Imagick/Modifiers/FlopModifier.php index 33827476..0df097ec 100644 --- a/src/Drivers/Imagick/Modifiers/FlopModifier.php +++ b/src/Drivers/Imagick/Modifiers/FlopModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class FlopModifier extends DriverSpecializedModifier +class FlopModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/GammaModifier.php b/src/Drivers/Imagick/Modifiers/GammaModifier.php index 548d3007..8edef4a6 100644 --- a/src/Drivers/Imagick/Modifiers/GammaModifier.php +++ b/src/Drivers/Imagick/Modifiers/GammaModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property float $gamma */ -class GammaModifier extends DriverSpecializedModifier +class GammaModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php b/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php index d12c1e3b..db2762c8 100644 --- a/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php +++ b/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class GreyscaleModifier extends DriverSpecializedModifier +class GreyscaleModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/InvertModifier.php b/src/Drivers/Imagick/Modifiers/InvertModifier.php index 0131df91..26b476b8 100644 --- a/src/Drivers/Imagick/Modifiers/InvertModifier.php +++ b/src/Drivers/Imagick/Modifiers/InvertModifier.php @@ -2,10 +2,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class InvertModifier extends DriverSpecializedModifier +class InvertModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/PixelateModifier.php b/src/Drivers/Imagick/Modifiers/PixelateModifier.php index 4f609252..a5a8ee20 100644 --- a/src/Drivers/Imagick/Modifiers/PixelateModifier.php +++ b/src/Drivers/Imagick/Modifiers/PixelateModifier.php @@ -2,14 +2,15 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Imagick\Frame; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $size */ -class PixelateModifier extends DriverSpecializedModifier +class PixelateModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/src/Drivers/Imagick/Modifiers/PlaceModifier.php index 8b0d7ad5..6f2f164e 100644 --- a/src/Drivers/Imagick/Modifiers/PlaceModifier.php +++ b/src/Drivers/Imagick/Modifiers/PlaceModifier.php @@ -3,8 +3,9 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method mixed getPosition(ImageInterface $image, ImageInterface $watermark) @@ -13,7 +14,7 @@ * @property int $offset_x * @property int $offset_y */ -class PlaceModifier extends DriverSpecializedModifier +class PlaceModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ProfileModifier.php b/src/Drivers/Imagick/Modifiers/ProfileModifier.php index c8be88b2..33ff0524 100644 --- a/src/Drivers/Imagick/Modifiers/ProfileModifier.php +++ b/src/Drivers/Imagick/Modifiers/ProfileModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\ProfileInterface; /** * @property ProfileInterface $profile */ -class ProfileModifier extends DriverSpecializedModifier +class ProfileModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php b/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php index 6a4a79af..9e905f33 100644 --- a/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php +++ b/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php @@ -2,11 +2,12 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; -class ProfileRemovalModifier extends DriverSpecializedModifier +class ProfileRemovalModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php b/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php index 13e7963c..3d68023c 100644 --- a/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php +++ b/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\InputException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $limit * @property mixed $background */ -class QuantizeColorsModifier extends DriverSpecializedModifier +class QuantizeColorsModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php index 15147b17..b4f3e71e 100644 --- a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php @@ -3,14 +3,15 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method mixed chosenFrame(ImageInterface $image, int|string $position) * @property int|string $position */ -class RemoveAnimationModifier extends DriverSpecializedModifier +class RemoveAnimationModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php b/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php index 11e29d6b..518c8856 100644 --- a/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php @@ -3,15 +3,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; /** * @method SizeInterface cropSize(ImageInterface $image) * @property mixed $background */ -class ResizeCanvasModifier extends DriverSpecializedModifier +class ResizeCanvasModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResizeModifier.php b/src/Drivers/Imagick/Modifiers/ResizeModifier.php index d016643a..9d0895a4 100644 --- a/src/Drivers/Imagick/Modifiers/ResizeModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResizeModifier.php @@ -2,15 +2,16 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; /** * @property null|int $width * @property null|int $height */ -class ResizeModifier extends DriverSpecializedModifier +class ResizeModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResolutionModifier.php b/src/Drivers/Imagick/Modifiers/ResolutionModifier.php index fd44dec8..7b1d53cc 100644 --- a/src/Drivers/Imagick/Modifiers/ResolutionModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResolutionModifier.php @@ -2,14 +2,15 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $x * @property int $y */ -class ResolutionModifier extends DriverSpecializedModifier +class ResolutionModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/RotateModifier.php b/src/Drivers/Imagick/Modifiers/RotateModifier.php index b7f15a12..22b65e49 100644 --- a/src/Drivers/Imagick/Modifiers/RotateModifier.php +++ b/src/Drivers/Imagick/Modifiers/RotateModifier.php @@ -2,14 +2,15 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @method mixed rotationAngle() * @property mixed $background */ -class RotateModifier extends DriverSpecializedModifier +class RotateModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/SharpenModifier.php b/src/Drivers/Imagick/Modifiers/SharpenModifier.php index 25ed5a90..cc71e5f6 100644 --- a/src/Drivers/Imagick/Modifiers/SharpenModifier.php +++ b/src/Drivers/Imagick/Modifiers/SharpenModifier.php @@ -2,13 +2,14 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecializedModifier; +use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\ModifierInterface; /** * @property int $amount */ -class SharpenModifier extends DriverSpecializedModifier +class SharpenModifier extends DriverSpecialized implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Encoders/AbstractEncoder.php b/src/Encoders/AbstractEncoder.php index 418e07ac..ab73c2f5 100644 --- a/src/Encoders/AbstractEncoder.php +++ b/src/Encoders/AbstractEncoder.php @@ -2,18 +2,42 @@ namespace Intervention\Image\Encoders; -use Intervention\Image\EncodedImage; +use Intervention\Image\Interfaces\EncodedImageInterface; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; abstract class AbstractEncoder implements EncoderInterface { + public const DEFAULT_QUALITY = 75; + + /** + * Target quality of encoder + * + * @param int $quality + */ + public int $quality = self::DEFAULT_QUALITY; + + /** + * Create new encoder instance + * + * @param mixed $options + * @return void + */ + public function __construct(mixed ...$options) + { + if (is_array($options) && array_is_list($options)) { + $this->quality = $options[0] ?? self::DEFAULT_QUALITY; + } else { + $this->quality = $options['quality'] ?? self::DEFAULT_QUALITY; + } + } + /** * {@inheritdoc} * * @see EncoderInterface::encode() */ - public function encode(ImageInterface $image): EncodedImage + public function encode(ImageInterface $image): EncodedImageInterface { return $image->encode($this); } diff --git a/src/Encoders/AutoEncoder.php b/src/Encoders/AutoEncoder.php index 8ef68563..614b2e6a 100644 --- a/src/Encoders/AutoEncoder.php +++ b/src/Encoders/AutoEncoder.php @@ -7,16 +7,6 @@ class AutoEncoder extends MediaTypeEncoder { - /** - * Create new encoder instance - * - * @param int $quality - * @return void - */ - public function __construct(protected int $quality = 75) - { - } - /** * {@inheritdoc} * diff --git a/src/Encoders/AvifEncoder.php b/src/Encoders/AvifEncoder.php index dfa64854..e9e91c48 100644 --- a/src/Encoders/AvifEncoder.php +++ b/src/Encoders/AvifEncoder.php @@ -2,9 +2,8 @@ namespace Intervention\Image\Encoders; -class AvifEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class AvifEncoder extends AbstractEncoder implements SpecializableInterface { - public function __construct(public int $quality = 75) - { - } } diff --git a/src/Encoders/BmpEncoder.php b/src/Encoders/BmpEncoder.php index 4cf0c6e6..787df9af 100644 --- a/src/Encoders/BmpEncoder.php +++ b/src/Encoders/BmpEncoder.php @@ -2,6 +2,8 @@ namespace Intervention\Image\Encoders; -class BmpEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class BmpEncoder extends AbstractEncoder implements SpecializableInterface { } diff --git a/src/Encoders/FileExtensionEncoder.php b/src/Encoders/FileExtensionEncoder.php index 5637792e..0f02607a 100644 --- a/src/Encoders/FileExtensionEncoder.php +++ b/src/Encoders/FileExtensionEncoder.php @@ -13,11 +13,12 @@ class FileExtensionEncoder extends AutoEncoder * Create new encoder instance to encode to format of given file extension * * @param null|string $extension - * @param int $quality + * @param mixed $options * @return void */ - public function __construct(protected ?string $extension = null, protected int $quality = 75) + public function __construct(protected ?string $extension = null, mixed ...$options) { + parent::__construct(null, ...$options); } /** @@ -48,14 +49,14 @@ protected function encoderByFileExtension(?string $extension): EncoderInterface } return match (strtolower($extension)) { - 'webp' => new WebpEncoder($this->quality), - 'avif' => new AvifEncoder($this->quality), - 'jpeg', 'jpg' => new JpegEncoder($this->quality), + 'webp' => new WebpEncoder(quality: $this->quality), + 'avif' => new AvifEncoder(quality: $this->quality), + 'jpeg', 'jpg' => new JpegEncoder(quality: $this->quality), 'bmp' => new BmpEncoder(), 'gif' => new GifEncoder(), 'png' => new PngEncoder(), - 'tiff', 'tif' => new TiffEncoder($this->quality), - 'jp2', 'j2k', 'jpf', 'jpm', 'jpg2', 'j2c', 'jpc', 'jpx' => new Jpeg2000Encoder($this->quality), + 'tiff', 'tif' => new TiffEncoder(quality: $this->quality), + 'jp2', 'j2k', 'jpf', 'jpm', 'jpg2', 'j2c', 'jpc', 'jpx' => new Jpeg2000Encoder(quality: $this->quality), default => throw new EncoderException('No encoder found for file extension (' . $extension . ').'), }; } diff --git a/src/Encoders/FilePathEncoder.php b/src/Encoders/FilePathEncoder.php index d93892aa..572a0dd4 100644 --- a/src/Encoders/FilePathEncoder.php +++ b/src/Encoders/FilePathEncoder.php @@ -11,11 +11,15 @@ class FilePathEncoder extends FileExtensionEncoder * Create new encoder instance to encode to format of file extension in given path * * @param null|string $path - * @param int $quality + * @param mixed $options * @return void */ - public function __construct(protected ?string $path = null, protected int $quality = 75) + public function __construct(protected ?string $path = null, mixed ...$options) { + parent::__construct( + is_null($path) ? $path : pathinfo($path, PATHINFO_EXTENSION), + ...$options + ); } /** diff --git a/src/Encoders/GifEncoder.php b/src/Encoders/GifEncoder.php index 5fd836b4..0f566f3e 100644 --- a/src/Encoders/GifEncoder.php +++ b/src/Encoders/GifEncoder.php @@ -2,6 +2,8 @@ namespace Intervention\Image\Encoders; -class GifEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class GifEncoder extends AbstractEncoder implements SpecializableInterface { } diff --git a/src/Encoders/Jpeg2000Encoder.php b/src/Encoders/Jpeg2000Encoder.php index 0eb60a54..a83b61b8 100644 --- a/src/Encoders/Jpeg2000Encoder.php +++ b/src/Encoders/Jpeg2000Encoder.php @@ -2,9 +2,8 @@ namespace Intervention\Image\Encoders; -class Jpeg2000Encoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class Jpeg2000Encoder extends AbstractEncoder implements SpecializableInterface { - public function __construct(public int $quality = 75) - { - } } diff --git a/src/Encoders/JpegEncoder.php b/src/Encoders/JpegEncoder.php index 3a63de5c..93a22659 100644 --- a/src/Encoders/JpegEncoder.php +++ b/src/Encoders/JpegEncoder.php @@ -2,9 +2,8 @@ namespace Intervention\Image\Encoders; -class JpegEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class JpegEncoder extends AbstractEncoder implements SpecializableInterface { - public function __construct(public int $quality = 75) - { - } } diff --git a/src/Encoders/MediaTypeEncoder.php b/src/Encoders/MediaTypeEncoder.php index 1fb6751b..be9c6027 100644 --- a/src/Encoders/MediaTypeEncoder.php +++ b/src/Encoders/MediaTypeEncoder.php @@ -7,17 +7,11 @@ use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class MediaTypeEncoder implements EncoderInterface +class MediaTypeEncoder extends AbstractEncoder implements EncoderInterface { - /** - * Create new encoder instance to encode given media (mime) type - * - * @param null|string $type - * @param int $quality - * @return void - */ - public function __construct(protected ?string $type = null, protected int $quality = 75) + public function __construct(protected ?string $type = null, ...$options) { + parent::__construct(...$options); } /** @@ -44,14 +38,14 @@ public function encode(ImageInterface $image): EncodedImageInterface protected function encoderByMediaType(string $type): EncoderInterface { return match (strtolower($type)) { - 'image/webp' => new WebpEncoder($this->quality), - 'image/avif' => new AvifEncoder($this->quality), - 'image/jpeg' => new JpegEncoder($this->quality), + 'image/webp' => new WebpEncoder(quality: $this->quality), + 'image/avif' => new AvifEncoder(quality: $this->quality), + 'image/jpeg' => new JpegEncoder(quality: $this->quality), 'image/bmp' => new BmpEncoder(), 'image/gif' => new GifEncoder(), 'image/png' => new PngEncoder(), - 'image/tiff' => new TiffEncoder($this->quality), - 'image/jp2', 'image/jpx', 'image/jpm' => new Jpeg2000Encoder($this->quality), + 'image/tiff' => new TiffEncoder(quality: $this->quality), + 'image/jp2', 'image/jpx', 'image/jpm' => new Jpeg2000Encoder(quality: $this->quality), default => throw new EncoderException('No encoder found for media type (' . $type . ').'), }; } diff --git a/src/Encoders/PngEncoder.php b/src/Encoders/PngEncoder.php index 1b8660d1..507488f2 100644 --- a/src/Encoders/PngEncoder.php +++ b/src/Encoders/PngEncoder.php @@ -2,6 +2,8 @@ namespace Intervention\Image\Encoders; -class PngEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class PngEncoder extends AbstractEncoder implements SpecializableInterface { } diff --git a/src/Encoders/TiffEncoder.php b/src/Encoders/TiffEncoder.php index 7bab4397..89862fd3 100644 --- a/src/Encoders/TiffEncoder.php +++ b/src/Encoders/TiffEncoder.php @@ -2,9 +2,8 @@ namespace Intervention\Image\Encoders; -class TiffEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class TiffEncoder extends AbstractEncoder implements SpecializableInterface { - public function __construct(public int $quality = 75) - { - } } diff --git a/src/Encoders/WebpEncoder.php b/src/Encoders/WebpEncoder.php index 0c63e630..a24af3dd 100644 --- a/src/Encoders/WebpEncoder.php +++ b/src/Encoders/WebpEncoder.php @@ -2,9 +2,8 @@ namespace Intervention\Image\Encoders; -class WebpEncoder extends AbstractEncoder +use Intervention\Image\Interfaces\SpecializableInterface; + +class WebpEncoder extends AbstractEncoder implements SpecializableInterface { - public function __construct(public int $quality = 75) - { - } } diff --git a/src/Image.php b/src/Image.php index 5dce3eef..1be15e9d 100644 --- a/src/Image.php +++ b/src/Image.php @@ -229,7 +229,7 @@ public function exif(?string $query = null): mixed */ public function modify(ModifierInterface $modifier): ImageInterface { - return $this->driver->resolve($modifier)->apply($this); + return $this->driver->specialize($modifier)->apply($this); } /** @@ -239,7 +239,7 @@ public function modify(ModifierInterface $modifier): ImageInterface */ public function analyze(AnalyzerInterface $analyzer): mixed { - return $this->driver->resolve($analyzer)->analyze($this); + return $this->driver->specialize($analyzer)->analyze($this); } /** @@ -247,9 +247,9 @@ public function analyze(AnalyzerInterface $analyzer): mixed * * @see ImageInterface::encode() */ - public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImage + public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedImageInterface { - return $this->driver->resolve($encoder)->encode($this); + return $this->driver->specialize($encoder)->encode($this); } /** @@ -257,7 +257,7 @@ public function encode(EncoderInterface $encoder = new AutoEncoder()): EncodedIm * * @see ImageInterface::save() */ - public function save(?string $path = null, int $quality = 75): ImageInterface + public function save(?string $path = null, ...$options): ImageInterface { $path = is_null($path) ? $this->origin()->filePath() : $path; @@ -267,10 +267,10 @@ public function save(?string $path = null, int $quality = 75): ImageInterface try { // try to determine encoding format by file extension of the path - $encoded = $this->encodeByPath($path, $quality); + $encoded = $this->encodeByPath($path, ...$options); } catch (EncoderException) { // fallback to encoding format by media type - $encoded = $this->encodeByMediaType(quality: $quality); + $encoded = $this->encodeByMediaType(null, ...$options); } $encoded->save($path); @@ -779,9 +779,9 @@ public function drawLine(callable $init): ImageInterface * * @see ImageInterface::encodeByMediaType() */ - public function encodeByMediaType(?string $type = null, int $quality = 75): EncodedImageInterface + public function encodeByMediaType(?string $type = null, ...$options): EncodedImageInterface { - return $this->encode(new MediaTypeEncoder($type, $quality)); + return $this->encode(new MediaTypeEncoder($type, ...$options)); } /** @@ -789,9 +789,9 @@ public function encodeByMediaType(?string $type = null, int $quality = 75): Enco * * @see ImageInterface::encodeByExtension() */ - public function encodeByExtension(?string $extension = null, int $quality = 75): EncodedImageInterface + public function encodeByExtension(?string $extension = null, mixed ...$options): EncodedImageInterface { - return $this->encode(new FileExtensionEncoder($extension, $quality)); + return $this->encode(new FileExtensionEncoder($extension, ...$options)); } /** @@ -799,9 +799,9 @@ public function encodeByExtension(?string $extension = null, int $quality = 75): * * @see ImageInterface::encodeByPath() */ - public function encodeByPath(?string $path = null, int $quality = 75): EncodedImageInterface + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface { - return $this->encode(new FilePathEncoder($path, $quality)); + return $this->encode(new FilePathEncoder($path, ...$options)); } /** @@ -809,20 +809,20 @@ public function encodeByPath(?string $path = null, int $quality = 75): EncodedIm * * @see ImageInterface::toJpeg() */ - public function toJpeg(int $quality = 75): EncodedImageInterface + public function toJpeg(mixed ...$options): EncodedImageInterface { - return $this->encode(new JpegEncoder($quality)); + return $this->encode(new JpegEncoder(...$options)); } /** * Alias of self::toJpeg() * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toJpg(int $quality = 75): EncodedImageInterface + public function toJpg(mixed ...$options): EncodedImageInterface { - return $this->toJpeg($quality); + return $this->toJpeg(...$options); } /** @@ -830,20 +830,20 @@ public function toJpg(int $quality = 75): EncodedImageInterface * * @see ImageInterface::toJpeg() */ - public function toJpeg2000(int $quality = 75): EncodedImageInterface + public function toJpeg2000(mixed ...$options): EncodedImageInterface { - return $this->encode(new Jpeg2000Encoder($quality)); + return $this->encode(new Jpeg2000Encoder(...$options)); } /** * ALias of self::toJpeg2000() * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toJp2(int $quality = 75): EncodedImageInterface + public function toJp2(mixed ...$options): EncodedImageInterface { - return $this->toJpeg2000($quality); + return $this->toJpeg2000(...$options); } /** @@ -851,9 +851,9 @@ public function toJp2(int $quality = 75): EncodedImageInterface * * @see ImageInterface::toPng() */ - public function toPng(): EncodedImageInterface + public function toPng(mixed ...$options): EncodedImageInterface { - return $this->encode(new PngEncoder()); + return $this->encode(new PngEncoder(...$options)); } /** @@ -861,9 +861,9 @@ public function toPng(): EncodedImageInterface * * @see ImageInterface::toGif() */ - public function toGif(): EncodedImageInterface + public function toGif(mixed ...$options): EncodedImageInterface { - return $this->encode(new GifEncoder()); + return $this->encode(new GifEncoder(...$options)); } /** @@ -871,9 +871,9 @@ public function toGif(): EncodedImageInterface * * @see ImageInterface::toWebp() */ - public function toWebp(int $quality = 75): EncodedImageInterface + public function toWebp(mixed ...$options): EncodedImageInterface { - return $this->encode(new WebpEncoder($quality)); + return $this->encode(new WebpEncoder(...$options)); } /** @@ -881,9 +881,9 @@ public function toWebp(int $quality = 75): EncodedImageInterface * * @see ImageInterface::toBitmap() */ - public function toBitmap(): EncodedImageInterface + public function toBitmap(mixed ...$options): EncodedImageInterface { - return $this->encode(new BmpEncoder()); + return $this->encode(new BmpEncoder(...$options)); } /** @@ -891,9 +891,9 @@ public function toBitmap(): EncodedImageInterface * * @return EncodedImageInterface */ - public function toBmp(): EncodedImageInterface + public function toBmp(mixed ...$options): EncodedImageInterface { - return $this->toBitmap(); + return $this->toBitmap(...$options); } /** @@ -901,9 +901,9 @@ public function toBmp(): EncodedImageInterface * * @see ImageInterface::toAvif() */ - public function toAvif(int $quality = 75): EncodedImageInterface + public function toAvif(mixed ...$options): EncodedImageInterface { - return $this->encode(new AvifEncoder($quality)); + return $this->encode(new AvifEncoder(...$options)); } /** @@ -911,20 +911,20 @@ public function toAvif(int $quality = 75): EncodedImageInterface * * @see ImageInterface::toTiff() */ - public function toTiff(int $quality = 75): EncodedImageInterface + public function toTiff(mixed ...$options): EncodedImageInterface { - return $this->encode(new TiffEncoder($quality)); + return $this->encode(new TiffEncoder(...$options)); } /** * Alias of self::toTiff() * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toTif(int $quality = 75): EncodedImageInterface + public function toTif(mixed ...$options): EncodedImageInterface { - return $this->toTiff($quality); + return $this->toTiff(...$options); } /** diff --git a/src/ImageManager.php b/src/ImageManager.php index ad93e39a..d600620a 100644 --- a/src/ImageManager.php +++ b/src/ImageManager.php @@ -6,6 +6,7 @@ use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Drivers\Gd\Driver as GdDriver; use Intervention\Image\Drivers\Imagick\Driver as ImagickDriver; +use Intervention\Image\Interfaces\DecoderInterface; final class ImageManager { @@ -60,7 +61,7 @@ public function create(int $width, int $height): ImageInterface } /** - * Create new image instance from given source which can be one of the following + * Create new image instance from given input which can be one of the following * * - Path in filesystem * - File Pointer resource @@ -70,12 +71,31 @@ public function create(int $width, int $height): ImageInterface * - Data Uri * - Intervention\Image\Image Instance * + * To decode the raw input data, you can optionally specify a decoding strategy + * with the second parameter. This can be an array of class names or objects + * of decoders to be processed in sequence. In this case, the input must be + * decodedable with one of the decoders passed. It is also possible to pass + * a single object or class name of a decoder. + * + * All decoders that implement the `DecoderInterface::class` can be passed. Usually + * a selection of classes of the namespace `Intervention\Image\Decoders` + * + * If the second parameter is not set, an attempt to decode the input is made + * with all available decoders of the driver. + * * @param mixed $input + * @param string|array|DecoderInterface $decoders * @return ImageInterface */ - public function read(mixed $input): ImageInterface + public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface { - return $this->driver->handleInput($input); + return $this->driver->handleInput( + $input, + match (true) { + is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders], + default => $decoders, + } + ); } /** diff --git a/src/Interfaces/DriverInterface.php b/src/Interfaces/DriverInterface.php index 232291b6..828d5eae 100644 --- a/src/Interfaces/DriverInterface.php +++ b/src/Interfaces/DriverInterface.php @@ -14,10 +14,18 @@ public function id(): string; /** * Resolve given object into a specialized version for the current driver * - * @param object $input - * @return object + * @param object $object + * @return ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface */ - public function resolve(object $input): object; + public function specialize(object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface; + + /** + * Resolve each object in given array into a specialized version for the current driver + * + * @param array $objects + * @return array + */ + public function specializeMultiple(array $objects): array; /** * Create new image instance with the current driver in given dimensions @@ -40,9 +48,10 @@ public function createAnimation(callable $init): ImageInterface; * Handle given input by decoding it to ImageInterface or ColorInterface * * @param mixed $input + * @param array $decoders * @return ImageInterface|ColorInterface */ - public function handleInput(mixed $input): ImageInterface|ColorInterface; + public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface; /** * Return color processor for the given colorspace diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index c50144d1..e483f07d 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -63,9 +63,9 @@ public function size(): SizeInterface; * Encode image with given encoder * * @param EncoderInterface $encoder - * @return EncodedImage + * @return EncodedImageInterface */ - public function encode(EncoderInterface $encoder): EncodedImage; + public function encode(EncoderInterface $encoder): EncodedImageInterface; /** * Save the image to the specified path in the file system. If no path is @@ -74,7 +74,7 @@ public function encode(EncoderInterface $encoder): EncodedImage; * @param null|string $path * @return ImageInterface */ - public function save(?string $path = null, int $quality = 75): ImageInterface; + public function save(?string $path = null, ...$options): ImageInterface; /** * Apply given modifier to current image @@ -573,7 +573,7 @@ public function drawLine(callable $init): ImageInterface; * @param null|string $type * @return EncodedImageInterface */ - public function encodeByMediaType(?string $type = null, int $quality = 75): EncodedImageInterface; + public function encodeByMediaType(?string $type = null, ...$options): EncodedImageInterface; /** * Encode the image into the format represented by the given extension. If no @@ -583,7 +583,7 @@ public function encodeByMediaType(?string $type = null, int $quality = 75): Enco * @param null|string $extension * @return EncodedImageInterface */ - public function encodeByExtension(?string $extension = null, int $quality = 75): EncodedImageInterface; + public function encodeByExtension(?string $extension = null, mixed ...$options): EncodedImageInterface; /** * Encode the image into the format represented by the given extension of @@ -593,66 +593,70 @@ public function encodeByExtension(?string $extension = null, int $quality = 75): * @param null|string $path * @return EncodedImageInterface */ - public function encodeByPath(?string $path = null, int $quality = 75): EncodedImageInterface; + public function encodeByPath(?string $path = null, mixed ...$options): EncodedImageInterface; /** * Encode image to JPEG format * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toJpeg(int $quality = 75): EncodedImageInterface; + + public function toJpeg(mixed ...$options): EncodedImageInterface; /** * Encode image to Jpeg2000 format * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toJpeg2000(int $quality = 75): EncodedImageInterface; + public function toJpeg2000(mixed ...$options): EncodedImageInterface; /** * Encode image to Webp format * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toWebp(int $quality = 75): EncodedImageInterface; + public function toWebp(mixed ...$options): EncodedImageInterface; /** * Encode image to PNG format * + * @param mixed $options * @return EncodedImageInterface */ - public function toPng(): EncodedImageInterface; + public function toPng(mixed ...$options): EncodedImageInterface; /** * Encode image to GIF format * + * @param mixed $options * @return EncodedImageInterface */ - public function toGif(): EncodedImageInterface; + public function toGif(mixed ...$options): EncodedImageInterface; /** * Encode image to Bitmap format * + * @param mixed $options * @return EncodedImageInterface */ - public function toBitmap(): EncodedImageInterface; + public function toBitmap(mixed ...$options): EncodedImageInterface; /** * Encode image to AVIF format * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toAvif(int $quality = 75): EncodedImageInterface; + public function toAvif(mixed ...$options): EncodedImageInterface; /** * Encode image to TIFF format * - * @param int $quality + * @param mixed $options * @return EncodedImageInterface */ - public function toTiff(int $quality = 75): EncodedImageInterface; + public function toTiff(mixed ...$options): EncodedImageInterface; } diff --git a/src/Interfaces/SpecializableInterface.php b/src/Interfaces/SpecializableInterface.php new file mode 100644 index 00000000..24ba6a4b --- /dev/null +++ b/src/Interfaces/SpecializableInterface.php @@ -0,0 +1,7 @@ +makePartial(); - - $this->assertInstanceOf(DriverInterface::class, $analyzer->driver()); - } -} diff --git a/tests/Drivers/DriverSpecializedEncoderTest.php b/tests/Drivers/DriverSpecializedEncoderTest.php index cc2171d8..c2177de0 100644 --- a/tests/Drivers/DriverSpecializedEncoderTest.php +++ b/tests/Drivers/DriverSpecializedEncoderTest.php @@ -5,8 +5,6 @@ namespace Intervention\Image\Tests\Drivers; use Intervention\Image\Drivers\DriverSpecializedEncoder; -use Intervention\Image\Encoders\JpegEncoder; -use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Tests\TestCase; use Mockery; @@ -25,14 +23,4 @@ public function testGetBuffered(): void }); $this->assertEquals('result', $result); } - - public function testGetAttributes(): void - { - $encoder = Mockery::mock(DriverSpecializedEncoder::class, [ - new JpegEncoder(quality: 10), - Mockery::mock(DriverInterface::class), - ])->makePartial(); - - $this->assertEquals(10, $encoder->quality); - } } diff --git a/tests/Drivers/DriverSpecializedTest.php b/tests/Drivers/DriverSpecializedTest.php new file mode 100644 index 00000000..0d32aeb0 --- /dev/null +++ b/tests/Drivers/DriverSpecializedTest.php @@ -0,0 +1,38 @@ +assertInstanceOf(JpegEncoder::class, $specialized->generic()); + $this->assertInstanceOf(DriverInterface::class, $specialized->driver()); + $this->assertEquals(10, $specialized->quality); + } +} diff --git a/tests/ImageManagerTest.php b/tests/ImageManagerTest.php index 5094a504..4fc8a220 100644 --- a/tests/ImageManagerTest.php +++ b/tests/ImageManagerTest.php @@ -2,6 +2,7 @@ namespace Intervention\Image\Tests; +use Intervention\Image\Decoders\FilePathImageDecoder; use Intervention\Image\Drivers\Gd\Driver as GdDriver; use Intervention\Image\Drivers\Imagick\Driver as ImagickDriver; use Intervention\Image\ImageManager; @@ -55,6 +56,38 @@ public function testReadGd() $this->assertInstanceOf(ImageInterface::class, $image); } + /** @requires extension gd */ + public function testReadGdWithDecoderClassname(): void + { + $manager = new ImageManager(GdDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', FilePathImageDecoder::class); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension gd */ + public function testReadGdWithDecoderInstance(): void + { + $manager = new ImageManager(GdDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', new FilePathImageDecoder()); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension gd */ + public function testReadGdWithDecoderClassnameArray(): void + { + $manager = new ImageManager(GdDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', [FilePathImageDecoder::class]); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension gd */ + public function testReadGdWithDecoderInstanceArray(): void + { + $manager = new ImageManager(GdDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', [new FilePathImageDecoder()]); + $this->assertInstanceOf(ImageInterface::class, $image); + } + /** @requires extension imagick */ public function testCreateImagick() { @@ -70,4 +103,36 @@ public function testReadImagick() $image = $manager->read(__DIR__ . '/images/red.gif'); $this->assertInstanceOf(ImageInterface::class, $image); } + + /** @requires extension imagick */ + public function testReadImagickWithDecoderClassname(): void + { + $manager = new ImageManager(ImagickDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', FilePathImageDecoder::class); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension imagick */ + public function testReadImagickWithDecoderInstance(): void + { + $manager = new ImageManager(ImagickDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', new FilePathImageDecoder()); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension imagick */ + public function testReadImagickWithDecoderClassnameArray(): void + { + $manager = new ImageManager(ImagickDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', [FilePathImageDecoder::class]); + $this->assertInstanceOf(ImageInterface::class, $image); + } + + /** @requires extension imagick */ + public function testReadImagickWithDecoderInstanceArray(): void + { + $manager = new ImageManager(ImagickDriver::class); + $image = $manager->read(__DIR__ . '/images/red.gif', [new FilePathImageDecoder()]); + $this->assertInstanceOf(ImageInterface::class, $image); + } }