mirror of
https://github.com/Intervention/image.git
synced 2025-08-30 09:10:21 +02:00
Add DriverInterface::handleImageInput() & handleColorInput()
This commit is contained in:
@@ -60,6 +60,50 @@ abstract class AbstractDriver implements DriverInterface
|
|||||||
return InputHandler::withDecoders($decoders, $this)->handle($input);
|
return InputHandler::withDecoders($decoders, $this)->handle($input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::handleImageInput()
|
||||||
|
*
|
||||||
|
* @throws DriverException|DecoderException|NotSupportedException|RuntimeException
|
||||||
|
*/
|
||||||
|
public function handleImageInput(mixed $input, array $decoders = []): ImageInterface
|
||||||
|
{
|
||||||
|
$handler = count($decoders) ?
|
||||||
|
InputHandler::withDecoders($decoders, $this) :
|
||||||
|
InputHandler::withImageDecoders($this);
|
||||||
|
|
||||||
|
$result = $handler->handle($input);
|
||||||
|
|
||||||
|
if (!($result instanceof ImageInterface)) {
|
||||||
|
throw new DecoderException('Unable to decode input to instance of ImageInterface.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*
|
||||||
|
* @see DriverInterface::handleColorInput()
|
||||||
|
*
|
||||||
|
* @throws DriverException|DecoderException|NotSupportedException|RuntimeException
|
||||||
|
*/
|
||||||
|
public function handleColorInput(mixed $input, array $decoders = []): ColorInterface
|
||||||
|
{
|
||||||
|
$handler = count($decoders) ?
|
||||||
|
InputHandler::withDecoders($decoders, $this) :
|
||||||
|
InputHandler::withColorDecoders($this);
|
||||||
|
|
||||||
|
$result = $handler->handle($input);
|
||||||
|
|
||||||
|
if (!($result instanceof ColorInterface)) {
|
||||||
|
throw new DecoderException('Unable to decode input to instance of ColorInterface.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*
|
*
|
||||||
|
@@ -6,6 +6,7 @@ namespace Intervention\Image\Drivers\Gd;
|
|||||||
|
|
||||||
use Intervention\Image\Exceptions\AnimationException;
|
use Intervention\Image\Exceptions\AnimationException;
|
||||||
use Intervention\Image\Exceptions\DecoderException;
|
use Intervention\Image\Exceptions\DecoderException;
|
||||||
|
use Intervention\Image\Exceptions\RuntimeException;
|
||||||
use Intervention\Image\Image;
|
use Intervention\Image\Image;
|
||||||
use Intervention\Image\Interfaces\AnimationFactoryInterface;
|
use Intervention\Image\Interfaces\AnimationFactoryInterface;
|
||||||
use Intervention\Image\Interfaces\CoreInterface;
|
use Intervention\Image\Interfaces\CoreInterface;
|
||||||
@@ -24,11 +25,12 @@ class AnimationFactory implements AnimationFactoryInterface
|
|||||||
/**
|
/**
|
||||||
* @throws AnimationException
|
* @throws AnimationException
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function add(mixed $source, float $delay = 1): self
|
public function add(mixed $source, float $delay = 1): self
|
||||||
{
|
{
|
||||||
$this->core->add(
|
$this->core->add(
|
||||||
$this->driver->handleInput($source)->core()->first()->setDelay($delay)
|
$this->driver->handleImageInput($source)->core()->first()->setDelay($delay)
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@@ -19,7 +19,7 @@ class JpegEncoder extends GenericJpegEncoder implements SpecializedInterface
|
|||||||
*/
|
*/
|
||||||
public function encode(ImageInterface $image): EncodedImage
|
public function encode(ImageInterface $image): EncodedImage
|
||||||
{
|
{
|
||||||
$backgroundColor = $this->driver()->handleInput(
|
$backgroundColor = $this->driver()->handleColorInput(
|
||||||
$this->driver()->config()->backgroundColor
|
$this->driver()->config()->backgroundColor
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -18,7 +18,7 @@ class DrawPixelModifier extends GenericDrawPixelModifier implements SpecializedI
|
|||||||
public function apply(ImageInterface $image): ImageInterface
|
public function apply(ImageInterface $image): ImageInterface
|
||||||
{
|
{
|
||||||
$color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
$color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
||||||
$this->driver()->handleInput($this->color)
|
$this->driver()->handleColorInput($this->color)
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($image as $frame) {
|
foreach ($image as $frame) {
|
||||||
|
@@ -38,7 +38,7 @@ class FillModifier extends GenericFillModifier implements SpecializedInterface
|
|||||||
private function color(ImageInterface $image): int
|
private function color(ImageInterface $image): int
|
||||||
{
|
{
|
||||||
return $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
return $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
||||||
$this->driver()->handleInput($this->color)
|
$this->driver()->handleColorInput($this->color)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,7 +20,7 @@ class PlaceModifier extends GenericPlaceModifier implements SpecializedInterface
|
|||||||
*/
|
*/
|
||||||
public function apply(ImageInterface $image): ImageInterface
|
public function apply(ImageInterface $image): ImageInterface
|
||||||
{
|
{
|
||||||
$watermark = $this->driver()->handleInput($this->element);
|
$watermark = $this->driver()->handleImageInput($this->element);
|
||||||
$position = $this->position($image, $watermark);
|
$position = $this->position($image, $watermark);
|
||||||
|
|
||||||
foreach ($image as $frame) {
|
foreach ($image as $frame) {
|
||||||
|
@@ -7,6 +7,7 @@ namespace Intervention\Image\Drivers\Imagick;
|
|||||||
use Imagick;
|
use Imagick;
|
||||||
use Intervention\Image\Exceptions\AnimationException;
|
use Intervention\Image\Exceptions\AnimationException;
|
||||||
use Intervention\Image\Exceptions\DecoderException;
|
use Intervention\Image\Exceptions\DecoderException;
|
||||||
|
use Intervention\Image\Exceptions\RuntimeException;
|
||||||
use Intervention\Image\Image;
|
use Intervention\Image\Image;
|
||||||
use Intervention\Image\Interfaces\AnimationFactoryInterface;
|
use Intervention\Image\Interfaces\AnimationFactoryInterface;
|
||||||
use Intervention\Image\Interfaces\DriverInterface;
|
use Intervention\Image\Interfaces\DriverInterface;
|
||||||
@@ -24,10 +25,11 @@ class AnimationFactory implements AnimationFactoryInterface
|
|||||||
/**
|
/**
|
||||||
* @throws AnimationException
|
* @throws AnimationException
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function add(mixed $source, float $delay = 1): self
|
public function add(mixed $source, float $delay = 1): self
|
||||||
{
|
{
|
||||||
$native = $this->driver->handleInput($source)->core()->native();
|
$native = $this->driver->handleImageInput($source)->core()->native();
|
||||||
$native->setImageDelay(intval(round($delay * 100)));
|
$native->setImageDelay(intval(round($delay * 100)));
|
||||||
|
|
||||||
$this->imagick->addImage($native);
|
$this->imagick->addImage($native);
|
||||||
|
@@ -18,7 +18,7 @@ class JpegEncoder extends GenericJpegEncoder implements SpecializedInterface
|
|||||||
{
|
{
|
||||||
$format = 'JPEG';
|
$format = 'JPEG';
|
||||||
$compression = Imagick::COMPRESSION_JPEG;
|
$compression = Imagick::COMPRESSION_JPEG;
|
||||||
$backgroundColor = $this->driver()->handleInput(
|
$backgroundColor = $this->driver()->handleColorInput(
|
||||||
$this->driver()->config()->backgroundColor
|
$this->driver()->config()->backgroundColor
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -14,7 +14,7 @@ class DrawPixelModifier extends GenericDrawPixelModifier implements SpecializedI
|
|||||||
public function apply(ImageInterface $image): ImageInterface
|
public function apply(ImageInterface $image): ImageInterface
|
||||||
{
|
{
|
||||||
$color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
$color = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
||||||
$this->driver()->handleInput($this->color)
|
$this->driver()->handleColorInput($this->color)
|
||||||
);
|
);
|
||||||
|
|
||||||
$pixel = new ImagickDraw();
|
$pixel = new ImagickDraw();
|
||||||
|
@@ -16,7 +16,7 @@ class FillModifier extends ModifiersFillModifier implements SpecializedInterface
|
|||||||
public function apply(ImageInterface $image): ImageInterface
|
public function apply(ImageInterface $image): ImageInterface
|
||||||
{
|
{
|
||||||
$pixel = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
$pixel = $this->driver()->colorProcessor($image->colorspace())->colorToNative(
|
||||||
$this->driver()->handleInput($this->color)
|
$this->driver()->handleColorInput($this->color)
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($image->core()->native() as $frame) {
|
foreach ($image->core()->native() as $frame) {
|
||||||
|
@@ -13,7 +13,7 @@ class PlaceModifier extends GenericPlaceModifier implements SpecializedInterface
|
|||||||
{
|
{
|
||||||
public function apply(ImageInterface $image): ImageInterface
|
public function apply(ImageInterface $image): ImageInterface
|
||||||
{
|
{
|
||||||
$watermark = $this->driver()->handleInput($this->element);
|
$watermark = $this->driver()->handleImageInput($this->element);
|
||||||
$position = $this->position($image, $watermark);
|
$position = $this->position($image, $watermark);
|
||||||
|
|
||||||
// set opacity of watermark
|
// set opacity of watermark
|
||||||
|
@@ -59,7 +59,7 @@ class TextModifier extends GenericTextModifier implements SpecializedInterface
|
|||||||
*/
|
*/
|
||||||
private function imagickDrawText(ImageInterface $image, FontInterface $font): ImagickDraw
|
private function imagickDrawText(ImageInterface $image, FontInterface $font): ImagickDraw
|
||||||
{
|
{
|
||||||
$color = $this->driver()->handleInput($font->color());
|
$color = $this->driver()->handleColorInput($font->color());
|
||||||
|
|
||||||
if ($font->hasStrokeEffect() && $color->isTransparent()) {
|
if ($font->hasStrokeEffect() && $color->isTransparent()) {
|
||||||
throw new ColorException(
|
throw new ColorException(
|
||||||
@@ -87,7 +87,7 @@ class TextModifier extends GenericTextModifier implements SpecializedInterface
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$color = $this->driver()->handleInput($font->strokeColor());
|
$color = $this->driver()->handleColorInput($font->strokeColor());
|
||||||
|
|
||||||
if ($color->isTransparent()) {
|
if ($color->isTransparent()) {
|
||||||
throw new ColorException(
|
throw new ColorException(
|
||||||
|
@@ -407,7 +407,7 @@ final class Image implements ImageInterface
|
|||||||
*/
|
*/
|
||||||
public function backgroundColor(): ColorInterface
|
public function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput(
|
return $this->driver()->handleColorInput(
|
||||||
$this->driver()->config()->backgroundColor
|
$this->driver()->config()->backgroundColor
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -420,7 +420,7 @@ final class Image implements ImageInterface
|
|||||||
public function setBackgroundColor(string|ColorInterface $color): ImageInterface
|
public function setBackgroundColor(string|ColorInterface $color): ImageInterface
|
||||||
{
|
{
|
||||||
$this->driver()->config()->setOptions(
|
$this->driver()->config()->setOptions(
|
||||||
backgroundColor: $this->driver()->handleInput($color)
|
backgroundColor: $this->driver()->handleColorInput($color)
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
|
@@ -91,7 +91,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readPath(string $path): ImageInterface
|
public function readPath(string $path): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($path, [FilePathImageDecoder::class]);
|
return $this->driver->handleImageInput($path, [FilePathImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -101,7 +101,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readBinary(string $data): ImageInterface
|
public function readBinary(string $data): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($data, [BinaryImageDecoder::class]);
|
return $this->driver->handleImageInput($data, [BinaryImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -111,7 +111,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readBase64(string $data): ImageInterface
|
public function readBase64(string $data): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($data, [Base64ImageDecoder::class]);
|
return $this->driver->handleImageInput($data, [Base64ImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,7 +121,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readDataUri(string $uri): ImageInterface
|
public function readDataUri(string $uri): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($uri, [DataUriImageDecoder::class]);
|
return $this->driver->handleImageInput($uri, [DataUriImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -131,7 +131,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readStream(mixed $stream): ImageInterface
|
public function readStream(mixed $stream): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($stream, [FilePointerImageDecoder::class]);
|
return $this->driver->handleImageInput($stream, [FilePointerImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -141,7 +141,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function readSplFileInfo(SplFileInfo $file): ImageInterface
|
public function readSplFileInfo(SplFileInfo $file): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput($file, [SplFileInfoImageDecoder::class]);
|
return $this->driver->handleImageInput($file, [SplFileInfoImageDecoder::class]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +151,7 @@ final class ImageManager implements ImageManagerInterface
|
|||||||
*/
|
*/
|
||||||
public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface
|
public function read(mixed $input, string|array|DecoderInterface $decoders = []): ImageInterface
|
||||||
{
|
{
|
||||||
return $this->driver->handleInput(
|
return $this->driver->handleImageInput(
|
||||||
$input,
|
$input,
|
||||||
match (true) {
|
match (true) {
|
||||||
is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders],
|
is_string($decoders), is_a($decoders, DecoderInterface::class) => [$decoders],
|
||||||
|
@@ -33,22 +33,9 @@ use Intervention\Image\Interfaces\InputHandlerInterface;
|
|||||||
|
|
||||||
class InputHandler implements InputHandlerInterface
|
class InputHandler implements InputHandlerInterface
|
||||||
{
|
{
|
||||||
/**
|
public const IMAGE_DECODERS = [
|
||||||
* Decoder classnames in hierarchical order
|
|
||||||
*
|
|
||||||
* @var array<string|DecoderInterface>
|
|
||||||
*/
|
|
||||||
protected array $decoders = [
|
|
||||||
NativeObjectDecoder::class,
|
NativeObjectDecoder::class,
|
||||||
ImageObjectDecoder::class,
|
ImageObjectDecoder::class,
|
||||||
ColorObjectDecoder::class,
|
|
||||||
RgbHexColorDecoder::class,
|
|
||||||
RgbStringColorDecoder::class,
|
|
||||||
CmykStringColorDecoder::class,
|
|
||||||
HsvStringColorDecoder::class,
|
|
||||||
HslStringColorDecoder::class,
|
|
||||||
TransparentColorDecoder::class,
|
|
||||||
HtmlColornameDecoder::class,
|
|
||||||
FilePointerImageDecoder::class,
|
FilePointerImageDecoder::class,
|
||||||
FilePathImageDecoder::class,
|
FilePathImageDecoder::class,
|
||||||
SplFileInfoImageDecoder::class,
|
SplFileInfoImageDecoder::class,
|
||||||
@@ -58,6 +45,24 @@ class InputHandler implements InputHandlerInterface
|
|||||||
EncodedImageObjectDecoder::class,
|
EncodedImageObjectDecoder::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public const COLOR_DECODERS = [
|
||||||
|
ColorObjectDecoder::class,
|
||||||
|
RgbHexColorDecoder::class,
|
||||||
|
RgbStringColorDecoder::class,
|
||||||
|
CmykStringColorDecoder::class,
|
||||||
|
HsvStringColorDecoder::class,
|
||||||
|
HslStringColorDecoder::class,
|
||||||
|
TransparentColorDecoder::class,
|
||||||
|
HtmlColornameDecoder::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decoder classnames in hierarchical order
|
||||||
|
*
|
||||||
|
* @var array<string|DecoderInterface>
|
||||||
|
*/
|
||||||
|
protected array $decoders = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Driver with which the decoder classes are specialized
|
* Driver with which the decoder classes are specialized
|
||||||
*/
|
*/
|
||||||
@@ -71,12 +76,12 @@ class InputHandler implements InputHandlerInterface
|
|||||||
*/
|
*/
|
||||||
public function __construct(array $decoders = [], ?DriverInterface $driver = null)
|
public function __construct(array $decoders = [], ?DriverInterface $driver = null)
|
||||||
{
|
{
|
||||||
$this->decoders = count($decoders) ? $decoders : $this->decoders;
|
$this->decoders = count($decoders) ? $decoders : array_merge(self::COLOR_DECODERS, self::IMAGE_DECODERS);
|
||||||
$this->driver = $driver;
|
$this->driver = $driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static factory method
|
* Static factory method to create input handler for both image and color handling
|
||||||
*
|
*
|
||||||
* @param array<string|DecoderInterface> $decoders
|
* @param array<string|DecoderInterface> $decoders
|
||||||
*/
|
*/
|
||||||
@@ -85,6 +90,22 @@ class InputHandler implements InputHandlerInterface
|
|||||||
return new self($decoders, $driver);
|
return new self($decoders, $driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static factory method to create input handler for image handling
|
||||||
|
*/
|
||||||
|
public static function withImageDecoders(?DriverInterface $driver = null): self
|
||||||
|
{
|
||||||
|
return new self(self::IMAGE_DECODERS, $driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static factory method to create input handler for color handling
|
||||||
|
*/
|
||||||
|
public static function withColorDecoders(?DriverInterface $driver = null): self
|
||||||
|
{
|
||||||
|
return new self(self::COLOR_DECODERS, $driver);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*
|
*
|
||||||
|
@@ -67,6 +67,36 @@ interface DriverInterface
|
|||||||
*/
|
*/
|
||||||
public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface;
|
public function handleInput(mixed $input, array $decoders = []): ImageInterface|ColorInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle given image source by decoding it to ImageInterface
|
||||||
|
*
|
||||||
|
* Image sources can be as follows:
|
||||||
|
*
|
||||||
|
* - Path in filesystem
|
||||||
|
* - Raw binary image data
|
||||||
|
* - Base64 encoded image data
|
||||||
|
* - Data Uri
|
||||||
|
* - File Pointer resource
|
||||||
|
* - SplFileInfo object
|
||||||
|
* - Intervention Image Instance (Intervention\Image\Image)
|
||||||
|
* - Encoded Intervention Image (Intervention\Image\EncodedImage)
|
||||||
|
* - Driver-specific image (instance of GDImage or Imagick)
|
||||||
|
*
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
public function handleImageInput(mixed $input, array $decoders = []): ImageInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle given image source by decoding it to ColorInterface
|
||||||
|
*
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
|
*/
|
||||||
|
public function handleColorInput(mixed $input, array $decoders = []): ColorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return color processor for the given colorspace
|
* Return color processor for the given colorspace
|
||||||
*/
|
*/
|
||||||
|
@@ -23,6 +23,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given file path
|
* Create new image instance from given file path
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readPath(string $path): ImageInterface;
|
public function readPath(string $path): ImageInterface;
|
||||||
|
|
||||||
@@ -30,6 +31,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given image binary data
|
* Create new image instance from given image binary data
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readBinary(string $data): ImageInterface;
|
public function readBinary(string $data): ImageInterface;
|
||||||
|
|
||||||
@@ -37,6 +39,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given base64 encoded image data
|
* Create new image instance from given base64 encoded image data
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readBase64(string $data): ImageInterface;
|
public function readBase64(string $data): ImageInterface;
|
||||||
|
|
||||||
@@ -44,6 +47,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given data uri encoded image data
|
* Create new image instance from given data uri encoded image data
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readDataUri(string $uri): ImageInterface;
|
public function readDataUri(string $uri): ImageInterface;
|
||||||
|
|
||||||
@@ -51,6 +55,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given image stream resource
|
* Create new image instance from given image stream resource
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readStream(mixed $stream): ImageInterface;
|
public function readStream(mixed $stream): ImageInterface;
|
||||||
|
|
||||||
@@ -58,6 +63,7 @@ interface ImageManagerInterface
|
|||||||
* Create new image instance from given SplFileInfo image object
|
* Create new image instance from given SplFileInfo image object
|
||||||
*
|
*
|
||||||
* @throws DecoderException
|
* @throws DecoderException
|
||||||
|
* @throws RuntimeException
|
||||||
*/
|
*/
|
||||||
public function readSplFileInfo(SplFileInfo $file): ImageInterface;
|
public function readSplFileInfo(SplFileInfo $file): ImageInterface;
|
||||||
|
|
||||||
|
@@ -23,9 +23,9 @@ abstract class AbstractDrawModifier extends SpecializableModifier
|
|||||||
public function backgroundColor(): ColorInterface
|
public function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$color = $this->driver()->handleInput($this->drawable()->backgroundColor());
|
$color = $this->driver()->handleColorInput($this->drawable()->backgroundColor());
|
||||||
} catch (DecoderException) {
|
} catch (DecoderException) {
|
||||||
return $this->driver()->handleInput('transparent');
|
return $this->driver()->handleColorInput('transparent');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $color;
|
return $color;
|
||||||
@@ -37,9 +37,9 @@ abstract class AbstractDrawModifier extends SpecializableModifier
|
|||||||
public function borderColor(): ColorInterface
|
public function borderColor(): ColorInterface
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$color = $this->driver()->handleInput($this->drawable()->borderColor());
|
$color = $this->driver()->handleColorInput($this->drawable()->borderColor());
|
||||||
} catch (DecoderException) {
|
} catch (DecoderException) {
|
||||||
return $this->driver()->handleInput('transparent');
|
return $this->driver()->handleColorInput('transparent');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $color;
|
return $color;
|
||||||
|
@@ -36,7 +36,7 @@ class BackgroundModifier extends SpecializableModifier
|
|||||||
protected function backgroundColor(DriverInterface $driver): ColorInterface
|
protected function backgroundColor(DriverInterface $driver): ColorInterface
|
||||||
{
|
{
|
||||||
// decode background color
|
// decode background color
|
||||||
$color = $driver->handleInput(
|
$color = $driver->handleColorInput(
|
||||||
$this->color ?: $driver->config()->backgroundColor
|
$this->color ?: $driver->config()->backgroundColor
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@@ -54,6 +54,6 @@ class ContainModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function backgroundColor(): ColorInterface
|
protected function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput($this->background ?? $this->driver()->config()->backgroundColor);
|
return $this->driver()->handleColorInput($this->background ?? $this->driver()->config()->backgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -51,6 +51,6 @@ class CropModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function backgroundColor(): ColorInterface
|
protected function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput($this->background ?? $this->driver()->config()->backgroundColor);
|
return $this->driver()->handleColorInput($this->background ?? $this->driver()->config()->backgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,8 @@ class QuantizeColorsModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function backgroundColor(): ColorInterface
|
protected function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput($this->background ?? $this->driver()->config()->backgroundColor);
|
return $this->driver()->handleColorInput(
|
||||||
|
$this->background ?? $this->driver()->config()->backgroundColor
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,6 +56,8 @@ class ResizeCanvasModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function backgroundColor(): ColorInterface
|
protected function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput($this->background ?? $this->driver()->config()->backgroundColor);
|
return $this->driver()->handleColorInput(
|
||||||
|
$this->background ?? $this->driver()->config()->backgroundColor,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,8 @@ class RotateModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function backgroundColor(): ColorInterface
|
protected function backgroundColor(): ColorInterface
|
||||||
{
|
{
|
||||||
return $this->driver()->handleInput($this->background ?? $this->driver()->config()->backgroundColor);
|
return $this->driver()->handleColorInput(
|
||||||
|
$this->background ?? $this->driver()->config()->backgroundColor,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -40,7 +40,7 @@ class TextModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function textColor(): ColorInterface
|
protected function textColor(): ColorInterface
|
||||||
{
|
{
|
||||||
$color = $this->driver()->handleInput($this->font->color());
|
$color = $this->driver()->handleColorInput($this->font->color());
|
||||||
|
|
||||||
if ($this->font->hasStrokeEffect() && $color->isTransparent()) {
|
if ($this->font->hasStrokeEffect() && $color->isTransparent()) {
|
||||||
throw new ColorException(
|
throw new ColorException(
|
||||||
@@ -59,7 +59,7 @@ class TextModifier extends SpecializableModifier
|
|||||||
*/
|
*/
|
||||||
protected function strokeColor(): ColorInterface
|
protected function strokeColor(): ColorInterface
|
||||||
{
|
{
|
||||||
$color = $this->driver()->handleInput($this->font->strokeColor());
|
$color = $this->driver()->handleColorInput($this->font->strokeColor());
|
||||||
|
|
||||||
if ($color->isTransparent()) {
|
if ($color->isTransparent()) {
|
||||||
throw new ColorException(
|
throw new ColorException(
|
||||||
|
@@ -15,12 +15,14 @@ use Intervention\Image\Drivers\Gd\Driver;
|
|||||||
use Intervention\Image\Drivers\Gd\Encoders\PngEncoder;
|
use Intervention\Image\Drivers\Gd\Encoders\PngEncoder;
|
||||||
use Intervention\Image\Drivers\Gd\Modifiers\ResizeModifier;
|
use Intervention\Image\Drivers\Gd\Modifiers\ResizeModifier;
|
||||||
use Intervention\Image\Encoders\PngEncoder as GenericPngEncoder;
|
use Intervention\Image\Encoders\PngEncoder as GenericPngEncoder;
|
||||||
|
use Intervention\Image\Exceptions\DecoderException;
|
||||||
use Intervention\Image\Exceptions\NotSupportedException;
|
use Intervention\Image\Exceptions\NotSupportedException;
|
||||||
use Intervention\Image\FileExtension;
|
use Intervention\Image\FileExtension;
|
||||||
use Intervention\Image\Format;
|
use Intervention\Image\Format;
|
||||||
use Intervention\Image\Interfaces\AnalyzerInterface;
|
use Intervention\Image\Interfaces\AnalyzerInterface;
|
||||||
use Intervention\Image\Interfaces\ColorInterface;
|
use Intervention\Image\Interfaces\ColorInterface;
|
||||||
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
use Intervention\Image\Interfaces\ColorProcessorInterface;
|
||||||
|
use Intervention\Image\Interfaces\DecoderInterface;
|
||||||
use Intervention\Image\Interfaces\DriverInterface;
|
use Intervention\Image\Interfaces\DriverInterface;
|
||||||
use Intervention\Image\Interfaces\ImageInterface;
|
use Intervention\Image\Interfaces\ImageInterface;
|
||||||
use Intervention\Image\Interfaces\SpecializableInterface;
|
use Intervention\Image\Interfaces\SpecializableInterface;
|
||||||
@@ -69,32 +71,88 @@ final class DriverTest extends BaseTestCase
|
|||||||
$this->assertEquals(2, $image->count());
|
$this->assertEquals(2, $image->count());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHandleInputImage(): void
|
/**
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
*/
|
||||||
|
#[DataProvider('handleImageInputDataProvider')]
|
||||||
|
#[DataProvider('handleColorInputDataProvider')]
|
||||||
|
public function testHandleInput(mixed $input, array $decoders, string $resultClassname): void
|
||||||
{
|
{
|
||||||
$result = $this->driver->handleInput($this->getTestResourcePath('test.jpg'));
|
$this->assertInstanceOf($resultClassname, $this->driver->handleInput($input, $decoders));
|
||||||
$this->assertInstanceOf(ImageInterface::class, $result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHandleInputColor(): void
|
/**
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
*/
|
||||||
|
#[DataProvider('handleImageInputDataProvider')]
|
||||||
|
public function testHandleImageInput(mixed $input, array $decoders, string $resultClassname): void
|
||||||
{
|
{
|
||||||
$result = $this->driver->handleInput('ffffff');
|
$this->assertInstanceOf($resultClassname, $this->driver->handleImageInput($input, $decoders));
|
||||||
$this->assertInstanceOf(ColorInterface::class, $result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHandleInputObjects(): void
|
/**
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
*/
|
||||||
|
#[DataProvider('handleColorInputDataProvider')]
|
||||||
|
public function testHandleColorInput(mixed $input, array $decoders, string $resultClassname): void
|
||||||
{
|
{
|
||||||
$result = $this->driver->handleInput('ffffff', [
|
$this->assertInstanceOf($resultClassname, $this->driver->handleColorInput($input, $decoders));
|
||||||
new HexColorDecoder()
|
|
||||||
]);
|
|
||||||
$this->assertInstanceOf(ColorInterface::class, $result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testHandleInputClassnames(): void
|
/**
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
*/
|
||||||
|
#[DataProvider('handleImageInputDataProvider')]
|
||||||
|
public function testHandleColorInputFail(mixed $input, array $decoders): void
|
||||||
{
|
{
|
||||||
$result = $this->driver->handleInput('ffffff', [
|
$this->expectException(DecoderException::class);
|
||||||
HexColorDecoder::class
|
$this->driver->handleColorInput($input, $decoders);
|
||||||
]);
|
}
|
||||||
$this->assertInstanceOf(ColorInterface::class, $result);
|
|
||||||
|
/**
|
||||||
|
* @param array<string|DecoderInterface> $decoders
|
||||||
|
*/
|
||||||
|
#[DataProvider('handleColorInputDataProvider')]
|
||||||
|
public function testHandleImageInputFail(mixed $input, array $decoders): void
|
||||||
|
{
|
||||||
|
$this->expectException(DecoderException::class);
|
||||||
|
$this->driver->handleImageInput($input, $decoders);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function handleImageInputDataProvider(): Generator
|
||||||
|
{
|
||||||
|
yield [
|
||||||
|
self::getTestResourcePath('test.jpg'),
|
||||||
|
[],
|
||||||
|
ImageInterface::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
self::getTestResourceData('test.jpg'),
|
||||||
|
[],
|
||||||
|
ImageInterface::class,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function handleColorInputDataProvider(): Generator
|
||||||
|
{
|
||||||
|
yield [
|
||||||
|
'ffffff',
|
||||||
|
[],
|
||||||
|
ColorInterface::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
'ffffff',
|
||||||
|
[new HexColorDecoder()],
|
||||||
|
ColorInterface::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
yield [
|
||||||
|
'ffffff',
|
||||||
|
[HexColorDecoder::class],
|
||||||
|
ColorInterface::class,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testColorProcessor(): void
|
public function testColorProcessor(): void
|
||||||
|
Reference in New Issue
Block a user