From 7f4ff15d51abdc20e93952b6191d374e8da8ff31 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sat, 23 Mar 2024 08:08:41 +0100 Subject: [PATCH] Improve Driver Specializing Process (#1315) Streamline driver specializing process of analyzers, modifers, encoders and decoders. --- src/Analyzers/ColorspaceAnalyzer.php | 2 + src/Analyzers/HeightAnalyzer.php | 2 + src/Analyzers/PixelColorAnalyzer.php | 2 + src/Analyzers/PixelColorsAnalyzer.php | 2 + src/Analyzers/ProfileAnalyzer.php | 2 + src/Analyzers/ResolutionAnalyzer.php | 2 + src/Analyzers/WidthAnalyzer.php | 2 + src/Decoders/Base64ImageDecoder.php | 2 + src/Decoders/BinaryImageDecoder.php | 2 + src/Decoders/DataUriImageDecoder.php | 2 + src/Decoders/FilePathImageDecoder.php | 2 + src/Decoders/FilePointerImageDecoder.php | 2 + src/Decoders/ImageObjectDecoder.php | 2 + src/Decoders/SplFileInfoImageDecoder.php | 2 + src/Drivers/AbstractDecoder.php | 4 +- src/Drivers/AbstractDriver.php | 42 +++++++---- src/Drivers/AbstractEncoder.php | 40 ++++++++++ src/Drivers/AbstractTextModifier.php | 34 --------- src/Drivers/DriverSpecialized.php | 75 ------------------- src/Drivers/DriverSpecializedEncoder.php | 26 ------- .../Gd/Analyzers/ColorspaceAnalyzer.php | 6 +- src/Drivers/Gd/Analyzers/HeightAnalyzer.php | 6 +- .../Gd/Analyzers/PixelColorAnalyzer.php | 11 +-- .../Gd/Analyzers/PixelColorsAnalyzer.php | 4 - .../Gd/Analyzers/ResolutionAnalyzer.php | 6 +- src/Drivers/Gd/Analyzers/WidthAnalyzer.php | 6 +- src/Drivers/Gd/Decoders/AbstractDecoder.php | 5 +- src/Drivers/Gd/Encoders/AvifEncoder.php | 10 +-- src/Drivers/Gd/Encoders/BmpEncoder.php | 7 +- src/Drivers/Gd/Encoders/GifEncoder.php | 7 +- src/Drivers/Gd/Encoders/JpegEncoder.php | 10 +-- src/Drivers/Gd/Encoders/PngEncoder.php | 7 +- src/Drivers/Gd/Encoders/WebpEncoder.php | 10 +-- .../Gd/Modifiers/AlignRotationModifier.php | 6 +- .../Modifiers/BlendTransparencyModifier.php | 9 +-- src/Drivers/Gd/Modifiers/BlurModifier.php | 9 +-- .../Gd/Modifiers/BrightnessModifier.php | 9 +-- src/Drivers/Gd/Modifiers/ColorizeModifier.php | 11 +-- .../Gd/Modifiers/ColorspaceModifier.php | 9 +-- src/Drivers/Gd/Modifiers/ContainModifier.php | 14 +--- src/Drivers/Gd/Modifiers/ContrastModifier.php | 9 +-- .../Gd/Modifiers/CoverDownModifier.php | 4 - src/Drivers/Gd/Modifiers/CoverModifier.php | 10 +-- src/Drivers/Gd/Modifiers/CropModifier.php | 12 +-- .../Gd/Modifiers/DrawEllipseModifier.php | 25 ++++--- src/Drivers/Gd/Modifiers/DrawLineModifier.php | 23 +++--- .../Gd/Modifiers/DrawPixelModifier.php | 11 +-- .../Gd/Modifiers/DrawPolygonModifier.php | 17 ++--- .../Gd/Modifiers/DrawRectangleModifier.php | 36 +++++---- src/Drivers/Gd/Modifiers/FillModifier.php | 12 +-- src/Drivers/Gd/Modifiers/FlipModifier.php | 6 +- src/Drivers/Gd/Modifiers/FlopModifier.php | 6 +- src/Drivers/Gd/Modifiers/GammaModifier.php | 9 +-- .../Gd/Modifiers/GreyscaleModifier.php | 6 +- src/Drivers/Gd/Modifiers/InvertModifier.php | 6 +- src/Drivers/Gd/Modifiers/PixelateModifier.php | 9 +-- src/Drivers/Gd/Modifiers/PlaceModifier.php | 14 +--- src/Drivers/Gd/Modifiers/ProfileModifier.php | 10 +-- .../Gd/Modifiers/ProfileRemovalModifier.php | 6 +- .../Gd/Modifiers/QuantizeColorsModifier.php | 10 +-- .../Gd/Modifiers/RemoveAnimationModifier.php | 10 +-- .../Gd/Modifiers/ResizeCanvasModifier.php | 13 +--- .../ResizeCanvasRelativeModifier.php | 8 +- src/Drivers/Gd/Modifiers/ResizeModifier.php | 10 +-- .../Gd/Modifiers/ResolutionModifier.php | 10 +-- src/Drivers/Gd/Modifiers/RotateModifier.php | 10 +-- .../Gd/Modifiers/ScaleDownModifier.php | 4 - src/Drivers/Gd/Modifiers/ScaleModifier.php | 4 - src/Drivers/Gd/Modifiers/SharpenModifier.php | 9 +-- .../Gd/Modifiers/SliceAnimationModifier.php | 10 +-- src/Drivers/Gd/Modifiers/TextModifier.php | 54 +++++-------- .../Imagick/Analyzers/ColorspaceAnalyzer.php | 6 +- .../Imagick/Analyzers/HeightAnalyzer.php | 6 +- .../Imagick/Analyzers/PixelColorAnalyzer.php | 11 +-- .../Imagick/Analyzers/PixelColorsAnalyzer.php | 4 - .../Imagick/Analyzers/ProfileAnalyzer.php | 6 +- .../Imagick/Analyzers/ResolutionAnalyzer.php | 6 +- .../Imagick/Analyzers/WidthAnalyzer.php | 6 +- .../Imagick/Decoders/Base64ImageDecoder.php | 3 +- .../Imagick/Decoders/BinaryImageDecoder.php | 3 +- .../Imagick/Decoders/ColorObjectDecoder.php | 3 +- .../Imagick/Decoders/DataUriImageDecoder.php | 3 +- .../Imagick/Decoders/FilePathImageDecoder.php | 3 +- .../Imagick/Decoders/ImageObjectDecoder.php | 5 +- .../Imagick/Decoders/ImagickImageDecoder.php | 5 +- .../Decoders/SplFileInfoImageDecoder.php | 3 +- src/Drivers/Imagick/Encoders/AvifEncoder.php | 8 +- src/Drivers/Imagick/Encoders/BmpEncoder.php | 5 +- src/Drivers/Imagick/Encoders/GifEncoder.php | 5 +- src/Drivers/Imagick/Encoders/HeicEncoder.php | 8 +- .../Imagick/Encoders/Jpeg2000Encoder.php | 8 +- src/Drivers/Imagick/Encoders/JpegEncoder.php | 8 +- src/Drivers/Imagick/Encoders/PngEncoder.php | 5 +- src/Drivers/Imagick/Encoders/TiffEncoder.php | 8 +- src/Drivers/Imagick/Encoders/WebpEncoder.php | 8 +- .../Modifiers/AlignRotationModifier.php | 6 +- .../Modifiers/BlendTransparencyModifier.php | 9 +-- .../Imagick/Modifiers/BlurModifier.php | 9 +-- .../Imagick/Modifiers/BrightnessModifier.php | 9 +-- .../Imagick/Modifiers/ColorizeModifier.php | 11 +-- .../Imagick/Modifiers/ColorspaceModifier.php | 9 +-- .../Imagick/Modifiers/ContainModifier.php | 15 +--- .../Imagick/Modifiers/ContrastModifier.php | 9 +-- .../Imagick/Modifiers/CoverDownModifier.php | 4 - .../Imagick/Modifiers/CoverModifier.php | 11 +-- .../Imagick/Modifiers/CropModifier.php | 13 +--- .../Imagick/Modifiers/DrawEllipseModifier.php | 17 +++-- .../Imagick/Modifiers/DrawLineModifier.php | 15 ++-- .../Imagick/Modifiers/DrawPixelModifier.php | 11 +-- .../Imagick/Modifiers/DrawPolygonModifier.php | 17 ++--- .../Modifiers/DrawRectangleModifier.php | 26 +++---- .../Imagick/Modifiers/FillModifier.php | 12 +-- .../Imagick/Modifiers/FlipModifier.php | 6 +- .../Imagick/Modifiers/FlopModifier.php | 6 +- .../Imagick/Modifiers/GammaModifier.php | 9 +-- .../Imagick/Modifiers/GreyscaleModifier.php | 6 +- .../Imagick/Modifiers/InvertModifier.php | 6 +- .../Imagick/Modifiers/PixelateModifier.php | 9 +-- .../Imagick/Modifiers/PlaceModifier.php | 14 +--- .../Imagick/Modifiers/ProfileModifier.php | 10 +-- .../Modifiers/ProfileRemovalModifier.php | 6 +- .../Modifiers/QuantizeColorsModifier.php | 10 +-- .../Modifiers/RemoveAnimationModifier.php | 10 +-- .../Modifiers/ResizeCanvasModifier.php | 11 +-- .../ResizeCanvasRelativeModifier.php | 8 +- .../Imagick/Modifiers/ResizeModifier.php | 10 +-- .../Imagick/Modifiers/ResolutionModifier.php | 10 +-- .../Imagick/Modifiers/RotateModifier.php | 10 +-- .../Imagick/Modifiers/ScaleDownModifier.php | 4 - .../Imagick/Modifiers/ScaleModifier.php | 4 - .../Imagick/Modifiers/SharpenModifier.php | 9 +-- .../Modifiers/SliceAnimationModifier.php | 10 +-- .../Imagick/Modifiers/TextModifier.php | 11 +-- src/Drivers/Specializable.php | 13 ++++ .../SpecializableAnalyzer.php | 5 +- .../SpecializableDecoder.php | 10 ++- src/Drivers/SpecializableEncoder.php | 13 ++++ .../SpecializableModifier.php | 5 +- src/Encoders/AvifEncoder.php | 7 +- src/Encoders/BmpEncoder.php | 7 +- src/Encoders/FileExtensionEncoder.php | 11 +-- src/Encoders/FilePathEncoder.php | 6 +- src/Encoders/GifEncoder.php | 7 +- src/Encoders/HeicEncoder.php | 7 +- src/Encoders/Jpeg2000Encoder.php | 7 +- src/Encoders/JpegEncoder.php | 7 +- src/Encoders/MediaTypeEncoder.php | 29 ++++--- src/Encoders/PngEncoder.php | 7 +- src/Encoders/SpecializableEncoder.php | 46 ------------ src/Encoders/TiffEncoder.php | 7 +- src/Encoders/WebpEncoder.php | 7 +- src/Image.php | 2 +- src/Interfaces/DriverInterface.php | 10 ++- src/Interfaces/ImageInterface.php | 2 +- src/Interfaces/SpecializableInterface.php | 22 ++++++ src/Interfaces/SpecializedInterface.php | 24 ------ .../AbstractDrawModifier.php | 26 +++---- src/Modifiers/AlignRotationModifier.php | 2 + src/Modifiers/BlendTransparencyModifier.php | 2 + src/Modifiers/BlurModifier.php | 2 + src/Modifiers/BrightnessModifier.php | 2 + src/Modifiers/ColorizeModifier.php | 2 + src/Modifiers/ColorspaceModifier.php | 1 + src/Modifiers/ContainModifier.php | 1 + src/Modifiers/ContrastModifier.php | 2 + src/Modifiers/CoverModifier.php | 1 + src/Modifiers/CropModifier.php | 1 + src/Modifiers/DrawEllipseModifier.php | 8 +- src/Modifiers/DrawLineModifier.php | 8 +- src/Modifiers/DrawPixelModifier.php | 1 + src/Modifiers/DrawPolygonModifier.php | 8 +- src/Modifiers/DrawRectangleModifier.php | 8 +- src/Modifiers/FillModifier.php | 1 + src/Modifiers/FlipModifier.php | 2 + src/Modifiers/FlopModifier.php | 2 + src/Modifiers/GammaModifier.php | 2 + src/Modifiers/GreyscaleModifier.php | 2 + src/Modifiers/InvertModifier.php | 2 + src/Modifiers/PixelateModifier.php | 2 + src/Modifiers/PlaceModifier.php | 1 + src/Modifiers/ProfileModifier.php | 1 + src/Modifiers/ProfileRemovalModifier.php | 2 + src/Modifiers/QuantizeColorsModifier.php | 2 + src/Modifiers/RemoveAnimationModifier.php | 1 + src/Modifiers/ResizeCanvasModifier.php | 27 +++++-- .../ResizeCanvasRelativeModifier.php | 15 ---- src/Modifiers/ResizeModifier.php | 2 + src/Modifiers/ResolutionModifier.php | 2 + src/Modifiers/RotateModifier.php | 2 + src/Modifiers/SharpenModifier.php | 2 + src/Modifiers/SliceAnimationModifier.php | 2 + src/Modifiers/TextModifier.php | 72 ++++++++++++++++++ src/Traits/CanBeDriverSpecialized.php | 60 +++++++++++++++ tests/BaseTestCase.php | 9 +++ tests/Unit/Drivers/AbstractDecoderTest.php | 34 +++++---- tests/Unit/Drivers/AbstractEncoderTest.php | 43 +++++++++++ .../Unit/Drivers/AbstractTextModifierTest.php | 39 ---------- .../Drivers/DriverSpecializedEncoderTest.php | 27 ------- tests/Unit/Drivers/DriverSpecializedTest.php | 39 ---------- .../Drivers/Gd/Modifiers/TextModifierTest.php | 37 +++++++++ .../Imagick/Modifiers/TextModifierTest.php | 37 +++++++++ .../SpecializableAnalyzerTest.php | 5 +- .../SpecializableDecoderTest.php | 4 +- .../SpecializableModifierTest.php | 5 +- .../Encoders/FileExtensionEncoderTest.php | 37 +++++---- .../Encoders/SpecializableEncoderTest.php | 52 ------------- tests/Unit/Modifiers/TextModifierTest.php | 38 ++++++++++ 207 files changed, 1073 insertions(+), 1185 deletions(-) create mode 100644 src/Drivers/AbstractEncoder.php delete mode 100644 src/Drivers/AbstractTextModifier.php delete mode 100644 src/Drivers/DriverSpecialized.php delete mode 100644 src/Drivers/DriverSpecializedEncoder.php create mode 100644 src/Drivers/Specializable.php rename src/{Analyzers => Drivers}/SpecializableAnalyzer.php (64%) rename src/{Decoders => Drivers}/SpecializableDecoder.php (52%) create mode 100644 src/Drivers/SpecializableEncoder.php rename src/{Modifiers => Drivers}/SpecializableModifier.php (64%) delete mode 100644 src/Encoders/SpecializableEncoder.php rename src/{Drivers => Modifiers}/AbstractDrawModifier.php (63%) create mode 100644 src/Traits/CanBeDriverSpecialized.php create mode 100644 tests/Unit/Drivers/AbstractEncoderTest.php delete mode 100644 tests/Unit/Drivers/AbstractTextModifierTest.php delete mode 100644 tests/Unit/Drivers/DriverSpecializedEncoderTest.php delete mode 100644 tests/Unit/Drivers/DriverSpecializedTest.php create mode 100644 tests/Unit/Drivers/Gd/Modifiers/TextModifierTest.php create mode 100644 tests/Unit/Drivers/Imagick/Modifiers/TextModifierTest.php rename tests/Unit/{Analyzers => Drivers}/SpecializableAnalyzerTest.php (83%) rename tests/Unit/{Decoders => Drivers}/SpecializableDecoderTest.php (80%) rename tests/Unit/{Modifiers => Drivers}/SpecializableModifierTest.php (83%) delete mode 100644 tests/Unit/Encoders/SpecializableEncoderTest.php create mode 100644 tests/Unit/Modifiers/TextModifierTest.php diff --git a/src/Analyzers/ColorspaceAnalyzer.php b/src/Analyzers/ColorspaceAnalyzer.php index 243705e6..d99222c4 100644 --- a/src/Analyzers/ColorspaceAnalyzer.php +++ b/src/Analyzers/ColorspaceAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class ColorspaceAnalyzer extends SpecializableAnalyzer { } diff --git a/src/Analyzers/HeightAnalyzer.php b/src/Analyzers/HeightAnalyzer.php index 6fe5c482..e2675a23 100644 --- a/src/Analyzers/HeightAnalyzer.php +++ b/src/Analyzers/HeightAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class HeightAnalyzer extends SpecializableAnalyzer { } diff --git a/src/Analyzers/PixelColorAnalyzer.php b/src/Analyzers/PixelColorAnalyzer.php index c422016e..2b5ffbcd 100644 --- a/src/Analyzers/PixelColorAnalyzer.php +++ b/src/Analyzers/PixelColorAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class PixelColorAnalyzer extends SpecializableAnalyzer { public function __construct( diff --git a/src/Analyzers/PixelColorsAnalyzer.php b/src/Analyzers/PixelColorsAnalyzer.php index b93754f5..749d265e 100644 --- a/src/Analyzers/PixelColorsAnalyzer.php +++ b/src/Analyzers/PixelColorsAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class PixelColorsAnalyzer extends SpecializableAnalyzer { public function __construct( diff --git a/src/Analyzers/ProfileAnalyzer.php b/src/Analyzers/ProfileAnalyzer.php index e9bdd60e..f251e525 100644 --- a/src/Analyzers/ProfileAnalyzer.php +++ b/src/Analyzers/ProfileAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class ProfileAnalyzer extends SpecializableAnalyzer { } diff --git a/src/Analyzers/ResolutionAnalyzer.php b/src/Analyzers/ResolutionAnalyzer.php index 9aa27f4a..b2801f7b 100644 --- a/src/Analyzers/ResolutionAnalyzer.php +++ b/src/Analyzers/ResolutionAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class ResolutionAnalyzer extends SpecializableAnalyzer { } diff --git a/src/Analyzers/WidthAnalyzer.php b/src/Analyzers/WidthAnalyzer.php index a1389f29..710e8a62 100644 --- a/src/Analyzers/WidthAnalyzer.php +++ b/src/Analyzers/WidthAnalyzer.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Analyzers; +use Intervention\Image\Drivers\SpecializableAnalyzer; + class WidthAnalyzer extends SpecializableAnalyzer { } diff --git a/src/Decoders/Base64ImageDecoder.php b/src/Decoders/Base64ImageDecoder.php index aa687246..f832ea02 100644 --- a/src/Decoders/Base64ImageDecoder.php +++ b/src/Decoders/Base64ImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class Base64ImageDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/BinaryImageDecoder.php b/src/Decoders/BinaryImageDecoder.php index 57e9f266..288e871d 100644 --- a/src/Decoders/BinaryImageDecoder.php +++ b/src/Decoders/BinaryImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class BinaryImageDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/DataUriImageDecoder.php b/src/Decoders/DataUriImageDecoder.php index 065850c6..ca433a32 100644 --- a/src/Decoders/DataUriImageDecoder.php +++ b/src/Decoders/DataUriImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class DataUriImageDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/FilePathImageDecoder.php b/src/Decoders/FilePathImageDecoder.php index c98a9be6..8abf3743 100644 --- a/src/Decoders/FilePathImageDecoder.php +++ b/src/Decoders/FilePathImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class FilePathImageDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/FilePointerImageDecoder.php b/src/Decoders/FilePointerImageDecoder.php index fee9d16e..b9932a8d 100644 --- a/src/Decoders/FilePointerImageDecoder.php +++ b/src/Decoders/FilePointerImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class FilePointerImageDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/ImageObjectDecoder.php b/src/Decoders/ImageObjectDecoder.php index 0b3209e9..ea01091c 100644 --- a/src/Decoders/ImageObjectDecoder.php +++ b/src/Decoders/ImageObjectDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class ImageObjectDecoder extends SpecializableDecoder { } diff --git a/src/Decoders/SplFileInfoImageDecoder.php b/src/Decoders/SplFileInfoImageDecoder.php index a0fe7045..b6b54948 100644 --- a/src/Decoders/SplFileInfoImageDecoder.php +++ b/src/Decoders/SplFileInfoImageDecoder.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Decoders; +use Intervention\Image\Drivers\SpecializableDecoder; + class SplFileInfoImageDecoder extends SpecializableDecoder { } diff --git a/src/Drivers/AbstractDecoder.php b/src/Drivers/AbstractDecoder.php index 5ada419f..aea1c1ca 100644 --- a/src/Drivers/AbstractDecoder.php +++ b/src/Drivers/AbstractDecoder.php @@ -14,7 +14,7 @@ use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Traits\CanBuildFilePointer; -abstract class AbstractDecoder extends DriverSpecialized implements DecoderInterface +abstract class AbstractDecoder implements DecoderInterface { use CanBuildFilePointer; @@ -110,7 +110,7 @@ abstract class AbstractDecoder extends DriverSpecialized implements DecoderInter try { $source = match (true) { - (strlen($path_or_data) <= PHP_MAXPATHLEN && is_file($path_or_data)) => $path_or_data, // path + $this->isFile($path_or_data) => $path_or_data, // path default => $this->buildFilePointer($path_or_data), // data }; diff --git a/src/Drivers/AbstractDriver.php b/src/Drivers/AbstractDriver.php index f2b07211..df8d8e64 100644 --- a/src/Drivers/AbstractDriver.php +++ b/src/Drivers/AbstractDriver.php @@ -13,6 +13,7 @@ use Intervention\Image\Interfaces\DriverInterface; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SpecializableInterface; +use Intervention\Image\Interfaces\SpecializedInterface; use ReflectionClass; abstract class AbstractDriver implements DriverInterface @@ -30,26 +31,35 @@ abstract class AbstractDriver implements DriverInterface * * @see DriverInterface::specialize() */ - public function specialize(object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface - { + public function specialize( + ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object + ): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface { + // return object directly if no specializing is possible if (!($object instanceof SpecializableInterface)) { return $object; } - $driver_namespace = (new ReflectionClass($this))->getNamespaceName(); - $class_path = substr($object::class, strlen("Intervention\\Image\\")); - $classname = $driver_namespace . "\\" . $class_path; + // return directly if object is already specialized + if ($object instanceof SpecializedInterface) { + return $object; + } - if (!class_exists($classname)) { + // resolve classname for specializable object + $driver_namespace = (new ReflectionClass($this))->getNamespaceName(); + $object_path = substr($object::class, strlen("Intervention\\Image\\")); + $specialized_classname = $driver_namespace . "\\" . $object_path; + + if (!class_exists($specialized_classname)) { throw new NotSupportedException( - "Class '" . $class_path . "' is not supported by " . $this->id() . " driver." + "Class '" . $object_path . "' is not supported by " . $this->id() . " driver." ); } - return forward_static_call([ - $classname, - 'buildSpecialized' - ], $object, $this); + // create driver specialized object with specializable properties of generic object + $specialized = (new $specialized_classname(...$object->specializable())); + + // attach driver + return $specialized->setDriver($this); } /** @@ -57,18 +67,18 @@ abstract class AbstractDriver implements DriverInterface * * @see DriverInterface::specializeMultiple() */ - public function specializeMultiple(array $specializables): array + public function specializeMultiple(array $objects): array { - return array_map(function ($specializable) { + return array_map(function ($object) { return $this->specialize( match (true) { - is_string($specializable) => new $specializable(), - is_object($specializable) => $specializable, + is_string($object) => new $object(), + is_object($object) => $object, default => throw new RuntimeException( 'Specializable item must be either a class name or an object.' ) } ); - }, $specializables); + }, $objects); } } diff --git a/src/Drivers/AbstractEncoder.php b/src/Drivers/AbstractEncoder.php new file mode 100644 index 00000000..7b2a9f57 --- /dev/null +++ b/src/Drivers/AbstractEncoder.php @@ -0,0 +1,40 @@ +encode($this); + } + + /** + * Get return value of callback through output buffer + * + * @param callable $callback + * @return string + */ + protected function buffered(callable $callback): string + { + ob_start(); + $callback(); + $buffer = ob_get_contents(); + ob_end_clean(); + + return $buffer; + } +} diff --git a/src/Drivers/AbstractTextModifier.php b/src/Drivers/AbstractTextModifier.php deleted file mode 100644 index f8565635..00000000 --- a/src/Drivers/AbstractTextModifier.php +++ /dev/null @@ -1,34 +0,0 @@ -strokeWidth() <= 0) { - return $offsets; - } - - for ($x = $font->strokeWidth() * -1; $x <= $font->strokeWidth(); $x++) { - for ($y = $font->strokeWidth() * -1; $y <= $font->strokeWidth(); $y++) { - $offsets[] = new Point($x, $y); - } - } - - return $offsets; - } -} diff --git a/src/Drivers/DriverSpecialized.php b/src/Drivers/DriverSpecialized.php deleted file mode 100644 index a376bfb8..00000000 --- a/src/Drivers/DriverSpecialized.php +++ /dev/null @@ -1,75 +0,0 @@ -generic = $generic; - $specialized->driver = $driver; - - return $specialized; - } - - /** - * {@inheritdoc} - * - * @see SpecializedInterface::driver() - */ - public function driver(): DriverInterface - { - return $this->driver; - } - - /** - * {@inheritdoc} - * - * @see SpecializedInterface::generic() - */ - public function generic(): object - { - return $this->generic; - } - - /** - * Magic method to read attributes of underlying generic object - * - * @param string $name - * @return mixed - */ - public function __get(string $name): mixed - { - return $this->generic->$name; - } - - /** - * Magic method to call methods of underlying generic object - * - * @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/DriverSpecializedEncoder.php b/src/Drivers/DriverSpecializedEncoder.php deleted file mode 100644 index 88be4fa1..00000000 --- a/src/Drivers/DriverSpecializedEncoder.php +++ /dev/null @@ -1,26 +0,0 @@ -core()->native(); - $data = $this->getBuffered(function () use ($gd) { + $data = $this->buffered(function () use ($gd) { imageavif($gd, null, $this->quality); }); diff --git a/src/Drivers/Gd/Encoders/BmpEncoder.php b/src/Drivers/Gd/Encoders/BmpEncoder.php index 7d918afe..811cb93e 100644 --- a/src/Drivers/Gd/Encoders/BmpEncoder.php +++ b/src/Drivers/Gd/Encoders/BmpEncoder.php @@ -4,15 +4,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\BmpEncoder as GenericBmpEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class BmpEncoder extends DriverSpecializedEncoder +class BmpEncoder extends GenericBmpEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { - $data = $this->getBuffered(function () use ($image) { + $data = $this->buffered(function () use ($image) { imagebmp($image->core()->native(), null, false); }); diff --git a/src/Drivers/Gd/Encoders/GifEncoder.php b/src/Drivers/Gd/Encoders/GifEncoder.php index f11721e8..af29e899 100644 --- a/src/Drivers/Gd/Encoders/GifEncoder.php +++ b/src/Drivers/Gd/Encoders/GifEncoder.php @@ -6,13 +6,14 @@ namespace Intervention\Image\Drivers\Gd\Encoders; use Exception; use Intervention\Gif\Builder as GifBuilder; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\GifEncoder as GenericGifEncoder; use Intervention\Image\Exceptions\EncoderException; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class GifEncoder extends DriverSpecializedEncoder +class GifEncoder extends GenericGifEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { @@ -21,7 +22,7 @@ class GifEncoder extends DriverSpecializedEncoder } $gd = $image->core()->native(); - $data = $this->getBuffered(function () use ($gd) { + $data = $this->buffered(function () use ($gd) { imagegif($gd); }); diff --git a/src/Drivers/Gd/Encoders/JpegEncoder.php b/src/Drivers/Gd/Encoders/JpegEncoder.php index d6436b83..7860862b 100644 --- a/src/Drivers/Gd/Encoders/JpegEncoder.php +++ b/src/Drivers/Gd/Encoders/JpegEncoder.php @@ -4,21 +4,19 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\Drivers\Gd\Cloner; +use Intervention\Image\Encoders\JpegEncoder as GenericJpegEncoder; use Intervention\Image\EncodedImage; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class JpegEncoder extends DriverSpecializedEncoder +class JpegEncoder extends GenericJpegEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { $output = Cloner::cloneBlended($image->core()->native(), background: $image->blendingColor()); - $data = $this->getBuffered(function () use ($output) { + $data = $this->buffered(function () use ($output) { imagejpeg($output, null, $this->quality); }); diff --git a/src/Drivers/Gd/Encoders/PngEncoder.php b/src/Drivers/Gd/Encoders/PngEncoder.php index 1d7f2c2b..8a94b63e 100644 --- a/src/Drivers/Gd/Encoders/PngEncoder.php +++ b/src/Drivers/Gd/Encoders/PngEncoder.php @@ -4,15 +4,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\PngEncoder as GenericPngEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class PngEncoder extends DriverSpecializedEncoder +class PngEncoder extends GenericPngEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { - $data = $this->getBuffered(function () use ($image) { + $data = $this->buffered(function () use ($image) { imagepng($image->core()->native(), null, -1); }); diff --git a/src/Drivers/Gd/Encoders/WebpEncoder.php b/src/Drivers/Gd/Encoders/WebpEncoder.php index 31416c36..5a838c76 100644 --- a/src/Drivers/Gd/Encoders/WebpEncoder.php +++ b/src/Drivers/Gd/Encoders/WebpEncoder.php @@ -4,19 +4,17 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\WebpEncoder as GenericWebpEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class WebpEncoder extends DriverSpecializedEncoder +class WebpEncoder extends GenericWebpEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { $quality = $this->quality === 100 ? IMG_WEBP_LOSSLESS : $this->quality; - $data = $this->getBuffered(function () use ($image, $quality) { + $data = $this->buffered(function () use ($image, $quality) { imagewebp($image->core()->native(), null, $quality); }); diff --git a/src/Drivers/Gd/Modifiers/AlignRotationModifier.php b/src/Drivers/Gd/Modifiers/AlignRotationModifier.php index 19702f60..38383b97 100644 --- a/src/Drivers/Gd/Modifiers/AlignRotationModifier.php +++ b/src/Drivers/Gd/Modifiers/AlignRotationModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\AlignRotationModifier as GenericAlignRotationModifier; -class AlignRotationModifier extends DriverSpecialized implements ModifierInterface +class AlignRotationModifier extends GenericAlignRotationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php b/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php index dee2dce3..33e3abac 100644 --- a/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php +++ b/src/Drivers/Gd/Modifiers/BlendTransparencyModifier.php @@ -4,15 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BlendTransparencyModifier as GenericBlendTransparencyModifier; -/** - * @property mixed $color - */ -class BlendTransparencyModifier extends DriverSpecialized implements ModifierInterface +class BlendTransparencyModifier extends GenericBlendTransparencyModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/BlurModifier.php b/src/Drivers/Gd/Modifiers/BlurModifier.php index a51b0404..5357c40e 100644 --- a/src/Drivers/Gd/Modifiers/BlurModifier.php +++ b/src/Drivers/Gd/Modifiers/BlurModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BlurModifier as GenericBlurModifier; -/** - * @property int $amount - */ -class BlurModifier extends DriverSpecialized implements ModifierInterface +class BlurModifier extends GenericBlurModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/BrightnessModifier.php b/src/Drivers/Gd/Modifiers/BrightnessModifier.php index 7eab2769..747d51d6 100644 --- a/src/Drivers/Gd/Modifiers/BrightnessModifier.php +++ b/src/Drivers/Gd/Modifiers/BrightnessModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BrightnessModifier as GenericBrightnessModifier; -/** - * @property int $level - */ -class BrightnessModifier extends DriverSpecialized implements ModifierInterface +class BrightnessModifier extends GenericBrightnessModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ColorizeModifier.php b/src/Drivers/Gd/Modifiers/ColorizeModifier.php index ed20e070..4458a553 100644 --- a/src/Drivers/Gd/Modifiers/ColorizeModifier.php +++ b/src/Drivers/Gd/Modifiers/ColorizeModifier.php @@ -4,16 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ColorizeModifier as GenericColorizeModifier; -/** - * @property int $red - * @property int $green - * @property int $blue - */ -class ColorizeModifier extends DriverSpecialized implements ModifierInterface +class ColorizeModifier extends GenericColorizeModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ColorspaceModifier.php b/src/Drivers/Gd/Modifiers/ColorspaceModifier.php index 3881860d..748ebc7a 100644 --- a/src/Drivers/Gd/Modifiers/ColorspaceModifier.php +++ b/src/Drivers/Gd/Modifiers/ColorspaceModifier.php @@ -5,15 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\NotSupportedException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ColorspaceModifier as GenericColorspaceModifier; -/** - * @method ColorspaceInterface targetColorspace() - */ -class ColorspaceModifier extends DriverSpecialized implements ModifierInterface +class ColorspaceModifier extends GenericColorspaceModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ContainModifier.php b/src/Drivers/Gd/Modifiers/ContainModifier.php index 053269b2..72f8e212 100644 --- a/src/Drivers/Gd/Modifiers/ContainModifier.php +++ b/src/Drivers/Gd/Modifiers/ContainModifier.php @@ -7,24 +7,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Colors\Rgb\Channels\Blue; use Intervention\Image\Colors\Rgb\Channels\Green; use Intervention\Image\Colors\Rgb\Channels\Red; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ContainModifier as GenericContainModifier; -/** - * @method SizeInterface getCropSize(ImageInterface $image) - * @method SizeInterface getResizeSize(ImageInterface $image) - * @property int $width - * @property int $height - * @property mixed $background - * @property string $position - */ -class ContainModifier extends DriverSpecialized implements ModifierInterface +class ContainModifier extends GenericContainModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ContrastModifier.php b/src/Drivers/Gd/Modifiers/ContrastModifier.php index 892964d6..8567ac35 100644 --- a/src/Drivers/Gd/Modifiers/ContrastModifier.php +++ b/src/Drivers/Gd/Modifiers/ContrastModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ContrastModifier as GenericContrastModifier; -/** - * @property int $level - */ -class ContrastModifier extends DriverSpecialized implements ModifierInterface +class ContrastModifier extends GenericContrastModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/CoverDownModifier.php b/src/Drivers/Gd/Modifiers/CoverDownModifier.php index 8fab3d4b..dc6fbd2d 100644 --- a/src/Drivers/Gd/Modifiers/CoverDownModifier.php +++ b/src/Drivers/Gd/Modifiers/CoverDownModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Exceptions\GeometryException; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class CoverDownModifier extends CoverModifier { /** diff --git a/src/Drivers/Gd/Modifiers/CoverModifier.php b/src/Drivers/Gd/Modifiers/CoverModifier.php index 7067d05f..4343d43d 100644 --- a/src/Drivers/Gd/Modifiers/CoverModifier.php +++ b/src/Drivers/Gd/Modifiers/CoverModifier.php @@ -4,19 +4,15 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\CoverModifier as GenericCoverModifier; -/** - * @method SizeInterface getCropSize(ImageInterface $image) - * @method SizeInterface getResizeSize(SizeInterface $size) - */ -class CoverModifier extends DriverSpecialized implements ModifierInterface +class CoverModifier extends GenericCoverModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/CropModifier.php b/src/Drivers/Gd/Modifiers/CropModifier.php index 63637ec8..a5696aae 100644 --- a/src/Drivers/Gd/Modifiers/CropModifier.php +++ b/src/Drivers/Gd/Modifiers/CropModifier.php @@ -4,21 +4,15 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\CropModifier as GenericCropModifier; -/** - * @method SizeInterface crop(ImageInterface $image) - * @property int $offset_x - * @property int $offset_y - * @property mixed $background - */ -class CropModifier extends DriverSpecialized implements ModifierInterface +class CropModifier extends GenericCropModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php b/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php index c988fd8f..da9bd573 100644 --- a/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawEllipseModifier.php @@ -4,15 +4,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\AbstractDrawModifier; -use Intervention\Image\Geometry\Ellipse; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawEllipseModifier as GenericDrawEllipseModifier; -/** - * @property Ellipse $drawable - */ -class DrawEllipseModifier extends AbstractDrawModifier +class DrawEllipseModifier extends GenericDrawEllipseModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { foreach ($image as $frame) { @@ -23,8 +24,8 @@ class DrawEllipseModifier extends AbstractDrawModifier if ($this->drawable->hasBackgroundColor()) { imagefilledellipse( $frame->native(), - $this->position()->x(), - $this->position()->y(), + $this->drawable()->position()->x(), + $this->drawable->position()->y(), $this->drawable->width() - 1, $this->drawable->height() - 1, $this->driver()->colorProcessor($image->colorspace())->colorToNative( @@ -42,8 +43,8 @@ class DrawEllipseModifier extends AbstractDrawModifier imagearc( $frame->native(), - $this->position()->x(), - $this->position()->y(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), $this->drawable->width(), $this->drawable->height(), 0, @@ -56,8 +57,8 @@ class DrawEllipseModifier extends AbstractDrawModifier imagealphablending($frame->native(), true); imagefilledellipse( $frame->native(), - $this->position()->x(), - $this->position()->y(), + $this->drawable()->position()->x(), + $this->drawable()->position()->y(), $this->drawable->width(), $this->drawable->height(), $this->driver()->colorProcessor($image->colorspace())->colorToNative( diff --git a/src/Drivers/Gd/Modifiers/DrawLineModifier.php b/src/Drivers/Gd/Modifiers/DrawLineModifier.php index 8f1e1b17..ccf6974f 100644 --- a/src/Drivers/Gd/Modifiers/DrawLineModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawLineModifier.php @@ -4,19 +4,22 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\AbstractDrawModifier; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Geometry\Line; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawLineModifier as GenericDrawLineModifier; -/** - * @method ColorInterface backgroundColor() - * @property Line $drawable - */ -class DrawLineModifier extends AbstractDrawModifier +class DrawLineModifier extends GenericDrawLineModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { + $color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( + $this->backgroundColor() + ); + foreach ($image as $frame) { imagealphablending($frame->native(), true); imageantialias($frame->native(), true); @@ -27,9 +30,7 @@ class DrawLineModifier extends AbstractDrawModifier $this->drawable->start()->y(), $this->drawable->end()->x(), $this->drawable->end()->y(), - $this->driver()->colorProcessor($image->colorspace())->colorToNative( - $this->backgroundColor() - ) + $color ); } diff --git a/src/Drivers/Gd/Modifiers/DrawPixelModifier.php b/src/Drivers/Gd/Modifiers/DrawPixelModifier.php index 3c1b55b1..f626ddfb 100644 --- a/src/Drivers/Gd/Modifiers/DrawPixelModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawPixelModifier.php @@ -4,16 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\PointInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawPixelModifier as GenericDrawPixelModifier; -/** - * @property PointInterface $position - * @property mixed $color - */ -class DrawPixelModifier extends DriverSpecialized implements ModifierInterface +class DrawPixelModifier extends GenericDrawPixelModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php b/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php index 02dd0acf..43628c51 100644 --- a/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawPolygonModifier.php @@ -4,19 +4,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\AbstractDrawModifier; -use Intervention\Image\Geometry\Polygon; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ColorInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawPolygonModifier as ModifiersDrawPolygonModifier; -/** - * @method Point position() - * @method ColorInterface backgroundColor() - * @method ColorInterface borderColor() - * @property Polygon $drawable - */ -class DrawPolygonModifier extends AbstractDrawModifier +class DrawPolygonModifier extends ModifiersDrawPolygonModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { foreach ($image as $frame) { diff --git a/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php b/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php index 17e19aad..df4a44d4 100644 --- a/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php +++ b/src/Drivers/Gd/Modifiers/DrawRectangleModifier.php @@ -4,32 +4,30 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\AbstractDrawModifier; -use Intervention\Image\Geometry\Rectangle; -use Intervention\Image\Interfaces\ColorInterface; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Geometry\Point; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawRectangleModifier as GenericDrawRectangleModifier; -/** - * @method Point position() - * @method ColorInterface backgroundColor() - * @method ColorInterface borderColor() - * @property Rectangle $drawable - */ -class DrawRectangleModifier extends AbstractDrawModifier +class DrawRectangleModifier extends GenericDrawRectangleModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { + $position = $this->drawable->position(); + foreach ($image as $frame) { // draw background if ($this->drawable->hasBackgroundColor()) { imagealphablending($frame->native(), true); imagefilledrectangle( $frame->native(), - $this->position()->x(), - $this->position()->y(), - $this->position()->x() + $this->drawable->width(), - $this->position()->y() + $this->drawable->height(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), $this->driver()->colorProcessor($image->colorspace())->colorToNative( $this->backgroundColor() ) @@ -42,10 +40,10 @@ class DrawRectangleModifier extends AbstractDrawModifier imagesetthickness($frame->native(), $this->drawable->borderSize()); imagerectangle( $frame->native(), - $this->position()->x(), - $this->position()->y(), - $this->position()->x() + $this->drawable->width(), - $this->position()->y() + $this->drawable->height(), + $position->x(), + $position->y(), + $position->x() + $this->drawable->width(), + $position->y() + $this->drawable->height(), $this->driver()->colorProcessor($image->colorspace())->colorToNative( $this->borderColor() ) diff --git a/src/Drivers/Gd/Modifiers/FillModifier.php b/src/Drivers/Gd/Modifiers/FillModifier.php index 5c45b280..84f7ca6d 100644 --- a/src/Drivers/Gd/Modifiers/FillModifier.php +++ b/src/Drivers/Gd/Modifiers/FillModifier.php @@ -4,19 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Frame; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Geometry\Point; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FillModifier as GenericFillModifier; -/** - * @method bool hasPosition() - * @property mixed $color - * @property null|Point $position - */ -class FillModifier extends DriverSpecialized implements ModifierInterface +class FillModifier extends GenericFillModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/FlipModifier.php b/src/Drivers/Gd/Modifiers/FlipModifier.php index ad588863..8e832cce 100644 --- a/src/Drivers/Gd/Modifiers/FlipModifier.php +++ b/src/Drivers/Gd/Modifiers/FlipModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FlipModifier as GenericFlipModifier; -class FlipModifier extends DriverSpecialized implements ModifierInterface +class FlipModifier extends GenericFlipModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/FlopModifier.php b/src/Drivers/Gd/Modifiers/FlopModifier.php index 55fcc95b..238bc264 100644 --- a/src/Drivers/Gd/Modifiers/FlopModifier.php +++ b/src/Drivers/Gd/Modifiers/FlopModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FlopModifier as GenericFlopModifier; -class FlopModifier extends DriverSpecialized implements ModifierInterface +class FlopModifier extends GenericFlopModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/GammaModifier.php b/src/Drivers/Gd/Modifiers/GammaModifier.php index ef369d6f..0815a7ba 100644 --- a/src/Drivers/Gd/Modifiers/GammaModifier.php +++ b/src/Drivers/Gd/Modifiers/GammaModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\GammaModifier as GenericGammaModifier; -/** - * @property float $gamma - */ -class GammaModifier extends DriverSpecialized implements ModifierInterface +class GammaModifier extends GenericGammaModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/GreyscaleModifier.php b/src/Drivers/Gd/Modifiers/GreyscaleModifier.php index 62babe2b..2eb04c23 100644 --- a/src/Drivers/Gd/Modifiers/GreyscaleModifier.php +++ b/src/Drivers/Gd/Modifiers/GreyscaleModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\GreyscaleModifier as GenericGreyscaleModifier; -class GreyscaleModifier extends DriverSpecialized implements ModifierInterface +class GreyscaleModifier extends GenericGreyscaleModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/InvertModifier.php b/src/Drivers/Gd/Modifiers/InvertModifier.php index df115129..65d42b4e 100644 --- a/src/Drivers/Gd/Modifiers/InvertModifier.php +++ b/src/Drivers/Gd/Modifiers/InvertModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\InvertModifier as GenericInvertModifier; -class InvertModifier extends DriverSpecialized implements ModifierInterface +class InvertModifier extends GenericInvertModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/PixelateModifier.php b/src/Drivers/Gd/Modifiers/PixelateModifier.php index 023fde24..06ddde14 100644 --- a/src/Drivers/Gd/Modifiers/PixelateModifier.php +++ b/src/Drivers/Gd/Modifiers/PixelateModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\PixelateModifier as GenericPixelateModifier; -/** - * @property int $size - */ -class PixelateModifier extends DriverSpecialized implements ModifierInterface +class PixelateModifier extends GenericPixelateModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/PlaceModifier.php b/src/Drivers/Gd/Modifiers/PlaceModifier.php index 282c5ffe..eaad5c2b 100644 --- a/src/Drivers/Gd/Modifiers/PlaceModifier.php +++ b/src/Drivers/Gd/Modifiers/PlaceModifier.php @@ -4,22 +4,14 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\PointInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\PlaceModifier as GenericPlaceModifier; -/** - * @method mixed getPosition(ImageInterface $image, ImageInterface $watermark) - * @property mixed $element - * @property string $position - * @property int $offset_x - * @property int $offset_y - * @property int $opacity - */ -class PlaceModifier extends DriverSpecialized implements ModifierInterface +class PlaceModifier extends GenericPlaceModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ProfileModifier.php b/src/Drivers/Gd/Modifiers/ProfileModifier.php index adf01642..5a5310a1 100644 --- a/src/Drivers/Gd/Modifiers/ProfileModifier.php +++ b/src/Drivers/Gd/Modifiers/ProfileModifier.php @@ -4,16 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -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; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ProfileModifier as GenericProfileModifier; -/** - * @property ProfileInterface $profile - */ -class ProfileModifier extends DriverSpecialized implements ModifierInterface +class ProfileModifier extends GenericProfileModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php b/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php index 7f95d0f9..1121036a 100644 --- a/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php +++ b/src/Drivers/Gd/Modifiers/ProfileRemovalModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ProfileRemovalModifier as GenericProfileRemovalModifier; -class ProfileRemovalModifier extends DriverSpecialized implements ModifierInterface +class ProfileRemovalModifier extends GenericProfileRemovalModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php b/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php index 9db2d3f0..8d7aa948 100644 --- a/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php +++ b/src/Drivers/Gd/Modifiers/QuantizeColorsModifier.php @@ -4,17 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\InputException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\QuantizeColorsModifier as GenericQuantizeColorsModifier; -/** - * @property int $limit - * @property mixed $background - */ -class QuantizeColorsModifier extends DriverSpecialized implements ModifierInterface +class QuantizeColorsModifier extends GenericQuantizeColorsModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php index 7d050945..345798f9 100644 --- a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php @@ -4,15 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\RemoveAnimationModifier as GenericRemoveAnimationModifier; -/** - * @method mixed chosenFrame(ImageInterface $image, int|string $position) - * @property int|string $position - */ -class RemoveAnimationModifier extends DriverSpecialized implements ModifierInterface +class RemoveAnimationModifier extends GenericRemoveAnimationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php b/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php index 5559f760..3a6872f5 100644 --- a/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php +++ b/src/Drivers/Gd/Modifiers/ResizeCanvasModifier.php @@ -7,20 +7,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Colors\Rgb\Channels\Blue; use Intervention\Image\Colors\Rgb\Channels\Green; use Intervention\Image\Colors\Rgb\Channels\Red; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResizeCanvasModifier as GenericResizeCanvasModifier; -/** - * @method SizeInterface cropSize(ImageInterface $image) - * @property mixed $background - */ -class ResizeCanvasModifier extends DriverSpecialized implements ModifierInterface +class ResizeCanvasModifier extends GenericResizeCanvasModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { @@ -55,8 +51,7 @@ class ResizeCanvasModifier extends DriverSpecialized implements ModifierInterfac 127, ); - imagealphablending($modified, false); // do not blend / just overwrite - // imagecolortransparent($modified, $transparent); + imagealphablending($modified, false); // do not blend - just overwrite imagefilledrectangle( $modified, $resize->pivot()->x() * -1, diff --git a/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php b/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php index 13d2e89d..53e375ff 100644 --- a/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php +++ b/src/Drivers/Gd/Modifiers/ResizeCanvasRelativeModifier.php @@ -7,10 +7,10 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @method SizeInterface cropSize(ImageInterface $image) - * @property mixed $background - */ class ResizeCanvasRelativeModifier extends ResizeCanvasModifier { + protected function cropSize(ImageInterface $image, bool $relative = false): SizeInterface + { + return parent::cropSize($image, true); + } } diff --git a/src/Drivers/Gd/Modifiers/ResizeModifier.php b/src/Drivers/Gd/Modifiers/ResizeModifier.php index 18a387a8..a707fc7a 100644 --- a/src/Drivers/Gd/Modifiers/ResizeModifier.php +++ b/src/Drivers/Gd/Modifiers/ResizeModifier.php @@ -4,20 +4,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResizeModifier as GenericResizeModifier; -/** - * @property null|int $width - * @property null|int $height - */ -class ResizeModifier extends DriverSpecialized implements ModifierInterface +class ResizeModifier extends GenericResizeModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ResolutionModifier.php b/src/Drivers/Gd/Modifiers/ResolutionModifier.php index 9293b915..6fcc2335 100644 --- a/src/Drivers/Gd/Modifiers/ResolutionModifier.php +++ b/src/Drivers/Gd/Modifiers/ResolutionModifier.php @@ -4,15 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResolutionModifier as GenericResolutionModifier; -/** - * @property int $x - * @property int $y - */ -class ResolutionModifier extends DriverSpecialized implements ModifierInterface +class ResolutionModifier extends GenericResolutionModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/RotateModifier.php b/src/Drivers/Gd/Modifiers/RotateModifier.php index 34b055f3..86811268 100644 --- a/src/Drivers/Gd/Modifiers/RotateModifier.php +++ b/src/Drivers/Gd/Modifiers/RotateModifier.php @@ -7,20 +7,16 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Colors\Rgb\Channels\Blue; use Intervention\Image\Colors\Rgb\Channels\Green; use Intervention\Image\Colors\Rgb\Channels\Red; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Gd\Cloner; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\FrameInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\RotateModifier as GenericRotateModifier; -/** - * @method mixed rotationAngle() - * @property mixed $background - */ -class RotateModifier extends DriverSpecialized implements ModifierInterface +class RotateModifier extends GenericRotateModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/ScaleDownModifier.php b/src/Drivers/Gd/Modifiers/ScaleDownModifier.php index 483839d6..606978d4 100644 --- a/src/Drivers/Gd/Modifiers/ScaleDownModifier.php +++ b/src/Drivers/Gd/Modifiers/ScaleDownModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class ScaleDownModifier extends ResizeModifier { protected function getAdjustedSize(ImageInterface $image): SizeInterface diff --git a/src/Drivers/Gd/Modifiers/ScaleModifier.php b/src/Drivers/Gd/Modifiers/ScaleModifier.php index feb3dba8..2486cbb6 100644 --- a/src/Drivers/Gd/Modifiers/ScaleModifier.php +++ b/src/Drivers/Gd/Modifiers/ScaleModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class ScaleModifier extends ResizeModifier { protected function getAdjustedSize(ImageInterface $image): SizeInterface diff --git a/src/Drivers/Gd/Modifiers/SharpenModifier.php b/src/Drivers/Gd/Modifiers/SharpenModifier.php index 58f5b5c9..decb6d75 100644 --- a/src/Drivers/Gd/Modifiers/SharpenModifier.php +++ b/src/Drivers/Gd/Modifiers/SharpenModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\SharpenModifier as GenericSharpenModifier; -/** - * @property int $amount - */ -class SharpenModifier extends DriverSpecialized implements ModifierInterface +class SharpenModifier extends GenericSharpenModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php b/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php index c1fcbb3d..84b04c36 100644 --- a/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php +++ b/src/Drivers/Gd/Modifiers/SliceAnimationModifier.php @@ -4,16 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\AnimationException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\SliceAnimationModifier as GenericSliceAnimationModifier; -/** - * @property int $offset - * @property null|int $length - */ -class SliceAnimationModifier extends DriverSpecialized implements ModifierInterface +class SliceAnimationModifier extends GenericSliceAnimationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Gd/Modifiers/TextModifier.php b/src/Drivers/Gd/Modifiers/TextModifier.php index 4d7a5cf6..66551baf 100644 --- a/src/Drivers/Gd/Modifiers/TextModifier.php +++ b/src/Drivers/Gd/Modifiers/TextModifier.php @@ -4,20 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Gd\Modifiers; -use Intervention\Image\Drivers\AbstractTextModifier; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Geometry\Point; -use Intervention\Image\Interfaces\FontInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\TextModifier as GenericTextModifier; -/** - * @property Point $position - * @property string $text - * @property FontInterface $font - */ -class TextModifier extends AbstractTextModifier implements ModifierInterface +class TextModifier extends GenericTextModifier implements SpecializedInterface { /** * {@inheritdoc} @@ -30,8 +23,8 @@ class TextModifier extends AbstractTextModifier implements ModifierInterface $lines = $fontProcessor->textBlock($this->text, $this->font, $this->position); // decode text colors - $textColor = $this->textColor($image); - $strokeColor = $this->strokeColor($image); + $textColor = $this->gdTextColor($image); + $strokeColor = $this->gdStrokeColor($image); foreach ($image as $frame) { imagealphablending($frame->native(), true); @@ -90,46 +83,36 @@ class TextModifier extends AbstractTextModifier implements ModifierInterface } /** - * Decode text color - * - * The text outline effect is drawn with a trick by plotting additional text - * under the actual text with an offset in the color of the outline effect. - * For this reason, no colors with transparency can be used for the text - * color or the color of the stroke effect, as this would be superimposed. + * Decode text color in GD compatible format * * @param ImageInterface $image + * @return int * @throws RuntimeException * @throws ColorException - * @return int */ - protected function textColor(ImageInterface $image): int + protected function gdTextColor(ImageInterface $image): int { - $color = $this->driver()->handleInput($this->font->color()); - - if ($this->font->hasStrokeEffect() && $color->isTransparent()) { - throw new ColorException( - 'The text color must be fully opaque when using the stroke effect.' - ); - } - - return $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative(parent::textColor()); } /** - * Decode outline stroke color + * Decode color for stroke (outline) effect in GD compatible format * * @param ImageInterface $image + * @return int * @throws RuntimeException * @throws ColorException - * @return int */ - protected function strokeColor(ImageInterface $image): int + protected function gdStrokeColor(ImageInterface $image): int { if (!$this->font->hasStrokeEffect()) { return 0; } - $color = $this->driver()->handleInput($this->font->strokeColor()); + $color = parent::strokeColor(); if ($color->isTransparent()) { throw new ColorException( @@ -137,7 +120,10 @@ class TextModifier extends AbstractTextModifier implements ModifierInterface ); } - return $this->driver()->colorProcessor($image->colorspace())->colorToNative($color); + return $this + ->driver() + ->colorProcessor($image->colorspace()) + ->colorToNative($color); } /** diff --git a/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php b/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php index 6bebc99f..181b4e46 100644 --- a/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ColorspaceAnalyzer.php @@ -5,13 +5,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Analyzers\ColorspaceAnalyzer as GenericColorspaceAnalyzer; 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; +use Intervention\Image\Interfaces\SpecializedInterface; -class ColorspaceAnalyzer extends DriverSpecialized implements AnalyzerInterface +class ColorspaceAnalyzer extends GenericColorspaceAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php b/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php index 6dee9d41..b3ab9969 100644 --- a/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/HeightAnalyzer.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecialized; -use Intervention\Image\Interfaces\AnalyzerInterface; +use Intervention\Image\Analyzers\HeightAnalyzer as GenericHeightAnalyzer; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class HeightAnalyzer extends DriverSpecialized implements AnalyzerInterface +class HeightAnalyzer extends GenericHeightAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php b/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php index 7264608e..d060e34d 100644 --- a/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/PixelColorAnalyzer.php @@ -5,19 +5,14 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; +use Intervention\Image\Analyzers\PixelColorAnalyzer as GenericPixelColorAnalyzer; use Intervention\Image\Exceptions\ColorException; -use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $x - * @property int $y - * @property int $frame_key - */ -class PixelColorAnalyzer extends DriverSpecialized implements AnalyzerInterface +class PixelColorAnalyzer extends GenericPixelColorAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php b/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php index 5f64a4f4..577b9c8c 100644 --- a/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/PixelColorsAnalyzer.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Imagick\Analyzers; use Intervention\Image\Collection; use Intervention\Image\Interfaces\ImageInterface; -/** - * @property int $x - * @property int $y - */ class PixelColorsAnalyzer extends PixelColorAnalyzer { public function analyze(ImageInterface $image): mixed diff --git a/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php b/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php index 8208d4cc..61fef32f 100644 --- a/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ProfileAnalyzer.php @@ -4,13 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; +use Intervention\Image\Analyzers\ProfileAnalyzer as GenericProfileAnalyzer; use Intervention\Image\Colors\Profile; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\ColorException; -use Intervention\Image\Interfaces\AnalyzerInterface; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class ProfileAnalyzer extends DriverSpecialized implements AnalyzerInterface +class ProfileAnalyzer extends GenericProfileAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php b/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php index ba502002..6bd4731e 100644 --- a/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/ResolutionAnalyzer.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecialized; -use Intervention\Image\Interfaces\AnalyzerInterface; +use Intervention\Image\Analyzers\ResolutionAnalyzer as GenericResolutionAnalyzer; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; use Intervention\Image\Resolution; -class ResolutionAnalyzer extends DriverSpecialized implements AnalyzerInterface +class ResolutionAnalyzer extends GenericResolutionAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php b/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php index 328d70e1..77b1d502 100644 --- a/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php +++ b/src/Drivers/Imagick/Analyzers/WidthAnalyzer.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Analyzers; -use Intervention\Image\Drivers\DriverSpecialized; -use Intervention\Image\Interfaces\AnalyzerInterface; +use Intervention\Image\Analyzers\WidthAnalyzer as GenericWidthAnalyzer; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class WidthAnalyzer extends DriverSpecialized implements AnalyzerInterface +class WidthAnalyzer extends GenericWidthAnalyzer implements SpecializedInterface { public function analyze(ImageInterface $image): mixed { diff --git a/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php b/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php index 70eac684..ecddde3c 100644 --- a/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/Base64ImageDecoder.php @@ -6,10 +6,9 @@ namespace Intervention\Image\Drivers\Imagick\Decoders; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class Base64ImageDecoder extends BinaryImageDecoder implements DecoderInterface +class Base64ImageDecoder extends BinaryImageDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php index cd99ad43..b96e6290 100644 --- a/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/BinaryImageDecoder.php @@ -8,10 +8,9 @@ use Imagick; use ImagickException; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class BinaryImageDecoder extends ImagickImageDecoder implements DecoderInterface +class BinaryImageDecoder extends ImagickImageDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/ColorObjectDecoder.php b/src/Drivers/Imagick/Decoders/ColorObjectDecoder.php index 31f60115..138046b5 100644 --- a/src/Drivers/Imagick/Decoders/ColorObjectDecoder.php +++ b/src/Drivers/Imagick/Decoders/ColorObjectDecoder.php @@ -7,10 +7,9 @@ namespace Intervention\Image\Drivers\Imagick\Decoders; use Intervention\Image\Drivers\AbstractDecoder; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class ColorObjectDecoder extends AbstractDecoder implements DecoderInterface +class ColorObjectDecoder extends AbstractDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php b/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php index 2e8633ee..82a39e68 100644 --- a/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/DataUriImageDecoder.php @@ -6,10 +6,9 @@ namespace Intervention\Image\Drivers\Imagick\Decoders; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class DataUriImageDecoder extends BinaryImageDecoder implements DecoderInterface +class DataUriImageDecoder extends BinaryImageDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php b/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php index a7e043ce..34834381 100644 --- a/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/FilePathImageDecoder.php @@ -8,10 +8,9 @@ use Imagick; use ImagickException; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class FilePathImageDecoder extends ImagickImageDecoder implements DecoderInterface +class FilePathImageDecoder extends ImagickImageDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/ImageObjectDecoder.php b/src/Drivers/Imagick/Decoders/ImageObjectDecoder.php index d307ca3d..f9487214 100644 --- a/src/Drivers/Imagick/Decoders/ImageObjectDecoder.php +++ b/src/Drivers/Imagick/Decoders/ImageObjectDecoder.php @@ -4,13 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Decoders; -use Intervention\Image\Drivers\AbstractDecoder; +use Intervention\Image\Drivers\SpecializableDecoder; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class ImageObjectDecoder extends AbstractDecoder implements DecoderInterface +class ImageObjectDecoder extends SpecializableDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/ImagickImageDecoder.php b/src/Drivers/Imagick/Decoders/ImagickImageDecoder.php index 954832f6..501d74d9 100644 --- a/src/Drivers/Imagick/Decoders/ImagickImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/ImagickImageDecoder.php @@ -5,17 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Decoders; use Imagick; -use Intervention\Image\Drivers\AbstractDecoder; use Intervention\Image\Drivers\Imagick\Core; use Intervention\Image\Drivers\Imagick\Driver; +use Intervention\Image\Drivers\SpecializableDecoder; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Image; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Modifiers\AlignRotationModifier; -class ImagickImageDecoder extends AbstractDecoder implements DecoderInterface +class ImagickImageDecoder extends SpecializableDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php b/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php index c1b3154f..ad96b7ce 100644 --- a/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php +++ b/src/Drivers/Imagick/Decoders/SplFileInfoImageDecoder.php @@ -7,10 +7,9 @@ namespace Intervention\Image\Drivers\Imagick\Decoders; use SplFileInfo; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Interfaces\DecoderInterface; use Intervention\Image\Interfaces\ImageInterface; -class SplFileInfoImageDecoder extends FilePathImageDecoder implements DecoderInterface +class SplFileInfoImageDecoder extends FilePathImageDecoder { public function decode(mixed $input): ImageInterface|ColorInterface { diff --git a/src/Drivers/Imagick/Encoders/AvifEncoder.php b/src/Drivers/Imagick/Encoders/AvifEncoder.php index 3b65b12a..b60c5e69 100644 --- a/src/Drivers/Imagick/Encoders/AvifEncoder.php +++ b/src/Drivers/Imagick/Encoders/AvifEncoder.php @@ -5,14 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\AvifEncoder as GenericAvifEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class AvifEncoder extends DriverSpecializedEncoder +class AvifEncoder extends GenericAvifEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Encoders/BmpEncoder.php b/src/Drivers/Imagick/Encoders/BmpEncoder.php index e62b290f..293767de 100644 --- a/src/Drivers/Imagick/Encoders/BmpEncoder.php +++ b/src/Drivers/Imagick/Encoders/BmpEncoder.php @@ -5,11 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\BmpEncoder as GenericBmpEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class BmpEncoder extends DriverSpecializedEncoder +class BmpEncoder extends GenericBmpEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Encoders/GifEncoder.php b/src/Drivers/Imagick/Encoders/GifEncoder.php index 282cb17e..84a327a1 100644 --- a/src/Drivers/Imagick/Encoders/GifEncoder.php +++ b/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -5,11 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\GifEncoder as GenericGifEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class GifEncoder extends DriverSpecializedEncoder +class GifEncoder extends GenericGifEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Encoders/HeicEncoder.php b/src/Drivers/Imagick/Encoders/HeicEncoder.php index 252ca365..64af42f1 100644 --- a/src/Drivers/Imagick/Encoders/HeicEncoder.php +++ b/src/Drivers/Imagick/Encoders/HeicEncoder.php @@ -4,15 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\HeicEncoder as GenericHeicEncoder; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\EncodedImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class HeicEncoder extends DriverSpecializedEncoder +class HeicEncoder extends GenericHeicEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImageInterface { diff --git a/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php b/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php index 8276408c..db0cc13a 100644 --- a/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php +++ b/src/Drivers/Imagick/Encoders/Jpeg2000Encoder.php @@ -5,15 +5,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\Jpeg2000Encoder as GenericJpeg2000Encoder; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\EncodedImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class Jpeg2000Encoder extends DriverSpecializedEncoder +class Jpeg2000Encoder extends GenericJpeg2000Encoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImageInterface { diff --git a/src/Drivers/Imagick/Encoders/JpegEncoder.php b/src/Drivers/Imagick/Encoders/JpegEncoder.php index 28ed4dd2..7e8d6ecd 100644 --- a/src/Drivers/Imagick/Encoders/JpegEncoder.php +++ b/src/Drivers/Imagick/Encoders/JpegEncoder.php @@ -5,14 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\JpegEncoder as GenericJpegEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class JpegEncoder extends DriverSpecializedEncoder +class JpegEncoder extends GenericJpegEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Encoders/PngEncoder.php b/src/Drivers/Imagick/Encoders/PngEncoder.php index 9732a38a..adc70d7d 100644 --- a/src/Drivers/Imagick/Encoders/PngEncoder.php +++ b/src/Drivers/Imagick/Encoders/PngEncoder.php @@ -5,11 +5,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\PngEncoder as GenericPngEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -class PngEncoder extends DriverSpecializedEncoder +class PngEncoder extends GenericPngEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Encoders/TiffEncoder.php b/src/Drivers/Imagick/Encoders/TiffEncoder.php index 6157e2d2..a03e0ae3 100644 --- a/src/Drivers/Imagick/Encoders/TiffEncoder.php +++ b/src/Drivers/Imagick/Encoders/TiffEncoder.php @@ -4,15 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Encoders; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\TiffEncoder as GenericTiffEncoder; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\EncodedImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class TiffEncoder extends DriverSpecializedEncoder +class TiffEncoder extends GenericTiffEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImageInterface { diff --git a/src/Drivers/Imagick/Encoders/WebpEncoder.php b/src/Drivers/Imagick/Encoders/WebpEncoder.php index cb20d739..552b23ab 100644 --- a/src/Drivers/Imagick/Encoders/WebpEncoder.php +++ b/src/Drivers/Imagick/Encoders/WebpEncoder.php @@ -6,14 +6,12 @@ namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; use ImagickPixel; -use Intervention\Image\Drivers\DriverSpecializedEncoder; use Intervention\Image\EncodedImage; +use Intervention\Image\Encoders\WebpEncoder as GenericWebpEncoder; use Intervention\Image\Interfaces\ImageInterface; +use Intervention\Image\Interfaces\SpecializedInterface; -/** - * @property int $quality - */ -class WebpEncoder extends DriverSpecializedEncoder +class WebpEncoder extends GenericWebpEncoder implements SpecializedInterface { public function encode(ImageInterface $image): EncodedImage { diff --git a/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php b/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php index f0f1a5bc..3427d4ad 100644 --- a/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php +++ b/src/Drivers/Imagick/Modifiers/AlignRotationModifier.php @@ -5,11 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\AlignRotationModifier as GenericAlignRotationModifier; -class AlignRotationModifier extends DriverSpecialized implements ModifierInterface +class AlignRotationModifier extends GenericAlignRotationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php b/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php index 348d81d5..f6586793 100644 --- a/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php +++ b/src/Drivers/Imagick/Modifiers/BlendTransparencyModifier.php @@ -5,14 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BlendTransparencyModifier as GenericBlendTransparencyModifier; -/** - * @property mixed $color - */ -class BlendTransparencyModifier extends DriverSpecialized implements ModifierInterface +class BlendTransparencyModifier extends GenericBlendTransparencyModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/BlurModifier.php b/src/Drivers/Imagick/Modifiers/BlurModifier.php index a8464e8f..d7ece822 100644 --- a/src/Drivers/Imagick/Modifiers/BlurModifier.php +++ b/src/Drivers/Imagick/Modifiers/BlurModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BlurModifier as GenericBlurModifier; -/** - * @property int $amount - */ -class BlurModifier extends DriverSpecialized implements ModifierInterface +class BlurModifier extends GenericBlurModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/BrightnessModifier.php b/src/Drivers/Imagick/Modifiers/BrightnessModifier.php index ae24f6b8..80fd9dfa 100644 --- a/src/Drivers/Imagick/Modifiers/BrightnessModifier.php +++ b/src/Drivers/Imagick/Modifiers/BrightnessModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\BrightnessModifier as GenericBrightnessModifier; -/** - * @property int $level - */ -class BrightnessModifier extends DriverSpecialized implements ModifierInterface +class BrightnessModifier extends GenericBrightnessModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ColorizeModifier.php b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php index 67f7c00c..c4abc30e 100644 --- a/src/Drivers/Imagick/Modifiers/ColorizeModifier.php +++ b/src/Drivers/Imagick/Modifiers/ColorizeModifier.php @@ -5,16 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ColorizeModifier as GenericColorizeModifier; -/** - * @property int $red - * @property int $green - * @property int $blue - */ -class ColorizeModifier extends DriverSpecialized implements ModifierInterface +class ColorizeModifier extends GenericColorizeModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php b/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php index c1e9d8f2..89cc6e7a 100644 --- a/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php +++ b/src/Drivers/Imagick/Modifiers/ColorspaceModifier.php @@ -5,18 +5,15 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -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; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ColorspaceModifier as GenericColorspaceModifier; -/** - * @method ColorspaceInterface targetColorspace() - */ -class ColorspaceModifier extends DriverSpecialized implements ModifierInterface +class ColorspaceModifier extends GenericColorspaceModifier implements SpecializedInterface { 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 0823bdb2..b01bfd3b 100644 --- a/src/Drivers/Imagick/Modifiers/ContainModifier.php +++ b/src/Drivers/Imagick/Modifiers/ContainModifier.php @@ -6,20 +6,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; use ImagickPixel; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ContainModifier as GenericContainModifier; -/** - * @method SizeInterface getCropSize(ImageInterface $image) - * @method SizeInterface getResizeSize(ImageInterface $image) - * @property int $width - * @property int $height - * @property mixed $background - * @property string $position - */ -class ContainModifier extends DriverSpecialized implements ModifierInterface +class ContainModifier extends GenericContainModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ContrastModifier.php b/src/Drivers/Imagick/Modifiers/ContrastModifier.php index 555c4555..72083fa1 100644 --- a/src/Drivers/Imagick/Modifiers/ContrastModifier.php +++ b/src/Drivers/Imagick/Modifiers/ContrastModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ContrastModifier as GenericContrastModifier; -/** - * @property int $level - */ -class ContrastModifier extends DriverSpecialized implements ModifierInterface +class ContrastModifier extends GenericContrastModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/CoverDownModifier.php b/src/Drivers/Imagick/Modifiers/CoverDownModifier.php index c16bf4be..efc82297 100644 --- a/src/Drivers/Imagick/Modifiers/CoverDownModifier.php +++ b/src/Drivers/Imagick/Modifiers/CoverDownModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Intervention\Image\Exceptions\GeometryException; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class CoverDownModifier extends CoverModifier { /** diff --git a/src/Drivers/Imagick/Modifiers/CoverModifier.php b/src/Drivers/Imagick/Modifiers/CoverModifier.php index 1829470f..d133cfa8 100644 --- a/src/Drivers/Imagick/Modifiers/CoverModifier.php +++ b/src/Drivers/Imagick/Modifiers/CoverModifier.php @@ -4,16 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\CoverModifier as GenericCoverModifier; -/** - * @method SizeInterface getCropSize(ImageInterface $image) - * @method SizeInterface getResizeSize(SizeInterface $size) - */ -class CoverModifier extends DriverSpecialized implements ModifierInterface +class CoverModifier extends GenericCoverModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/CropModifier.php b/src/Drivers/Imagick/Modifiers/CropModifier.php index 52cb83d3..067c1fd4 100644 --- a/src/Drivers/Imagick/Modifiers/CropModifier.php +++ b/src/Drivers/Imagick/Modifiers/CropModifier.php @@ -6,18 +6,11 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; use ImagickPixel; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\CropModifier as GenericCropModifier; -/** - * @method SizeInterface crop(ImageInterface $image) - * @property int $offset_x - * @property int $offset_y - * @property mixed $background - */ -class CropModifier extends DriverSpecialized implements ModifierInterface +class CropModifier extends GenericCropModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php b/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php index ceaf714b..1508f918 100644 --- a/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawEllipseModifier.php @@ -5,15 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\AbstractDrawModifier; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Geometry\Ellipse; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawEllipseModifier as GenericDrawEllipseModifier; -/** - * @property Ellipse $drawable - */ -class DrawEllipseModifier extends AbstractDrawModifier +class DrawEllipseModifier extends GenericDrawEllipseModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { $background_color = $this->driver()->colorProcessor($image->colorspace())->colorToNative( @@ -34,8 +35,8 @@ class DrawEllipseModifier extends AbstractDrawModifier } $drawing->ellipse( - $this->position()->x(), - $this->position()->y(), + $this->drawable->position()->x(), + $this->drawable->position()->y(), $this->drawable->width() / 2, $this->drawable->height() / 2, 0, diff --git a/src/Drivers/Imagick/Modifiers/DrawLineModifier.php b/src/Drivers/Imagick/Modifiers/DrawLineModifier.php index b65eaa50..ca4a04bb 100644 --- a/src/Drivers/Imagick/Modifiers/DrawLineModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawLineModifier.php @@ -5,17 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\AbstractDrawModifier; -use Intervention\Image\Geometry\Line; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ColorInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawLineModifier as GenericDrawLineModifier; -/** - * @method ColorInterface backgroundColor() - * @property Line $drawable - */ -class DrawLineModifier extends AbstractDrawModifier +class DrawLineModifier extends GenericDrawLineModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { $drawing = new ImagickDraw(); diff --git a/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php b/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php index 91c1954c..e69ecc27 100644 --- a/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawPixelModifier.php @@ -5,16 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\PointInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawPixelModifier as GenericDrawPixelModifier; -/** - * @property PointInterface $position - * @property mixed $color - */ -class DrawPixelModifier extends DriverSpecialized implements ModifierInterface +class DrawPixelModifier extends GenericDrawPixelModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php b/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php index 30648ed3..443722e9 100644 --- a/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawPolygonModifier.php @@ -5,19 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\AbstractDrawModifier; -use Intervention\Image\Geometry\Polygon; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ColorInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawPolygonModifier as GenericDrawPolygonModifier; -/** - * @method Point position() - * @method ColorInterface backgroundColor() - * @method ColorInterface borderColor() - * @property Polygon $drawable - */ -class DrawPolygonModifier extends AbstractDrawModifier +class DrawPolygonModifier extends GenericDrawPolygonModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { $drawing = new ImagickDraw(); diff --git a/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php b/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php index b0b8aee5..8f8e79ea 100644 --- a/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php +++ b/src/Drivers/Imagick/Modifiers/DrawRectangleModifier.php @@ -5,20 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\AbstractDrawModifier; +use RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Geometry\Point; -use Intervention\Image\Interfaces\ColorInterface; -use Intervention\Image\Geometry\Rectangle; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\DrawRectangleModifier as GenericDrawRectangleModifier; -/** - * @method Point position() - * @method ColorInterface backgroundColor() - * @method ColorInterface borderColor() - * @property Rectangle $drawable - */ -class DrawRectangleModifier extends AbstractDrawModifier +class DrawRectangleModifier extends GenericDrawRectangleModifier implements SpecializedInterface { + /** + * @throws RuntimeException + */ public function apply(ImageInterface $image): ImageInterface { $drawing = new ImagickDraw(); @@ -39,10 +35,10 @@ class DrawRectangleModifier extends AbstractDrawModifier // build rectangle $drawing->rectangle( - $this->position()->x(), - $this->position()->y(), - $this->position()->x() + $this->drawable->width(), - $this->position()->y() + $this->drawable->height() + $this->drawable->position()->x(), + $this->drawable->position()->y(), + $this->drawable->position()->x() + $this->drawable->width(), + $this->drawable->position()->y() + $this->drawable->height() ); foreach ($image as $frame) { diff --git a/src/Drivers/Imagick/Modifiers/FillModifier.php b/src/Drivers/Imagick/Modifiers/FillModifier.php index 141b8f3c..eb515e4e 100644 --- a/src/Drivers/Imagick/Modifiers/FillModifier.php +++ b/src/Drivers/Imagick/Modifiers/FillModifier.php @@ -7,18 +7,12 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; use ImagickDraw; use ImagickPixel; -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; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FillModifier as ModifiersFillModifier; -/** - * @method bool hasPosition() - * @property mixed $color - * @property null|Point $position - */ -class FillModifier extends DriverSpecialized implements ModifierInterface +class FillModifier extends ModifiersFillModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/FlipModifier.php b/src/Drivers/Imagick/Modifiers/FlipModifier.php index 442db543..edfa1244 100644 --- a/src/Drivers/Imagick/Modifiers/FlipModifier.php +++ b/src/Drivers/Imagick/Modifiers/FlipModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FlipModifier as GenericFlipModifier; -class FlipModifier extends DriverSpecialized implements ModifierInterface +class FlipModifier extends GenericFlipModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/FlopModifier.php b/src/Drivers/Imagick/Modifiers/FlopModifier.php index d99f8a19..d05c239e 100644 --- a/src/Drivers/Imagick/Modifiers/FlopModifier.php +++ b/src/Drivers/Imagick/Modifiers/FlopModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\FlopModifier as ModifiersFlopModifier; -class FlopModifier extends DriverSpecialized implements ModifierInterface +class FlopModifier extends ModifiersFlopModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/GammaModifier.php b/src/Drivers/Imagick/Modifiers/GammaModifier.php index bf6ca948..f8b1c7ce 100644 --- a/src/Drivers/Imagick/Modifiers/GammaModifier.php +++ b/src/Drivers/Imagick/Modifiers/GammaModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\GammaModifier as GenericGammaModifier; -/** - * @property float $gamma - */ -class GammaModifier extends DriverSpecialized implements ModifierInterface +class GammaModifier extends GenericGammaModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php b/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php index 2e32c45a..4bc2f284 100644 --- a/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php +++ b/src/Drivers/Imagick/Modifiers/GreyscaleModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\GreyscaleModifier as GenericGreyscaleModifier; -class GreyscaleModifier extends DriverSpecialized implements ModifierInterface +class GreyscaleModifier extends GenericGreyscaleModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/InvertModifier.php b/src/Drivers/Imagick/Modifiers/InvertModifier.php index b3f877e7..d504ecb5 100644 --- a/src/Drivers/Imagick/Modifiers/InvertModifier.php +++ b/src/Drivers/Imagick/Modifiers/InvertModifier.php @@ -4,11 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\InvertModifier as GenericInvertModifier; -class InvertModifier extends DriverSpecialized implements ModifierInterface +class InvertModifier extends GenericInvertModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/PixelateModifier.php b/src/Drivers/Imagick/Modifiers/PixelateModifier.php index 40759897..02b5d068 100644 --- a/src/Drivers/Imagick/Modifiers/PixelateModifier.php +++ b/src/Drivers/Imagick/Modifiers/PixelateModifier.php @@ -4,15 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Drivers\Imagick\Frame; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\PixelateModifier as GenericPixelateModifier; -/** - * @property int $size - */ -class PixelateModifier extends DriverSpecialized implements ModifierInterface +class PixelateModifier extends GenericPixelateModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/src/Drivers/Imagick/Modifiers/PlaceModifier.php index 6007693a..7ee6cb5d 100644 --- a/src/Drivers/Imagick/Modifiers/PlaceModifier.php +++ b/src/Drivers/Imagick/Modifiers/PlaceModifier.php @@ -5,19 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\PlaceModifier as GenericPlaceModifier; -/** - * @method mixed getPosition(ImageInterface $image, ImageInterface $watermark) - * @property mixed $element - * @property string $position - * @property int $offset_x - * @property int $offset_y - * @property int $opacity - */ -class PlaceModifier extends DriverSpecialized implements ModifierInterface +class PlaceModifier extends GenericPlaceModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ProfileModifier.php b/src/Drivers/Imagick/Modifiers/ProfileModifier.php index fb646558..22212d95 100644 --- a/src/Drivers/Imagick/Modifiers/ProfileModifier.php +++ b/src/Drivers/Imagick/Modifiers/ProfileModifier.php @@ -4,16 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -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; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ProfileModifier as GenericProfileModifier; -/** - * @property ProfileInterface $profile - */ -class ProfileModifier extends DriverSpecialized implements ModifierInterface +class ProfileModifier extends GenericProfileModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php b/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php index e300810a..ef4a2aba 100644 --- a/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php +++ b/src/Drivers/Imagick/Modifiers/ProfileRemovalModifier.php @@ -4,12 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\ColorException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ProfileRemovalModifier as GenericProfileRemovalModifier; -class ProfileRemovalModifier extends DriverSpecialized implements ModifierInterface +class ProfileRemovalModifier extends GenericProfileRemovalModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php b/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php index 486288da..6a93482e 100644 --- a/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php +++ b/src/Drivers/Imagick/Modifiers/QuantizeColorsModifier.php @@ -4,16 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\InputException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\QuantizeColorsModifier as GenericQuantizeColorsModifier; -/** - * @property int $limit - * @property mixed $background - */ -class QuantizeColorsModifier extends DriverSpecialized implements ModifierInterface +class QuantizeColorsModifier extends GenericQuantizeColorsModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php index 1b9579c3..787524fa 100644 --- a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php @@ -5,15 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\RemoveAnimationModifier as GenericRemoveAnimationModifier; -/** - * @method mixed chosenFrame(ImageInterface $image, int|string $position) - * @property int|string $position - */ -class RemoveAnimationModifier extends DriverSpecialized implements ModifierInterface +class RemoveAnimationModifier extends GenericRemoveAnimationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php b/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php index 945bb13b..c5bae4e8 100644 --- a/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResizeCanvasModifier.php @@ -5,16 +5,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResizeCanvasModifier as GenericResizeCanvasModifier; -/** - * @method SizeInterface cropSize(ImageInterface $image) - * @property mixed $background - */ -class ResizeCanvasModifier extends DriverSpecialized implements ModifierInterface +class ResizeCanvasModifier extends GenericResizeCanvasModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php b/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php index bb8a2a4d..e1fcb740 100644 --- a/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResizeCanvasRelativeModifier.php @@ -7,10 +7,10 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @method SizeInterface cropSize(ImageInterface $image) - * @property mixed $background - */ class ResizeCanvasRelativeModifier extends ResizeCanvasModifier { + protected function cropSize(ImageInterface $image, bool $relative = false): SizeInterface + { + return parent::cropSize($image, true); + } } diff --git a/src/Drivers/Imagick/Modifiers/ResizeModifier.php b/src/Drivers/Imagick/Modifiers/ResizeModifier.php index becfdc9a..459aad02 100644 --- a/src/Drivers/Imagick/Modifiers/ResizeModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResizeModifier.php @@ -4,17 +4,13 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResizeModifier as GenericResizeModifier; -/** - * @property null|int $width - * @property null|int $height - */ -class ResizeModifier extends DriverSpecialized implements ModifierInterface +class ResizeModifier extends GenericResizeModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ResolutionModifier.php b/src/Drivers/Imagick/Modifiers/ResolutionModifier.php index dcb711f1..426e683e 100644 --- a/src/Drivers/Imagick/Modifiers/ResolutionModifier.php +++ b/src/Drivers/Imagick/Modifiers/ResolutionModifier.php @@ -4,15 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\ResolutionModifier as GenericResolutionModifier; -/** - * @property int $x - * @property int $y - */ -class ResolutionModifier extends DriverSpecialized implements ModifierInterface +class ResolutionModifier extends GenericResolutionModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/RotateModifier.php b/src/Drivers/Imagick/Modifiers/RotateModifier.php index 9ce82b44..19ad2282 100644 --- a/src/Drivers/Imagick/Modifiers/RotateModifier.php +++ b/src/Drivers/Imagick/Modifiers/RotateModifier.php @@ -4,15 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\RotateModifier as GenericRotateModifier; -/** - * @method mixed rotationAngle() - * @property mixed $background - */ -class RotateModifier extends DriverSpecialized implements ModifierInterface +class RotateModifier extends GenericRotateModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php b/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php index 5e1a9b35..ae874bb6 100644 --- a/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php +++ b/src/Drivers/Imagick/Modifiers/ScaleDownModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class ScaleDownModifier extends ResizeModifier { protected function getAdjustedSize(ImageInterface $image): SizeInterface diff --git a/src/Drivers/Imagick/Modifiers/ScaleModifier.php b/src/Drivers/Imagick/Modifiers/ScaleModifier.php index 6aaf9726..da8c2c48 100644 --- a/src/Drivers/Imagick/Modifiers/ScaleModifier.php +++ b/src/Drivers/Imagick/Modifiers/ScaleModifier.php @@ -7,10 +7,6 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\SizeInterface; -/** - * @property int $width - * @property int $height - */ class ScaleModifier extends ResizeModifier { protected function getAdjustedSize(ImageInterface $image): SizeInterface diff --git a/src/Drivers/Imagick/Modifiers/SharpenModifier.php b/src/Drivers/Imagick/Modifiers/SharpenModifier.php index 4e105731..120d3c89 100644 --- a/src/Drivers/Imagick/Modifiers/SharpenModifier.php +++ b/src/Drivers/Imagick/Modifiers/SharpenModifier.php @@ -4,14 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\SharpenModifier as GenericSharpenModifier; -/** - * @property int $amount - */ -class SharpenModifier extends DriverSpecialized implements ModifierInterface +class SharpenModifier extends GenericSharpenModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php b/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php index b33cc19e..16691079 100644 --- a/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php +++ b/src/Drivers/Imagick/Modifiers/SliceAnimationModifier.php @@ -4,16 +4,12 @@ declare(strict_types=1); namespace Intervention\Image\Drivers\Imagick\Modifiers; -use Intervention\Image\Drivers\DriverSpecialized; use Intervention\Image\Exceptions\AnimationException; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\SliceAnimationModifier as GenericSliceAnimationModifier; -/** - * @property int $offset - * @property null|int $length - */ -class SliceAnimationModifier extends DriverSpecialized implements ModifierInterface +class SliceAnimationModifier extends GenericSliceAnimationModifier implements SpecializedInterface { public function apply(ImageInterface $image): ImageInterface { diff --git a/src/Drivers/Imagick/Modifiers/TextModifier.php b/src/Drivers/Imagick/Modifiers/TextModifier.php index 47da884b..60b85189 100644 --- a/src/Drivers/Imagick/Modifiers/TextModifier.php +++ b/src/Drivers/Imagick/Modifiers/TextModifier.php @@ -7,7 +7,6 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use ImagickDraw; use ImagickDrawException; use ImagickException; -use Intervention\Image\Drivers\AbstractTextModifier; use Intervention\Image\Drivers\Imagick\FontProcessor; use Intervention\Image\Drivers\Imagick\Frame; use Intervention\Image\Exceptions\ColorException; @@ -16,15 +15,11 @@ use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Point; use Intervention\Image\Interfaces\FontInterface; use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\SpecializedInterface; +use Intervention\Image\Modifiers\TextModifier as GenericTextModifier; use Intervention\Image\Typography\Line; -/** - * @property Point $position - * @property string $text - * @property FontInterface $font - */ -class TextModifier extends AbstractTextModifier implements ModifierInterface +class TextModifier extends GenericTextModifier implements SpecializedInterface { /** * {@inheritdoc} diff --git a/src/Drivers/Specializable.php b/src/Drivers/Specializable.php new file mode 100644 index 00000000..30a1c3f2 --- /dev/null +++ b/src/Drivers/Specializable.php @@ -0,0 +1,13 @@ +type) ? $image->origin()->mediaType() : $this->type; + $mediaType = is_null($this->mediaType) ? $image->origin()->mediaType() : $this->mediaType; return $image->encode( - $this->encoderByMediaType($type) + $this->encoderByMediaType($mediaType) ); } /** * Return new encoder by given media (MIME) type * - * @param string $type + * @param string $mediaType * @throws EncoderException * @return EncoderInterface */ - protected function encoderByMediaType(string $type): EncoderInterface + protected function encoderByMediaType(string $mediaType): EncoderInterface { - return match (strtolower($type)) { + return match (strtolower($mediaType)) { 'image/webp', 'image/x-webp' => new WebpEncoder(quality: $this->quality), 'image/avif', @@ -64,7 +73,7 @@ class MediaTypeEncoder extends SpecializableEncoder implements EncoderInterface 'image/jpm' => new Jpeg2000Encoder(quality: $this->quality), 'image/heic', 'image/heif', => new HeicEncoder(quality: $this->quality), - default => throw new EncoderException('No encoder found for media type (' . $type . ').'), + default => throw new EncoderException('No encoder found for media type (' . $mediaType . ').'), }; } } diff --git a/src/Encoders/PngEncoder.php b/src/Encoders/PngEncoder.php index 42a8914d..cff27945 100644 --- a/src/Encoders/PngEncoder.php +++ b/src/Encoders/PngEncoder.php @@ -4,8 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Encoders; -use Intervention\Image\Interfaces\SpecializableInterface; +use Intervention\Image\Drivers\SpecializableEncoder; -class PngEncoder extends SpecializableEncoder implements SpecializableInterface +class PngEncoder extends SpecializableEncoder { + public function __construct() + { + } } diff --git a/src/Encoders/SpecializableEncoder.php b/src/Encoders/SpecializableEncoder.php deleted file mode 100644 index f66ef15b..00000000 --- a/src/Encoders/SpecializableEncoder.php +++ /dev/null @@ -1,46 +0,0 @@ -quality = $options[0] ?? self::DEFAULT_QUALITY; - } else { - $this->quality = $options['quality'] ?? self::DEFAULT_QUALITY; - } - } - - /** - * {@inheritdoc} - * - * @see EncoderInterface::encode() - */ - public function encode(ImageInterface $image): EncodedImageInterface - { - return $image->encode($this); - } -} diff --git a/src/Encoders/TiffEncoder.php b/src/Encoders/TiffEncoder.php index 9b94f1c5..29621892 100644 --- a/src/Encoders/TiffEncoder.php +++ b/src/Encoders/TiffEncoder.php @@ -4,8 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Encoders; -use Intervention\Image\Interfaces\SpecializableInterface; +use Intervention\Image\Drivers\SpecializableEncoder; -class TiffEncoder extends SpecializableEncoder implements SpecializableInterface +class TiffEncoder extends SpecializableEncoder { + public function __construct(public int $quality = self::DEFAULT_QUALITY) + { + } } diff --git a/src/Encoders/WebpEncoder.php b/src/Encoders/WebpEncoder.php index c3f5f181..535d6b79 100644 --- a/src/Encoders/WebpEncoder.php +++ b/src/Encoders/WebpEncoder.php @@ -4,8 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Encoders; -use Intervention\Image\Interfaces\SpecializableInterface; +use Intervention\Image\Drivers\SpecializableEncoder; -class WebpEncoder extends SpecializableEncoder implements SpecializableInterface +class WebpEncoder extends SpecializableEncoder { + public function __construct(public int $quality = self::DEFAULT_QUALITY) + { + } } diff --git a/src/Image.php b/src/Image.php index a14ff9f7..e15c36f7 100644 --- a/src/Image.php +++ b/src/Image.php @@ -864,7 +864,7 @@ final class Image implements ImageInterface * * @see ImageInterface::encodeByMediaType() */ - public function encodeByMediaType(?string $type = null, ...$options): EncodedImageInterface + public function encodeByMediaType(?string $type = null, mixed ...$options): EncodedImageInterface { return $this->encode(new MediaTypeEncoder($type, ...$options)); } diff --git a/src/Interfaces/DriverInterface.php b/src/Interfaces/DriverInterface.php index c4c39001..52e4dbfe 100644 --- a/src/Interfaces/DriverInterface.php +++ b/src/Interfaces/DriverInterface.php @@ -20,19 +20,21 @@ interface DriverInterface /** * Resolve given object into a specialized version for the current driver * - * @param object $object + * @param ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object * @throws NotSupportedException * @return ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface */ - public function specialize(object $object): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface; + public function specialize( + ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface $object + ): ModifierInterface|AnalyzerInterface|EncoderInterface|DecoderInterface; /** * Resolve array of classnames or objects into their specialized version for the current driver * - * @param array $specializables + * @param array $objects * @return array */ - public function specializeMultiple(array $specializables): array; + public function specializeMultiple(array $objects): array; /** * Create new image instance with the current driver in given dimensions diff --git a/src/Interfaces/ImageInterface.php b/src/Interfaces/ImageInterface.php index 57e91bbb..22be2360 100644 --- a/src/Interfaces/ImageInterface.php +++ b/src/Interfaces/ImageInterface.php @@ -731,7 +731,7 @@ interface ImageInterface extends IteratorAggregate, Countable * @throws RuntimeException * @return EncodedImageInterface */ - public function encodeByMediaType(?string $type = null, ...$options): EncodedImageInterface; + public function encodeByMediaType(?string $type = null, mixed ...$options): EncodedImageInterface; /** * Encode the image into the format represented by the given extension. If no diff --git a/src/Interfaces/SpecializableInterface.php b/src/Interfaces/SpecializableInterface.php index 7cc69fa5..ef71ffc7 100644 --- a/src/Interfaces/SpecializableInterface.php +++ b/src/Interfaces/SpecializableInterface.php @@ -6,4 +6,26 @@ namespace Intervention\Image\Interfaces; interface SpecializableInterface { + /** + * Return an array of constructor parameters, which is usually passed from + * the generic object to the specialized object + * + * @return array + */ + public function specializable(): array; + + /** + * Set the driver for which the object is specialized + * + * @param DriverInterface $driver + * @return SpecializableInterface + */ + public function setDriver(DriverInterface $driver): self; + + /** + * Return the driver for which the object was specialized + * + * @return DriverInterface + */ + public function driver(): DriverInterface; } diff --git a/src/Interfaces/SpecializedInterface.php b/src/Interfaces/SpecializedInterface.php index 3cfd1ef5..dc8eaa95 100644 --- a/src/Interfaces/SpecializedInterface.php +++ b/src/Interfaces/SpecializedInterface.php @@ -6,28 +6,4 @@ namespace Intervention\Image\Interfaces; interface SpecializedInterface { - public function __construct(); - - /** - * Return current driver instance - * - * @return DriverInterface - */ - public function driver(): DriverInterface; - - /** - * Return driverless generic object - * - * @return object - */ - public function generic(): object; - - /** - * Build driver specialized version of given generic object for given driver - * - * @param object $generic - * @param DriverInterface $driver - * @return SpecializedInterface - */ - public static function buildSpecialized(object $generic, DriverInterface $driver): self; } diff --git a/src/Drivers/AbstractDrawModifier.php b/src/Modifiers/AbstractDrawModifier.php similarity index 63% rename from src/Drivers/AbstractDrawModifier.php rename to src/Modifiers/AbstractDrawModifier.php index 3a9f0c64..3c10e0fb 100644 --- a/src/Drivers/AbstractDrawModifier.php +++ b/src/Modifiers/AbstractDrawModifier.php @@ -2,24 +2,22 @@ declare(strict_types=1); -namespace Intervention\Image\Drivers; +namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\DecoderException; -use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\DrawableInterface; -use Intervention\Image\Interfaces\ModifierInterface; -use Intervention\Image\Interfaces\PointInterface; +use RuntimeException; -/** - * @property DrawableInterface $drawable - */ -abstract class AbstractDrawModifier extends DriverSpecialized implements ModifierInterface +abstract class AbstractDrawModifier extends SpecializableModifier { - public function position(): PointInterface - { - return $this->drawable->position(); - } + /** + * Return the drawable object which will be rendered by the modifier + * + * @return DrawableInterface + */ + abstract public function drawable(): DrawableInterface; /** * @throws RuntimeException @@ -27,7 +25,7 @@ abstract class AbstractDrawModifier extends DriverSpecialized implements Modifie public function backgroundColor(): ColorInterface { try { - $color = $this->driver()->handleInput($this->drawable->backgroundColor()); + $color = $this->driver()->handleInput($this->drawable()->backgroundColor()); } catch (DecoderException) { return $this->driver()->handleInput('transparent'); } @@ -41,7 +39,7 @@ abstract class AbstractDrawModifier extends DriverSpecialized implements Modifie public function borderColor(): ColorInterface { try { - $color = $this->driver()->handleInput($this->drawable->borderColor()); + $color = $this->driver()->handleInput($this->drawable()->borderColor()); } catch (DecoderException) { return $this->driver()->handleInput('transparent'); } diff --git a/src/Modifiers/AlignRotationModifier.php b/src/Modifiers/AlignRotationModifier.php index 41d400d0..1af9b1b2 100644 --- a/src/Modifiers/AlignRotationModifier.php +++ b/src/Modifiers/AlignRotationModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class AlignRotationModifier extends SpecializableModifier { } diff --git a/src/Modifiers/BlendTransparencyModifier.php b/src/Modifiers/BlendTransparencyModifier.php index 7845afbb..6e330c44 100644 --- a/src/Modifiers/BlendTransparencyModifier.php +++ b/src/Modifiers/BlendTransparencyModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class BlendTransparencyModifier extends SpecializableModifier { public function __construct(public mixed $color = null) diff --git a/src/Modifiers/BlurModifier.php b/src/Modifiers/BlurModifier.php index 384d9a35..7f50f66a 100644 --- a/src/Modifiers/BlurModifier.php +++ b/src/Modifiers/BlurModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class BlurModifier extends SpecializableModifier { public function __construct(public int $amount) diff --git a/src/Modifiers/BrightnessModifier.php b/src/Modifiers/BrightnessModifier.php index 42ae6f3e..d9e68dcb 100644 --- a/src/Modifiers/BrightnessModifier.php +++ b/src/Modifiers/BrightnessModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class BrightnessModifier extends SpecializableModifier { public function __construct(public int $level) diff --git a/src/Modifiers/ColorizeModifier.php b/src/Modifiers/ColorizeModifier.php index 13bdbc77..2fe28721 100644 --- a/src/Modifiers/ColorizeModifier.php +++ b/src/Modifiers/ColorizeModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class ColorizeModifier extends SpecializableModifier { public function __construct( diff --git a/src/Modifiers/ColorspaceModifier.php b/src/Modifiers/ColorspaceModifier.php index bd9eb98f..9a57e06b 100644 --- a/src/Modifiers/ColorspaceModifier.php +++ b/src/Modifiers/ColorspaceModifier.php @@ -7,6 +7,7 @@ namespace Intervention\Image\Modifiers; use Intervention\Image\Interfaces\ColorspaceInterface; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\NotSupportedException; class ColorspaceModifier extends SpecializableModifier diff --git a/src/Modifiers/ContainModifier.php b/src/Modifiers/ContainModifier.php index 05d2e1a8..9f1fa3a9 100644 --- a/src/Modifiers/ContainModifier.php +++ b/src/Modifiers/ContainModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\ImageInterface; diff --git a/src/Modifiers/ContrastModifier.php b/src/Modifiers/ContrastModifier.php index 84fa4873..e61f5832 100644 --- a/src/Modifiers/ContrastModifier.php +++ b/src/Modifiers/ContrastModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class ContrastModifier extends SpecializableModifier { public function __construct(public int $level) diff --git a/src/Modifiers/CoverModifier.php b/src/Modifiers/CoverModifier.php index 7417ecfb..d71a5e42 100644 --- a/src/Modifiers/CoverModifier.php +++ b/src/Modifiers/CoverModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\ImageInterface; diff --git a/src/Modifiers/CropModifier.php b/src/Modifiers/CropModifier.php index 1eff42a6..d14958d6 100644 --- a/src/Modifiers/CropModifier.php +++ b/src/Modifiers/CropModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\ImageInterface; diff --git a/src/Modifiers/DrawEllipseModifier.php b/src/Modifiers/DrawEllipseModifier.php index 0ef06224..59c06bd6 100644 --- a/src/Modifiers/DrawEllipseModifier.php +++ b/src/Modifiers/DrawEllipseModifier.php @@ -5,10 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; use Intervention\Image\Geometry\Ellipse; +use Intervention\Image\Interfaces\DrawableInterface; -class DrawEllipseModifier extends SpecializableModifier +class DrawEllipseModifier extends AbstractDrawModifier { public function __construct(public Ellipse $drawable) { } + + public function drawable(): DrawableInterface + { + return $this->drawable; + } } diff --git a/src/Modifiers/DrawLineModifier.php b/src/Modifiers/DrawLineModifier.php index d0b70e4a..4997124b 100644 --- a/src/Modifiers/DrawLineModifier.php +++ b/src/Modifiers/DrawLineModifier.php @@ -5,10 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; use Intervention\Image\Geometry\Line; +use Intervention\Image\Interfaces\DrawableInterface; -class DrawLineModifier extends SpecializableModifier +class DrawLineModifier extends AbstractDrawModifier { public function __construct(public Line $drawable) { } + + public function drawable(): DrawableInterface + { + return $this->drawable; + } } diff --git a/src/Modifiers/DrawPixelModifier.php b/src/Modifiers/DrawPixelModifier.php index d9150397..6e4d732a 100644 --- a/src/Modifiers/DrawPixelModifier.php +++ b/src/Modifiers/DrawPixelModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Interfaces\PointInterface; class DrawPixelModifier extends SpecializableModifier diff --git a/src/Modifiers/DrawPolygonModifier.php b/src/Modifiers/DrawPolygonModifier.php index 4e5531ee..744b5462 100644 --- a/src/Modifiers/DrawPolygonModifier.php +++ b/src/Modifiers/DrawPolygonModifier.php @@ -5,10 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; use Intervention\Image\Geometry\Polygon; +use Intervention\Image\Interfaces\DrawableInterface; -class DrawPolygonModifier extends SpecializableModifier +class DrawPolygonModifier extends AbstractDrawModifier { public function __construct(public Polygon $drawable) { } + + public function drawable(): DrawableInterface + { + return $this->drawable; + } } diff --git a/src/Modifiers/DrawRectangleModifier.php b/src/Modifiers/DrawRectangleModifier.php index f6a5122a..03d521c2 100644 --- a/src/Modifiers/DrawRectangleModifier.php +++ b/src/Modifiers/DrawRectangleModifier.php @@ -5,10 +5,16 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; use Intervention\Image\Geometry\Rectangle; +use Intervention\Image\Interfaces\DrawableInterface; -class DrawRectangleModifier extends SpecializableModifier +class DrawRectangleModifier extends AbstractDrawModifier { public function __construct(public Rectangle $drawable) { } + + public function drawable(): DrawableInterface + { + return $this->drawable; + } } diff --git a/src/Modifiers/FillModifier.php b/src/Modifiers/FillModifier.php index 7ee088b0..46bbc519 100644 --- a/src/Modifiers/FillModifier.php +++ b/src/Modifiers/FillModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Geometry\Point; class FillModifier extends SpecializableModifier diff --git a/src/Modifiers/FlipModifier.php b/src/Modifiers/FlipModifier.php index ea464852..502cb3e5 100644 --- a/src/Modifiers/FlipModifier.php +++ b/src/Modifiers/FlipModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class FlipModifier extends SpecializableModifier { } diff --git a/src/Modifiers/FlopModifier.php b/src/Modifiers/FlopModifier.php index 50ceb6b6..b6ae153c 100644 --- a/src/Modifiers/FlopModifier.php +++ b/src/Modifiers/FlopModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class FlopModifier extends SpecializableModifier { } diff --git a/src/Modifiers/GammaModifier.php b/src/Modifiers/GammaModifier.php index 3150676e..53b978c1 100644 --- a/src/Modifiers/GammaModifier.php +++ b/src/Modifiers/GammaModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class GammaModifier extends SpecializableModifier { public function __construct(public float $gamma) diff --git a/src/Modifiers/GreyscaleModifier.php b/src/Modifiers/GreyscaleModifier.php index 034008d4..85f5a6f6 100644 --- a/src/Modifiers/GreyscaleModifier.php +++ b/src/Modifiers/GreyscaleModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class GreyscaleModifier extends SpecializableModifier { } diff --git a/src/Modifiers/InvertModifier.php b/src/Modifiers/InvertModifier.php index 9eff2778..1482c468 100644 --- a/src/Modifiers/InvertModifier.php +++ b/src/Modifiers/InvertModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class InvertModifier extends SpecializableModifier { } diff --git a/src/Modifiers/PixelateModifier.php b/src/Modifiers/PixelateModifier.php index 1468d428..51cb770b 100644 --- a/src/Modifiers/PixelateModifier.php +++ b/src/Modifiers/PixelateModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class PixelateModifier extends SpecializableModifier { public function __construct(public int $size) diff --git a/src/Modifiers/PlaceModifier.php b/src/Modifiers/PlaceModifier.php index 4289fdf2..aed2ea56 100644 --- a/src/Modifiers/PlaceModifier.php +++ b/src/Modifiers/PlaceModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\PointInterface; diff --git a/src/Modifiers/ProfileModifier.php b/src/Modifiers/ProfileModifier.php index 372f16ab..99e844b7 100644 --- a/src/Modifiers/ProfileModifier.php +++ b/src/Modifiers/ProfileModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Interfaces\ProfileInterface; class ProfileModifier extends SpecializableModifier diff --git a/src/Modifiers/ProfileRemovalModifier.php b/src/Modifiers/ProfileRemovalModifier.php index 978565db..7a860986 100644 --- a/src/Modifiers/ProfileRemovalModifier.php +++ b/src/Modifiers/ProfileRemovalModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class ProfileRemovalModifier extends SpecializableModifier { } diff --git a/src/Modifiers/QuantizeColorsModifier.php b/src/Modifiers/QuantizeColorsModifier.php index a5507ef4..7845582a 100644 --- a/src/Modifiers/QuantizeColorsModifier.php +++ b/src/Modifiers/QuantizeColorsModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class QuantizeColorsModifier extends SpecializableModifier { public function __construct( diff --git a/src/Modifiers/RemoveAnimationModifier.php b/src/Modifiers/RemoveAnimationModifier.php index af961976..15459a4f 100644 --- a/src/Modifiers/RemoveAnimationModifier.php +++ b/src/Modifiers/RemoveAnimationModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\InputException; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Interfaces\FrameInterface; diff --git a/src/Modifiers/ResizeCanvasModifier.php b/src/Modifiers/ResizeCanvasModifier.php index d4e5ed43..8fafbf92 100644 --- a/src/Modifiers/ResizeCanvasModifier.php +++ b/src/Modifiers/ResizeCanvasModifier.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Rectangle; use Intervention\Image\Interfaces\ImageInterface; @@ -20,17 +21,27 @@ class ResizeCanvasModifier extends SpecializableModifier } /** + * Build the crop size to be used for the ResizeCanvas process + * + * @param ImageInterface $image + * @param bool $relative * @throws RuntimeException + * @return SizeInterface */ - public function cropSize(ImageInterface $image): SizeInterface + protected function cropSize(ImageInterface $image, bool $relative = false): SizeInterface { - $width = is_null($this->width) ? $image->width() : $this->width; - $height = is_null($this->height) ? $image->height() : $this->height; - return (new Rectangle($width, $height)) - ->alignPivotTo( - $image->size(), - $this->position - ); + $size = match ($relative) { + true => new Rectangle( + is_null($this->width) ? $image->width() : $image->width() + $this->width, + is_null($this->height) ? $image->height() : $image->height() + $this->height, + ), + default => new Rectangle( + is_null($this->width) ? $image->width() : $this->width, + is_null($this->height) ? $image->height() : $this->height, + ), + }; + + return $size->alignPivotTo($image->size(), $this->position); } } diff --git a/src/Modifiers/ResizeCanvasRelativeModifier.php b/src/Modifiers/ResizeCanvasRelativeModifier.php index 5d959bbd..1d865207 100644 --- a/src/Modifiers/ResizeCanvasRelativeModifier.php +++ b/src/Modifiers/ResizeCanvasRelativeModifier.php @@ -4,21 +4,6 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; -use Intervention\Image\Geometry\Rectangle; -use Intervention\Image\Interfaces\ImageInterface; -use Intervention\Image\Interfaces\SizeInterface; - class ResizeCanvasRelativeModifier extends ResizeCanvasModifier { - public function cropSize(ImageInterface $image): SizeInterface - { - $width = is_null($this->width) ? $image->width() : $image->width() + $this->width; - $height = is_null($this->height) ? $image->height() : $image->height() + $this->height; - - return (new Rectangle($width, $height)) - ->alignPivotTo( - $image->size(), - $this->position - ); - } } diff --git a/src/Modifiers/ResizeModifier.php b/src/Modifiers/ResizeModifier.php index 34b7eb48..51d3783c 100644 --- a/src/Modifiers/ResizeModifier.php +++ b/src/Modifiers/ResizeModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class ResizeModifier extends SpecializableModifier { public function __construct(public ?int $width = null, public ?int $height = null) diff --git a/src/Modifiers/ResolutionModifier.php b/src/Modifiers/ResolutionModifier.php index fc91bfec..49e5efd5 100644 --- a/src/Modifiers/ResolutionModifier.php +++ b/src/Modifiers/ResolutionModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class ResolutionModifier extends SpecializableModifier { public function __construct(public float $x, public float $y) diff --git a/src/Modifiers/RotateModifier.php b/src/Modifiers/RotateModifier.php index feb6c7fe..31335654 100644 --- a/src/Modifiers/RotateModifier.php +++ b/src/Modifiers/RotateModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class RotateModifier extends SpecializableModifier { public function __construct(public float $angle, public mixed $background) diff --git a/src/Modifiers/SharpenModifier.php b/src/Modifiers/SharpenModifier.php index 32aa4728..7addb034 100644 --- a/src/Modifiers/SharpenModifier.php +++ b/src/Modifiers/SharpenModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class SharpenModifier extends SpecializableModifier { public function __construct(public int $amount) diff --git a/src/Modifiers/SliceAnimationModifier.php b/src/Modifiers/SliceAnimationModifier.php index 4d26a669..88254960 100644 --- a/src/Modifiers/SliceAnimationModifier.php +++ b/src/Modifiers/SliceAnimationModifier.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; + class SliceAnimationModifier extends SpecializableModifier { public function __construct(public int $offset = 0, public ?int $length = null) diff --git a/src/Modifiers/TextModifier.php b/src/Modifiers/TextModifier.php index b9068620..98f7e94e 100644 --- a/src/Modifiers/TextModifier.php +++ b/src/Modifiers/TextModifier.php @@ -4,7 +4,11 @@ declare(strict_types=1); namespace Intervention\Image\Modifiers; +use Intervention\Image\Drivers\SpecializableModifier; +use Intervention\Image\Exceptions\ColorException; +use Intervention\Image\Exceptions\RuntimeException; use Intervention\Image\Geometry\Point; +use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\FontInterface; class TextModifier extends SpecializableModifier @@ -15,4 +19,72 @@ class TextModifier extends SpecializableModifier public FontInterface $font ) { } + + /** + * Decode text color + * + * The text outline effect is drawn with a trick by plotting additional text + * under the actual text with an offset in the color of the outline effect. + * For this reason, no colors with transparency can be used for the text + * color or the color of the stroke effect, as this would be superimposed. + * + * @throws RuntimeException + * @throws ColorException + * @return ColorInterface + */ + protected function textColor(): ColorInterface + { + $color = $this->driver()->handleInput($this->font->color()); + + if ($this->font->hasStrokeEffect() && $color->isTransparent()) { + throw new ColorException( + 'The text color must be fully opaque when using the stroke effect.' + ); + } + + return $color; + } + + /** + * Decode outline stroke color + * + * @throws RuntimeException + * @throws ColorException + * @return ColorInterface + */ + protected function strokeColor(): ColorInterface + { + $color = $this->driver()->handleInput($this->font->strokeColor()); + + if ($color->isTransparent()) { + throw new ColorException( + 'The stroke color must be fully opaque.' + ); + } + + return $color; + } + + /** + * Return array of offset points to draw text stroke effect below the actual text + * + * @param FontInterface $font + * @return array + */ + protected function strokeOffsets(FontInterface $font): array + { + $offsets = []; + + if ($font->strokeWidth() <= 0) { + return $offsets; + } + + for ($x = $font->strokeWidth() * -1; $x <= $font->strokeWidth(); $x++) { + for ($y = $font->strokeWidth() * -1; $y <= $font->strokeWidth(); $y++) { + $offsets[] = new Point($x, $y); + } + } + + return $offsets; + } } diff --git a/src/Traits/CanBeDriverSpecialized.php b/src/Traits/CanBeDriverSpecialized.php new file mode 100644 index 00000000..463050f4 --- /dev/null +++ b/src/Traits/CanBeDriverSpecialized.php @@ -0,0 +1,60 @@ +getConstructor()) { + foreach ($constructor->getParameters() as $parameter) { + $specializable[$parameter->getName()] = $this->{$parameter->getName()}; + } + } + + return $specializable; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::driver() + */ + public function driver(): DriverInterface + { + return $this->driver; + } + + /** + * {@inheritdoc} + * + * @see SpecializableInterface::setDriver() + */ + public function setDriver(DriverInterface $driver): SpecializableInterface + { + $this->driver = $driver; + + return $this; + } +} diff --git a/tests/BaseTestCase.php b/tests/BaseTestCase.php index a59ad9e5..1ebfedb8 100644 --- a/tests/BaseTestCase.php +++ b/tests/BaseTestCase.php @@ -21,6 +21,15 @@ abstract class BaseTestCase extends MockeryTestCase return file_get_contents($this->getTestResourcePath($filename)); } + public function getTestResourcePointer($filename = 'test.jpg') + { + $pointer = fopen('php://temp', 'rw'); + fputs($pointer, $this->getTestResourceData($filename)); + rewind($pointer); + + return $pointer; + } + protected function assertColor($r, $g, $b, $a, ColorInterface $color) { $this->assertEquals([$r, $g, $b, $a], $color->toArray()); diff --git a/tests/Unit/Drivers/AbstractDecoderTest.php b/tests/Unit/Drivers/AbstractDecoderTest.php index dff9514d..e156db8f 100644 --- a/tests/Unit/Drivers/AbstractDecoderTest.php +++ b/tests/Unit/Drivers/AbstractDecoderTest.php @@ -13,6 +13,7 @@ use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Tests\BaseTestCase; use Mockery; +use stdClass; #[CoversClass(\Intervention\Image\Drivers\AbstractDecoder::class)] final class AbstractDecoderTest extends BaseTestCase @@ -20,62 +21,63 @@ final class AbstractDecoderTest extends BaseTestCase public function testHandle(): void { $result = Mockery::mock(ColorInterface::class); - $decoder = Mockery::mock(AbstractDecoder::class)->makePartial(); + $decoder = Mockery::mock(AbstractDecoder::class); $decoder->shouldReceive('decode')->with('test input')->andReturn($result); - $decoder->handle('test input'); } public function testHandleFail(): void { - $decoder = Mockery::mock(AbstractDecoder::class, [])->makePartial()->shouldAllowMockingProtectedMethods(); + $decoder = Mockery::mock(AbstractDecoder::class, []); $decoder->shouldReceive('decode')->with('test input')->andThrow(DecoderException::class); - $this->expectException(DecoderException::class); - $decoder->handle('test input'); } public function testHandleFailWithSuccessor(): void { $result = Mockery::mock(ColorInterface::class); - $successor = Mockery::mock(AbstractDecoder::class)->makePartial(); + $successor = Mockery::mock(AbstractDecoder::class); $successor->shouldReceive('decode')->with('test input')->andReturn($result); - $decoder = Mockery::mock( AbstractDecoder::class, [$successor] - )->makePartial()->shouldAllowMockingProtectedMethods(); + ); $decoder->shouldReceive('decode')->with('test input')->andThrow(DecoderException::class); - $decoder->handle('test input'); } public function testIsGifFormat(): void { - $decoder = Mockery::mock(AbstractDecoder::class)->makePartial(); + $decoder = Mockery::mock(AbstractDecoder::class); $this->assertFalse($decoder->isGifFormat($this->getTestResourceData('exif.jpg'))); $this->assertTrue($decoder->isGifFormat($this->getTestResourceData('red.gif'))); } public function testIsFile(): void { - $decoder = Mockery::mock(AbstractDecoder::class)->makePartial(); + $decoder = Mockery::mock(AbstractDecoder::class); $this->assertTrue($decoder->isFile($this->getTestResourcePath())); $this->assertFalse($decoder->isFile('non-existent-file')); + $this->assertFalse($decoder->isFile(new stdClass())); + $this->assertFalse($decoder->isFile(str_repeat('o', PHP_MAXPATHLEN + 1))); + $this->assertFalse($decoder->isFile(__DIR__)); } public function testExtractExifDataFromBinary(): void { - $decoder = Mockery::mock(AbstractDecoder::class)->makePartial(); - $result = $decoder->extractExifData($this->getTestResourceData('exif.jpg')); + $source = $this->getTestResourceData('exif.jpg'); + $pointer = $this->getTestResourcePointer('exif.jpg'); + $decoder = Mockery::mock(AbstractDecoder::class); + $decoder->shouldReceive('buildFilePointer')->with($source)->andReturn($pointer); + $result = $decoder->extractExifData($source); $this->assertInstanceOf(CollectionInterface::class, $result); $this->assertEquals('Oliver Vogel', $result->get('IFD0.Artist')); } public function testExtractExifDataFromPath(): void { - $decoder = Mockery::mock(AbstractDecoder::class)->makePartial(); + $decoder = Mockery::mock(AbstractDecoder::class); $result = $decoder->extractExifData($this->getTestResourcePath('exif.jpg')); $this->assertInstanceOf(CollectionInterface::class, $result); $this->assertEquals('Oliver Vogel', $result->get('IFD0.Artist')); @@ -145,5 +147,9 @@ final class AbstractDecoderTest extends BaseTestCase $this->assertFalse( $decoder->isValid('foo') ); + + $this->assertFalse( + $decoder->isValid(new stdClass()) + ); } } diff --git a/tests/Unit/Drivers/AbstractEncoderTest.php b/tests/Unit/Drivers/AbstractEncoderTest.php new file mode 100644 index 00000000..10f46040 --- /dev/null +++ b/tests/Unit/Drivers/AbstractEncoderTest.php @@ -0,0 +1,43 @@ +makePartial(); + $image = Mockery::mock(ImageInterface::class); + $encoded = Mockery::mock(EncodedImage::class); + $image->shouldReceive('encode')->andReturn($encoded); + $result = $encoder->encode($image); + $this->assertInstanceOf(EncodedImage::class, $result); + } + + public function testGetBuffered(): void + { + $encoder = new class () extends AbstractEncoder + { + public function test(callable $callback) + { + return $this->buffered($callback); + } + }; + + $result = $encoder->test(function () { + echo 'result'; + }); + + $this->assertEquals('result', $result); + } +} diff --git a/tests/Unit/Drivers/AbstractTextModifierTest.php b/tests/Unit/Drivers/AbstractTextModifierTest.php deleted file mode 100644 index 2b3c761c..00000000 --- a/tests/Unit/Drivers/AbstractTextModifierTest.php +++ /dev/null @@ -1,39 +0,0 @@ -makePartial(); - $this->assertEquals([ - ], $modifier->strokeOffsets( - new Font() - )); - - $this->assertEquals([ - new Point(-1, -1), - new Point(-1, 0), - new Point(-1, 1), - new Point(0, -1), - new Point(0, 0), - new Point(0, 1), - new Point(1, -1), - new Point(1, 0), - new Point(1, 1), - ], $modifier->strokeOffsets( - (new Font())->setStrokeWidth(1) - )); - } -} diff --git a/tests/Unit/Drivers/DriverSpecializedEncoderTest.php b/tests/Unit/Drivers/DriverSpecializedEncoderTest.php deleted file mode 100644 index ed03ca74..00000000 --- a/tests/Unit/Drivers/DriverSpecializedEncoderTest.php +++ /dev/null @@ -1,27 +0,0 @@ -makePartial(); - $result = $encoder->getBuffered(function () { - echo 'result'; - }); - $this->assertEquals('result', $result); - } -} diff --git a/tests/Unit/Drivers/DriverSpecializedTest.php b/tests/Unit/Drivers/DriverSpecializedTest.php deleted file mode 100644 index 6df5358b..00000000 --- a/tests/Unit/Drivers/DriverSpecializedTest.php +++ /dev/null @@ -1,39 +0,0 @@ -assertInstanceOf(JpegEncoder::class, $specialized->generic()); - $this->assertInstanceOf(DriverInterface::class, $specialized->driver()); - $this->assertEquals(10, $specialized->quality); - } -} diff --git a/tests/Unit/Drivers/Gd/Modifiers/TextModifierTest.php b/tests/Unit/Drivers/Gd/Modifiers/TextModifierTest.php new file mode 100644 index 00000000..3bd1f503 --- /dev/null +++ b/tests/Unit/Drivers/Gd/Modifiers/TextModifierTest.php @@ -0,0 +1,37 @@ +setColor('ff0055'); + + $modifier = new class ('test', new Point(), $font) extends TextModifier + { + public function test() + { + return $this->textColor(); + } + }; + + $modifier->setDriver(new Driver()); + + $this->assertInstanceOf(ColorInterface::class, $modifier->test()); + } +} diff --git a/tests/Unit/Drivers/Imagick/Modifiers/TextModifierTest.php b/tests/Unit/Drivers/Imagick/Modifiers/TextModifierTest.php new file mode 100644 index 00000000..232b6c3e --- /dev/null +++ b/tests/Unit/Drivers/Imagick/Modifiers/TextModifierTest.php @@ -0,0 +1,37 @@ +setColor('ff0055'); + + $modifier = new class ('test', new Point(), $font) extends TextModifier + { + public function test() + { + return $this->textColor(); + } + }; + + $modifier->setDriver(new Driver()); + + $this->assertInstanceOf(ColorInterface::class, $modifier->test()); + } +} diff --git a/tests/Unit/Analyzers/SpecializableAnalyzerTest.php b/tests/Unit/Drivers/SpecializableAnalyzerTest.php similarity index 83% rename from tests/Unit/Analyzers/SpecializableAnalyzerTest.php rename to tests/Unit/Drivers/SpecializableAnalyzerTest.php index b109c16b..b6345718 100644 --- a/tests/Unit/Analyzers/SpecializableAnalyzerTest.php +++ b/tests/Unit/Drivers/SpecializableAnalyzerTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Intervention\Image\Tests\Unit\Analyzers; +namespace Intervention\Image\Tests\Unit\Drivers; -use Intervention\Image\Analyzers\SpecializableAnalyzer; +use Intervention\Image\Drivers\SpecializableAnalyzer; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Tests\BaseTestCase; use Mockery; @@ -16,7 +16,6 @@ final class SpecializableAnalyzerTest extends BaseTestCase $analyzer = Mockery::mock(SpecializableAnalyzer::class)->makePartial(); $image = Mockery::mock(ImageInterface::class); $image->shouldReceive('analyze')->andReturn('test'); - $result = $analyzer->analyze($image); $this->assertEquals('test', $result); } diff --git a/tests/Unit/Decoders/SpecializableDecoderTest.php b/tests/Unit/Drivers/SpecializableDecoderTest.php similarity index 80% rename from tests/Unit/Decoders/SpecializableDecoderTest.php rename to tests/Unit/Drivers/SpecializableDecoderTest.php index 0c0a5a00..a6c5c3b9 100644 --- a/tests/Unit/Decoders/SpecializableDecoderTest.php +++ b/tests/Unit/Drivers/SpecializableDecoderTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Intervention\Image\Tests\Unit\Decoders; +namespace Intervention\Image\Tests\Unit\Drivers; -use Intervention\Image\Decoders\SpecializableDecoder; +use Intervention\Image\Drivers\SpecializableDecoder; use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Tests\BaseTestCase; use Mockery; diff --git a/tests/Unit/Modifiers/SpecializableModifierTest.php b/tests/Unit/Drivers/SpecializableModifierTest.php similarity index 83% rename from tests/Unit/Modifiers/SpecializableModifierTest.php rename to tests/Unit/Drivers/SpecializableModifierTest.php index 603cbd26..bea67973 100644 --- a/tests/Unit/Modifiers/SpecializableModifierTest.php +++ b/tests/Unit/Drivers/SpecializableModifierTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -namespace Intervention\Image\Tests\Unit\Modifiers; +namespace Intervention\Image\Tests\Unit\Drivers; -use Intervention\Image\Modifiers\SpecializableModifier; +use Intervention\Image\Drivers\SpecializableModifier; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Tests\BaseTestCase; use Mockery; @@ -16,7 +16,6 @@ final class SpecializableModifierTest extends BaseTestCase $modifier = Mockery::mock(SpecializableModifier::class)->makePartial(); $image = Mockery::mock(ImageInterface::class); $image->shouldReceive('modify')->andReturn($image); - $result = $modifier->apply($image); $this->assertInstanceOf(ImageInterface::class, $result); } diff --git a/tests/Unit/Encoders/FileExtensionEncoderTest.php b/tests/Unit/Encoders/FileExtensionEncoderTest.php index 01dfae23..444b7ec2 100644 --- a/tests/Unit/Encoders/FileExtensionEncoderTest.php +++ b/tests/Unit/Encoders/FileExtensionEncoderTest.php @@ -15,65 +15,76 @@ use Intervention\Image\Encoders\PngEncoder; use Intervention\Image\Encoders\TiffEncoder; use Intervention\Image\Encoders\WebpEncoder; use Intervention\Image\Exceptions\EncoderException; +use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Tests\BaseTestCase; -use Mockery; final class FileExtensionEncoderTest extends BaseTestCase { + private function testEncoder(string $extension): EncoderInterface + { + $encoder = new class () extends FileExtensionEncoder + { + public function test($extension) + { + return $this->encoderByFileExtension($extension); + } + }; + + return $encoder->test($extension); + } + public function testEncoderByFileExtension(): void { - $encoder = Mockery::mock(FileExtensionEncoder::class); $this->assertInstanceOf( WebpEncoder::class, - $encoder->encoderByFileExtension('webp') + $this->testEncoder('webp') ); $this->assertInstanceOf( AvifEncoder::class, - $encoder->encoderByFileExtension('avif') + $this->testEncoder('avif') ); $this->assertInstanceOf( JpegEncoder::class, - $encoder->encoderByFileExtension('jpeg') + $this->testEncoder('jpeg') ); $this->assertInstanceOf( BmpEncoder::class, - $encoder->encoderByFileExtension('bmp') + $this->testEncoder('bmp') ); $this->assertInstanceOf( GifEncoder::class, - $encoder->encoderByFileExtension('gif') + $this->testEncoder('gif') ); $this->assertInstanceOf( PngEncoder::class, - $encoder->encoderByFileExtension('png') + $this->testEncoder('png') ); $this->assertInstanceOf( TiffEncoder::class, - $encoder->encoderByFileExtension('tiff') + $this->testEncoder('tiff') ); $this->assertInstanceOf( Jpeg2000Encoder::class, - $encoder->encoderByFileExtension('jp2') + $this->testEncoder('jp2') ); $this->assertInstanceOf( HeicEncoder::class, - $encoder->encoderByFileExtension('heic') + $this->testEncoder('heic') ); } public function testEncoderByFileExtensionUnknown(): void { - $encoder = Mockery::mock(FileExtensionEncoder::class); $this->expectException(EncoderException::class); - $encoder->encoderByFileExtension('test'); + $this->testEncoder('test'); } } diff --git a/tests/Unit/Encoders/SpecializableEncoderTest.php b/tests/Unit/Encoders/SpecializableEncoderTest.php deleted file mode 100644 index f6a63f5a..00000000 --- a/tests/Unit/Encoders/SpecializableEncoderTest.php +++ /dev/null @@ -1,52 +0,0 @@ -assertEquals(75, $encoder->quality); - } - - public function testConstructorList(): void - { - $encoder = new class (1) extends SpecializableEncoder - { - }; - - $this->assertEquals(1, $encoder->quality); - } - - public function testConstructorNamed(): void - { - $encoder = new class (quality: 1) extends SpecializableEncoder - { - }; - - $this->assertEquals(1, $encoder->quality); - } - - public function testEncode(): void - { - $encoder = Mockery::mock(SpecializableEncoder::class)->makePartial(); - $image = Mockery::mock(ImageInterface::class); - $encoded = Mockery::mock(EncodedImage::class); - $image->shouldReceive('encode')->andReturn($encoded); - - $result = $encoder->encode($image); - $this->assertInstanceOf(EncodedImage::class, $result); - } -} diff --git a/tests/Unit/Modifiers/TextModifierTest.php b/tests/Unit/Modifiers/TextModifierTest.php new file mode 100644 index 00000000..6db0c88f --- /dev/null +++ b/tests/Unit/Modifiers/TextModifierTest.php @@ -0,0 +1,38 @@ +strokeOffsets($font); + } + }; + + $this->assertEquals([], $modifier->testStrokeOffsets(new Font())); + + $this->assertEquals([ + new Point(-1, -1), + new Point(-1, 0), + new Point(-1, 1), + new Point(0, -1), + new Point(0, 0), + new Point(0, 1), + new Point(1, -1), + new Point(1, 0), + new Point(1, 1), + ], $modifier->testStrokeOffsets((new Font())->setStrokeWidth(1))); + } +}