diff --git a/src/Drivers/Gd/Font.php b/src/Drivers/Gd/Font.php index 3ac9c1c7..b407b495 100644 --- a/src/Drivers/Gd/Font.php +++ b/src/Drivers/Gd/Font.php @@ -68,9 +68,6 @@ class Font extends AbstractFont protected function getGdFontHeight(): int { switch ($this->getGdFont()) { - case 1: - return 8; - case 2: return 14; @@ -82,6 +79,10 @@ class Font extends AbstractFont case 5: return 16; + + default: + case 1: + return 8; } } } diff --git a/src/Drivers/Gd/ImageFactory.php b/src/Drivers/Gd/ImageFactory.php index 467e0332..7dbc2f4e 100644 --- a/src/Drivers/Gd/ImageFactory.php +++ b/src/Drivers/Gd/ImageFactory.php @@ -2,7 +2,6 @@ namespace Intervention\Image\Drivers\Gd; -use GdImage; use Intervention\Image\Collection; use Intervention\Image\Interfaces\FactoryInterface; use Intervention\Image\Interfaces\ImageInterface; @@ -18,7 +17,7 @@ class ImageFactory implements FactoryInterface ); } - public function newCore(int $width, int $height): GdImage + public function newCore(int $width, int $height) { $core = imagecreatetruecolor($width, $height); $color = imagecolorallocatealpha($core, 0, 0, 0, 127); diff --git a/src/Drivers/Gd/Modifiers/PlaceModifier.php b/src/Drivers/Gd/Modifiers/PlaceModifier.php index 9350170a..b90233c9 100644 --- a/src/Drivers/Gd/Modifiers/PlaceModifier.php +++ b/src/Drivers/Gd/Modifiers/PlaceModifier.php @@ -3,9 +3,9 @@ namespace Intervention\Image\Drivers\Gd\Modifiers; use Intervention\Image\Drivers\Gd\Image; -use Intervention\Image\Geometry\Point; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\PointInterface; use Intervention\Image\Traits\CanResolveDriverClass; class PlaceModifier implements ModifierInterface @@ -52,7 +52,7 @@ class PlaceModifier implements ModifierInterface return $this->resolveDriverClass('InputHandler')->handle($this->element); } - protected function getPosition(Image $image, Image $watermark): Point + protected function getPosition(ImageInterface $image, ImageInterface $watermark): PointInterface { $image_size = $image->getSize()->alignPivot($this->position, $this->offset_x, $this->offset_y); $watermark_size = $watermark->getSize()->alignPivot($this->position); diff --git a/src/Drivers/Imagick/Color.php b/src/Drivers/Imagick/Color.php index bda5e232..7503c7b1 100644 --- a/src/Drivers/Imagick/Color.php +++ b/src/Drivers/Imagick/Color.php @@ -21,17 +21,17 @@ class Color extends AbstractColor implements ColorInterface public function red(): int { - return round($this->pixel->getColorValue(Imagick::COLOR_RED) * 255); + return intval(round($this->pixel->getColorValue(Imagick::COLOR_RED) * 255)); } public function green(): int { - return round($this->pixel->getColorValue(Imagick::COLOR_GREEN) * 255); + return intval(round($this->pixel->getColorValue(Imagick::COLOR_GREEN) * 255)); } public function blue(): int { - return round($this->pixel->getColorValue(Imagick::COLOR_BLUE) * 255); + return intval(round($this->pixel->getColorValue(Imagick::COLOR_BLUE) * 255)); } public function alpha(): float diff --git a/src/Drivers/Imagick/Encoders/GifEncoder.php b/src/Drivers/Imagick/Encoders/GifEncoder.php index f7192274..d180dc11 100644 --- a/src/Drivers/Imagick/Encoders/GifEncoder.php +++ b/src/Drivers/Imagick/Encoders/GifEncoder.php @@ -4,7 +4,9 @@ namespace Intervention\Image\Drivers\Imagick\Encoders; use Imagick; use Intervention\Image\Drivers\Abstract\Encoders\AbstractEncoder; +use Intervention\Image\Drivers\Imagick\Image; use Intervention\Image\EncodedImage; +use Intervention\Image\Exceptions\EncoderException; use Intervention\Image\Interfaces\EncoderInterface; use Intervention\Image\Interfaces\ImageInterface; @@ -15,6 +17,10 @@ class GifEncoder extends AbstractEncoder implements EncoderInterface $format = 'gif'; $compression = Imagick::COMPRESSION_LZW; + if (!is_a($image, Image::class)) { + throw new EncoderException('Image does not match the current driver.'); + } + $imagick = $image->getImagick(); $imagick->setFormat($format); $imagick->setImageFormat($format); diff --git a/src/Drivers/Imagick/Font.php b/src/Drivers/Imagick/Font.php index 93f21943..e719fe7a 100644 --- a/src/Drivers/Imagick/Font.php +++ b/src/Drivers/Imagick/Font.php @@ -5,6 +5,7 @@ namespace Intervention\Image\Drivers\Imagick; use Imagick; use ImagickDraw; use Intervention\Image\Drivers\Abstract\AbstractFont; +use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Exceptions\FontException; use Intervention\Image\Geometry\Polygon; use Intervention\Image\Geometry\Size; @@ -17,12 +18,17 @@ class Font extends AbstractFont throw new FontException('No font file specified.'); } + $color = $this->getColor(); + if (!is_a($color, Color::class)) { + throw new DecoderException('Unable to decode font color.'); + } + $draw = new ImagickDraw(); $draw->setStrokeAntialias(true); $draw->setTextAntialias(true); $draw->setFont($this->getFilename()); $draw->setFontSize($this->getSize()); - $draw->setFillColor($this->getColor()->getPixel()); + $draw->setFillColor($color->getPixel()); $draw->setTextAlignment($this->getImagickAlign()); return $draw; @@ -38,11 +44,9 @@ class Font extends AbstractFont switch (strtolower($this->getAlign())) { case 'center': return Imagick::ALIGN_CENTER; - break; case 'right': return Imagick::ALIGN_RIGHT; - break; } return Imagick::ALIGN_LEFT; diff --git a/src/Drivers/Imagick/Frame.php b/src/Drivers/Imagick/Frame.php index cb49b24d..245aff84 100644 --- a/src/Drivers/Imagick/Frame.php +++ b/src/Drivers/Imagick/Frame.php @@ -39,7 +39,7 @@ class Frame implements FrameInterface public function setDelay(float $delay): FrameInterface { - $this->core->setImageDelay(round($delay * 100)); + $this->core->setImageDelay(intval(round($delay * 100))); return $this; } diff --git a/src/Drivers/Imagick/ImageFactory.php b/src/Drivers/Imagick/ImageFactory.php index 57ef4cc3..cc54048b 100644 --- a/src/Drivers/Imagick/ImageFactory.php +++ b/src/Drivers/Imagick/ImageFactory.php @@ -14,7 +14,7 @@ class ImageFactory implements FactoryInterface return new Image($this->newCore($width, $height)); } - public function newCore(int $width, int $height): Imagick + public function newCore(int $width, int $height) { $imagick = new Imagick(); $imagick->newImage($width, $height, new ImagickPixel('rgba(0, 0, 0, 0)'), 'png'); diff --git a/src/Drivers/Imagick/Modifiers/PadModifier.php b/src/Drivers/Imagick/Modifiers/PadModifier.php index 94bee08e..94d44a65 100644 --- a/src/Drivers/Imagick/Modifiers/PadModifier.php +++ b/src/Drivers/Imagick/Modifiers/PadModifier.php @@ -5,7 +5,8 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Imagick; use ImagickDraw; use Intervention\Image\Drivers\Abstract\Modifiers\AbstractPadModifier; -use Intervention\Image\Interfaces\ColorInterface; +use Intervention\Image\Drivers\Imagick\Color; +use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ModifierInterface; use Intervention\Image\Interfaces\SizeInterface; @@ -23,6 +24,10 @@ class PadModifier extends AbstractPadModifier implements ModifierInterface $crop = $this->getCropSize($image); $background = $this->handleInput($this->background); + if (!is_a($background, Color::class)) { + throw new DecoderException('Unable to decode backgroud color.'); + } + foreach ($image as $frame) { // resize current core $frame->getCore()->scaleImage( @@ -49,7 +54,7 @@ class PadModifier extends AbstractPadModifier implements ModifierInterface return $image; } - protected function buildBaseCanvas(SizeInterface $crop, SizeInterface $resize, ColorInterface $background): Imagick + protected function buildBaseCanvas(SizeInterface $crop, SizeInterface $resize, Color $background): Imagick { // build base canvas in target size $canvas = $this->imageFactory()->newCore( diff --git a/src/Drivers/Imagick/Modifiers/PlaceModifier.php b/src/Drivers/Imagick/Modifiers/PlaceModifier.php index 06f1ef09..894ba153 100644 --- a/src/Drivers/Imagick/Modifiers/PlaceModifier.php +++ b/src/Drivers/Imagick/Modifiers/PlaceModifier.php @@ -7,6 +7,7 @@ use Intervention\Image\Drivers\Imagick\Image; use Intervention\Image\Geometry\Point; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ModifierInterface; +use Intervention\Image\Interfaces\PointInterface; use Intervention\Image\Traits\CanResolveDriverClass; class PlaceModifier implements ModifierInterface @@ -44,7 +45,7 @@ class PlaceModifier implements ModifierInterface return $this->resolveDriverClass('InputHandler')->handle($this->element); } - protected function getPosition(Image $image, Image $watermark): Point + protected function getPosition(ImageInterface $image, Image $watermark): PointInterface { $image_size = $image->getSize()->alignPivot($this->position, $this->offset_x, $this->offset_y); $watermark_size = $watermark->getSize()->alignPivot($this->position); diff --git a/src/Drivers/Imagick/Modifiers/RotateModifier.php b/src/Drivers/Imagick/Modifiers/RotateModifier.php index 3fde612e..304585e7 100644 --- a/src/Drivers/Imagick/Modifiers/RotateModifier.php +++ b/src/Drivers/Imagick/Modifiers/RotateModifier.php @@ -3,6 +3,8 @@ namespace Intervention\Image\Drivers\Imagick\Modifiers; use Intervention\Image\Drivers\Abstract\Modifiers\AbstractRotateModifier; +use Intervention\Image\Drivers\Imagick\Color; +use Intervention\Image\Exceptions\DecoderException; use Intervention\Image\Interfaces\ImageInterface; use Intervention\Image\Interfaces\ModifierInterface; @@ -10,9 +12,14 @@ class RotateModifier extends AbstractRotateModifier implements ModifierInterface { public function apply(ImageInterface $image): ImageInterface { + $background = $this->backgroundColor(); + if (!is_a($background, Color::class)) { + throw new DecoderException('Unable to decode given background color.'); + } + foreach ($image as $frame) { $frame->getCore()->rotateImage( - $this->backgroundColor()->getPixel(), + $background->getPixel(), $this->rotationAngle() ); } diff --git a/src/Exceptions/EncoderException.php b/src/Exceptions/EncoderException.php new file mode 100644 index 00000000..f7d0721a --- /dev/null +++ b/src/Exceptions/EncoderException.php @@ -0,0 +1,8 @@ +