From b13282001e317f1caabf58647a1fbb326baf3232 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:35:05 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20.gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..331c58f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +vendor \ No newline at end of file From acf2b973df0dcd8b54903bd7e4546fe6cd40fe70 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:43:15 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?composer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Intervention/Image/AbstractColor.php | 229 ----------- Intervention/Image/AbstractDecoder.php | 364 ----------------- Intervention/Image/AbstractDriver.php | 140 ------- Intervention/Image/AbstractEncoder.php | 271 ------------- Intervention/Image/AbstractFont.php | 295 -------------- Intervention/Image/AbstractShape.php | 71 ---- .../Image/Commands/AbstractCommand.php | 81 ---- Intervention/Image/Commands/Argument.php | 225 ----------- .../Image/Commands/ChecksumCommand.php | 29 -- Intervention/Image/Commands/CircleCommand.php | 35 -- .../Image/Commands/EllipseCommand.php | 36 -- Intervention/Image/Commands/ExifCommand.php | 61 --- Intervention/Image/Commands/IptcCommand.php | 68 ---- Intervention/Image/Commands/LineCommand.php | 36 -- .../Image/Commands/OrientateCommand.php | 48 --- .../Image/Commands/PolygonCommand.php | 49 --- .../Image/Commands/PsrResponseCommand.php | 45 --- .../Image/Commands/RectangleCommand.php | 36 -- .../Image/Commands/ResponseCommand.php | 26 -- Intervention/Image/Commands/StreamCommand.php | 39 -- Intervention/Image/Commands/TextCommand.php | 34 -- Intervention/Image/Constraint.php | 92 ----- .../Image/Exception/ImageException.php | 8 - .../Exception/InvalidArgumentException.php | 8 - .../Exception/MissingDependencyException.php | 8 - .../Image/Exception/NotFoundException.php | 8 - .../Image/Exception/NotReadableException.php | 8 - .../Image/Exception/NotSupportedException.php | 8 - .../Image/Exception/NotWritableException.php | 8 - .../Image/Exception/RuntimeException.php | 8 - Intervention/Image/Facades/Image.php | 19 - Intervention/Image/File.php | 92 ----- Intervention/Image/Filters/DemoFilter.php | 44 --- .../Image/Filters/FilterInterface.php | 16 - Intervention/Image/Gd/Color.php | 227 ----------- .../Image/Gd/Commands/BackupCommand.php | 25 -- .../Image/Gd/Commands/BlurCommand.php | 25 -- .../Image/Gd/Commands/BrightnessCommand.php | 21 - .../Image/Gd/Commands/ColorizeCommand.php | 29 -- .../Image/Gd/Commands/ContrastCommand.php | 21 - .../Image/Gd/Commands/CropCommand.php | 40 -- .../Image/Gd/Commands/DestroyCommand.php | 27 -- .../Image/Gd/Commands/FillCommand.php | 69 ---- Intervention/Image/Gd/Commands/FitCommand.php | 32 -- .../Image/Gd/Commands/FlipCommand.php | 37 -- .../Image/Gd/Commands/GammaCommand.php | 21 - .../Image/Gd/Commands/GetSizeCommand.php | 25 -- .../Image/Gd/Commands/GreyscaleCommand.php | 19 - .../Image/Gd/Commands/HeightenCommand.php | 28 -- .../Image/Gd/Commands/InsertCommand.php | 34 -- .../Image/Gd/Commands/InterlaceCommand.php | 23 -- .../Image/Gd/Commands/InvertCommand.php | 19 - .../Image/Gd/Commands/LimitColorsCommand.php | 53 --- .../Image/Gd/Commands/MaskCommand.php | 83 ---- .../Image/Gd/Commands/OpacityCommand.php | 31 -- .../Image/Gd/Commands/PickColorCommand.php | 37 -- .../Image/Gd/Commands/PixelCommand.php | 25 -- .../Image/Gd/Commands/PixelateCommand.php | 21 - .../Image/Gd/Commands/ResetCommand.php | 39 -- .../Image/Gd/Commands/ResizeCanvasCommand.php | 83 ---- .../Image/Gd/Commands/ResizeCommand.php | 84 ---- .../Image/Gd/Commands/RotateCommand.php | 30 -- .../Image/Gd/Commands/SharpenCommand.php | 34 -- .../Image/Gd/Commands/TrimCommand.php | 176 --------- .../Image/Gd/Commands/WidenCommand.php | 28 -- Intervention/Image/Gd/Decoder.php | 171 -------- Intervention/Image/Gd/Driver.php | 89 ----- Intervention/Image/Gd/Encoder.php | 180 --------- Intervention/Image/Gd/Font.php | 277 ------------- Intervention/Image/Gd/Shapes/CircleShape.php | 40 -- Intervention/Image/Gd/Shapes/EllipseShape.php | 65 --- Intervention/Image/Gd/Shapes/LineShape.php | 90 ----- Intervention/Image/Gd/Shapes/PolygonShape.php | 49 --- .../Image/Gd/Shapes/RectangleShape.php | 76 ---- Intervention/Image/Image.php | 370 ----------------- Intervention/Image/ImageManager.php | 142 ------- Intervention/Image/ImageManagerStatic.php | 88 ----- Intervention/Image/ImageServiceProvider.php | 87 ---- .../Image/ImageServiceProviderLaravel4.php | 112 ------ .../Image/ImageServiceProviderLaravel5.php | 96 ----- .../ImageServiceProviderLaravelRecent.php | 106 ----- .../Image/ImageServiceProviderLeague.php | 42 -- .../Image/ImageServiceProviderLumen.php | 34 -- Intervention/Image/Imagick/Color.php | 279 ------------- .../Image/Imagick/Commands/BackupCommand.php | 25 -- .../Image/Imagick/Commands/BlurCommand.php | 21 - .../Imagick/Commands/BrightnessCommand.php | 21 - .../Imagick/Commands/ColorizeCommand.php | 44 --- .../Imagick/Commands/ContrastCommand.php | 21 - .../Image/Imagick/Commands/CropCommand.php | 45 --- .../Image/Imagick/Commands/DestroyCommand.php | 27 -- .../Image/Imagick/Commands/ExifCommand.php | 63 --- .../Image/Imagick/Commands/FillCommand.php | 105 ----- .../Image/Imagick/Commands/FitCommand.php | 42 -- .../Image/Imagick/Commands/FlipCommand.php | 27 -- .../Image/Imagick/Commands/GammaCommand.php | 21 - .../Image/Imagick/Commands/GetSizeCommand.php | 28 -- .../Imagick/Commands/GreyscaleCommand.php | 19 - .../Imagick/Commands/HeightenCommand.php | 28 -- .../Image/Imagick/Commands/InsertCommand.php | 33 -- .../Imagick/Commands/InterlaceCommand.php | 29 -- .../Image/Imagick/Commands/InvertCommand.php | 19 - .../Imagick/Commands/LimitColorsCommand.php | 59 --- .../Image/Imagick/Commands/MaskCommand.php | 60 --- .../Image/Imagick/Commands/OpacityCommand.php | 23 -- .../Imagick/Commands/PickColorCommand.php | 30 -- .../Image/Imagick/Commands/PixelCommand.php | 31 -- .../Imagick/Commands/PixelateCommand.php | 27 -- .../Image/Imagick/Commands/ResetCommand.php | 40 -- .../Imagick/Commands/ResizeCanvasCommand.php | 91 ----- .../Image/Imagick/Commands/ResizeCommand.php | 29 -- .../Image/Imagick/Commands/RotateCommand.php | 30 -- .../Image/Imagick/Commands/SharpenCommand.php | 21 - .../Image/Imagick/Commands/TrimCommand.php | 121 ------ .../Image/Imagick/Commands/WidenCommand.php | 28 -- Intervention/Image/Imagick/Decoder.php | 124 ------ Intervention/Image/Imagick/Driver.php | 74 ---- Intervention/Image/Imagick/Encoder.php | 239 ----------- Intervention/Image/Imagick/Font.php | 122 ------ .../Image/Imagick/Shapes/CircleShape.php | 40 -- .../Image/Imagick/Shapes/EllipseShape.php | 66 ---- .../Image/Imagick/Shapes/LineShape.php | 94 ----- .../Image/Imagick/Shapes/PolygonShape.php | 81 ---- .../Image/Imagick/Shapes/RectangleShape.php | 84 ---- Intervention/Image/Point.php | 64 --- Intervention/Image/Response.php | 78 ---- Intervention/Image/Size.php | 374 ------------------ src/Manager.php | 16 +- 128 files changed, 1 insertion(+), 9047 deletions(-) delete mode 100644 Intervention/Image/AbstractColor.php delete mode 100644 Intervention/Image/AbstractDecoder.php delete mode 100644 Intervention/Image/AbstractDriver.php delete mode 100644 Intervention/Image/AbstractEncoder.php delete mode 100644 Intervention/Image/AbstractFont.php delete mode 100644 Intervention/Image/AbstractShape.php delete mode 100644 Intervention/Image/Commands/AbstractCommand.php delete mode 100644 Intervention/Image/Commands/Argument.php delete mode 100644 Intervention/Image/Commands/ChecksumCommand.php delete mode 100644 Intervention/Image/Commands/CircleCommand.php delete mode 100644 Intervention/Image/Commands/EllipseCommand.php delete mode 100644 Intervention/Image/Commands/ExifCommand.php delete mode 100644 Intervention/Image/Commands/IptcCommand.php delete mode 100644 Intervention/Image/Commands/LineCommand.php delete mode 100644 Intervention/Image/Commands/OrientateCommand.php delete mode 100644 Intervention/Image/Commands/PolygonCommand.php delete mode 100644 Intervention/Image/Commands/PsrResponseCommand.php delete mode 100644 Intervention/Image/Commands/RectangleCommand.php delete mode 100644 Intervention/Image/Commands/ResponseCommand.php delete mode 100644 Intervention/Image/Commands/StreamCommand.php delete mode 100644 Intervention/Image/Commands/TextCommand.php delete mode 100644 Intervention/Image/Constraint.php delete mode 100644 Intervention/Image/Exception/ImageException.php delete mode 100644 Intervention/Image/Exception/InvalidArgumentException.php delete mode 100644 Intervention/Image/Exception/MissingDependencyException.php delete mode 100644 Intervention/Image/Exception/NotFoundException.php delete mode 100644 Intervention/Image/Exception/NotReadableException.php delete mode 100644 Intervention/Image/Exception/NotSupportedException.php delete mode 100644 Intervention/Image/Exception/NotWritableException.php delete mode 100644 Intervention/Image/Exception/RuntimeException.php delete mode 100644 Intervention/Image/Facades/Image.php delete mode 100644 Intervention/Image/File.php delete mode 100644 Intervention/Image/Filters/DemoFilter.php delete mode 100644 Intervention/Image/Filters/FilterInterface.php delete mode 100644 Intervention/Image/Gd/Color.php delete mode 100644 Intervention/Image/Gd/Commands/BackupCommand.php delete mode 100644 Intervention/Image/Gd/Commands/BlurCommand.php delete mode 100644 Intervention/Image/Gd/Commands/BrightnessCommand.php delete mode 100644 Intervention/Image/Gd/Commands/ColorizeCommand.php delete mode 100644 Intervention/Image/Gd/Commands/ContrastCommand.php delete mode 100644 Intervention/Image/Gd/Commands/CropCommand.php delete mode 100644 Intervention/Image/Gd/Commands/DestroyCommand.php delete mode 100644 Intervention/Image/Gd/Commands/FillCommand.php delete mode 100644 Intervention/Image/Gd/Commands/FitCommand.php delete mode 100644 Intervention/Image/Gd/Commands/FlipCommand.php delete mode 100644 Intervention/Image/Gd/Commands/GammaCommand.php delete mode 100644 Intervention/Image/Gd/Commands/GetSizeCommand.php delete mode 100644 Intervention/Image/Gd/Commands/GreyscaleCommand.php delete mode 100644 Intervention/Image/Gd/Commands/HeightenCommand.php delete mode 100644 Intervention/Image/Gd/Commands/InsertCommand.php delete mode 100644 Intervention/Image/Gd/Commands/InterlaceCommand.php delete mode 100644 Intervention/Image/Gd/Commands/InvertCommand.php delete mode 100644 Intervention/Image/Gd/Commands/LimitColorsCommand.php delete mode 100644 Intervention/Image/Gd/Commands/MaskCommand.php delete mode 100644 Intervention/Image/Gd/Commands/OpacityCommand.php delete mode 100644 Intervention/Image/Gd/Commands/PickColorCommand.php delete mode 100644 Intervention/Image/Gd/Commands/PixelCommand.php delete mode 100644 Intervention/Image/Gd/Commands/PixelateCommand.php delete mode 100644 Intervention/Image/Gd/Commands/ResetCommand.php delete mode 100644 Intervention/Image/Gd/Commands/ResizeCanvasCommand.php delete mode 100644 Intervention/Image/Gd/Commands/ResizeCommand.php delete mode 100644 Intervention/Image/Gd/Commands/RotateCommand.php delete mode 100644 Intervention/Image/Gd/Commands/SharpenCommand.php delete mode 100644 Intervention/Image/Gd/Commands/TrimCommand.php delete mode 100644 Intervention/Image/Gd/Commands/WidenCommand.php delete mode 100644 Intervention/Image/Gd/Decoder.php delete mode 100644 Intervention/Image/Gd/Driver.php delete mode 100644 Intervention/Image/Gd/Encoder.php delete mode 100644 Intervention/Image/Gd/Font.php delete mode 100644 Intervention/Image/Gd/Shapes/CircleShape.php delete mode 100644 Intervention/Image/Gd/Shapes/EllipseShape.php delete mode 100644 Intervention/Image/Gd/Shapes/LineShape.php delete mode 100644 Intervention/Image/Gd/Shapes/PolygonShape.php delete mode 100644 Intervention/Image/Gd/Shapes/RectangleShape.php delete mode 100644 Intervention/Image/Image.php delete mode 100644 Intervention/Image/ImageManager.php delete mode 100644 Intervention/Image/ImageManagerStatic.php delete mode 100644 Intervention/Image/ImageServiceProvider.php delete mode 100755 Intervention/Image/ImageServiceProviderLaravel4.php delete mode 100644 Intervention/Image/ImageServiceProviderLaravel5.php delete mode 100644 Intervention/Image/ImageServiceProviderLaravelRecent.php delete mode 100644 Intervention/Image/ImageServiceProviderLeague.php delete mode 100644 Intervention/Image/ImageServiceProviderLumen.php delete mode 100644 Intervention/Image/Imagick/Color.php delete mode 100644 Intervention/Image/Imagick/Commands/BackupCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/BlurCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/BrightnessCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ColorizeCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ContrastCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/CropCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/DestroyCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ExifCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/FillCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/FitCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/FlipCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/GammaCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/GetSizeCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/GreyscaleCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/HeightenCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/InsertCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/InterlaceCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/InvertCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/LimitColorsCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/MaskCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/OpacityCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/PickColorCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/PixelCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/PixelateCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ResetCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/ResizeCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/RotateCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/SharpenCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/TrimCommand.php delete mode 100644 Intervention/Image/Imagick/Commands/WidenCommand.php delete mode 100644 Intervention/Image/Imagick/Decoder.php delete mode 100644 Intervention/Image/Imagick/Driver.php delete mode 100644 Intervention/Image/Imagick/Encoder.php delete mode 100644 Intervention/Image/Imagick/Font.php delete mode 100644 Intervention/Image/Imagick/Shapes/CircleShape.php delete mode 100644 Intervention/Image/Imagick/Shapes/EllipseShape.php delete mode 100644 Intervention/Image/Imagick/Shapes/LineShape.php delete mode 100644 Intervention/Image/Imagick/Shapes/PolygonShape.php delete mode 100644 Intervention/Image/Imagick/Shapes/RectangleShape.php delete mode 100644 Intervention/Image/Point.php delete mode 100644 Intervention/Image/Response.php delete mode 100644 Intervention/Image/Size.php diff --git a/Intervention/Image/AbstractColor.php b/Intervention/Image/AbstractColor.php deleted file mode 100644 index c9846c6..0000000 --- a/Intervention/Image/AbstractColor.php +++ /dev/null @@ -1,229 +0,0 @@ -parse($value); - } - - /** - * Parses given value as color - * - * @param mixed $value - * @return \Intervention\Image\AbstractColor - */ - public function parse($value) - { - switch (true) { - - case is_string($value): - $this->initFromString($value); - break; - - case is_int($value): - $this->initFromInteger($value); - break; - - case is_array($value): - $this->initFromArray($value); - break; - - case is_object($value): - $this->initFromObject($value); - break; - - case is_null($value): - $this->initFromArray([255, 255, 255, 0]); - break; - - default: - throw new NotReadableException( - "Color format ({$value}) cannot be read." - ); - } - - return $this; - } - - /** - * Formats current color instance into given format - * - * @param string $type - * @return mixed - */ - public function format($type) - { - switch (strtolower($type)) { - - case 'rgba': - return $this->getRgba(); - - case 'hex': - return $this->getHex('#'); - - case 'int': - case 'integer': - return $this->getInt(); - - case 'array': - return $this->getArray(); - - case 'obj': - case 'object': - return $this; - - default: - throw new NotSupportedException( - "Color format ({$type}) is not supported." - ); - } - } - - /** - * Reads RGBA values from string into array - * - * @param string $value - * @return array - */ - protected function rgbaFromString($value) - { - $result = false; - - // parse color string in hexidecimal format like #cccccc or cccccc or ccc - $hexPattern = '/^#?([a-f0-9]{1,2})([a-f0-9]{1,2})([a-f0-9]{1,2})$/i'; - - // parse color string in format rgb(140, 140, 140) - $rgbPattern = '/^rgb ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3})\)$/i'; - - // parse color string in format rgba(255, 0, 0, 0.5) - $rgbaPattern = '/^rgba ?\(([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9]{1,3}), ?([0-9.]{1,4})\)$/i'; - - if (preg_match($hexPattern, $value, $matches)) { - $result = []; - $result[0] = strlen($matches[1]) == '1' ? hexdec($matches[1].$matches[1]) : hexdec($matches[1]); - $result[1] = strlen($matches[2]) == '1' ? hexdec($matches[2].$matches[2]) : hexdec($matches[2]); - $result[2] = strlen($matches[3]) == '1' ? hexdec($matches[3].$matches[3]) : hexdec($matches[3]); - $result[3] = 1; - } elseif (preg_match($rgbPattern, $value, $matches)) { - $result = []; - $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0; - $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0; - $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0; - $result[3] = 1; - } elseif (preg_match($rgbaPattern, $value, $matches)) { - $result = []; - $result[0] = ($matches[1] >= 0 && $matches[1] <= 255) ? intval($matches[1]) : 0; - $result[1] = ($matches[2] >= 0 && $matches[2] <= 255) ? intval($matches[2]) : 0; - $result[2] = ($matches[3] >= 0 && $matches[3] <= 255) ? intval($matches[3]) : 0; - $result[3] = ($matches[4] >= 0 && $matches[4] <= 1) ? $matches[4] : 0; - } else { - throw new NotReadableException( - "Unable to read color ({$value})." - ); - } - - return $result; - } -} diff --git a/Intervention/Image/AbstractDecoder.php b/Intervention/Image/AbstractDecoder.php deleted file mode 100644 index 743cc5c..0000000 --- a/Intervention/Image/AbstractDecoder.php +++ /dev/null @@ -1,364 +0,0 @@ -data = $data; - } - - /** - * Init from given URL - * - * @param string $url - * @return \Intervention\Image\Image - */ - public function initFromUrl($url) - { - - $options = [ - 'http' => [ - 'method'=>"GET", - 'protocol_version'=>1.1, // force use HTTP 1.1 for service mesh environment with envoy - 'header'=>"Accept-language: en\r\n". - "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2\r\n" - ] - ]; - - $context = stream_context_create($options); - - - if ($data = @file_get_contents($url, false, $context)) { - return $this->initFromBinary($data); - } - - throw new NotReadableException( - "Unable to init from given url (".$url.")." - ); - } - - /** - * Init from given stream - * - * @param StreamInterface|resource $stream - * @return \Intervention\Image\Image - */ - public function initFromStream($stream) - { - if (!$stream instanceof StreamInterface) { - $stream = new Stream($stream); - } - - try { - $offset = $stream->tell(); - } catch (\RuntimeException $e) { - $offset = 0; - } - - $shouldAndCanSeek = $offset !== 0 && $stream->isSeekable(); - - if ($shouldAndCanSeek) { - $stream->rewind(); - } - - try { - $data = $stream->getContents(); - } catch (\RuntimeException $e) { - $data = null; - } - - if ($shouldAndCanSeek) { - $stream->seek($offset); - } - - if ($data) { - return $this->initFromBinary($data); - } - - throw new NotReadableException( - "Unable to init from given stream" - ); - } - - /** - * Determines if current source data is GD resource - * - * @return boolean - */ - public function isGdResource() - { - if (is_resource($this->data)) { - return (get_resource_type($this->data) == 'gd'); - } - - if ($this->data instanceof \GdImage) { - return true; - } - - return false; - } - - /** - * Determines if current source data is Imagick object - * - * @return boolean - */ - public function isImagick() - { - return is_a($this->data, 'Imagick'); - } - - /** - * Determines if current source data is Intervention\Image\Image object - * - * @return boolean - */ - public function isInterventionImage() - { - return is_a($this->data, '\Intervention\Image\Image'); - } - - /** - * Determines if current data is SplFileInfo object - * - * @return boolean - */ - public function isSplFileInfo() - { - return is_a($this->data, 'SplFileInfo'); - } - - /** - * Determines if current data is Symfony UploadedFile component - * - * @return boolean - */ - public function isSymfonyUpload() - { - return is_a($this->data, 'Symfony\Component\HttpFoundation\File\UploadedFile'); - } - - /** - * Determines if current source data is file path - * - * @return boolean - */ - public function isFilePath() - { - if (is_string($this->data)) { - try { - return is_file($this->data); - } catch (\Exception $e) { - return false; - } - } - - return false; - } - - /** - * Determines if current source data is url - * - * @return boolean - */ - public function isUrl() - { - return (bool) filter_var($this->data, FILTER_VALIDATE_URL); - } - - /** - * Determines if current source data is a stream resource - * - * @return boolean - */ - public function isStream() - { - if ($this->data instanceof StreamInterface) return true; - if (!is_resource($this->data)) return false; - if (get_resource_type($this->data) !== 'stream') return false; - - return true; - } - - /** - * Determines if current source data is binary data - * - * @return boolean - */ - public function isBinary() - { - if (is_string($this->data)) { - $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $this->data); - return (substr($mime, 0, 4) != 'text' && $mime != 'application/x-empty'); - } - - return false; - } - - /** - * Determines if current source data is data-url - * - * @return boolean - */ - public function isDataUrl() - { - $data = $this->decodeDataUrl($this->data); - - return is_null($data) ? false : true; - } - - /** - * Determines if current source data is base64 encoded - * - * @return boolean - */ - public function isBase64() - { - if (!is_string($this->data)) { - return false; - } - - return base64_encode(base64_decode($this->data)) === str_replace(["\n", "\r"], '', $this->data); - } - - /** - * Initiates new Image from Intervention\Image\Image - * - * @param Image $object - * @return \Intervention\Image\Image - */ - public function initFromInterventionImage($object) - { - return $object; - } - - /** - * Parses and decodes binary image data from data-url - * - * @param string $data_url - * @return string - */ - private function decodeDataUrl($data_url) - { - if (!is_string($data_url)) { - return null; - } - - $pattern = "/^data:(?:image\/[a-zA-Z\-\.]+)(?:charset=\".+\")?;base64,(?P.+)$/"; - preg_match($pattern, str_replace(["\n", "\r"], '', $data_url), $matches); - - if (is_array($matches) && array_key_exists('data', $matches)) { - return base64_decode($matches['data']); - } - - return null; - } - - /** - * Initiates new image from mixed data - * - * @param mixed $data - * @return \Intervention\Image\Image - */ - public function init($data) - { - $this->data = $data; - - switch (true) { - - case $this->isGdResource(): - return $this->initFromGdResource($this->data); - - case $this->isImagick(): - return $this->initFromImagick($this->data); - - case $this->isInterventionImage(): - return $this->initFromInterventionImage($this->data); - - case $this->isSplFileInfo(): - return $this->initFromPath($this->data->getRealPath()); - - case $this->isBinary(): - return $this->initFromBinary($this->data); - - case $this->isUrl(): - return $this->initFromUrl($this->data); - - case $this->isStream(): - return $this->initFromStream($this->data); - - case $this->isDataUrl(): - return $this->initFromBinary($this->decodeDataUrl($this->data)); - - case $this->isFilePath(): - return $this->initFromPath($this->data); - - // isBase64 has to be after isFilePath to prevent false positives - case $this->isBase64(): - return $this->initFromBinary(base64_decode($this->data)); - - default: - throw new NotReadableException("Image source not readable"); - } - } - - /** - * Decoder object transforms to string source data - * - * @return string - */ - public function __toString() - { - return (string) $this->data; - } -} diff --git a/Intervention/Image/AbstractDriver.php b/Intervention/Image/AbstractDriver.php deleted file mode 100644 index 6c591a7..0000000 --- a/Intervention/Image/AbstractDriver.php +++ /dev/null @@ -1,140 +0,0 @@ -decoder->init($data); - } - - /** - * Encodes given image - * - * @param Image $image - * @param string $format - * @param int $quality - * @return \Intervention\Image\Image - */ - public function encode($image, $format, $quality) - { - return $this->encoder->process($image, $format, $quality); - } - - /** - * Executes named command on given image - * - * @param Image $image - * @param string $name - * @param array $arguments - * @return \Intervention\Image\Commands\AbstractCommand - */ - public function executeCommand($image, $name, $arguments) - { - $commandName = $this->getCommandClassName($name); - $command = new $commandName($arguments); - $command->execute($image); - - return $command; - } - - /** - * Returns classname of given command name - * - * @param string $name - * @return string - */ - private function getCommandClassName($name) - { - if (extension_loaded('mbstring')) { - $name = mb_strtoupper(mb_substr($name, 0, 1)) . mb_substr($name, 1); - } else { - $name = strtoupper(substr($name, 0, 1)) . substr($name, 1); - } - - $drivername = $this->getDriverName(); - $classnameLocal = sprintf('\Intervention\Image\%s\Commands\%sCommand', $drivername, ucfirst($name)); - $classnameGlobal = sprintf('\Intervention\Image\Commands\%sCommand', ucfirst($name)); - - if (class_exists($classnameLocal)) { - return $classnameLocal; - } elseif (class_exists($classnameGlobal)) { - return $classnameGlobal; - } - - throw new NotSupportedException( - "Command ({$name}) is not available for driver ({$drivername})." - ); - } - - /** - * Returns name of current driver instance - * - * @return string - */ - public function getDriverName() - { - $reflect = new \ReflectionClass($this); - $namespace = $reflect->getNamespaceName(); - - return substr(strrchr($namespace, "\\"), 1); - } -} diff --git a/Intervention/Image/AbstractEncoder.php b/Intervention/Image/AbstractEncoder.php deleted file mode 100644 index c25f8bf..0000000 --- a/Intervention/Image/AbstractEncoder.php +++ /dev/null @@ -1,271 +0,0 @@ -setImage($image); - $this->setFormat($format); - $this->setQuality($quality); - - switch (strtolower($this->format)) { - - case 'data-url': - $this->result = $this->processDataUrl(); - break; - - case 'gif': - case 'image/gif': - $this->result = $this->processGif(); - break; - - case 'png': - case 'image/png': - case 'image/x-png': - $this->result = $this->processPng(); - break; - - case 'jpg': - case 'jpeg': - case 'jfif': - case 'image/jp2': - case 'image/jpg': - case 'image/jpeg': - case 'image/pjpeg': - case 'image/jfif': - $this->result = $this->processJpeg(); - break; - - case 'tif': - case 'tiff': - case 'image/tiff': - case 'image/tif': - case 'image/x-tif': - case 'image/x-tiff': - $this->result = $this->processTiff(); - break; - - case 'bmp': - case 'ms-bmp': - case 'x-bitmap': - case 'x-bmp': - case 'x-ms-bmp': - case 'x-win-bitmap': - case 'x-windows-bmp': - case 'x-xbitmap': - case 'image/ms-bmp': - case 'image/x-bitmap': - case 'image/x-bmp': - case 'image/x-ms-bmp': - case 'image/x-win-bitmap': - case 'image/x-windows-bmp': - case 'image/x-xbitmap': - $this->result = $this->processBmp(); - break; - - case 'ico': - case 'image/x-ico': - case 'image/x-icon': - case 'image/vnd.microsoft.icon': - $this->result = $this->processIco(); - break; - - case 'psd': - case 'image/vnd.adobe.photoshop': - $this->result = $this->processPsd(); - break; - - case 'webp': - case 'image/webp': - case 'image/x-webp': - $this->result = $this->processWebp(); - break; - - case 'avif': - case 'image/avif': - $this->result = $this->processAvif(); - break; - - case 'heic': - case 'image/heic': - case 'image/heif': - $this->result = $this->processHeic(); - break; - - default: - throw new NotSupportedException( - "Encoding format ({$this->format}) is not supported." - ); - } - - $this->setImage(null); - - return $image->setEncoded($this->result); - } - - /** - * Processes and returns encoded image as data-url string - * - * @return string - */ - protected function processDataUrl() - { - $mime = $this->image->mime ? $this->image->mime : 'image/png'; - - return sprintf('data:%s;base64,%s', - $mime, - base64_encode($this->process($this->image, $mime, $this->quality)) - ); - } - - /** - * Sets image to process - * - * @param Image $image - */ - protected function setImage($image) - { - $this->image = $image; - } - - /** - * Determines output format - * - * @param string $format - */ - protected function setFormat($format = null) - { - if ($format == '' && $this->image instanceof Image) { - $format = $this->image->mime; - } - - $this->format = $format ? $format : 'jpg'; - - return $this; - } - - /** - * Determines output quality - * - * @param int $quality - */ - protected function setQuality($quality) - { - $quality = is_null($quality) ? 90 : $quality; - $quality = $quality === 0 ? 1 : $quality; - - if ($quality < 0 || $quality > 100) { - throw new InvalidArgumentException( - 'Quality must range from 0 to 100.' - ); - } - - $this->quality = intval($quality); - - return $this; - } -} diff --git a/Intervention/Image/AbstractFont.php b/Intervention/Image/AbstractFont.php deleted file mode 100644 index 35c1825..0000000 --- a/Intervention/Image/AbstractFont.php +++ /dev/null @@ -1,295 +0,0 @@ -text = $text; - } - - /** - * Set text to be written - * - * @param String $text - * @return self - */ - public function text($text) - { - $this->text = $text; - - return $this; - } - - /** - * Get text to be written - * - * @return String - */ - public function getText() - { - return $this->text; - } - - /** - * Set font size in pixels - * - * @param int $size - * @return self - */ - public function size($size) - { - $this->size = $size; - - return $this; - } - - /** - * Get font size in pixels - * - * @return int - */ - public function getSize() - { - return $this->size; - } - - /** - * Set color of text to be written - * - * @param mixed $color - * @return self - */ - public function color($color) - { - $this->color = $color; - - return $this; - } - - /** - * Get color of text - * - * @return mixed - */ - public function getColor() - { - return $this->color; - } - - /** - * Set rotation angle of text - * - * @param int $angle - * @return self - */ - public function angle($angle) - { - $this->angle = $angle; - - return $this; - } - - /** - * Get rotation angle of text - * - * @return int - */ - public function getAngle() - { - return $this->angle; - } - - /** - * Set horizontal text alignment - * - * @param string $align - * @return self - */ - public function align($align) - { - $this->align = $align; - - return $this; - } - - /** - * Get horizontal text alignment - * - * @return string - */ - public function getAlign() - { - return $this->align; - } - - /** - * Set vertical text alignment - * - * @param string $valign - * @return self - */ - public function valign($valign) - { - $this->valign = $valign; - - return $this; - } - - /** - * Get vertical text alignment - * - * @return string - */ - public function getValign() - { - return $this->valign; - } - - /** - * Set text kerning - * - * @param string $kerning - * @return void - */ - public function kerning($kerning) - { - $this->kerning = $kerning; - } - - /** - * Get kerning - * - * @return float - */ - public function getKerning() - { - return $this->kerning; - } - - /** - * Set path to font file - * - * @param string $file - * @return self - */ - public function file($file) - { - $this->file = $file; - - return $this; - } - - /** - * Get path to font file - * - * @return string - */ - public function getFile() - { - return $this->file; - } - - /** - * Checks if current font has access to an applicable font file - * - * @return boolean - */ - protected function hasApplicableFontFile() - { - if (is_string($this->file)) { - return file_exists($this->file); - } - - return false; - } - - /** - * Counts lines of text to be written - * - * @return int - */ - public function countLines() - { - return count(explode(PHP_EOL, $this->text)); - } -} diff --git a/Intervention/Image/AbstractShape.php b/Intervention/Image/AbstractShape.php deleted file mode 100644 index cd4a9f1..0000000 --- a/Intervention/Image/AbstractShape.php +++ /dev/null @@ -1,71 +0,0 @@ -background = $color; - } - - /** - * Set border width and color of current shape - * - * @param int $width - * @param string $color - * @return void - */ - public function border($width, $color = null) - { - $this->border_width = is_numeric($width) ? intval($width) : 0; - $this->border_color = is_null($color) ? '#000000' : $color; - } - - /** - * Determines if current shape has border - * - * @return boolean - */ - public function hasBorder() - { - return ($this->border_width >= 1); - } -} diff --git a/Intervention/Image/Commands/AbstractCommand.php b/Intervention/Image/Commands/AbstractCommand.php deleted file mode 100644 index e31078c..0000000 --- a/Intervention/Image/Commands/AbstractCommand.php +++ /dev/null @@ -1,81 +0,0 @@ -arguments = $arguments; - } - - /** - * Creates new argument instance from given argument key - * - * @param int $key - * @return \Intervention\Image\Commands\Argument - */ - public function argument($key) - { - return new Argument($this, $key); - } - - /** - * Returns output data of current command - * - * @return mixed - */ - public function getOutput() - { - return $this->output ? $this->output : null; - } - - /** - * Determines if current instance has output data - * - * @return boolean - */ - public function hasOutput() - { - return ! is_null($this->output); - } - - /** - * Sets output data of current command - * - * @param mixed $value - */ - public function setOutput($value) - { - $this->output = $value; - } -} diff --git a/Intervention/Image/Commands/Argument.php b/Intervention/Image/Commands/Argument.php deleted file mode 100644 index 9538199..0000000 --- a/Intervention/Image/Commands/Argument.php +++ /dev/null @@ -1,225 +0,0 @@ -command = $command; - $this->key = $key; - } - - /** - * Returns name of current arguments command - * - * @return string - */ - public function getCommandName() - { - preg_match("/\\\\([\w]+)Command$/", get_class($this->command), $matches); - return isset($matches[1]) ? lcfirst($matches[1]).'()' : 'Method'; - } - - /** - * Returns value of current argument - * - * @param mixed $default - * @return mixed - */ - public function value($default = null) - { - $arguments = $this->command->arguments; - - if (is_array($arguments)) { - return isset($arguments[$this->key]) ? $arguments[$this->key] : $default; - } - - return $default; - } - - /** - * Defines current argument as required - * - * @return \Intervention\Image\Commands\Argument - */ - public function required() - { - if ( ! array_key_exists($this->key, $this->command->arguments)) { - throw new InvalidArgumentException( - sprintf("Missing argument %d for %s", $this->key + 1, $this->getCommandName()) - ); - } - - return $this; - } - - /** - * Determines that current argument must be of given type - * - * @return \Intervention\Image\Commands\Argument - */ - public function type($type) - { - $valid = true; - $value = $this->value(); - - if ($value === null) { - return $this; - } - - switch (strtolower($type)) { - case 'bool': - case 'boolean': - $valid = \is_bool($value); - $message = '%s accepts only boolean values as argument %d.'; - break; - case 'int': - case 'integer': - $valid = \is_int($value); - $message = '%s accepts only integer values as argument %d.'; - break; - case 'num': - case 'numeric': - $valid = is_numeric($value); - $message = '%s accepts only numeric values as argument %d.'; - break; - case 'str': - case 'string': - $valid = \is_string($value); - $message = '%s accepts only string values as argument %d.'; - break; - case 'array': - $valid = \is_array($value); - $message = '%s accepts only array as argument %d.'; - break; - case 'closure': - $valid = is_a($value, '\Closure'); - $message = '%s accepts only Closure as argument %d.'; - break; - case 'digit': - $valid = $this->isDigit($value); - $message = '%s accepts only integer values as argument %d.'; - break; - } - - if (! $valid) { - $commandName = $this->getCommandName(); - $argument = $this->key + 1; - - if (isset($message)) { - $message = sprintf($message, $commandName, $argument); - } else { - $message = sprintf('Missing argument for %d.', $argument); - } - - throw new InvalidArgumentException( - $message - ); - } - - return $this; - } - - /** - * Determines that current argument value must be numeric between given values - * - * @return \Intervention\Image\Commands\Argument - */ - public function between($x, $y) - { - $value = $this->type('numeric')->value(); - - if (is_null($value)) { - return $this; - } - - $alpha = min($x, $y); - $omega = max($x, $y); - - if ($value < $alpha || $value > $omega) { - throw new InvalidArgumentException( - sprintf('Argument %d must be between %s and %s.', $this->key, $x, $y) - ); - } - - return $this; - } - - /** - * Determines that current argument must be over a minimum value - * - * @return \Intervention\Image\Commands\Argument - */ - public function min($value) - { - $v = $this->type('numeric')->value(); - - if (is_null($v)) { - return $this; - } - - if ($v < $value) { - throw new InvalidArgumentException( - sprintf('Argument %d must be at least %s.', $this->key, $value) - ); - } - - return $this; - } - - /** - * Determines that current argument must be under a maxiumum value - * - * @return \Intervention\Image\Commands\Argument - */ - public function max($value) - { - $v = $this->type('numeric')->value(); - - if (is_null($v)) { - return $this; - } - - if ($v > $value) { - throw new InvalidArgumentException( - sprintf('Argument %d may not be greater than %s.', $this->key, $value) - ); - } - - return $this; - } - - /** - * Checks if value is "PHP" integer (120 but also 120.0) - * - * @param mixed $value - * @return boolean - */ - private function isDigit($value) - { - return is_numeric($value) ? intval($value) == $value : false; - } -} diff --git a/Intervention/Image/Commands/ChecksumCommand.php b/Intervention/Image/Commands/ChecksumCommand.php deleted file mode 100644 index 9acc403..0000000 --- a/Intervention/Image/Commands/ChecksumCommand.php +++ /dev/null @@ -1,29 +0,0 @@ -getSize(); - - for ($x=0; $x <= ($size->width-1); $x++) { - for ($y=0; $y <= ($size->height-1); $y++) { - $colors[] = $image->pickColor($x, $y, 'array'); - } - } - - $this->setOutput(md5(serialize($colors))); - - return true; - } -} diff --git a/Intervention/Image/Commands/CircleCommand.php b/Intervention/Image/Commands/CircleCommand.php deleted file mode 100644 index c627818..0000000 --- a/Intervention/Image/Commands/CircleCommand.php +++ /dev/null @@ -1,35 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $x = $this->argument(1)->type('numeric')->required()->value(); - $y = $this->argument(2)->type('numeric')->required()->value(); - $callback = $this->argument(3)->type('closure')->value(); - - $circle_classname = sprintf('\Intervention\Image\%s\Shapes\CircleShape', - $image->getDriver()->getDriverName()); - - $circle = new $circle_classname($diameter); - - if ($callback instanceof Closure) { - $callback($circle); - } - - $circle->applyToImage($image, $x, $y); - - return true; - } -} diff --git a/Intervention/Image/Commands/EllipseCommand.php b/Intervention/Image/Commands/EllipseCommand.php deleted file mode 100644 index 4637e02..0000000 --- a/Intervention/Image/Commands/EllipseCommand.php +++ /dev/null @@ -1,36 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $height = $this->argument(1)->type('numeric')->required()->value(); - $x = $this->argument(2)->type('numeric')->required()->value(); - $y = $this->argument(3)->type('numeric')->required()->value(); - $callback = $this->argument(4)->type('closure')->value(); - - $ellipse_classname = sprintf('\Intervention\Image\%s\Shapes\EllipseShape', - $image->getDriver()->getDriverName()); - - $ellipse = new $ellipse_classname($width, $height); - - if ($callback instanceof Closure) { - $callback($ellipse); - } - - $ellipse->applyToImage($image, $x, $y); - - return true; - } -} diff --git a/Intervention/Image/Commands/ExifCommand.php b/Intervention/Image/Commands/ExifCommand.php deleted file mode 100644 index 063df6e..0000000 --- a/Intervention/Image/Commands/ExifCommand.php +++ /dev/null @@ -1,61 +0,0 @@ -argument(0)->value(); - - // try to read exif data from image file - try { - if ($image->dirname && $image->basename) { - $stream = $image->dirname . '/' . $image->basename; - } elseif (version_compare(PHP_VERSION, '7.2.0', '>=')) { - // https://www.php.net/manual/en/function.exif-read-data.php#refsect1-function.exif-read-data-changelog - $stream = $image->stream()->detach(); - } else { - // https://bugs.php.net/bug.php?id=65187 - $stream = $image->encode('data-url')->encoded; - } - - $data = @exif_read_data($stream); - - if (!is_null($key) && is_array($data)) { - $data = array_key_exists($key, $data) ? $data[$key] : false; - } - - } catch (\Exception $e) { - throw new NotReadableException( - sprintf( - "Cannot read the Exif data from the filename (%s) provided ", - $image->dirname . '/' . $image->basename - ), - $e->getCode(), - $e - ); - } - - $this->setOutput($data); - return true; - } -} diff --git a/Intervention/Image/Commands/IptcCommand.php b/Intervention/Image/Commands/IptcCommand.php deleted file mode 100644 index b78a2a8..0000000 --- a/Intervention/Image/Commands/IptcCommand.php +++ /dev/null @@ -1,68 +0,0 @@ -argument(0)->value(); - - $info = []; - @getimagesize($image->dirname .'/'. $image->basename, $info); - - $data = []; - - if (array_key_exists('APP13', $info)) { - $iptc = iptcparse($info['APP13']); - - if (is_array($iptc)) { - $data['DocumentTitle'] = isset($iptc["2#005"][0]) ? $iptc["2#005"][0] : null; - $data['Urgency'] = isset($iptc["2#010"][0]) ? $iptc["2#010"][0] : null; - $data['Category'] = isset($iptc["2#015"][0]) ? $iptc["2#015"][0] : null; - $data['Subcategories'] = isset($iptc["2#020"][0]) ? $iptc["2#020"][0] : null; - $data['Keywords'] = isset($iptc["2#025"][0]) ? $iptc["2#025"] : null; - $data['ReleaseDate'] = isset($iptc["2#030"][0]) ? $iptc["2#030"][0] : null; - $data['ReleaseTime'] = isset($iptc["2#035"][0]) ? $iptc["2#035"][0] : null; - $data['SpecialInstructions'] = isset($iptc["2#040"][0]) ? $iptc["2#040"][0] : null; - $data['CreationDate'] = isset($iptc["2#055"][0]) ? $iptc["2#055"][0] : null; - $data['CreationTime'] = isset($iptc["2#060"][0]) ? $iptc["2#060"][0] : null; - $data['AuthorByline'] = isset($iptc["2#080"][0]) ? $iptc["2#080"][0] : null; - $data['AuthorTitle'] = isset($iptc["2#085"][0]) ? $iptc["2#085"][0] : null; - $data['City'] = isset($iptc["2#090"][0]) ? $iptc["2#090"][0] : null; - $data['SubLocation'] = isset($iptc["2#092"][0]) ? $iptc["2#092"][0] : null; - $data['State'] = isset($iptc["2#095"][0]) ? $iptc["2#095"][0] : null; - $data['Country'] = isset($iptc["2#101"][0]) ? $iptc["2#101"][0] : null; - $data['OTR'] = isset($iptc["2#103"][0]) ? $iptc["2#103"][0] : null; - $data['Headline'] = isset($iptc["2#105"][0]) ? $iptc["2#105"][0] : null; - $data['Source'] = isset($iptc["2#110"][0]) ? $iptc["2#110"][0] : null; - $data['PhotoSource'] = isset($iptc["2#115"][0]) ? $iptc["2#115"][0] : null; - $data['Copyright'] = isset($iptc["2#116"][0]) ? $iptc["2#116"][0] : null; - $data['Caption'] = isset($iptc["2#120"][0]) ? $iptc["2#120"][0] : null; - $data['CaptionWriter'] = isset($iptc["2#122"][0]) ? $iptc["2#122"][0] : null; - } - } - - if (! is_null($key) && is_array($data)) { - $data = array_key_exists($key, $data) ? $data[$key] : false; - } - - $this->setOutput($data); - - return true; - } -} diff --git a/Intervention/Image/Commands/LineCommand.php b/Intervention/Image/Commands/LineCommand.php deleted file mode 100644 index a068c66..0000000 --- a/Intervention/Image/Commands/LineCommand.php +++ /dev/null @@ -1,36 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $y1 = $this->argument(1)->type('numeric')->required()->value(); - $x2 = $this->argument(2)->type('numeric')->required()->value(); - $y2 = $this->argument(3)->type('numeric')->required()->value(); - $callback = $this->argument(4)->type('closure')->value(); - - $line_classname = sprintf('\Intervention\Image\%s\Shapes\LineShape', - $image->getDriver()->getDriverName()); - - $line = new $line_classname($x2, $y2); - - if ($callback instanceof Closure) { - $callback($line); - } - - $line->applyToImage($image, $x1, $y1); - - return true; - } -} diff --git a/Intervention/Image/Commands/OrientateCommand.php b/Intervention/Image/Commands/OrientateCommand.php deleted file mode 100644 index 552482c..0000000 --- a/Intervention/Image/Commands/OrientateCommand.php +++ /dev/null @@ -1,48 +0,0 @@ -exif('Orientation')) { - - case 2: - $image->flip(); - break; - - case 3: - $image->rotate(180); - break; - - case 4: - $image->rotate(180)->flip(); - break; - - case 5: - $image->rotate(270)->flip(); - break; - - case 6: - $image->rotate(270); - break; - - case 7: - $image->rotate(90)->flip(); - break; - - case 8: - $image->rotate(90); - break; - } - - return true; - } -} diff --git a/Intervention/Image/Commands/PolygonCommand.php b/Intervention/Image/Commands/PolygonCommand.php deleted file mode 100644 index a2fa997..0000000 --- a/Intervention/Image/Commands/PolygonCommand.php +++ /dev/null @@ -1,49 +0,0 @@ -argument(0)->type('array')->required()->value(); - $callback = $this->argument(1)->type('closure')->value(); - - $vertices_count = count($points); - - // check if number if coordinates is even - if ($vertices_count % 2 !== 0) { - throw new InvalidArgumentException( - "The number of given polygon vertices must be even." - ); - } - - if ($vertices_count < 6) { - throw new InvalidArgumentException( - "You must have at least 3 points in your array." - ); - } - - $polygon_classname = sprintf('\Intervention\Image\%s\Shapes\PolygonShape', - $image->getDriver()->getDriverName()); - - $polygon = new $polygon_classname($points); - - if ($callback instanceof Closure) { - $callback($polygon); - } - - $polygon->applyToImage($image); - - return true; - } -} diff --git a/Intervention/Image/Commands/PsrResponseCommand.php b/Intervention/Image/Commands/PsrResponseCommand.php deleted file mode 100644 index d75cd90..0000000 --- a/Intervention/Image/Commands/PsrResponseCommand.php +++ /dev/null @@ -1,45 +0,0 @@ -argument(0)->value(); - $quality = $this->argument(1)->between(0, 100)->value(); - - //Encoded property will be populated at this moment - $stream = $image->stream($format, $quality); - - $mimetype = finfo_buffer( - finfo_open(FILEINFO_MIME_TYPE), - $image->getEncoded() - ); - - $this->setOutput(new Response( - 200, - [ - 'Content-Type' => $mimetype, - 'Content-Length' => strlen($image->getEncoded()) - ], - $stream - )); - - return true; - } -} \ No newline at end of file diff --git a/Intervention/Image/Commands/RectangleCommand.php b/Intervention/Image/Commands/RectangleCommand.php deleted file mode 100644 index 24378b3..0000000 --- a/Intervention/Image/Commands/RectangleCommand.php +++ /dev/null @@ -1,36 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $y1 = $this->argument(1)->type('numeric')->required()->value(); - $x2 = $this->argument(2)->type('numeric')->required()->value(); - $y2 = $this->argument(3)->type('numeric')->required()->value(); - $callback = $this->argument(4)->type('closure')->value(); - - $rectangle_classname = sprintf('\Intervention\Image\%s\Shapes\RectangleShape', - $image->getDriver()->getDriverName()); - - $rectangle = new $rectangle_classname($x1, $y1, $x2, $y2); - - if ($callback instanceof Closure) { - $callback($rectangle); - } - - $rectangle->applyToImage($image, $x1, $y1); - - return true; - } -} diff --git a/Intervention/Image/Commands/ResponseCommand.php b/Intervention/Image/Commands/ResponseCommand.php deleted file mode 100644 index 7903b5a..0000000 --- a/Intervention/Image/Commands/ResponseCommand.php +++ /dev/null @@ -1,26 +0,0 @@ -argument(0)->value(); - $quality = $this->argument(1)->between(0, 100)->value(); - - $response = new Response($image, $format, $quality); - - $this->setOutput($response->make()); - - return true; - } -} diff --git a/Intervention/Image/Commands/StreamCommand.php b/Intervention/Image/Commands/StreamCommand.php deleted file mode 100644 index bc2ff9e..0000000 --- a/Intervention/Image/Commands/StreamCommand.php +++ /dev/null @@ -1,39 +0,0 @@ -argument(0)->value(); - $quality = $this->argument(1)->between(0, 100)->value(); - $data = $image->encode($format, $quality)->getEncoded(); - - $this->setOutput($this->getStream($data)); - - return true; - } - - /** - * Create stream from given data - * - * @param string $data - * @return \Psr\Http\Message\StreamInterface - */ - protected function getStream($data) - { - if (class_exists(\GuzzleHttp\Psr7\Utils::class)) { - return \GuzzleHttp\Psr7\Utils::streamFor($data); // guzzlehttp/psr7 >= 2.0 - } - - return \GuzzleHttp\Psr7\stream_for($data); // guzzlehttp/psr7 < 2.0 - } -} diff --git a/Intervention/Image/Commands/TextCommand.php b/Intervention/Image/Commands/TextCommand.php deleted file mode 100644 index 3c60b4e..0000000 --- a/Intervention/Image/Commands/TextCommand.php +++ /dev/null @@ -1,34 +0,0 @@ -argument(0)->required()->value(); - $x = $this->argument(1)->type('numeric')->value(0); - $y = $this->argument(2)->type('numeric')->value(0); - $callback = $this->argument(3)->type('closure')->value(); - - $fontclassname = sprintf('\Intervention\Image\%s\Font', - $image->getDriver()->getDriverName()); - - $font = new $fontclassname($text); - - if ($callback instanceof Closure) { - $callback($font); - } - - $font->applyToImage($image, $x, $y); - - return true; - } -} diff --git a/Intervention/Image/Constraint.php b/Intervention/Image/Constraint.php deleted file mode 100644 index 44bdd67..0000000 --- a/Intervention/Image/Constraint.php +++ /dev/null @@ -1,92 +0,0 @@ -size = $size; - } - - /** - * Returns current size of constraint - * - * @return \Intervention\Image\Size - */ - public function getSize() - { - return $this->size; - } - - /** - * Fix the given argument in current constraint - * - * @param int $type - * @return void - */ - public function fix($type) - { - $this->fixed = ($this->fixed & ~(1 << $type)) | (1 << $type); - } - - /** - * Checks if given argument is fixed in current constraint - * - * @param int $type - * @return boolean - */ - public function isFixed($type) - { - return (bool) ($this->fixed & (1 << $type)); - } - - /** - * Fixes aspect ratio in current constraint - * - * @return void - */ - public function aspectRatio() - { - $this->fix(self::ASPECTRATIO); - } - - /** - * Fixes possibility to size up in current constraint - * - * @return void - */ - public function upsize() - { - $this->fix(self::UPSIZE); - } -} diff --git a/Intervention/Image/Exception/ImageException.php b/Intervention/Image/Exception/ImageException.php deleted file mode 100644 index 83e6b91..0000000 --- a/Intervention/Image/Exception/ImageException.php +++ /dev/null @@ -1,8 +0,0 @@ -dirname = array_key_exists('dirname', $info) ? $info['dirname'] : null; - $this->basename = array_key_exists('basename', $info) ? $info['basename'] : null; - $this->extension = array_key_exists('extension', $info) ? $info['extension'] : null; - $this->filename = array_key_exists('filename', $info) ? $info['filename'] : null; - - if (file_exists($path) && is_file($path)) { - $this->mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $path); - } - - return $this; - } - - /** - * Get file size - * - * @return mixed - */ - public function filesize() - { - $path = $this->basePath(); - - if (file_exists($path) && is_file($path)) { - return filesize($path); - } - - return false; - } - - /** - * Get fully qualified path - * - * @return string - */ - public function basePath() - { - if ($this->dirname && $this->basename) { - return ($this->dirname .'/'. $this->basename); - } - - return null; - } - -} diff --git a/Intervention/Image/Filters/DemoFilter.php b/Intervention/Image/Filters/DemoFilter.php deleted file mode 100644 index 4e8f92b..0000000 --- a/Intervention/Image/Filters/DemoFilter.php +++ /dev/null @@ -1,44 +0,0 @@ -size = is_numeric($size) ? intval($size) : self::DEFAULT_SIZE; - } - - /** - * Applies filter effects to given image - * - * @param \Intervention\Image\Image $image - * @return \Intervention\Image\Image - */ - public function applyFilter(Image $image) - { - $image->pixelate($this->size); - $image->greyscale(); - - return $image; - } -} diff --git a/Intervention/Image/Filters/FilterInterface.php b/Intervention/Image/Filters/FilterInterface.php deleted file mode 100644 index 88f6cbf..0000000 --- a/Intervention/Image/Filters/FilterInterface.php +++ /dev/null @@ -1,16 +0,0 @@ -a = ($value >> 24) & 0xFF; - $this->r = ($value >> 16) & 0xFF; - $this->g = ($value >> 8) & 0xFF; - $this->b = $value & 0xFF; - } - - /** - * Initiates color object from given array - * - * @param array $value - * @return \Intervention\Image\AbstractColor - */ - public function initFromArray($array) - { - $array = array_values($array); - - if (count($array) == 4) { - - // color array with alpha value - list($r, $g, $b, $a) = $array; - $this->a = $this->alpha2gd($a); - - } elseif (count($array) == 3) { - - // color array without alpha value - list($r, $g, $b) = $array; - $this->a = 0; - - } - - $this->r = $r; - $this->g = $g; - $this->b = $b; - } - - /** - * Initiates color object from given string - * - * @param string $value - * @return \Intervention\Image\AbstractColor - */ - public function initFromString($value) - { - if ($color = $this->rgbaFromString($value)) { - $this->r = $color[0]; - $this->g = $color[1]; - $this->b = $color[2]; - $this->a = $this->alpha2gd($color[3]); - } - } - - /** - * Initiates color object from given R, G and B values - * - * @param int $r - * @param int $g - * @param int $b - * @return \Intervention\Image\AbstractColor - */ - public function initFromRgb($r, $g, $b) - { - $this->r = intval($r); - $this->g = intval($g); - $this->b = intval($b); - $this->a = 0; - } - - /** - * Initiates color object from given R, G, B and A values - * - * @param int $r - * @param int $g - * @param int $b - * @param float $a - * @return \Intervention\Image\AbstractColor - */ - public function initFromRgba($r, $g, $b, $a = 1) - { - $this->r = intval($r); - $this->g = intval($g); - $this->b = intval($b); - $this->a = $this->alpha2gd($a); - } - - /** - * Initiates color object from given ImagickPixel object - * - * @param ImagickPixel $value - * @return \Intervention\Image\AbstractColor - */ - public function initFromObject($value) - { - throw new NotSupportedException( - "GD colors cannot init from ImagickPixel objects." - ); - } - - /** - * Calculates integer value of current color instance - * - * @return int - */ - public function getInt() - { - return ($this->a << 24) + ($this->r << 16) + ($this->g << 8) + $this->b; - } - - /** - * Calculates hexadecimal value of current color instance - * - * @param string $prefix - * @return string - */ - public function getHex($prefix = '') - { - return sprintf('%s%02x%02x%02x', $prefix, $this->r, $this->g, $this->b); - } - - /** - * Calculates RGB(A) in array format of current color instance - * - * @return array - */ - public function getArray() - { - return [$this->r, $this->g, $this->b, round(1 - $this->a / 127, 2)]; - } - - /** - * Calculates RGBA in string format of current color instance - * - * @return string - */ - public function getRgba() - { - return sprintf('rgba(%d, %d, %d, %.2F)', $this->r, $this->g, $this->b, round(1 - $this->a / 127, 2)); - } - - /** - * Determines if current color is different from given color - * - * @param AbstractColor $color - * @param int $tolerance - * @return boolean - */ - public function differs(AbstractColor $color, $tolerance = 0) - { - $color_tolerance = round($tolerance * 2.55); - $alpha_tolerance = round($tolerance * 1.27); - - $delta = [ - 'r' => abs($color->r - $this->r), - 'g' => abs($color->g - $this->g), - 'b' => abs($color->b - $this->b), - 'a' => abs($color->a - $this->a) - ]; - - return ( - $delta['r'] > $color_tolerance or - $delta['g'] > $color_tolerance or - $delta['b'] > $color_tolerance or - $delta['a'] > $alpha_tolerance - ); - } - - /** - * Convert rgba alpha (0-1) value to gd value (0-127) - * - * @param float $input - * @return int - */ - private function alpha2gd($input) - { - $oldMin = 0; - $oldMax = 1; - - $newMin = 127; - $newMax = 0; - - return ceil(((($input- $oldMin) * ($newMax - $newMin)) / ($oldMax - $oldMin)) + $newMin); - } -} diff --git a/Intervention/Image/Gd/Commands/BackupCommand.php b/Intervention/Image/Gd/Commands/BackupCommand.php deleted file mode 100644 index 310dc03..0000000 --- a/Intervention/Image/Gd/Commands/BackupCommand.php +++ /dev/null @@ -1,25 +0,0 @@ -argument(0)->value(); - - // clone current image resource - $clone = clone $image; - $image->setBackup($clone->getCore(), $backupName); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/BlurCommand.php b/Intervention/Image/Gd/Commands/BlurCommand.php deleted file mode 100644 index c4fca0e..0000000 --- a/Intervention/Image/Gd/Commands/BlurCommand.php +++ /dev/null @@ -1,25 +0,0 @@ -argument(0)->between(0, 100)->value(1); - - for ($i=0; $i < intval($amount); $i++) { - imagefilter($image->getCore(), IMG_FILTER_GAUSSIAN_BLUR); - } - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/BrightnessCommand.php b/Intervention/Image/Gd/Commands/BrightnessCommand.php deleted file mode 100644 index 4e48464..0000000 --- a/Intervention/Image/Gd/Commands/BrightnessCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - - return imagefilter($image->getCore(), IMG_FILTER_BRIGHTNESS, ($level * 2.55)); - } -} diff --git a/Intervention/Image/Gd/Commands/ColorizeCommand.php b/Intervention/Image/Gd/Commands/ColorizeCommand.php deleted file mode 100644 index 410917b..0000000 --- a/Intervention/Image/Gd/Commands/ColorizeCommand.php +++ /dev/null @@ -1,29 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - $green = $this->argument(1)->between(-100, 100)->required()->value(); - $blue = $this->argument(2)->between(-100, 100)->required()->value(); - - // normalize colorize levels - $red = round($red * 2.55); - $green = round($green * 2.55); - $blue = round($blue * 2.55); - - // apply filter - return imagefilter($image->getCore(), IMG_FILTER_COLORIZE, $red, $green, $blue); - } -} diff --git a/Intervention/Image/Gd/Commands/ContrastCommand.php b/Intervention/Image/Gd/Commands/ContrastCommand.php deleted file mode 100644 index 916c41f..0000000 --- a/Intervention/Image/Gd/Commands/ContrastCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - - return imagefilter($image->getCore(), IMG_FILTER_CONTRAST, ($level * -1)); - } -} diff --git a/Intervention/Image/Gd/Commands/CropCommand.php b/Intervention/Image/Gd/Commands/CropCommand.php deleted file mode 100644 index b7f5954..0000000 --- a/Intervention/Image/Gd/Commands/CropCommand.php +++ /dev/null @@ -1,40 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->required()->value(); - $x = $this->argument(2)->type('digit')->value(); - $y = $this->argument(3)->type('digit')->value(); - - if (is_null($width) || is_null($height)) { - throw new \Intervention\Image\Exception\InvalidArgumentException( - "Width and height of cutout needs to be defined." - ); - } - - $cropped = new Size($width, $height); - $position = new Point($x, $y); - - // align boxes - if (is_null($x) && is_null($y)) { - $position = $image->getSize()->align('center')->relativePosition($cropped->align('center')); - } - - // crop image core - return $this->modify($image, 0, 0, $position->x, $position->y, $cropped->width, $cropped->height, $cropped->width, $cropped->height); - } -} diff --git a/Intervention/Image/Gd/Commands/DestroyCommand.php b/Intervention/Image/Gd/Commands/DestroyCommand.php deleted file mode 100644 index 4503d10..0000000 --- a/Intervention/Image/Gd/Commands/DestroyCommand.php +++ /dev/null @@ -1,27 +0,0 @@ -getCore()); - - // destroy backups - foreach ($image->getBackups() as $backup) { - imagedestroy($backup); - } - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/FillCommand.php b/Intervention/Image/Gd/Commands/FillCommand.php deleted file mode 100644 index cf19082..0000000 --- a/Intervention/Image/Gd/Commands/FillCommand.php +++ /dev/null @@ -1,69 +0,0 @@ -argument(0)->value(); - $x = $this->argument(1)->type('digit')->value(); - $y = $this->argument(2)->type('digit')->value(); - - $width = $image->getWidth(); - $height = $image->getHeight(); - $resource = $image->getCore(); - - try { - - // set image tile filling - $source = new Decoder; - $tile = $source->init($filling); - imagesettile($image->getCore(), $tile->getCore()); - $filling = IMG_COLOR_TILED; - - } catch (\Intervention\Image\Exception\NotReadableException $e) { - - // set solid color filling - $color = new Color($filling); - $filling = $color->getInt(); - } - - imagealphablending($resource, true); - - if (is_int($x) && is_int($y)) { - - // resource should be visible through transparency - $base = $image->getDriver()->newImage($width, $height)->getCore(); - imagecopy($base, $resource, 0, 0, 0, 0, $width, $height); - - // floodfill if exact position is defined - imagefill($resource, $x, $y, $filling); - - // copy filled original over base - imagecopy($base, $resource, 0, 0, 0, 0, $width, $height); - - // set base as new resource-core - $image->setCore($base); - imagedestroy($resource); - - } else { - // fill whole image otherwise - imagefilledrectangle($resource, 0, 0, $width - 1, $height - 1, $filling); - } - - isset($tile) ? imagedestroy($tile->getCore()) : null; - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/FitCommand.php b/Intervention/Image/Gd/Commands/FitCommand.php deleted file mode 100644 index d861ad9..0000000 --- a/Intervention/Image/Gd/Commands/FitCommand.php +++ /dev/null @@ -1,32 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->value($width); - $constraints = $this->argument(2)->type('closure')->value(); - $position = $this->argument(3)->type('string')->value('center'); - - // calculate size - $cropped = $image->getSize()->fit(new Size($width, $height), $position); - $resized = clone $cropped; - $resized = $resized->resize($width, $height, $constraints); - - // modify image - $this->modify($image, 0, 0, $cropped->pivot->x, $cropped->pivot->y, $resized->getWidth(), $resized->getHeight(), $cropped->getWidth(), $cropped->getHeight()); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/FlipCommand.php b/Intervention/Image/Gd/Commands/FlipCommand.php deleted file mode 100644 index aa8f230..0000000 --- a/Intervention/Image/Gd/Commands/FlipCommand.php +++ /dev/null @@ -1,37 +0,0 @@ -argument(0)->value('h'); - - $size = $image->getSize(); - $dst = clone $size; - - switch (strtolower($mode)) { - case 2: - case 'v': - case 'vert': - case 'vertical': - $size->pivot->y = $size->height - 1; - $size->height = $size->height * (-1); - break; - - default: - $size->pivot->x = $size->width - 1; - $size->width = $size->width * (-1); - break; - } - - return $this->modify($image, 0, 0, $size->pivot->x, $size->pivot->y, $dst->width, $dst->height, $size->width, $size->height); - } -} diff --git a/Intervention/Image/Gd/Commands/GammaCommand.php b/Intervention/Image/Gd/Commands/GammaCommand.php deleted file mode 100644 index 7de0fb8..0000000 --- a/Intervention/Image/Gd/Commands/GammaCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - - return imagegammacorrect($image->getCore(), 1, $gamma); - } -} diff --git a/Intervention/Image/Gd/Commands/GetSizeCommand.php b/Intervention/Image/Gd/Commands/GetSizeCommand.php deleted file mode 100644 index 9eb7e20..0000000 --- a/Intervention/Image/Gd/Commands/GetSizeCommand.php +++ /dev/null @@ -1,25 +0,0 @@ -setOutput(new Size( - imagesx($image->getCore()), - imagesy($image->getCore()) - )); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/GreyscaleCommand.php b/Intervention/Image/Gd/Commands/GreyscaleCommand.php deleted file mode 100644 index 12921e7..0000000 --- a/Intervention/Image/Gd/Commands/GreyscaleCommand.php +++ /dev/null @@ -1,19 +0,0 @@ -getCore(), IMG_FILTER_GRAYSCALE); - } -} diff --git a/Intervention/Image/Gd/Commands/HeightenCommand.php b/Intervention/Image/Gd/Commands/HeightenCommand.php deleted file mode 100644 index d31e9cd..0000000 --- a/Intervention/Image/Gd/Commands/HeightenCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $additionalConstraints = $this->argument(1)->type('closure')->value(); - - $this->arguments[0] = null; - $this->arguments[1] = $height; - $this->arguments[2] = function ($constraint) use ($additionalConstraints) { - $constraint->aspectRatio(); - if(is_callable($additionalConstraints)) - $additionalConstraints($constraint); - }; - - return parent::execute($image); - } -} diff --git a/Intervention/Image/Gd/Commands/InsertCommand.php b/Intervention/Image/Gd/Commands/InsertCommand.php deleted file mode 100644 index 47c7703..0000000 --- a/Intervention/Image/Gd/Commands/InsertCommand.php +++ /dev/null @@ -1,34 +0,0 @@ -argument(0)->required()->value(); - $position = $this->argument(1)->type('string')->value(); - $x = $this->argument(2)->type('digit')->value(0); - $y = $this->argument(3)->type('digit')->value(0); - - // build watermark - $watermark = $image->getDriver()->init($source); - - // define insertion point - $image_size = $image->getSize()->align($position, $x, $y); - $watermark_size = $watermark->getSize()->align($position); - $target = $image_size->relativePosition($watermark_size); - - // insert image at position - imagealphablending($image->getCore(), true); - return imagecopy($image->getCore(), $watermark->getCore(), $target->x, $target->y, 0, 0, $watermark_size->width, $watermark_size->height); - } -} diff --git a/Intervention/Image/Gd/Commands/InterlaceCommand.php b/Intervention/Image/Gd/Commands/InterlaceCommand.php deleted file mode 100644 index e3461cb..0000000 --- a/Intervention/Image/Gd/Commands/InterlaceCommand.php +++ /dev/null @@ -1,23 +0,0 @@ -argument(0)->type('bool')->value(true); - - imageinterlace($image->getCore(), $mode); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/InvertCommand.php b/Intervention/Image/Gd/Commands/InvertCommand.php deleted file mode 100644 index 1a514f1..0000000 --- a/Intervention/Image/Gd/Commands/InvertCommand.php +++ /dev/null @@ -1,19 +0,0 @@ -getCore(), IMG_FILTER_NEGATE); - } -} diff --git a/Intervention/Image/Gd/Commands/LimitColorsCommand.php b/Intervention/Image/Gd/Commands/LimitColorsCommand.php deleted file mode 100644 index 0baed7e..0000000 --- a/Intervention/Image/Gd/Commands/LimitColorsCommand.php +++ /dev/null @@ -1,53 +0,0 @@ -argument(0)->value(); - $matte = $this->argument(1)->value(); - - // get current image size - $size = $image->getSize(); - - // create empty canvas - $resource = imagecreatetruecolor($size->width, $size->height); - - // define matte - if (is_null($matte)) { - $matte = imagecolorallocatealpha($resource, 255, 255, 255, 127); - } else { - $matte = $image->getDriver()->parseColor($matte)->getInt(); - } - - // fill with matte and copy original image - imagefill($resource, 0, 0, $matte); - - // set transparency - imagecolortransparent($resource, $matte); - - // copy original image - imagecopy($resource, $image->getCore(), 0, 0, 0, 0, $size->width, $size->height); - - if (is_numeric($count) && $count <= 256) { - // decrease colors - imagetruecolortopalette($resource, true, $count); - } - - // set new resource - $image->setCore($resource); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/MaskCommand.php b/Intervention/Image/Gd/Commands/MaskCommand.php deleted file mode 100644 index 4c61429..0000000 --- a/Intervention/Image/Gd/Commands/MaskCommand.php +++ /dev/null @@ -1,83 +0,0 @@ -argument(0)->value(); - $mask_w_alpha = $this->argument(1)->type('bool')->value(false); - - $image_size = $image->getSize(); - - // create empty canvas - $canvas = $image->getDriver()->newImage($image_size->width, $image_size->height, [0,0,0,0]); - - // build mask image from source - $mask = $image->getDriver()->init($mask_source); - $mask_size = $mask->getSize(); - - // resize mask to size of current image (if necessary) - if ($mask_size != $image_size) { - $mask->resize($image_size->width, $image_size->height); - } - - imagealphablending($canvas->getCore(), false); - - if ( ! $mask_w_alpha) { - // mask from greyscale image - imagefilter($mask->getCore(), IMG_FILTER_GRAYSCALE); - } - - // redraw old image pixel by pixel considering alpha map - for ($x=0; $x < $image_size->width; $x++) { - for ($y=0; $y < $image_size->height; $y++) { - - $color = $image->pickColor($x, $y, 'array'); - $alpha = $mask->pickColor($x, $y, 'array'); - - if ($mask_w_alpha) { - $alpha = $alpha[3]; // use alpha channel as mask - } else { - - if ($alpha[3] == 0) { // transparent as black - $alpha = 0; - } else { - - // $alpha = floatval(round((($alpha[0] + $alpha[1] + $alpha[3]) / 3) / 255, 2)); - - // image is greyscale, so channel doesn't matter (use red channel) - $alpha = floatval(round($alpha[0] / 255, 2)); - } - - } - - // preserve alpha of original image... - if ($color[3] < $alpha) { - $alpha = $color[3]; - } - - // replace alpha value - $color[3] = $alpha; - - // redraw pixel - $canvas->pixel($color, $x, $y); - } - } - - - // replace current image with masked instance - $image->setCore($canvas->getCore()); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/OpacityCommand.php b/Intervention/Image/Gd/Commands/OpacityCommand.php deleted file mode 100644 index 48492d2..0000000 --- a/Intervention/Image/Gd/Commands/OpacityCommand.php +++ /dev/null @@ -1,31 +0,0 @@ -argument(0)->between(0, 100)->required()->value(); - - // get size of image - $size = $image->getSize(); - - // build temp alpha mask - $mask_color = sprintf('rgba(0, 0, 0, %.1F)', $transparency / 100); - $mask = $image->getDriver()->newImage($size->width, $size->height, $mask_color); - - // mask image - $image->mask($mask->getCore(), true); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/PickColorCommand.php b/Intervention/Image/Gd/Commands/PickColorCommand.php deleted file mode 100644 index bad96f4..0000000 --- a/Intervention/Image/Gd/Commands/PickColorCommand.php +++ /dev/null @@ -1,37 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $y = $this->argument(1)->type('digit')->required()->value(); - $format = $this->argument(2)->type('string')->value('array'); - - // pick color - $color = imagecolorat($image->getCore(), $x, $y); - - if ( ! imageistruecolor($image->getCore())) { - $color = imagecolorsforindex($image->getCore(), $color); - $color['alpha'] = round(1 - $color['alpha'] / 127, 2); - } - - $color = new Color($color); - - // format to output - $this->setOutput($color->format($format)); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/PixelCommand.php b/Intervention/Image/Gd/Commands/PixelCommand.php deleted file mode 100644 index 2a90ce3..0000000 --- a/Intervention/Image/Gd/Commands/PixelCommand.php +++ /dev/null @@ -1,25 +0,0 @@ -argument(0)->required()->value(); - $color = new Color($color); - $x = $this->argument(1)->type('digit')->required()->value(); - $y = $this->argument(2)->type('digit')->required()->value(); - - return imagesetpixel($image->getCore(), $x, $y, $color->getInt()); - } -} diff --git a/Intervention/Image/Gd/Commands/PixelateCommand.php b/Intervention/Image/Gd/Commands/PixelateCommand.php deleted file mode 100644 index 0934797..0000000 --- a/Intervention/Image/Gd/Commands/PixelateCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->type('digit')->value(10); - - return imagefilter($image->getCore(), IMG_FILTER_PIXELATE, $size, true); - } -} diff --git a/Intervention/Image/Gd/Commands/ResetCommand.php b/Intervention/Image/Gd/Commands/ResetCommand.php deleted file mode 100644 index a68b75e..0000000 --- a/Intervention/Image/Gd/Commands/ResetCommand.php +++ /dev/null @@ -1,39 +0,0 @@ -argument(0)->value(); - $backup = $image->getBackup($backupName); - - if (is_resource($backup) || $backup instanceof \GdImage) { - - // destroy current resource - imagedestroy($image->getCore()); - - // clone backup - $backup = $image->getDriver()->cloneCore($backup); - - // reset to new resource - $image->setCore($backup); - - return true; - } - - throw new RuntimeException( - "Backup not available. Call backup() before reset()." - ); - } -} diff --git a/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php b/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php deleted file mode 100644 index 73f3df3..0000000 --- a/Intervention/Image/Gd/Commands/ResizeCanvasCommand.php +++ /dev/null @@ -1,83 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->required()->value(); - $anchor = $this->argument(2)->value('center'); - $relative = $this->argument(3)->type('boolean')->value(false); - $bgcolor = $this->argument(4)->value(); - - $original_width = $image->getWidth(); - $original_height = $image->getHeight(); - - // check of only width or height is set - $width = is_null($width) ? $original_width : intval($width); - $height = is_null($height) ? $original_height : intval($height); - - // check on relative width/height - if ($relative) { - $width = $original_width + $width; - $height = $original_height + $height; - } - - // check for negative width/height - $width = ($width <= 0) ? $width + $original_width : $width; - $height = ($height <= 0) ? $height + $original_height : $height; - - // create new canvas - $canvas = $image->getDriver()->newImage($width, $height, $bgcolor); - - // set copy position - $canvas_size = $canvas->getSize()->align($anchor); - $image_size = $image->getSize()->align($anchor); - $canvas_pos = $image_size->relativePosition($canvas_size); - $image_pos = $canvas_size->relativePosition($image_size); - - if ($width <= $original_width) { - $dst_x = 0; - $src_x = $canvas_pos->x; - $src_w = $canvas_size->width; - } else { - $dst_x = $image_pos->x; - $src_x = 0; - $src_w = $original_width; - } - - if ($height <= $original_height) { - $dst_y = 0; - $src_y = $canvas_pos->y; - $src_h = $canvas_size->height; - } else { - $dst_y = $image_pos->y; - $src_y = 0; - $src_h = $original_height; - } - - // make image area transparent to keep transparency - // even if background-color is set - $transparent = imagecolorallocatealpha($canvas->getCore(), 255, 255, 255, 127); - imagealphablending($canvas->getCore(), false); // do not blend / just overwrite - imagefilledrectangle($canvas->getCore(), $dst_x, $dst_y, $dst_x + $src_w - 1, $dst_y + $src_h - 1, $transparent); - - // copy image into new canvas - imagecopy($canvas->getCore(), $image->getCore(), $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h); - - // set new core to canvas - $image->setCore($canvas->getCore()); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/ResizeCommand.php b/Intervention/Image/Gd/Commands/ResizeCommand.php deleted file mode 100644 index 382d970..0000000 --- a/Intervention/Image/Gd/Commands/ResizeCommand.php +++ /dev/null @@ -1,84 +0,0 @@ -argument(0)->value(); - $height = $this->argument(1)->value(); - $constraints = $this->argument(2)->type('closure')->value(); - - // resize box - $resized = $image->getSize()->resize($width, $height, $constraints); - - // modify image - $this->modify($image, 0, 0, 0, 0, $resized->getWidth(), $resized->getHeight(), $image->getWidth(), $image->getHeight()); - - return true; - } - - /** - * Wrapper function for 'imagecopyresampled' - * - * @param Image $image - * @param int $dst_x - * @param int $dst_y - * @param int $src_x - * @param int $src_y - * @param int $dst_w - * @param int $dst_h - * @param int $src_w - * @param int $src_h - * @return boolean - */ - protected function modify($image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) - { - // create new image - $modified = imagecreatetruecolor($dst_w, $dst_h); - - // get current image - $resource = $image->getCore(); - - // preserve transparency - $transIndex = imagecolortransparent($resource); - - if ($transIndex != -1) { - $rgba = imagecolorsforindex($modified, $transIndex); - $transColor = imagecolorallocatealpha($modified, $rgba['red'], $rgba['green'], $rgba['blue'], 127); - imagefill($modified, 0, 0, $transColor); - imagecolortransparent($modified, $transColor); - } else { - imagealphablending($modified, false); - imagesavealpha($modified, true); - } - - // copy content from resource - $result = imagecopyresampled( - $modified, - $resource, - $dst_x, - $dst_y, - $src_x, - $src_y, - $dst_w, - $dst_h, - $src_w, - $src_h - ); - - // set new content as recource - $image->setCore($modified); - - return $result; - } -} diff --git a/Intervention/Image/Gd/Commands/RotateCommand.php b/Intervention/Image/Gd/Commands/RotateCommand.php deleted file mode 100644 index 682ec0d..0000000 --- a/Intervention/Image/Gd/Commands/RotateCommand.php +++ /dev/null @@ -1,30 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $color = $this->argument(1)->value(); - $color = new Color($color); - - // restrict rotations beyond 360 degrees, since the end result is the same - $angle = fmod($angle, 360); - - // rotate image - $image->setCore(imagerotate($image->getCore(), $angle, $color->getInt())); - - return true; - } -} diff --git a/Intervention/Image/Gd/Commands/SharpenCommand.php b/Intervention/Image/Gd/Commands/SharpenCommand.php deleted file mode 100644 index 782e565..0000000 --- a/Intervention/Image/Gd/Commands/SharpenCommand.php +++ /dev/null @@ -1,34 +0,0 @@ -argument(0)->between(0, 100)->value(10); - - // build matrix - $min = $amount >= 10 ? $amount * -0.01 : 0; - $max = $amount * -0.025; - $abs = ((4 * $min + 4 * $max) * -1) + 1; - $div = 1; - - $matrix = [ - [$min, $max, $min], - [$max, $abs, $max], - [$min, $max, $min] - ]; - - // apply the matrix - return imageconvolution($image->getCore(), $matrix, $div, 0); - } -} diff --git a/Intervention/Image/Gd/Commands/TrimCommand.php b/Intervention/Image/Gd/Commands/TrimCommand.php deleted file mode 100644 index 2e36975..0000000 --- a/Intervention/Image/Gd/Commands/TrimCommand.php +++ /dev/null @@ -1,176 +0,0 @@ -argument(0)->type('string')->value(); - $away = $this->argument(1)->value(); - $tolerance = $this->argument(2)->type('numeric')->value(0); - $feather = $this->argument(3)->type('numeric')->value(0); - - $width = $image->getWidth(); - $height = $image->getHeight(); - - // default values - $checkTransparency = false; - - // define borders to trim away - if (is_null($away)) { - $away = ['top', 'right', 'bottom', 'left']; - } elseif (is_string($away)) { - $away = [$away]; - } - - // lower border names - foreach ($away as $key => $value) { - $away[$key] = strtolower($value); - } - - // define base color position - switch (strtolower($base)) { - case 'transparent': - case 'trans': - $checkTransparency = true; - $base_x = 0; - $base_y = 0; - break; - - case 'bottom-right': - case 'right-bottom': - $base_x = $width - 1; - $base_y = $height - 1; - break; - - default: - case 'top-left': - case 'left-top': - $base_x = 0; - $base_y = 0; - break; - } - - // pick base color - if ($checkTransparency) { - $color = new Color; // color will only be used to compare alpha channel - } else { - $color = $image->pickColor($base_x, $base_y, 'object'); - } - - $top_x = 0; - $top_y = 0; - $bottom_x = $width; - $bottom_y = $height; - - // search upper part of image for colors to trim away - if (in_array('top', $away)) { - - for ($y=0; $y < ceil($height/2); $y++) { - for ($x=0; $x < $width; $x++) { - - $checkColor = $image->pickColor($x, $y, 'object'); - - if ($checkTransparency) { - $checkColor->r = $color->r; - $checkColor->g = $color->g; - $checkColor->b = $color->b; - } - - if ($color->differs($checkColor, $tolerance)) { - $top_y = max(0, $y - $feather); - break 2; - } - - } - } - - } - - // search left part of image for colors to trim away - if (in_array('left', $away)) { - - for ($x=0; $x < ceil($width/2); $x++) { - for ($y=$top_y; $y < $height; $y++) { - - $checkColor = $image->pickColor($x, $y, 'object'); - - if ($checkTransparency) { - $checkColor->r = $color->r; - $checkColor->g = $color->g; - $checkColor->b = $color->b; - } - - if ($color->differs($checkColor, $tolerance)) { - $top_x = max(0, $x - $feather); - break 2; - } - - } - } - - } - - // search lower part of image for colors to trim away - if (in_array('bottom', $away)) { - - for ($y=($height-1); $y >= floor($height/2)-1; $y--) { - for ($x=$top_x; $x < $width; $x++) { - - $checkColor = $image->pickColor($x, $y, 'object'); - - if ($checkTransparency) { - $checkColor->r = $color->r; - $checkColor->g = $color->g; - $checkColor->b = $color->b; - } - - if ($color->differs($checkColor, $tolerance)) { - $bottom_y = min($height, $y+1 + $feather); - break 2; - } - - } - } - - } - - // search right part of image for colors to trim away - if (in_array('right', $away)) { - - for ($x=($width-1); $x >= floor($width/2)-1; $x--) { - for ($y=$top_y; $y < $bottom_y; $y++) { - - $checkColor = $image->pickColor($x, $y, 'object'); - - if ($checkTransparency) { - $checkColor->r = $color->r; - $checkColor->g = $color->g; - $checkColor->b = $color->b; - } - - if ($color->differs($checkColor, $tolerance)) { - $bottom_x = min($width, $x+1 + $feather); - break 2; - } - - } - } - - } - - - // trim parts of image - return $this->modify($image, 0, 0, $top_x, $top_y, ($bottom_x-$top_x), ($bottom_y-$top_y), ($bottom_x-$top_x), ($bottom_y-$top_y)); - - } -} diff --git a/Intervention/Image/Gd/Commands/WidenCommand.php b/Intervention/Image/Gd/Commands/WidenCommand.php deleted file mode 100644 index 43000d5..0000000 --- a/Intervention/Image/Gd/Commands/WidenCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $additionalConstraints = $this->argument(1)->type('closure')->value(); - - $this->arguments[0] = $width; - $this->arguments[1] = null; - $this->arguments[2] = function ($constraint) use ($additionalConstraints) { - $constraint->aspectRatio(); - if(is_callable($additionalConstraints)) - $additionalConstraints($constraint); - }; - - return parent::execute($image); - } -} diff --git a/Intervention/Image/Gd/Decoder.php b/Intervention/Image/Gd/Decoder.php deleted file mode 100644 index f5c34aa..0000000 --- a/Intervention/Image/Gd/Decoder.php +++ /dev/null @@ -1,171 +0,0 @@ -gdResourceToTruecolor($core); - - // build image - $image = $this->initFromGdResource($core); - $image->mime = $mime; - $image->setFileInfoFromPath($path); - - return $image; - } - - /** - * Initiates new image from GD resource - * - * @param Resource $resource - * @return \Intervention\Image\Image - */ - public function initFromGdResource($resource) - { - return new Image(new Driver, $resource); - } - - /** - * Initiates new image from Imagick object - * - * @param Imagick $object - * @return \Intervention\Image\Image - */ - public function initFromImagick(\Imagick $object) - { - throw new NotSupportedException( - "Gd driver is unable to init from Imagick object." - ); - } - - /** - * Initiates new image from binary data - * - * @param string $data - * @return \Intervention\Image\Image - */ - public function initFromBinary($binary) - { - $resource = @imagecreatefromstring($binary); - - if ($resource === false) { - throw new NotReadableException( - "Unable to init from given binary data." - ); - } - - $image = $this->initFromGdResource($resource); - $image->mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $binary); - - return $image; - } - - /** - * Transform GD resource into Truecolor version - * - * @param resource $resource - * @return bool - */ - public function gdResourceToTruecolor(&$resource) - { - $width = imagesx($resource); - $height = imagesy($resource); - - // new canvas - $canvas = imagecreatetruecolor($width, $height); - - // fill with transparent color - imagealphablending($canvas, false); - $transparent = imagecolorallocatealpha($canvas, 255, 255, 255, 127); - imagefilledrectangle($canvas, 0, 0, $width, $height, $transparent); - imagecolortransparent($canvas, $transparent); - imagealphablending($canvas, true); - - // copy original - imagecopy($canvas, $resource, 0, 0, 0, 0, $width, $height); - imagedestroy($resource); - - $resource = $canvas; - - return true; - } -} diff --git a/Intervention/Image/Gd/Driver.php b/Intervention/Image/Gd/Driver.php deleted file mode 100644 index 5f2f23e..0000000 --- a/Intervention/Image/Gd/Driver.php +++ /dev/null @@ -1,89 +0,0 @@ -coreAvailable()) { - throw new NotSupportedException( - "GD Library extension not available with this PHP installation." - ); - } - - $this->decoder = $decoder ? $decoder : new Decoder; - $this->encoder = $encoder ? $encoder : new Encoder; - } - - /** - * Creates new image instance - * - * @param int $width - * @param int $height - * @param mixed $background - * @return \Intervention\Image\Image - */ - public function newImage($width, $height, $background = null) - { - // create empty resource - $core = imagecreatetruecolor($width, $height); - $image = new Image(new static, $core); - - // set background color - $background = new Color($background); - imagefill($image->getCore(), 0, 0, $background->getInt()); - - return $image; - } - - /** - * Reads given string into color object - * - * @param string $value - * @return AbstractColor - */ - public function parseColor($value) - { - return new Color($value); - } - - /** - * Checks if core module installation is available - * - * @return boolean - */ - protected function coreAvailable() - { - return (extension_loaded('gd') && function_exists('gd_info')); - } - - /** - * Returns clone of given core - * - * @return mixed - */ - public function cloneCore($core) - { - $width = imagesx($core); - $height = imagesy($core); - $clone = imagecreatetruecolor($width, $height); - imagealphablending($clone, false); - imagesavealpha($clone, true); - $transparency = imagecolorallocatealpha($clone, 0, 0, 0, 127); - imagefill($clone, 0, 0, $transparency); - - imagecopy($clone, $core, 0, 0, 0, 0, $width, $height); - - return $clone; - } -} diff --git a/Intervention/Image/Gd/Encoder.php b/Intervention/Image/Gd/Encoder.php deleted file mode 100644 index 559d60d..0000000 --- a/Intervention/Image/Gd/Encoder.php +++ /dev/null @@ -1,180 +0,0 @@ -image->getCore(), null, $this->quality); - $this->image->mime = image_type_to_mime_type(IMAGETYPE_JPEG); - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as PNG string - * - * @return string - */ - protected function processPng() - { - ob_start(); - $resource = $this->image->getCore(); - imagealphablending($resource, false); - imagesavealpha($resource, true); - imagepng($resource, null, -1); - $this->image->mime = image_type_to_mime_type(IMAGETYPE_PNG); - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as GIF string - * - * @return string - */ - protected function processGif() - { - ob_start(); - imagegif($this->image->getCore()); - $this->image->mime = image_type_to_mime_type(IMAGETYPE_GIF); - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as WEBP string - * - * @return string - */ - protected function processWebp() - { - if ( ! function_exists('imagewebp')) { - throw new NotSupportedException( - "Webp format is not supported by PHP installation." - ); - } - - ob_start(); - imagepalettetotruecolor($this->image->getCore()); - imagealphablending($this->image->getCore(), true); - imagesavealpha($this->image->getCore(), true); - imagewebp($this->image->getCore(), null, $this->quality); - $this->image->mime = defined('IMAGETYPE_WEBP') ? image_type_to_mime_type(IMAGETYPE_WEBP) : 'image/webp'; - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as TIFF string - * - * @return string - */ - protected function processTiff() - { - throw new NotSupportedException( - "TIFF format is not supported by Gd Driver." - ); - } - - /** - * Processes and returns encoded image as BMP string - * - * @return string - */ - protected function processBmp() - { - if ( ! function_exists('imagebmp')) { - throw new NotSupportedException( - "BMP format is not supported by PHP installation." - ); - } - - ob_start(); - imagebmp($this->image->getCore()); - $this->image->mime = defined('IMAGETYPE_BMP') ? image_type_to_mime_type(IMAGETYPE_BMP) : 'image/bmp'; - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as ICO string - * - * @return string - */ - protected function processIco() - { - throw new NotSupportedException( - "ICO format is not supported by Gd Driver." - ); - } - - /** - * Processes and returns encoded image as PSD string - * - * @return string - */ - protected function processPsd() - { - throw new NotSupportedException( - "PSD format is not supported by Gd Driver." - ); - } - - /** - * Processes and returns encoded image as AVIF string - * - * @return string - */ - protected function processAvif() - { - if ( ! function_exists('imageavif')) { - throw new NotSupportedException( - "AVIF format is not supported by PHP installation." - ); - } - - ob_start(); - $resource = $this->image->getCore(); - imagepalettetotruecolor($resource); - imagealphablending($resource, true); - imagesavealpha($resource, true); - imageavif($resource, null, $this->quality); - $this->image->mime = defined('IMAGETYPE_AVIF') ? image_type_to_mime_type(IMAGETYPE_AVIF) : 'image/avif'; - $buffer = ob_get_contents(); - ob_end_clean(); - - return $buffer; - } - - /** - * Processes and returns encoded image as HEIC string - * - * @return string - */ - protected function processHeic() - { - throw new NotSupportedException( - "HEIC format is not supported by Gd Driver." - ); - } -} diff --git a/Intervention/Image/Gd/Font.php b/Intervention/Image/Gd/Font.php deleted file mode 100644 index 3f58887..0000000 --- a/Intervention/Image/Gd/Font.php +++ /dev/null @@ -1,277 +0,0 @@ -size * 0.75)); - } - - /** - * Filter function to access internal integer font values - * - * @return int - */ - private function getInternalFont() - { - $internalfont = is_null($this->file) ? 1 : $this->file; - $internalfont = is_numeric($internalfont) ? $internalfont : false; - - if ( ! in_array($internalfont, [1, 2, 3, 4, 5])) { - throw new NotSupportedException( - sprintf('Internal GD font (%s) not available. Use only 1-5.', $internalfont) - ); - } - - return intval($internalfont); - } - - /** - * Get width of an internal font character - * - * @return int - */ - private function getInternalFontWidth() - { - return $this->getInternalFont() + 4; - } - - /** - * Get height of an internal font character - * - * @return int - */ - private function getInternalFontHeight() - { - switch ($this->getInternalFont()) { - case 1: - return 8; - - case 2: - return 14; - - case 3: - return 14; - - case 4: - return 16; - - case 5: - return 16; - } - } - - /** - * Calculates bounding box of current font setting - * - * @return Array - */ - public function getBoxSize() - { - $box = []; - - if ($this->hasApplicableFontFile()) { - - // imagettfbbox() converts numeric entities to their respective - // character. Preserve any originally double encoded entities to be - // represented as is. - // eg: &#160; will render   rather than its character. - $this->text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&\1', $this->text); - $this->text = mb_encode_numericentity($this->text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8'); - - // get bounding box with angle 0 - $box = imagettfbbox($this->getPointSize(), 0, $this->file, $this->text); - - // rotate points manually - if ($this->angle != 0) { - - $angle = pi() * 2 - $this->angle * pi() * 2 / 360; - - for ($i=0; $i<4; $i++) { - $x = $box[$i * 2]; - $y = $box[$i * 2 + 1]; - $box[$i * 2] = cos($angle) * $x - sin($angle) * $y; - $box[$i * 2 + 1] = sin($angle) * $x + cos($angle) * $y; - } - } - - $box['width'] = intval(abs($box[4] - $box[0])); - $box['height'] = intval(abs($box[5] - $box[1])); - - } else { - - // get current internal font size - $width = $this->getInternalFontWidth(); - $height = $this->getInternalFontHeight(); - - if (strlen($this->text) == 0) { - // no text -> no boxsize - $box['width'] = 0; - $box['height'] = 0; - } else { - // calculate boxsize - $box['width'] = strlen($this->text) * $width; - $box['height'] = $height; - } - } - - return $box; - } - - /** - * Draws font to given image at given position - * - * @param Image $image - * @param int $posx - * @param int $posy - * @return void - */ - public function applyToImage(Image $image, $posx = 0, $posy = 0) - { - // parse text color - $color = new Color($this->color); - - if ($this->hasApplicableFontFile()) { - - if ($this->angle != 0 || is_string($this->align) || is_string($this->valign)) { - - $box = $this->getBoxSize(); - - $align = is_null($this->align) ? 'left' : strtolower($this->align); - $valign = is_null($this->valign) ? 'bottom' : strtolower($this->valign); - - // correction on position depending on v/h alignment - switch ($align.'-'.$valign) { - - case 'center-top': - $posx = $posx - round(($box[6]+$box[4])/2); - $posy = $posy - round(($box[7]+$box[5])/2); - break; - - case 'right-top': - $posx = $posx - $box[4]; - $posy = $posy - $box[5]; - break; - - case 'left-top': - $posx = $posx - $box[6]; - $posy = $posy - $box[7]; - break; - - case 'center-center': - case 'center-middle': - $posx = $posx - round(($box[0]+$box[4])/2); - $posy = $posy - round(($box[1]+$box[5])/2); - break; - - case 'right-center': - case 'right-middle': - $posx = $posx - round(($box[2]+$box[4])/2); - $posy = $posy - round(($box[3]+$box[5])/2); - break; - - case 'left-center': - case 'left-middle': - $posx = $posx - round(($box[0]+$box[6])/2); - $posy = $posy - round(($box[1]+$box[7])/2); - break; - - case 'center-bottom': - $posx = $posx - round(($box[0]+$box[2])/2); - $posy = $posy - round(($box[1]+$box[3])/2); - break; - - case 'right-bottom': - $posx = $posx - $box[2]; - $posy = $posy - $box[3]; - break; - - case 'left-bottom': - $posx = $posx - $box[0]; - $posy = $posy - $box[1]; - break; - } - } - - // enable alphablending for imagettftext - imagealphablending($image->getCore(), true); - - // draw ttf text - imagettftext($image->getCore(), $this->getPointSize(), $this->angle, $posx, $posy, $color->getInt(), $this->file, $this->text); - - } else { - - // get box size - $box = $this->getBoxSize(); - $width = $box['width']; - $height = $box['height']; - - // internal font specific position corrections - if ($this->getInternalFont() == 1) { - $top_correction = 1; - $bottom_correction = 2; - } elseif ($this->getInternalFont() == 3) { - $top_correction = 2; - $bottom_correction = 4; - } else { - $top_correction = 3; - $bottom_correction = 4; - } - - // x-position corrections for horizontal alignment - switch (strtolower($this->align)) { - case 'center': - $posx = ceil($posx - ($width / 2)); - break; - - case 'right': - $posx = ceil($posx - $width) + 1; - break; - } - - // y-position corrections for vertical alignment - switch (strtolower($this->valign)) { - case 'center': - case 'middle': - $posy = ceil($posy - ($height / 2)); - break; - - case 'top': - $posy = ceil($posy - $top_correction); - break; - - default: - case 'bottom': - $posy = round($posy - $height + $bottom_correction); - break; - } - - // draw text - imagestring($image->getCore(), $this->getInternalFont(), $posx, $posy, $this->text, $color->getInt()); - } - } - - /** - * Set text kerning - * - * @param string $kerning - * @return void - */ - public function kerning($kerning) - { - throw new \Intervention\Image\Exception\NotSupportedException( - "Kerning is not supported by GD driver." - ); - } - -} diff --git a/Intervention/Image/Gd/Shapes/CircleShape.php b/Intervention/Image/Gd/Shapes/CircleShape.php deleted file mode 100644 index c3c4214..0000000 --- a/Intervention/Image/Gd/Shapes/CircleShape.php +++ /dev/null @@ -1,40 +0,0 @@ -width = is_numeric($diameter) ? intval($diameter) : $this->diameter; - $this->height = is_numeric($diameter) ? intval($diameter) : $this->diameter; - $this->diameter = is_numeric($diameter) ? intval($diameter) : $this->diameter; - } - - /** - * Draw current circle on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - return parent::applyToImage($image, $x, $y); - } -} diff --git a/Intervention/Image/Gd/Shapes/EllipseShape.php b/Intervention/Image/Gd/Shapes/EllipseShape.php deleted file mode 100644 index 78e5e4a..0000000 --- a/Intervention/Image/Gd/Shapes/EllipseShape.php +++ /dev/null @@ -1,65 +0,0 @@ -width = is_numeric($width) ? intval($width) : $this->width; - $this->height = is_numeric($height) ? intval($height) : $this->height; - } - - /** - * Draw ellipse instance on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - // parse background color - $background = new Color($this->background); - - if ($this->hasBorder()) { - // slightly smaller ellipse to keep 1px bordered edges clean - imagefilledellipse($image->getCore(), $x, $y, $this->width-1, $this->height-1, $background->getInt()); - - $border_color = new Color($this->border_color); - imagesetthickness($image->getCore(), $this->border_width); - - // gd's imageellipse doesn't respect imagesetthickness so i use imagearc with 359.9 degrees here - imagearc($image->getCore(), $x, $y, $this->width, $this->height, 0, 359.99, $border_color->getInt()); - } else { - imagefilledellipse($image->getCore(), $x, $y, $this->width, $this->height, $background->getInt()); - } - - return true; - } -} diff --git a/Intervention/Image/Gd/Shapes/LineShape.php b/Intervention/Image/Gd/Shapes/LineShape.php deleted file mode 100644 index ea38b51..0000000 --- a/Intervention/Image/Gd/Shapes/LineShape.php +++ /dev/null @@ -1,90 +0,0 @@ -x = is_numeric($x) ? intval($x) : $this->x; - $this->y = is_numeric($y) ? intval($y) : $this->y; - } - - /** - * Set current line color - * - * @param string $color - * @return void - */ - public function color($color) - { - $this->color = $color; - } - - /** - * Set current line width in pixels - * - * @param int $width - * @return void - */ - public function width($width) - { - throw new \Intervention\Image\Exception\NotSupportedException( - "Line width is not supported by GD driver." - ); - } - - /** - * Draw current instance of line to given endpoint on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $color = new Color($this->color); - imageline($image->getCore(), $x, $y, $this->x, $this->y, $color->getInt()); - - return true; - } -} diff --git a/Intervention/Image/Gd/Shapes/PolygonShape.php b/Intervention/Image/Gd/Shapes/PolygonShape.php deleted file mode 100644 index 5e14df4..0000000 --- a/Intervention/Image/Gd/Shapes/PolygonShape.php +++ /dev/null @@ -1,49 +0,0 @@ -points = $points; - } - - /** - * Draw polygon on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $background = new Color($this->background); - imagefilledpolygon($image->getCore(), $this->points, intval(count($this->points) / 2), $background->getInt()); - - if ($this->hasBorder()) { - $border_color = new Color($this->border_color); - imagesetthickness($image->getCore(), $this->border_width); - imagepolygon($image->getCore(), $this->points, intval(count($this->points) / 2), $border_color->getInt()); - } - - return true; - } -} diff --git a/Intervention/Image/Gd/Shapes/RectangleShape.php b/Intervention/Image/Gd/Shapes/RectangleShape.php deleted file mode 100644 index 5f69a7f..0000000 --- a/Intervention/Image/Gd/Shapes/RectangleShape.php +++ /dev/null @@ -1,76 +0,0 @@ -x1 = is_numeric($x1) ? intval($x1) : $this->x1; - $this->y1 = is_numeric($y1) ? intval($y1) : $this->y1; - $this->x2 = is_numeric($x2) ? intval($x2) : $this->x2; - $this->y2 = is_numeric($y2) ? intval($y2) : $this->y2; - } - - /** - * Draw rectangle to given image at certain position - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $background = new Color($this->background); - imagefilledrectangle($image->getCore(), $this->x1, $this->y1, $this->x2, $this->y2, $background->getInt()); - - if ($this->hasBorder()) { - $border_color = new Color($this->border_color); - imagesetthickness($image->getCore(), $this->border_width); - imagerectangle($image->getCore(), $this->x1, $this->y1, $this->x2, $this->y2, $border_color->getInt()); - } - - return true; - } -} diff --git a/Intervention/Image/Image.php b/Intervention/Image/Image.php deleted file mode 100644 index 7d5a59b..0000000 --- a/Intervention/Image/Image.php +++ /dev/null @@ -1,370 +0,0 @@ -driver = $driver; - $this->core = $core; - } - - /** - * Magic method to catch all image calls - * usually any AbstractCommand - * - * @param string $name - * @param Array $arguments - * @return mixed - */ - public function __call($name, $arguments) - { - $command = $this->driver->executeCommand($this, $name, $arguments); - return $command->hasOutput() ? $command->getOutput() : $this; - } - - /** - * Starts encoding of current image - * - * @param string $format - * @param int $quality - * @return \Intervention\Image\Image - */ - public function encode($format = null, $quality = 90) - { - return $this->driver->encode($this, $format, $quality); - } - - /** - * Saves encoded image in filesystem - * - * @param string $path - * @param int $quality - * @param string $format - * @return \Intervention\Image\Image - */ - public function save($path = null, $quality = null, $format = null) - { - $path = is_null($path) ? $this->basePath() : $path; - - if (is_null($path)) { - throw new NotWritableException( - "Can't write to undefined path." - ); - } - - if ($format === null) { - $format = pathinfo($path, PATHINFO_EXTENSION); - } - - $data = $this->encode($format, $quality); - $saved = @file_put_contents($path, $data); - - if ($saved === false) { - throw new NotWritableException( - "Can't write image data to path ({$path})" - ); - } - - // set new file info - $this->setFileInfoFromPath($path); - - return $this; - } - - /** - * Runs a given filter on current image - * - * @param FiltersFilterInterface $filter - * @return \Intervention\Image\Image - */ - public function filter(Filters\FilterInterface $filter) - { - return $filter->applyFilter($this); - } - - /** - * Returns current image driver - * - * @return \Intervention\Image\AbstractDriver - */ - public function getDriver() - { - return $this->driver; - } - - /** - * Sets current image driver - * @param AbstractDriver $driver - */ - public function setDriver(AbstractDriver $driver) - { - $this->driver = $driver; - - return $this; - } - - /** - * Returns current image resource/obj - * - * @return mixed - */ - public function getCore() - { - return $this->core; - } - - /** - * Sets current image resource - * - * @param mixed $core - */ - public function setCore($core) - { - $this->core = $core; - - return $this; - } - - /** - * Returns current image backup - * - * @param string $name - * @return mixed - */ - public function getBackup($name = null) - { - $name = is_null($name) ? 'default' : $name; - - if ( ! $this->backupExists($name)) { - throw new RuntimeException( - "Backup with name ({$name}) not available. Call backup() before reset()." - ); - } - - return $this->backups[$name]; - } - - /** - * Returns all backups attached to image - * - * @return array - */ - public function getBackups() - { - return $this->backups; - } - - /** - * Sets current image backup - * - * @param mixed $resource - * @param string $name - * @return self - */ - public function setBackup($resource, $name = null) - { - $name = is_null($name) ? 'default' : $name; - - $this->backups[$name] = $resource; - - return $this; - } - - /** - * Checks if named backup exists - * - * @param string $name - * @return bool - */ - private function backupExists($name) - { - return array_key_exists($name, $this->backups); - } - - /** - * Checks if current image is already encoded - * - * @return boolean - */ - public function isEncoded() - { - return ! empty($this->encoded); - } - - /** - * Returns encoded image data of current image - * - * @return string - */ - public function getEncoded() - { - return $this->encoded; - } - - /** - * Sets encoded image buffer - * - * @param string $value - */ - public function setEncoded($value) - { - $this->encoded = $value; - - return $this; - } - - /** - * Calculates current image width - * - * @return int - */ - public function getWidth() - { - return $this->getSize()->width; - } - - /** - * Alias of getWidth() - * - * @return int - */ - public function width() - { - return $this->getWidth(); - } - - /** - * Calculates current image height - * - * @return int - */ - public function getHeight() - { - return $this->getSize()->height; - } - - /** - * Alias of getHeight - * - * @return int - */ - public function height() - { - return $this->getHeight(); - } - - /** - * Reads mime type - * - * @return string - */ - public function mime() - { - return $this->mime; - } - - /** - * Returns encoded image data in string conversion - * - * @return string - */ - public function __toString() - { - return $this->encoded; - } - - /** - * Cloning an image - */ - public function __clone() - { - $this->core = $this->driver->cloneCore($this->core); - } -} diff --git a/Intervention/Image/ImageManager.php b/Intervention/Image/ImageManager.php deleted file mode 100644 index 324fe7f..0000000 --- a/Intervention/Image/ImageManager.php +++ /dev/null @@ -1,142 +0,0 @@ - 'gd' - ]; - - /** - * Creates new instance of Image Manager - * - * @param array $config - */ - public function __construct(array $config = []) - { - $this->checkRequirements(); - $this->configure($config); - } - - /** - * Overrides configuration settings - * - * @param array $config - * - * @return self - */ - public function configure(array $config = []) - { - $this->config = array_replace($this->config, $config); - - return $this; - } - - /** - * Initiates an Image instance from different input types - * - * @param mixed $data - * - * @return \Intervention\Image\Image - */ - public function make($data) - { - return $this->createDriver()->init($data); - } - - /** - * Creates an empty image canvas - * - * @param int $width - * @param int $height - * @param mixed $background - * - * @return \Intervention\Image\Image - */ - public function canvas($width, $height, $background = null) - { - return $this->createDriver()->newImage($width, $height, $background); - } - - /** - * Create new cached image and run callback - * (requires additional package intervention/imagecache) - * - * @param Closure $callback - * @param int $lifetime - * @param boolean $returnObj - * - * @return Image - */ - public function cache(Closure $callback, $lifetime = null, $returnObj = false) - { - if (class_exists('Intervention\\Image\\ImageCache')) { - // create imagecache - $imagecache = new ImageCache($this); - - // run callback - if (is_callable($callback)) { - $callback($imagecache); - } - - return $imagecache->get($lifetime, $returnObj); - } - - throw new MissingDependencyException( - "Please install package intervention/imagecache before running this function." - ); - } - - /** - * Creates a driver instance according to config settings - * - * @return \Intervention\Image\AbstractDriver - */ - private function createDriver() - { - if (is_string($this->config['driver'])) { - $drivername = ucfirst($this->config['driver']); - $driverclass = sprintf('Intervention\\Image\\%s\\Driver', $drivername); - - if (class_exists($driverclass)) { - return new $driverclass; - } - - throw new NotSupportedException( - "Driver ({$drivername}) could not be instantiated." - ); - } - - if ($this->config['driver'] instanceof AbstractDriver) { - return $this->config['driver']; - } - - throw new NotSupportedException( - "Unknown driver type." - ); - } - - /** - * Check if all requirements are available - * - * @return void - */ - private function checkRequirements() - { - if ( ! function_exists('finfo_buffer')) { - throw new MissingDependencyException( - "PHP Fileinfo extension must be installed/enabled to use Intervention Image." - ); - } - } -} diff --git a/Intervention/Image/ImageManagerStatic.php b/Intervention/Image/ImageManagerStatic.php deleted file mode 100644 index a1b5642..0000000 --- a/Intervention/Image/ImageManagerStatic.php +++ /dev/null @@ -1,88 +0,0 @@ -configure($config); - } - - /** - * Statically initiates an Image instance from different input types - * - * @param mixed $data - * - * @return \Intervention\Image\Image - * @throws \Intervention\Image\Exception\NotReadableException - */ - public static function make($data) - { - return self::getManager()->make($data); - } - - /** - * Statically creates an empty image canvas - * - * @param int $width - * @param int $height - * @param mixed $background - * - * @return \Intervention\Image\Image - */ - public static function canvas($width, $height, $background = null) - { - return self::getManager()->canvas($width, $height, $background); - } - - /** - * Create new cached image and run callback statically - * - * @param Closure $callback - * @param int $lifetime - * @param boolean $returnObj - * - * @return mixed - */ - public static function cache(Closure $callback, $lifetime = null, $returnObj = false) - { - return self::getManager()->cache($callback, $lifetime, $returnObj); - } -} diff --git a/Intervention/Image/ImageServiceProvider.php b/Intervention/Image/ImageServiceProvider.php deleted file mode 100644 index f99fe4a..0000000 --- a/Intervention/Image/ImageServiceProvider.php +++ /dev/null @@ -1,87 +0,0 @@ -provider = $this->getProvider(); - } - - /** - * Bootstrap the application events. - * - * @return void - */ - public function boot() - { - if (method_exists($this->provider, 'boot')) { - return $this->provider->boot(); - } - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - return $this->provider->register(); - } - - /** - * Return ServiceProvider according to Laravel version - * - * @return \Intervention\Image\Provider\ProviderInterface - */ - private function getProvider() - { - if ($this->app instanceof LumenApplication) { - $provider = '\Intervention\Image\ImageServiceProviderLumen'; - } elseif (version_compare(IlluminateApplication::VERSION, '5.0', '<')) { - $provider = '\Intervention\Image\ImageServiceProviderLaravel4'; - } else { - $provider = '\Intervention\Image\ImageServiceProviderLaravelRecent'; - } - - return new $provider($this->app); - } - - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return ['image']; - } -} diff --git a/Intervention/Image/ImageServiceProviderLaravel4.php b/Intervention/Image/ImageServiceProviderLaravel4.php deleted file mode 100755 index 3b1388f..0000000 --- a/Intervention/Image/ImageServiceProviderLaravel4.php +++ /dev/null @@ -1,112 +0,0 @@ -package('intervention/image'); - - // try to create imagecache route only if imagecache is present - if (class_exists('Intervention\\Image\\ImageCache')) { - - $app = $this->app; - - // load imagecache config - $app['config']->package('intervention/imagecache', __DIR__.'/../../../../imagecache/src/config', 'imagecache'); - $config = $app['config']; - - // create dynamic manipulation route - if (is_string($config->get('imagecache::route'))) { - - // add original to route templates - $config->set('imagecache::templates.original', null); - - // setup image manipulator route - $app['router']->get($config->get('imagecache::route').'/{template}/{filename}', ['as' => 'imagecache', function ($template, $filename) use ($app, $config) { - - // disable session cookies for image route - $app['config']->set('session.driver', 'array'); - - // find file - foreach ($config->get('imagecache::paths') as $path) { - // don't allow '..' in filenames - $image_path = $path.'/'.str_replace('..', '', $filename); - if (file_exists($image_path) && is_file($image_path)) { - break; - } else { - $image_path = false; - } - } - - // abort if file not found - if ($image_path === false) { - $app->abort(404); - } - - // define template callback - $callback = $config->get("imagecache::templates.{$template}"); - - if (is_callable($callback) || class_exists($callback)) { - - // image manipulation based on callback - $content = $app['image']->cache(function ($image) use ($image_path, $callback) { - - switch (true) { - case is_callable($callback): - return $callback($image->make($image_path)); - break; - - case class_exists($callback): - return $image->make($image_path)->filter(new $callback); - break; - } - - }, $config->get('imagecache::lifetime')); - - } else { - - // get original image file contents - $content = file_get_contents($image_path); - } - - // define mime type - $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content); - - // return http response - return new IlluminateResponse($content, 200, [ - 'Content-Type' => $mime, - 'Cache-Control' => 'max-age='.($config->get('imagecache::lifetime')*60).', public', - 'Etag' => md5($content) - ]); - - }])->where(['template' => join('|', array_keys($config->get('imagecache::templates'))), 'filename' => '[ \w\\.\\/\\-]+']); - } - } - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $app = $this->app; - - $app['image'] = $app->share(function ($app) { - return new ImageManager($app['config']->get('image::config')); - }); - - $app->alias('image', 'Intervention\Image\ImageManager'); - } -} diff --git a/Intervention/Image/ImageServiceProviderLaravel5.php b/Intervention/Image/ImageServiceProviderLaravel5.php deleted file mode 100644 index 288df8c..0000000 --- a/Intervention/Image/ImageServiceProviderLaravel5.php +++ /dev/null @@ -1,96 +0,0 @@ - - * @copyright Copyright 2015 Oliver Vogel - * @license MIT License; see license.txt - * @link http://image.intervention.io - */ - -defined('_JEXEC') or die; - -use Illuminate\Support\ServiceProvider; - -class ImageServiceProviderLaravel5 extends ServiceProvider -{ - /** - * Determines if Intervention Imagecache is installed - * - * @return boolean - */ - private function cacheIsInstalled() - { - return class_exists('Intervention\\Image\\ImageCache'); - } - - /** - * Bootstrap the application events. - * - * @return void - */ - public function boot() - { - $this->publishes([ - __DIR__.'/../../config/config.php' => config_path('image.php') - ]); - - // setup intervention/imagecache if package is installed - $this->cacheIsInstalled() ? $this->bootstrapImageCache() : null; - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $app = $this->app; - - // merge default config - $this->mergeConfigFrom( - __DIR__.'/../../config/config.php', - 'image' - ); - - // create image - $app->singleton('image', function ($app) { - return new ImageManager($app['config']->get('image')); - }); - - $app->alias('image', 'Intervention\Image\ImageManager'); - } - - /** - * Bootstrap imagecache - * - * @return void - */ - protected function bootstrapImageCache() - { - $app = $this->app; - $config = __DIR__.'/../../../../imagecache/src/config/config.php'; - - $this->publishes([ - $config => config_path('imagecache.php') - ]); - - // merge default config - $this->mergeConfigFrom( - $config, - 'imagecache' - ); - - // imagecache route - if (is_string(config('imagecache.route'))) { - - $filename_pattern = '[ \w\\.\\/\\-\\@\(\)]+'; - - // route to access template applied image file - $app['router']->get(config('imagecache.route').'/{template}/{filename}', [ - 'uses' => 'Intervention\Image\ImageCacheController@getResponse', - 'as' => 'imagecache' - ])->where(['filename' => $filename_pattern]); - } - } -} diff --git a/Intervention/Image/ImageServiceProviderLaravelRecent.php b/Intervention/Image/ImageServiceProviderLaravelRecent.php deleted file mode 100644 index 17a84d0..0000000 --- a/Intervention/Image/ImageServiceProviderLaravelRecent.php +++ /dev/null @@ -1,106 +0,0 @@ -publishes([ - __DIR__.'/../../config/config.php' => config_path('image.php') - ]); - - // setup intervention/imagecache if package is installed - $this->cacheIsInstalled() ? $this->bootstrapImageCache() : null; - } - - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - $app = $this->app; - - // merge default config - $this->mergeConfigFrom( - __DIR__.'/../../config/config.php', - 'image' - ); - - // create image - $app->singleton('image', function ($app) { - return new ImageManager($this->getImageConfig($app)); - }); - - $app->alias('image', 'Intervention\Image\ImageManager'); - } - - /** - * Bootstrap imagecache - * - * @return void - */ - protected function bootstrapImageCache() - { - $app = $this->app; - $config = __DIR__.'/../../../../imagecache/src/config/config.php'; - - $this->publishes([ - $config => config_path('imagecache.php') - ]); - - // merge default config - $this->mergeConfigFrom( - $config, - 'imagecache' - ); - - // imagecache route - if (is_string(config('imagecache.route'))) { - - $filename_pattern = '[ \w\\.\\/\\-\\@\(\)\=]+'; - - // route to access template applied image file - $app['router']->get(config('imagecache.route').'/{template}/{filename}', [ - 'uses' => 'Intervention\Image\ImageCacheController@getResponse', - 'as' => 'imagecache' - ])->where(['filename' => $filename_pattern]); - } - } - - /** - * Return image configuration as array - * - * @param Application $app - * @return array - */ - private function getImageConfig($app) - { - $config = $app['config']->get('image'); - - if (is_null($config)) { - return []; - } - - return $config; - } -} diff --git a/Intervention/Image/ImageServiceProviderLeague.php b/Intervention/Image/ImageServiceProviderLeague.php deleted file mode 100644 index b756a61..0000000 --- a/Intervention/Image/ImageServiceProviderLeague.php +++ /dev/null @@ -1,42 +0,0 @@ -config = $config; - } - - /** - * Register the server provider. - * - * @return void - */ - public function register() - { - $this->getContainer()->share('Intervention\Image\ImageManager', function () { - return new ImageManager($this->config); - }); - } -} diff --git a/Intervention/Image/ImageServiceProviderLumen.php b/Intervention/Image/ImageServiceProviderLumen.php deleted file mode 100644 index 4a381cc..0000000 --- a/Intervention/Image/ImageServiceProviderLumen.php +++ /dev/null @@ -1,34 +0,0 @@ -app; - - // merge default config - $this->mergeConfigFrom( - __DIR__.'/../../config/config.php', - 'image' - ); - - // set configuration - $app->configure('image'); - - // create image - $app->singleton('image',function ($app) { - return new ImageManager($app['config']->get('image')); - }); - - $app->alias('image', 'Intervention\Image\ImageManager'); - } -} diff --git a/Intervention/Image/Imagick/Color.php b/Intervention/Image/Imagick/Color.php deleted file mode 100644 index a41ff3a..0000000 --- a/Intervention/Image/Imagick/Color.php +++ /dev/null @@ -1,279 +0,0 @@ -> 24) & 0xFF; - $r = ($value >> 16) & 0xFF; - $g = ($value >> 8) & 0xFF; - $b = $value & 0xFF; - $a = $this->rgb2alpha($a); - - $this->setPixel($r, $g, $b, $a); - } - - /** - * Initiates color object from given array - * - * @param array $value - * @return \Intervention\Image\AbstractColor - */ - public function initFromArray($array) - { - $array = array_values($array); - - if (count($array) == 4) { - - // color array with alpha value - list($r, $g, $b, $a) = $array; - - } elseif (count($array) == 3) { - - // color array without alpha value - list($r, $g, $b) = $array; - $a = 1; - } - - $this->setPixel($r, $g, $b, $a); - } - - /** - * Initiates color object from given string - * - * @param string $value - * - * @return \Intervention\Image\AbstractColor - */ - public function initFromString($value) - { - if ($color = $this->rgbaFromString($value)) { - $this->setPixel($color[0], $color[1], $color[2], $color[3]); - } - } - - /** - * Initiates color object from given ImagickPixel object - * - * @param ImagickPixel $value - * - * @return \Intervention\Image\AbstractColor - */ - public function initFromObject($value) - { - if (is_a($value, '\ImagickPixel')) { - $this->pixel = $value; - } - } - - /** - * Initiates color object from given R, G and B values - * - * @param int $r - * @param int $g - * @param int $b - * - * @return \Intervention\Image\AbstractColor - */ - public function initFromRgb($r, $g, $b) - { - $this->setPixel($r, $g, $b); - } - - /** - * Initiates color object from given R, G, B and A values - * - * @param int $r - * @param int $g - * @param int $b - * @param float $a - * - * @return \Intervention\Image\AbstractColor - */ - public function initFromRgba($r, $g, $b, $a) - { - $this->setPixel($r, $g, $b, $a); - } - - /** - * Calculates integer value of current color instance - * - * @return int - */ - public function getInt() - { - $r = $this->getRedValue(); - $g = $this->getGreenValue(); - $b = $this->getBlueValue(); - $a = intval(round($this->getAlphaValue() * 255)); - - return intval(($a << 24) + ($r << 16) + ($g << 8) + $b); - } - - /** - * Calculates hexadecimal value of current color instance - * - * @param string $prefix - * - * @return string - */ - public function getHex($prefix = '') - { - return sprintf('%s%02x%02x%02x', $prefix, - $this->getRedValue(), - $this->getGreenValue(), - $this->getBlueValue() - ); - } - - /** - * Calculates RGB(A) in array format of current color instance - * - * @return array - */ - public function getArray() - { - return [ - $this->getRedValue(), - $this->getGreenValue(), - $this->getBlueValue(), - $this->getAlphaValue() - ]; - } - - /** - * Calculates RGBA in string format of current color instance - * - * @return string - */ - public function getRgba() - { - return sprintf('rgba(%d, %d, %d, %.2F)', - $this->getRedValue(), - $this->getGreenValue(), - $this->getBlueValue(), - $this->getAlphaValue() - ); - } - - /** - * Determines if current color is different from given color - * - * @param AbstractColor $color - * @param int $tolerance - * @return boolean - */ - public function differs(AbstractColor $color, $tolerance = 0) - { - $color_tolerance = round($tolerance * 2.55); - $alpha_tolerance = round($tolerance); - - $delta = [ - 'r' => abs($color->getRedValue() - $this->getRedValue()), - 'g' => abs($color->getGreenValue() - $this->getGreenValue()), - 'b' => abs($color->getBlueValue() - $this->getBlueValue()), - 'a' => abs($color->getAlphaValue() - $this->getAlphaValue()) - ]; - - return ( - $delta['r'] > $color_tolerance or - $delta['g'] > $color_tolerance or - $delta['b'] > $color_tolerance or - $delta['a'] > $alpha_tolerance - ); - } - - /** - * Returns RGB red value of current color - * - * @return int - */ - public function getRedValue() - { - return intval(round($this->pixel->getColorValue(\Imagick::COLOR_RED) * 255)); - } - - /** - * Returns RGB green value of current color - * - * @return int - */ - public function getGreenValue() - { - return intval(round($this->pixel->getColorValue(\Imagick::COLOR_GREEN) * 255)); - } - - /** - * Returns RGB blue value of current color - * - * @return int - */ - public function getBlueValue() - { - return intval(round($this->pixel->getColorValue(\Imagick::COLOR_BLUE) * 255)); - } - - /** - * Returns RGB alpha value of current color - * - * @return float - */ - public function getAlphaValue() - { - return round($this->pixel->getColorValue(\Imagick::COLOR_ALPHA), 2); - } - - /** - * Initiates ImagickPixel from given RGBA values - * - * @return \ImagickPixel - */ - private function setPixel($r, $g, $b, $a = null) - { - $a = is_null($a) ? 1 : $a; - - return $this->pixel = new \ImagickPixel( - sprintf('rgba(%d, %d, %d, %.2F)', $r, $g, $b, $a) - ); - } - - /** - * Returns current color as ImagickPixel - * - * @return \ImagickPixel - */ - public function getPixel() - { - return $this->pixel; - } - - /** - * Calculates RGA integer alpha value into float value - * - * @param int $value - * @return float - */ - private function rgb2alpha($value) - { - // (255 -> 1.0) / (0 -> 0.0) - return (float) round($value/255, 2); - } - -} diff --git a/Intervention/Image/Imagick/Commands/BackupCommand.php b/Intervention/Image/Imagick/Commands/BackupCommand.php deleted file mode 100644 index 76b4f72..0000000 --- a/Intervention/Image/Imagick/Commands/BackupCommand.php +++ /dev/null @@ -1,25 +0,0 @@ -argument(0)->value(); - - // clone current image resource - $clone = clone $image; - $image->setBackup($clone->getCore(), $backupName); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/BlurCommand.php b/Intervention/Image/Imagick/Commands/BlurCommand.php deleted file mode 100644 index d2533e0..0000000 --- a/Intervention/Image/Imagick/Commands/BlurCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(0, 100)->value(1); - - return $image->getCore()->blurImage(1 * $amount, 0.5 * $amount); - } -} diff --git a/Intervention/Image/Imagick/Commands/BrightnessCommand.php b/Intervention/Image/Imagick/Commands/BrightnessCommand.php deleted file mode 100644 index 03ac847..0000000 --- a/Intervention/Image/Imagick/Commands/BrightnessCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - - return $image->getCore()->modulateImage(100 + $level, 100, 100); - } -} diff --git a/Intervention/Image/Imagick/Commands/ColorizeCommand.php b/Intervention/Image/Imagick/Commands/ColorizeCommand.php deleted file mode 100644 index 3a6506f..0000000 --- a/Intervention/Image/Imagick/Commands/ColorizeCommand.php +++ /dev/null @@ -1,44 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - $green = $this->argument(1)->between(-100, 100)->required()->value(); - $blue = $this->argument(2)->between(-100, 100)->required()->value(); - - // normalize colorize levels - $red = $this->normalizeLevel($red); - $green = $this->normalizeLevel($green); - $blue = $this->normalizeLevel($blue); - - $qrange = $image->getCore()->getQuantumRange(); - - // apply - $image->getCore()->levelImage(0, $red, $qrange['quantumRangeLong'], \Imagick::CHANNEL_RED); - $image->getCore()->levelImage(0, $green, $qrange['quantumRangeLong'], \Imagick::CHANNEL_GREEN); - $image->getCore()->levelImage(0, $blue, $qrange['quantumRangeLong'], \Imagick::CHANNEL_BLUE); - - return true; - } - - private function normalizeLevel($level) - { - if ($level > 0) { - return $level/5; - } else { - return ($level+100)/100; - } - } -} diff --git a/Intervention/Image/Imagick/Commands/ContrastCommand.php b/Intervention/Image/Imagick/Commands/ContrastCommand.php deleted file mode 100644 index c4847c6..0000000 --- a/Intervention/Image/Imagick/Commands/ContrastCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(-100, 100)->required()->value(); - - return $image->getCore()->sigmoidalContrastImage($level > 0, $level / 4, 0); - } -} diff --git a/Intervention/Image/Imagick/Commands/CropCommand.php b/Intervention/Image/Imagick/Commands/CropCommand.php deleted file mode 100644 index 618edea..0000000 --- a/Intervention/Image/Imagick/Commands/CropCommand.php +++ /dev/null @@ -1,45 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->required()->value(); - $x = $this->argument(2)->type('digit')->value(); - $y = $this->argument(3)->type('digit')->value(); - - if (is_null($width) || is_null($height)) { - throw new InvalidArgumentException( - "Width and height of cutout needs to be defined." - ); - } - - $cropped = new Size($width, $height); - $position = new Point($x, $y); - - // align boxes - if (is_null($x) && is_null($y)) { - $position = $image->getSize()->align('center')->relativePosition($cropped->align('center')); - } - - // crop image core - $image->getCore()->cropImage($cropped->width, $cropped->height, $position->x, $position->y); - $image->getCore()->setImagePage(0,0,0,0); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/DestroyCommand.php b/Intervention/Image/Imagick/Commands/DestroyCommand.php deleted file mode 100644 index 58c9556..0000000 --- a/Intervention/Image/Imagick/Commands/DestroyCommand.php +++ /dev/null @@ -1,27 +0,0 @@ -getCore()->clear(); - - // destroy backups - foreach ($image->getBackups() as $backup) { - $backup->clear(); - } - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/ExifCommand.php b/Intervention/Image/Imagick/Commands/ExifCommand.php deleted file mode 100644 index 521b38b..0000000 --- a/Intervention/Image/Imagick/Commands/ExifCommand.php +++ /dev/null @@ -1,63 +0,0 @@ -preferExtension = false; - } - - /** - * Read Exif data from the given image - * - * @param \Intervention\Image\Image $image - * @return boolean - */ - public function execute($image) - { - if ($this->preferExtension && function_exists('exif_read_data')) { - return parent::execute($image); - } - - $core = $image->getCore(); - - if ( ! method_exists($core, 'getImageProperties')) { - throw new NotSupportedException( - "Reading Exif data is not supported by this PHP installation." - ); - } - - $requestedKey = $this->argument(0)->value(); - if ($requestedKey !== null) { - $this->setOutput($core->getImageProperty('exif:' . $requestedKey)); - return true; - } - - $exif = []; - $properties = $core->getImageProperties(); - foreach ($properties as $key => $value) { - if (substr($key, 0, 5) !== 'exif:') { - continue; - } - - $exif[substr($key, 5)] = $value; - } - - $this->setOutput($exif); - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/FillCommand.php b/Intervention/Image/Imagick/Commands/FillCommand.php deleted file mode 100644 index 82baac5..0000000 --- a/Intervention/Image/Imagick/Commands/FillCommand.php +++ /dev/null @@ -1,105 +0,0 @@ -argument(0)->value(); - $x = $this->argument(1)->type('digit')->value(); - $y = $this->argument(2)->type('digit')->value(); - - $imagick = $image->getCore(); - - try { - // set image filling - $source = new Decoder; - $filling = $source->init($filling); - - } catch (NotReadableException $e) { - - // set solid color filling - $filling = new Color($filling); - } - - // flood fill if coordinates are set - if (is_int($x) && is_int($y)) { - - // flood fill with texture - if ($filling instanceof Image) { - - // create tile - $tile = clone $image->getCore(); - - // mask away color at position - $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false); - - // create canvas - $canvas = clone $image->getCore(); - - // fill canvas with texture - $canvas = $canvas->textureImage($filling->getCore()); - - // merge canvas and tile - $canvas->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0); - - // replace image core - $image->setCore($canvas); - - // flood fill with color - } elseif ($filling instanceof Color) { - - // create canvas with filling - $canvas = new \Imagick; - $canvas->newImage($image->getWidth(), $image->getHeight(), $filling->getPixel(), 'png'); - - // create tile to put on top - $tile = clone $image->getCore(); - - // mask away color at pos. - $tile->transparentPaintImage($tile->getImagePixelColor($x, $y), 0, 0, false); - - // save alpha channel of original image - $alpha = clone $image->getCore(); - - // merge original with canvas and tile - $image->getCore()->compositeImage($canvas, \Imagick::COMPOSITE_DEFAULT, 0, 0); - $image->getCore()->compositeImage($tile, \Imagick::COMPOSITE_DEFAULT, 0, 0); - - // restore alpha channel of original image - $image->getCore()->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); - } - - } else { - - if ($filling instanceof Image) { - - // fill whole image with texture - $image->setCore($image->getCore()->textureImage($filling->getCore())); - - } elseif ($filling instanceof Color) { - - // fill whole image with color - $draw = new \ImagickDraw(); - $draw->setFillColor($filling->getPixel()); - $draw->rectangle(0, 0, $image->getWidth(), $image->getHeight()); - $image->getCore()->drawImage($draw); - } - } - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/FitCommand.php b/Intervention/Image/Imagick/Commands/FitCommand.php deleted file mode 100644 index 6d62ba6..0000000 --- a/Intervention/Image/Imagick/Commands/FitCommand.php +++ /dev/null @@ -1,42 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->value($width); - $constraints = $this->argument(2)->type('closure')->value(); - $position = $this->argument(3)->type('string')->value('center'); - - // calculate size - $cropped = $image->getSize()->fit(new Size($width, $height), $position); - $resized = clone $cropped; - $resized = $resized->resize($width, $height, $constraints); - - // crop image - $image->getCore()->cropImage( - $cropped->width, - $cropped->height, - $cropped->pivot->x, - $cropped->pivot->y - ); - - // resize image - $image->getCore()->scaleImage($resized->getWidth(), $resized->getHeight()); - $image->getCore()->setImagePage(0,0,0,0); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/FlipCommand.php b/Intervention/Image/Imagick/Commands/FlipCommand.php deleted file mode 100644 index abae16a..0000000 --- a/Intervention/Image/Imagick/Commands/FlipCommand.php +++ /dev/null @@ -1,27 +0,0 @@ -argument(0)->value('h'); - - if (in_array(strtolower($mode), [2, 'v', 'vert', 'vertical'])) { - // flip vertical - return $image->getCore()->flipImage(); - } else { - // flip horizontal - return $image->getCore()->flopImage(); - } - } -} diff --git a/Intervention/Image/Imagick/Commands/GammaCommand.php b/Intervention/Image/Imagick/Commands/GammaCommand.php deleted file mode 100644 index 200515f..0000000 --- a/Intervention/Image/Imagick/Commands/GammaCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - - return $image->getCore()->gammaImage($gamma); - } -} diff --git a/Intervention/Image/Imagick/Commands/GetSizeCommand.php b/Intervention/Image/Imagick/Commands/GetSizeCommand.php deleted file mode 100644 index ccccedb..0000000 --- a/Intervention/Image/Imagick/Commands/GetSizeCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -getCore(); - - $this->setOutput(new Size( - $core->getImageWidth(), - $core->getImageHeight() - )); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/GreyscaleCommand.php b/Intervention/Image/Imagick/Commands/GreyscaleCommand.php deleted file mode 100644 index df0ff5b..0000000 --- a/Intervention/Image/Imagick/Commands/GreyscaleCommand.php +++ /dev/null @@ -1,19 +0,0 @@ -getCore()->modulateImage(100, 0, 100); - } -} diff --git a/Intervention/Image/Imagick/Commands/HeightenCommand.php b/Intervention/Image/Imagick/Commands/HeightenCommand.php deleted file mode 100644 index 0b61e50..0000000 --- a/Intervention/Image/Imagick/Commands/HeightenCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $additionalConstraints = $this->argument(1)->type('closure')->value(); - - $this->arguments[0] = null; - $this->arguments[1] = $height; - $this->arguments[2] = function ($constraint) use ($additionalConstraints) { - $constraint->aspectRatio(); - if(is_callable($additionalConstraints)) - $additionalConstraints($constraint); - }; - - return parent::execute($image); - } -} diff --git a/Intervention/Image/Imagick/Commands/InsertCommand.php b/Intervention/Image/Imagick/Commands/InsertCommand.php deleted file mode 100644 index 2a99743..0000000 --- a/Intervention/Image/Imagick/Commands/InsertCommand.php +++ /dev/null @@ -1,33 +0,0 @@ -argument(0)->required()->value(); - $position = $this->argument(1)->type('string')->value(); - $x = $this->argument(2)->type('digit')->value(0); - $y = $this->argument(3)->type('digit')->value(0); - - // build watermark - $watermark = $image->getDriver()->init($source); - - // define insertion point - $image_size = $image->getSize()->align($position, $x, $y); - $watermark_size = $watermark->getSize()->align($position); - $target = $image_size->relativePosition($watermark_size); - - // insert image at position - return $image->getCore()->compositeImage($watermark->getCore(), \Imagick::COMPOSITE_DEFAULT, $target->x, $target->y); - } -} diff --git a/Intervention/Image/Imagick/Commands/InterlaceCommand.php b/Intervention/Image/Imagick/Commands/InterlaceCommand.php deleted file mode 100644 index 913cab7..0000000 --- a/Intervention/Image/Imagick/Commands/InterlaceCommand.php +++ /dev/null @@ -1,29 +0,0 @@ -argument(0)->type('bool')->value(true); - - if ($mode) { - $mode = \Imagick::INTERLACE_LINE; - } else { - $mode = \Imagick::INTERLACE_NO; - } - - $image->getCore()->setInterlaceScheme($mode); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/InvertCommand.php b/Intervention/Image/Imagick/Commands/InvertCommand.php deleted file mode 100644 index 1d13430..0000000 --- a/Intervention/Image/Imagick/Commands/InvertCommand.php +++ /dev/null @@ -1,19 +0,0 @@ -getCore()->negateImage(false); - } -} diff --git a/Intervention/Image/Imagick/Commands/LimitColorsCommand.php b/Intervention/Image/Imagick/Commands/LimitColorsCommand.php deleted file mode 100644 index 16f9b82..0000000 --- a/Intervention/Image/Imagick/Commands/LimitColorsCommand.php +++ /dev/null @@ -1,59 +0,0 @@ -argument(0)->value(); - $matte = $this->argument(1)->value(); - - // get current image size - $size = $image->getSize(); - - // build 2 color alpha mask from original alpha - $alpha = clone $image->getCore(); - $alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA); - $alpha->transparentPaintImage('#ffffff', 0, 0, false); - $alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA); - $alpha->negateImage(false); - - if ($matte) { - - // get matte color - $mattecolor = $image->getDriver()->parseColor($matte)->getPixel(); - - // create matte image - $canvas = new \Imagick; - $canvas->newImage($size->width, $size->height, $mattecolor, 'png'); - - // lower colors of original and copy to matte - $image->getCore()->quantizeImage($count, \Imagick::COLORSPACE_RGB, 0, false, false); - $canvas->compositeImage($image->getCore(), \Imagick::COMPOSITE_DEFAULT, 0, 0); - - // copy new alpha to canvas - $canvas->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); - - // replace core - $image->setCore($canvas); - - } else { - - $image->getCore()->quantizeImage($count, \Imagick::COLORSPACE_RGB, 0, false, false); - $image->getCore()->compositeImage($alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); - - } - - return true; - - } -} diff --git a/Intervention/Image/Imagick/Commands/MaskCommand.php b/Intervention/Image/Imagick/Commands/MaskCommand.php deleted file mode 100644 index af9d6b2..0000000 --- a/Intervention/Image/Imagick/Commands/MaskCommand.php +++ /dev/null @@ -1,60 +0,0 @@ -argument(0)->value(); - $mask_w_alpha = $this->argument(1)->type('bool')->value(false); - - // get imagick - $imagick = $image->getCore(); - - // build mask image from source - $mask = $image->getDriver()->init($mask_source); - - // resize mask to size of current image (if necessary) - $image_size = $image->getSize(); - if ($mask->getSize() != $image_size) { - $mask->resize($image_size->width, $image_size->height); - } - - $imagick->setImageMatte(true); - - if ($mask_w_alpha) { - - // just mask with alpha map - $imagick->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DSTIN, 0, 0); - - } else { - - // get alpha channel of original as greyscale image - $original_alpha = clone $imagick; - $original_alpha->separateImageChannel(\Imagick::CHANNEL_ALPHA); - - // use red channel from mask ask alpha - $mask_alpha = clone $mask->getCore(); - $mask_alpha->compositeImage($mask->getCore(), \Imagick::COMPOSITE_DEFAULT, 0, 0); - // $mask_alpha->setImageAlphaChannel(\Imagick::ALPHACHANNEL_DEACTIVATE); - $mask_alpha->separateImageChannel(\Imagick::CHANNEL_ALL); - - // combine both alphas from original and mask - $original_alpha->compositeImage($mask_alpha, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); - - // mask the image with the alpha combination - $imagick->compositeImage($original_alpha, \Imagick::COMPOSITE_DSTIN, 0, 0); - } - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/OpacityCommand.php b/Intervention/Image/Imagick/Commands/OpacityCommand.php deleted file mode 100644 index b4708d8..0000000 --- a/Intervention/Image/Imagick/Commands/OpacityCommand.php +++ /dev/null @@ -1,23 +0,0 @@ -argument(0)->between(0, 100)->required()->value(); - - $transparency = $transparency > 0 ? (100 / $transparency) : 1000; - - return $image->getCore()->evaluateImage(\Imagick::EVALUATE_DIVIDE, $transparency, \Imagick::CHANNEL_ALPHA); - } -} diff --git a/Intervention/Image/Imagick/Commands/PickColorCommand.php b/Intervention/Image/Imagick/Commands/PickColorCommand.php deleted file mode 100644 index 978a128..0000000 --- a/Intervention/Image/Imagick/Commands/PickColorCommand.php +++ /dev/null @@ -1,30 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $y = $this->argument(1)->type('digit')->required()->value(); - $format = $this->argument(2)->type('string')->value('array'); - - // pick color - $color = new Color($image->getCore()->getImagePixelColor($x, $y)); - - // format to output - $this->setOutput($color->format($format)); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/PixelCommand.php b/Intervention/Image/Imagick/Commands/PixelCommand.php deleted file mode 100644 index 6eb6ae7..0000000 --- a/Intervention/Image/Imagick/Commands/PixelCommand.php +++ /dev/null @@ -1,31 +0,0 @@ -argument(0)->required()->value(); - $color = new Color($color); - $x = $this->argument(1)->type('digit')->required()->value(); - $y = $this->argument(2)->type('digit')->required()->value(); - - // prepare pixel - $draw = new \ImagickDraw; - $draw->setFillColor($color->getPixel()); - $draw->point($x, $y); - - // apply pixel - return $image->getCore()->drawImage($draw); - } -} diff --git a/Intervention/Image/Imagick/Commands/PixelateCommand.php b/Intervention/Image/Imagick/Commands/PixelateCommand.php deleted file mode 100644 index 6fe7949..0000000 --- a/Intervention/Image/Imagick/Commands/PixelateCommand.php +++ /dev/null @@ -1,27 +0,0 @@ -argument(0)->type('digit')->value(10); - - $width = $image->getWidth(); - $height = $image->getHeight(); - - $image->getCore()->scaleImage(max(1, ($width / $size)), max(1, ($height / $size))); - $image->getCore()->scaleImage($width, $height); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/ResetCommand.php b/Intervention/Image/Imagick/Commands/ResetCommand.php deleted file mode 100644 index 77b7f33..0000000 --- a/Intervention/Image/Imagick/Commands/ResetCommand.php +++ /dev/null @@ -1,40 +0,0 @@ -argument(0)->value(); - - $backup = $image->getBackup($backupName); - - if ($backup instanceof \Imagick) { - - // destroy current core - $image->getCore()->clear(); - - // clone backup - $backup = clone $backup; - - // reset to new resource - $image->setCore($backup); - - return true; - } - - throw new RuntimeException( - "Backup not available. Call backup({$backupName}) before reset()." - ); - } -} diff --git a/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php b/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php deleted file mode 100644 index ecf0761..0000000 --- a/Intervention/Image/Imagick/Commands/ResizeCanvasCommand.php +++ /dev/null @@ -1,91 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $height = $this->argument(1)->type('digit')->required()->value(); - $anchor = $this->argument(2)->value('center'); - $relative = $this->argument(3)->type('boolean')->value(false); - $bgcolor = $this->argument(4)->value(); - - $original_width = $image->getWidth(); - $original_height = $image->getHeight(); - - // check of only width or height is set - $width = is_null($width) ? $original_width : intval($width); - $height = is_null($height) ? $original_height : intval($height); - - // check on relative width/height - if ($relative) { - $width = $original_width + $width; - $height = $original_height + $height; - } - - // check for negative width/height - $width = ($width <= 0) ? $width + $original_width : $width; - $height = ($height <= 0) ? $height + $original_height : $height; - - // create new canvas - $canvas = $image->getDriver()->newImage($width, $height, $bgcolor); - - // set copy position - $canvas_size = $canvas->getSize()->align($anchor); - $image_size = $image->getSize()->align($anchor); - $canvas_pos = $image_size->relativePosition($canvas_size); - $image_pos = $canvas_size->relativePosition($image_size); - - if ($width <= $original_width) { - $dst_x = 0; - $src_x = $canvas_pos->x; - $src_w = $canvas_size->width; - } else { - $dst_x = $image_pos->x; - $src_x = 0; - $src_w = $original_width; - } - - if ($height <= $original_height) { - $dst_y = 0; - $src_y = $canvas_pos->y; - $src_h = $canvas_size->height; - } else { - $dst_y = $image_pos->y; - $src_y = 0; - $src_h = $original_height; - } - - // make image area transparent to keep transparency - // even if background-color is set - $rect = new \ImagickDraw; - $fill = $canvas->pickColor(0, 0, 'hex'); - $fill = $fill == '#ff0000' ? '#00ff00' : '#ff0000'; - $rect->setFillColor($fill); - $rect->rectangle($dst_x, $dst_y, $dst_x + $src_w - 1, $dst_y + $src_h - 1); - $canvas->getCore()->drawImage($rect); - $canvas->getCore()->transparentPaintImage($fill, 0, 0, false); - - $canvas->getCore()->setImageColorspace($image->getCore()->getImageColorspace()); - - // copy image into new canvas - $image->getCore()->cropImage($src_w, $src_h, $src_x, $src_y); - $canvas->getCore()->compositeImage($image->getCore(), \Imagick::COMPOSITE_DEFAULT, $dst_x, $dst_y); - $canvas->getCore()->setImagePage(0,0,0,0); - - // set new core to canvas - $image->setCore($canvas->getCore()); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/ResizeCommand.php b/Intervention/Image/Imagick/Commands/ResizeCommand.php deleted file mode 100644 index 3d4dc5b..0000000 --- a/Intervention/Image/Imagick/Commands/ResizeCommand.php +++ /dev/null @@ -1,29 +0,0 @@ -argument(0)->value(); - $height = $this->argument(1)->value(); - $constraints = $this->argument(2)->type('closure')->value(); - - // resize box - $resized = $image->getSize()->resize($width, $height, $constraints); - - // modify image - $image->getCore()->scaleImage($resized->getWidth(), $resized->getHeight()); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/RotateCommand.php b/Intervention/Image/Imagick/Commands/RotateCommand.php deleted file mode 100644 index b3e12a5..0000000 --- a/Intervention/Image/Imagick/Commands/RotateCommand.php +++ /dev/null @@ -1,30 +0,0 @@ -argument(0)->type('numeric')->required()->value(); - $color = $this->argument(1)->value(); - $color = new Color($color); - - // restrict rotations beyond 360 degrees, since the end result is the same - $angle = fmod($angle, 360); - - // rotate image - $image->getCore()->rotateImage($color->getPixel(), ($angle * -1)); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/SharpenCommand.php b/Intervention/Image/Imagick/Commands/SharpenCommand.php deleted file mode 100644 index bc5e393..0000000 --- a/Intervention/Image/Imagick/Commands/SharpenCommand.php +++ /dev/null @@ -1,21 +0,0 @@ -argument(0)->between(0, 100)->value(10); - - return $image->getCore()->unsharpMaskImage(1, 1, $amount / 6.25, 0); - } -} diff --git a/Intervention/Image/Imagick/Commands/TrimCommand.php b/Intervention/Image/Imagick/Commands/TrimCommand.php deleted file mode 100644 index bdc897b..0000000 --- a/Intervention/Image/Imagick/Commands/TrimCommand.php +++ /dev/null @@ -1,121 +0,0 @@ -argument(0)->type('string')->value(); - $away = $this->argument(1)->value(); - $tolerance = $this->argument(2)->type('numeric')->value(0); - $feather = $this->argument(3)->type('numeric')->value(0); - - $width = $image->getWidth(); - $height = $image->getHeight(); - - $checkTransparency = false; - - // define borders to trim away - if (is_null($away)) { - $away = ['top', 'right', 'bottom', 'left']; - } elseif (is_string($away)) { - $away = [$away]; - } - - // lower border names - foreach ($away as $key => $value) { - $away[$key] = strtolower($value); - } - - // define base color position - switch (strtolower($base)) { - case 'transparent': - case 'trans': - $checkTransparency = true; - $base_x = 0; - $base_y = 0; - break; - - case 'bottom-right': - case 'right-bottom': - $base_x = $width - 1; - $base_y = $height - 1; - break; - - default: - case 'top-left': - case 'left-top': - $base_x = 0; - $base_y = 0; - break; - } - - // pick base color - if ($checkTransparency) { - $base_color = new Color; // color will only be used to compare alpha channel - } else { - $base_color = $image->pickColor($base_x, $base_y, 'object'); - } - - // trim on clone to get only coordinates - $trimed = clone $image->getCore(); - - // add border to trim specific color - $trimed->borderImage($base_color->getPixel(), 1, 1); - - // trim image - $trimed->trimImage(65850 / 100 * $tolerance); - - // get coordinates of trim - $imagePage = $trimed->getImagePage(); - list($crop_x, $crop_y) = [$imagePage['x']-1, $imagePage['y']-1]; - // $trimed->setImagePage(0, 0, 0, 0); - list($crop_width, $crop_height) = [$trimed->width, $trimed->height]; - - // adjust settings if right should not be trimed - if ( ! in_array('right', $away)) { - $crop_width = $crop_width + ($width - ($width - $crop_x)); - } - - // adjust settings if bottom should not be trimed - if ( ! in_array('bottom', $away)) { - $crop_height = $crop_height + ($height - ($height - $crop_y)); - } - - // adjust settings if left should not be trimed - if ( ! in_array('left', $away)) { - $crop_width = $crop_width + $crop_x; - $crop_x = 0; - } - - // adjust settings if top should not be trimed - if ( ! in_array('top', $away)) { - $crop_height = $crop_height + $crop_y; - $crop_y = 0; - } - - // add feather - $crop_width = min($width, ($crop_width + $feather * 2)); - $crop_height = min($height, ($crop_height + $feather * 2)); - $crop_x = max(0, ($crop_x - $feather)); - $crop_y = max(0, ($crop_y - $feather)); - - // finally crop based on page - $image->getCore()->cropImage($crop_width, $crop_height, $crop_x, $crop_y); - $image->getCore()->setImagePage(0,0,0,0); - - $trimed->destroy(); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Commands/WidenCommand.php b/Intervention/Image/Imagick/Commands/WidenCommand.php deleted file mode 100644 index a196753..0000000 --- a/Intervention/Image/Imagick/Commands/WidenCommand.php +++ /dev/null @@ -1,28 +0,0 @@ -argument(0)->type('digit')->required()->value(); - $additionalConstraints = $this->argument(1)->type('closure')->value(); - - $this->arguments[0] = $width; - $this->arguments[1] = null; - $this->arguments[2] = function ($constraint) use ($additionalConstraints) { - $constraint->aspectRatio(); - if(is_callable($additionalConstraints)) - $additionalConstraints($constraint); - }; - - return parent::execute($image); - } -} diff --git a/Intervention/Image/Imagick/Decoder.php b/Intervention/Image/Imagick/Decoder.php deleted file mode 100644 index f4dde9a..0000000 --- a/Intervention/Image/Imagick/Decoder.php +++ /dev/null @@ -1,124 +0,0 @@ -setBackgroundColor(new \ImagickPixel('transparent')); - $core->readImage($path); - $core->setImageType(defined('\Imagick::IMGTYPE_TRUECOLORALPHA') ? \Imagick::IMGTYPE_TRUECOLORALPHA : \Imagick::IMGTYPE_TRUECOLORMATTE); - - } catch (\ImagickException $e) { - throw new \Intervention\Image\Exception\NotReadableException( - "Unable to read image from path ({$path}).", - 0, - $e - ); - } - - // build image - $image = $this->initFromImagick($core); - $image->setFileInfoFromPath($path); - - return $image; - } - - /** - * Initiates new image from GD resource - * - * @param Resource $resource - * @return \Intervention\Image\Image - */ - public function initFromGdResource($resource) - { - throw new NotSupportedException( - 'Imagick driver is unable to init from GD resource.' - ); - } - - /** - * Initiates new image from Imagick object - * - * @param Imagick $object - * @return \Intervention\Image\Image - */ - public function initFromImagick(\Imagick $object) - { - // currently animations are not supported - // so all images are turned into static - $object = $this->removeAnimation($object); - - // reset image orientation - $object->setImageOrientation(\Imagick::ORIENTATION_UNDEFINED); - - return new Image(new Driver, $object); - } - - /** - * Initiates new image from binary data - * - * @param string $data - * @return \Intervention\Image\Image - */ - public function initFromBinary($binary) - { - $core = new \Imagick; - - try { - $core->setBackgroundColor(new \ImagickPixel('transparent')); - - $core->readImageBlob($binary); - - } catch (\ImagickException $e) { - throw new NotReadableException( - "Unable to read image from binary data.", - 0, - $e - ); - } - - // build image - $image = $this->initFromImagick($core); - $image->mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $binary); - - return $image; - } - - /** - * Turns object into one frame Imagick object - * by removing all frames except first - * - * @param Imagick $object - * @return Imagick - */ - private function removeAnimation(\Imagick $object) - { - $imagick = new \Imagick; - - foreach ($object as $frame) { - $imagick->addImage($frame->getImage()); - break; - } - - $object->destroy(); - - return $imagick; - } -} diff --git a/Intervention/Image/Imagick/Driver.php b/Intervention/Image/Imagick/Driver.php deleted file mode 100644 index bb26ca0..0000000 --- a/Intervention/Image/Imagick/Driver.php +++ /dev/null @@ -1,74 +0,0 @@ -coreAvailable()) { - throw new NotSupportedException( - "ImageMagick module not available with this PHP installation." - ); - } - - $this->decoder = $decoder ? $decoder : new Decoder; - $this->encoder = $encoder ? $encoder : new Encoder; - } - - /** - * Creates new image instance - * - * @param int $width - * @param int $height - * @param mixed $background - * @return \Intervention\Image\Image - */ - public function newImage($width, $height, $background = null) - { - $background = new Color($background); - - // create empty core - $core = new \Imagick; - $core->newImage($width, $height, $background->getPixel(), 'png'); - $core->setType(\Imagick::IMGTYPE_UNDEFINED); - $core->setImageType(\Imagick::IMGTYPE_UNDEFINED); - $core->setColorspace(\Imagick::COLORSPACE_UNDEFINED); - - // build image - $image = new Image(new static, $core); - - return $image; - } - - /** - * Reads given string into color object - * - * @param string $value - * @return AbstractColor - */ - public function parseColor($value) - { - return new Color($value); - } - - /** - * Checks if core module installation is available - * - * @return boolean - */ - protected function coreAvailable() - { - return (extension_loaded('imagick') && class_exists('Imagick')); - } -} diff --git a/Intervention/Image/Imagick/Encoder.php b/Intervention/Image/Imagick/Encoder.php deleted file mode 100644 index feb8a9d..0000000 --- a/Intervention/Image/Imagick/Encoder.php +++ /dev/null @@ -1,239 +0,0 @@ -image->getCore(); - $imagick->setImageBackgroundColor('white'); - $imagick->setBackgroundColor('white'); - $imagick = $imagick->mergeImageLayers(\Imagick::LAYERMETHOD_MERGE); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - $imagick->setCompressionQuality($this->quality); - $imagick->setImageCompressionQuality($this->quality); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as PNG string - * - * @return string - */ - protected function processPng() - { - $format = 'png'; - $compression = \Imagick::COMPRESSION_ZIP; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_PNG); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as GIF string - * - * @return string - */ - protected function processGif() - { - $format = 'gif'; - $compression = \Imagick::COMPRESSION_LZW; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_GIF); - - return $imagick->getImagesBlob(); - } - - protected function processWebp() - { - if ( ! \Imagick::queryFormats('WEBP')) { - throw new NotSupportedException( - "Webp format is not supported by Imagick installation." - ); - } - - $format = 'webp'; - $compression = \Imagick::COMPRESSION_JPEG; - - $imagick = $this->image->getCore(); - $imagick->setImageBackgroundColor(new \ImagickPixel('transparent')); - - $imagick = $imagick->mergeImageLayers(\Imagick::LAYERMETHOD_MERGE); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - $imagick->setImageCompressionQuality($this->quality); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as TIFF string - * - * @return string - */ - protected function processTiff() - { - $format = 'tiff'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - $imagick->setCompressionQuality($this->quality); - $imagick->setImageCompressionQuality($this->quality); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_TIFF_II); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as BMP string - * - * @return string - */ - protected function processBmp() - { - $format = 'bmp'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_BMP); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as ICO string - * - * @return string - */ - protected function processIco() - { - $format = 'ico'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_ICO); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as PSD string - * - * @return string - */ - protected function processPsd() - { - $format = 'psd'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - - $this->image->mime = image_type_to_mime_type(IMAGETYPE_PSD); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as AVIF string - * - * @return string - */ - protected function processAvif() - { - if ( ! \Imagick::queryFormats('AVIF')) { - throw new NotSupportedException( - "AVIF format is not supported by Imagick installation." - ); - } - - $format = 'avif'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - $imagick->setCompressionQuality($this->quality); - $imagick->setImageCompressionQuality($this->quality); - - return $imagick->getImagesBlob(); - } - - /** - * Processes and returns encoded image as HEIC string - * - * @return string - */ - protected function processHeic() - { - if ( ! \Imagick::queryFormats('HEIC')) { - throw new NotSupportedException( - "HEIC format is not supported by Imagick installation." - ); - } - - $format = 'heic'; - $compression = \Imagick::COMPRESSION_UNDEFINED; - - $imagick = $this->image->getCore(); - $imagick->setFormat($format); - $imagick->setImageFormat($format); - $imagick->setCompression($compression); - $imagick->setImageCompression($compression); - $imagick->setCompressionQuality($this->quality); - $imagick->setImageCompressionQuality($this->quality); - - return $imagick->getImagesBlob(); - } -} diff --git a/Intervention/Image/Imagick/Font.php b/Intervention/Image/Imagick/Font.php deleted file mode 100644 index 9869d06..0000000 --- a/Intervention/Image/Imagick/Font.php +++ /dev/null @@ -1,122 +0,0 @@ -setStrokeAntialias(true); - $draw->setTextAntialias(true); - - // set font file - if ($this->hasApplicableFontFile()) { - $draw->setFont($this->file); - } else { - throw new RuntimeException( - "Font file must be provided to apply text to image." - ); - } - - // parse text color - $color = new Color($this->color); - - $draw->setFontSize($this->size); - $draw->setFillColor($color->getPixel()); - $draw->setTextKerning($this->kerning); - - // align horizontal - switch (strtolower($this->align)) { - case 'center': - $align = \Imagick::ALIGN_CENTER; - break; - - case 'right': - $align = \Imagick::ALIGN_RIGHT; - break; - - default: - $align = \Imagick::ALIGN_LEFT; - break; - } - - $draw->setTextAlignment($align); - - // align vertical - if (strtolower($this->valign) != 'bottom') { - - // corrections on y-position - switch (strtolower($this->valign)) { - case 'center': - case 'middle': - // calculate box size - $dimensions = $image->getCore()->queryFontMetrics($draw, $this->text); - $posy = $posy + $dimensions['textHeight'] * 0.65 / 2; - break; - - case 'top': - // calculate box size - $dimensions = $image->getCore()->queryFontMetrics($draw, $this->text, false); - $posy = $posy + $dimensions['characterHeight']; - break; - } - } - - // apply to image - $image->getCore()->annotateImage($draw, $posx, $posy, $this->angle * (-1), $this->text); - } - - /** - * Calculates bounding box of current font setting - * - * @return array - */ - public function getBoxSize() - { - $box = []; - - // build draw object - $draw = new \ImagickDraw(); - $draw->setStrokeAntialias(true); - $draw->setTextAntialias(true); - - // set font file - if ($this->hasApplicableFontFile()) { - $draw->setFont($this->file); - } else { - throw new RuntimeException( - "Font file must be provided to apply text to image." - ); - } - - $draw->setFontSize($this->size); - - $dimensions = (new \Imagick())->queryFontMetrics($draw, $this->text); - - if (strlen($this->text) == 0) { - // no text -> no boxsize - $box['width'] = 0; - $box['height'] = 0; - } else { - // get boxsize - $box['width'] = intval(abs($dimensions['textWidth'])); - $box['height'] = intval(abs($dimensions['textHeight'])); - } - - return $box; - } -} diff --git a/Intervention/Image/Imagick/Shapes/CircleShape.php b/Intervention/Image/Imagick/Shapes/CircleShape.php deleted file mode 100644 index 24172ea..0000000 --- a/Intervention/Image/Imagick/Shapes/CircleShape.php +++ /dev/null @@ -1,40 +0,0 @@ -width = is_numeric($diameter) ? intval($diameter) : $this->diameter; - $this->height = is_numeric($diameter) ? intval($diameter) : $this->diameter; - $this->diameter = is_numeric($diameter) ? intval($diameter) : $this->diameter; - } - - /** - * Draw current circle on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - return parent::applyToImage($image, $x, $y); - } -} diff --git a/Intervention/Image/Imagick/Shapes/EllipseShape.php b/Intervention/Image/Imagick/Shapes/EllipseShape.php deleted file mode 100644 index 99694b9..0000000 --- a/Intervention/Image/Imagick/Shapes/EllipseShape.php +++ /dev/null @@ -1,66 +0,0 @@ -width = is_numeric($width) ? intval($width) : $this->width; - $this->height = is_numeric($height) ? intval($height) : $this->height; - } - - /** - * Draw ellipse instance on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $circle = new \ImagickDraw; - - // set background - $bgcolor = new Color($this->background); - $circle->setFillColor($bgcolor->getPixel()); - - // set border - if ($this->hasBorder()) { - $border_color = new Color($this->border_color); - $circle->setStrokeWidth($this->border_width); - $circle->setStrokeColor($border_color->getPixel()); - } - - $circle->ellipse($x, $y, $this->width / 2, $this->height / 2, 0, 360); - - $image->getCore()->drawImage($circle); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Shapes/LineShape.php b/Intervention/Image/Imagick/Shapes/LineShape.php deleted file mode 100644 index 0d6b329..0000000 --- a/Intervention/Image/Imagick/Shapes/LineShape.php +++ /dev/null @@ -1,94 +0,0 @@ -x = is_numeric($x) ? intval($x) : $this->x; - $this->y = is_numeric($y) ? intval($y) : $this->y; - } - - /** - * Set current line color - * - * @param string $color - * @return void - */ - public function color($color) - { - $this->color = $color; - } - - /** - * Set current line width in pixels - * - * @param int $width - * @return void - */ - public function width($width) - { - $this->width = $width; - } - - /** - * Draw current instance of line to given endpoint on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $line = new \ImagickDraw; - - $color = new Color($this->color); - $line->setStrokeColor($color->getPixel()); - $line->setStrokeWidth($this->width); - - $line->line($this->x, $this->y, $x, $y); - $image->getCore()->drawImage($line); - - return true; - } -} diff --git a/Intervention/Image/Imagick/Shapes/PolygonShape.php b/Intervention/Image/Imagick/Shapes/PolygonShape.php deleted file mode 100644 index 45f44ad..0000000 --- a/Intervention/Image/Imagick/Shapes/PolygonShape.php +++ /dev/null @@ -1,81 +0,0 @@ -points = $this->formatPoints($points); - } - - /** - * Draw polygon on given image - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $polygon = new \ImagickDraw; - - // set background - $bgcolor = new Color($this->background); - $polygon->setFillColor($bgcolor->getPixel()); - - // set border - if ($this->hasBorder()) { - $border_color = new Color($this->border_color); - $polygon->setStrokeWidth($this->border_width); - $polygon->setStrokeColor($border_color->getPixel()); - } - - $polygon->polygon($this->points); - - $image->getCore()->drawImage($polygon); - - return true; - } - - /** - * Format polygon points to Imagick format - * - * @param Array $points - * @return Array - */ - private function formatPoints($points) - { - $ipoints = []; - $count = 1; - - foreach ($points as $key => $value) { - if ($count%2 === 0) { - $y = $value; - $ipoints[] = ['x' => $x, 'y' => $y]; - } else { - $x = $value; - } - $count++; - } - - return $ipoints; - } -} diff --git a/Intervention/Image/Imagick/Shapes/RectangleShape.php b/Intervention/Image/Imagick/Shapes/RectangleShape.php deleted file mode 100644 index 1166d77..0000000 --- a/Intervention/Image/Imagick/Shapes/RectangleShape.php +++ /dev/null @@ -1,84 +0,0 @@ -x1 = is_numeric($x1) ? intval($x1) : $this->x1; - $this->y1 = is_numeric($y1) ? intval($y1) : $this->y1; - $this->x2 = is_numeric($x2) ? intval($x2) : $this->x2; - $this->y2 = is_numeric($y2) ? intval($y2) : $this->y2; - } - - /** - * Draw rectangle to given image at certain position - * - * @param Image $image - * @param int $x - * @param int $y - * @return boolean - */ - public function applyToImage(Image $image, $x = 0, $y = 0) - { - $rectangle = new \ImagickDraw; - - // set background - $bgcolor = new Color($this->background); - $rectangle->setFillColor($bgcolor->getPixel()); - - // set border - if ($this->hasBorder()) { - $border_color = new Color($this->border_color); - $rectangle->setStrokeWidth($this->border_width); - $rectangle->setStrokeColor($border_color->getPixel()); - } - - $rectangle->rectangle($this->x1, $this->y1, $this->x2, $this->y2); - - $image->getCore()->drawImage($rectangle); - - return true; - } -} diff --git a/Intervention/Image/Point.php b/Intervention/Image/Point.php deleted file mode 100644 index d51452e..0000000 --- a/Intervention/Image/Point.php +++ /dev/null @@ -1,64 +0,0 @@ -x = is_numeric($x) ? intval($x) : 0; - $this->y = is_numeric($y) ? intval($y) : 0; - } - - /** - * Sets X coordinate - * - * @param int $x - */ - public function setX($x) - { - $this->x = intval($x); - } - - /** - * Sets Y coordinate - * - * @param int $y - */ - public function setY($y) - { - $this->y = intval($y); - } - - /** - * Sets both X and Y coordinate - * - * @param int $x - * @param int $y - */ - public function setPosition($x, $y) - { - $this->setX($x); - $this->setY($y); - } -} diff --git a/Intervention/Image/Response.php b/Intervention/Image/Response.php deleted file mode 100644 index 59a51e9..0000000 --- a/Intervention/Image/Response.php +++ /dev/null @@ -1,78 +0,0 @@ -image = $image; - $this->format = $format ? $format : $image->mime; - $this->quality = $quality ? $quality : 90; - } - - /** - * Builds response according to settings - * - * @return mixed - */ - public function make() - { - $this->image->encode($this->format, $this->quality); - $data = $this->image->getEncoded(); - $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $data); - $length = strlen($data); - - if (function_exists('app') && is_a($app = app(), 'Illuminate\Foundation\Application')) { - - $response = IlluminateResponse::make($data); - $response->header('Content-Type', $mime); - $response->header('Content-Length', $length); - - } elseif (class_exists('\Symfony\Component\HttpFoundation\Response')) { - - $response = new SymfonyResponse($data); - $response->headers->set('Content-Type', $mime); - $response->headers->set('Content-Length', $length); - - } else { - - header('Content-Type: ' . $mime); - header('Content-Length: ' . $length); - $response = $data; - } - - return $response; - } -} diff --git a/Intervention/Image/Size.php b/Intervention/Image/Size.php deleted file mode 100644 index f8b6dc8..0000000 --- a/Intervention/Image/Size.php +++ /dev/null @@ -1,374 +0,0 @@ -width = is_numeric($width) ? intval($width) : 1; - $this->height = is_numeric($height) ? intval($height) : 1; - $this->pivot = $pivot ? $pivot : new Point; - } - - /** - * Set the width and height absolutely - * - * @param int $width - * @param int $height - */ - public function set($width, $height) - { - $this->width = $width; - $this->height = $height; - } - - /** - * Set current pivot point - * - * @param Point $point - */ - public function setPivot(Point $point) - { - $this->pivot = $point; - } - - /** - * Get the current width - * - * @return int - */ - public function getWidth() - { - return $this->width; - } - - /** - * Get the current height - * - * @return int - */ - public function getHeight() - { - return $this->height; - } - - /** - * Calculate the current aspect ratio - * - * @return float - */ - public function getRatio() - { - return $this->width / $this->height; - } - - /** - * Resize to desired width and/or height - * - * @param int $width - * @param int $height - * @param Closure $callback - * @return Size - */ - public function resize($width, $height, Closure $callback = null) - { - if (is_null($width) && is_null($height)) { - throw new InvalidArgumentException( - "Width or height needs to be defined." - ); - } - - // new size with dominant width - $dominant_w_size = clone $this; - $dominant_w_size->resizeHeight($height, $callback); - $dominant_w_size->resizeWidth($width, $callback); - - // new size with dominant height - $dominant_h_size = clone $this; - $dominant_h_size->resizeWidth($width, $callback); - $dominant_h_size->resizeHeight($height, $callback); - - // decide which size to use - if ($dominant_h_size->fitsInto(new self($width, $height))) { - $this->set($dominant_h_size->width, $dominant_h_size->height); - } else { - $this->set($dominant_w_size->width, $dominant_w_size->height); - } - - return $this; - } - - /** - * Scale size according to given constraints - * - * @param int $width - * @param Closure $callback - * @return Size - */ - private function resizeWidth($width, Closure $callback = null) - { - $constraint = $this->getConstraint($callback); - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $max_width = $constraint->getSize()->getWidth(); - $max_height = $constraint->getSize()->getHeight(); - } - - if (is_numeric($width)) { - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $this->width = ($width > $max_width) ? $max_width : $width; - } else { - $this->width = $width; - } - - if ($constraint->isFixed(Constraint::ASPECTRATIO)) { - $h = max(1, intval(round($this->width / $constraint->getSize()->getRatio()))); - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $this->height = ($h > $max_height) ? $max_height : $h; - } else { - $this->height = $h; - } - } - } - } - - /** - * Scale size according to given constraints - * - * @param int $height - * @param Closure $callback - * @return Size - */ - private function resizeHeight($height, Closure $callback = null) - { - $constraint = $this->getConstraint($callback); - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $max_width = $constraint->getSize()->getWidth(); - $max_height = $constraint->getSize()->getHeight(); - } - - if (is_numeric($height)) { - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $this->height = ($height > $max_height) ? $max_height : $height; - } else { - $this->height = $height; - } - - if ($constraint->isFixed(Constraint::ASPECTRATIO)) { - $w = max(1, intval(round($this->height * $constraint->getSize()->getRatio()))); - - if ($constraint->isFixed(Constraint::UPSIZE)) { - $this->width = ($w > $max_width) ? $max_width : $w; - } else { - $this->width = $w; - } - } - } - } - - /** - * Calculate the relative position to another Size - * based on the pivot point settings of both sizes. - * - * @param Size $size - * @return \Intervention\Image\Point - */ - public function relativePosition(Size $size) - { - $x = $this->pivot->x - $size->pivot->x; - $y = $this->pivot->y - $size->pivot->y; - - return new Point($x, $y); - } - - /** - * Resize given Size to best fitting size of current size. - * - * @param Size $size - * @return \Intervention\Image\Size - */ - public function fit(Size $size, $position = 'center') - { - // create size with auto height - $auto_height = clone $size; - - $auto_height->resize($this->width, null, function ($constraint) { - $constraint->aspectRatio(); - }); - - // decide which version to use - if ($auto_height->fitsInto($this)) { - - $size = $auto_height; - - } else { - - // create size with auto width - $auto_width = clone $size; - - $auto_width->resize(null, $this->height, function ($constraint) { - $constraint->aspectRatio(); - }); - - $size = $auto_width; - } - - $this->align($position); - $size->align($position); - $size->setPivot($this->relativePosition($size)); - - return $size; - } - - /** - * Checks if given size fits into current size - * - * @param Size $size - * @return boolean - */ - public function fitsInto(Size $size) - { - return ($this->width <= $size->width) && ($this->height <= $size->height); - } - - /** - * Aligns current size's pivot point to given position - * and moves point automatically by offset. - * - * @param string $position - * @param int $offset_x - * @param int $offset_y - * @return \Intervention\Image\Size - */ - public function align($position, $offset_x = 0, $offset_y = 0) - { - switch (strtolower($position)) { - - case 'top': - case 'top-center': - case 'top-middle': - case 'center-top': - case 'middle-top': - $x = intval($this->width / 2); - $y = 0 + $offset_y; - break; - - case 'top-right': - case 'right-top': - $x = $this->width - $offset_x; - $y = 0 + $offset_y; - break; - - case 'left': - case 'left-center': - case 'left-middle': - case 'center-left': - case 'middle-left': - $x = 0 + $offset_x; - $y = intval($this->height / 2); - break; - - case 'right': - case 'right-center': - case 'right-middle': - case 'center-right': - case 'middle-right': - $x = $this->width - $offset_x; - $y = intval($this->height / 2); - break; - - case 'bottom-left': - case 'left-bottom': - $x = 0 + $offset_x; - $y = $this->height - $offset_y; - break; - - case 'bottom': - case 'bottom-center': - case 'bottom-middle': - case 'center-bottom': - case 'middle-bottom': - $x = intval($this->width / 2); - $y = $this->height - $offset_y; - break; - - case 'bottom-right': - case 'right-bottom': - $x = $this->width - $offset_x; - $y = $this->height - $offset_y; - break; - - case 'center': - case 'middle': - case 'center-center': - case 'middle-middle': - $x = intval($this->width / 2) + $offset_x; - $y = intval($this->height / 2) + $offset_y; - break; - - default: - case 'top-left': - case 'left-top': - $x = 0 + $offset_x; - $y = 0 + $offset_y; - break; - } - - $this->pivot->setPosition($x, $y); - - return $this; - } - - /** - * Runs constraints on current size - * - * @param Closure $callback - * @return \Intervention\Image\Constraint - */ - private function getConstraint(Closure $callback = null) - { - $constraint = new Constraint(clone $this); - - if (is_callable($callback)) { - $callback($constraint); - } - - return $constraint; - } -} diff --git a/src/Manager.php b/src/Manager.php index 75a095b..fbc5182 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -11,10 +11,8 @@ defined('_JEXEC') or die; use Intervention\Image\ImageManagerStatic as Image; -use JLoader; use Joomla\CMS\Filesystem\Folder; use Joomla\CMS\Filesystem\Path; -use Joomla\CMS\Version; class Manager { @@ -28,19 +26,7 @@ class Manager */ public static function getInstance($options = ['driver' => 'gd']) { - $jversion = new Version(); - - if (version_compare($jversion->getShortVersion(), '4.0', '<')) - { - // only for Joomla 3.x - JLoader::registerNamespace('Intervention\Image', JPATH_LIBRARIES . DIRECTORY_SEPARATOR . 'jinterventionimage'); - - } - else - { - // only for Joomla 4.x|5x - JLoader::registerNamespace('Intervention\Image', JPATH_LIBRARIES . DIRECTORY_SEPARATOR . 'jinterventionimage' . DIRECTORY_SEPARATOR . 'Intervention' . DIRECTORY_SEPARATOR . 'Image'); - } + require_once dirname(__FILE__, 2) . '/vendor/autoload.php'; return Image::configure($options); } From 10953c4663cf4236d361ce60c9587b77dc80ed6d Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:43:22 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D1=8F=D0=BC=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?composer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composer.json | 27 +++++++++++ composer.lock | 108 +++++++++++++++++++++++++++++++++++++++++ jinterventionimage.xml | 2 +- 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 composer.json create mode 100644 composer.lock diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..57903d9 --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "type": "joomla-library", + "description": "Libraries Image Intervention for Joomla!", + "authors": [ + { + "name": "Dmitrii Cymbal", + "role": "Developer, maintainer", + "email": "cymbal@delo-design.ru", + "homepage": "https://delo-design.ru" + } + ], + "minimum-stability": "stable", + "require": { + "php": ">=7.1", + "intervention/image": "2.7" + }, + "replace": { + "guzzlehttp/psr7": "*" + }, + "config": { + "optimize-autoloader": true, + "platform": { + "php": "7.1" + }, + "prepend-autoloader": false + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..ee556bb --- /dev/null +++ b/composer.lock @@ -0,0 +1,108 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "c850b58fd0d8d2e1d40127860d67ab21", + "packages": [ + { + "name": "intervention/image", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/9a8cc99d30415ec0b3f7649e1647d03a55698545", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + }, + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/interventionphp", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2021-10-03T14:17:12+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.1" + }, + "platform-dev": [], + "platform-overrides": { + "php": "7.1" + }, + "plugin-api-version": "2.6.0" +} diff --git a/jinterventionimage.xml b/jinterventionimage.xml index 01a572d..815ceec 100644 --- a/jinterventionimage.xml +++ b/jinterventionimage.xml @@ -22,8 +22,8 @@ - Intervention src + vendor From be1f801ff7c187ca22b035c5b9e5e627b0a65a86 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:44:46 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20.editorconfig=20=D0=B8=D0=B7=20joomla/joomla-cms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..27f887b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style end of lines and a blank line at the end of the file +[*] +indent_style = tab +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.php] +indent_style = space +indent_size = 4 + +[*.{js,json,scss,css,yml,vue}] +indent_style = space +indent_size = 2 \ No newline at end of file From e68a9e0381dc7cc815523734e2622cbdb7a24704 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:46:04 +0300 Subject: [PATCH 5/8] =?UTF-8?q?Codestyle=20=D1=81=20.editorconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Manager.php | 444 +++++++++++++++++++++++------------------------- 1 file changed, 212 insertions(+), 232 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index fbc5182..c022b2b 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -1,4 +1,6 @@ - @@ -17,234 +19,212 @@ class Manager { - /** - * @param array $options - * - * @return \Intervention\Image\ImageManager - * - * @since version - */ - public static function getInstance($options = ['driver' => 'gd']) - { - require_once dirname(__FILE__, 2) . '/vendor/autoload.php'; - - return Image::configure($options); - } - - - /** - * @param string $source - * @param int $max_width - * @param int $max_height - * @param string $algorithm values: fit|bestfit|resize - * @param string $thumb_path example: cache/images - * @param string $how_save values: folder|file - * - * @return mixed|string - * - * @since version - */ - public static function generateThumb($source, $max_width, $max_height, $algorithm = 'resize', $thumb_path = null, $how_save = 'file') - { - $source = str_replace(JPATH_ROOT . DIRECTORY_SEPARATOR, '', $source); - $paths = explode(DIRECTORY_SEPARATOR, $source); - $file = array_pop($paths); - $file_split = explode('.', $file); - $file_ext = mb_strtolower(array_pop($file_split)); - $extAccept = ['jpg', 'jpeg', 'png', 'gif', 'webp']; - - if (!in_array($file_ext, $extAccept)) - { - return $file; - } - - if ($how_save === 'file') - { - $file = implode('.', $file_split) . '_' . $max_width . '_' . $max_height . '.' . $file_ext; - } - - if ($thumb_path === null) - { - $pathThumb = implode(DIRECTORY_SEPARATOR, array_merge($paths, ['_thumb'])); - $pathFileThumb = implode(DIRECTORY_SEPARATOR, array_merge($paths, ['_thumb'])) . DIRECTORY_SEPARATOR . $file; - } - else - { - $pathThumb = Path::clean($thumb_path . DIRECTORY_SEPARATOR . '_thumb'); - $pathFileThumb = Path::clean($thumb_path . DIRECTORY_SEPARATOR . '_thumb' . DIRECTORY_SEPARATOR . $file); - } - - if ($how_save === 'folder') - { - $pathThumb .= DIRECTORY_SEPARATOR . $max_width . 'x' . $max_height; - $pathFileThumb = Path::clean($pathThumb . DIRECTORY_SEPARATOR . $file); - } - - $params = []; - - $fullPathThumb = Path::clean(JPATH_ROOT . DIRECTORY_SEPARATOR . $pathThumb . DIRECTORY_SEPARATOR . $file); - - //если есть превью, то отдаем ссылку на файл - if (file_exists($fullPathThumb)) - { - return $pathFileThumb; - } - - - //если нет, генерируем превью - - //проверяем создан ли каталог для превью - $pathThumbSplit = explode(DIRECTORY_SEPARATOR, $pathThumb); - $pathThumbCurrent = ''; - foreach ($pathThumbSplit as $pathCurrentCheck) - { - $pathThumbCurrent .= DIRECTORY_SEPARATOR . $pathCurrentCheck; - $pathThumbCheck = Path::clean(JPATH_ROOT . DIRECTORY_SEPARATOR . $pathThumbCurrent); - if (!file_exists($pathThumbCheck)) - { - //создаем каталог - Folder::create($pathThumbCheck); - } - } - - - if (copy(JPATH_ROOT . DIRECTORY_SEPARATOR . $source, $fullPathThumb)) - { - - if ($algorithm === 'fit') - { - self::fit($fullPathThumb, $max_width, $max_height); - } - - if ($algorithm === 'bestfit') - { - self::bestFit($fullPathThumb, $max_width, $max_height); - } - - if ($algorithm === 'resize') - { - self::resize($fullPathThumb, $max_width, $max_height); - } - - } - - - return $pathFileThumb; - - } - - - /** - * @param string $file - * @param int $width_fit - * @param int $height_fit - * - * - * @since version - */ - public static function resize($file, $width_fit, $height_fit) - { - list($width, $height, $type, $attr) = getimagesize($file); - $max_width = (int) $width_fit; - $max_height = (int) $height_fit; - - $manager = self::getInstance(['driver' => self::getNameDriver()]); - $manager - ->make($file) - ->resize($max_width, $max_height, function ($constraint) { - $constraint->aspectRatio(); - }) - ->resizeCanvas($max_width, $max_height) - ->save($file); - - } - - - /** - * @param string $file - * @param int $width_fit - * @param int $height_fit - * - * - * @since version - */ - public static function bestFit($file, $width_fit, $height_fit) - { - list($width, $height, $type, $attr) = getimagesize($file); - $new_width = $width; - $new_height = $height; - $max_width = (int) $width_fit; - $max_height = (int) $height_fit; - - $ratio = $width / $height; - - if ($width > $max_width) - { - $new_width = $max_width; - $new_height = round($new_width / $ratio); - } - - if ($new_height > $max_height) - { - $new_height = $max_height; - $new_width = round($new_height * $ratio); - } - - - $manager = self::getInstance(['driver' => self::getNameDriver()]); - $manager - ->make($file) - ->resize($new_width, $new_height, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - }) - ->save($file); - - } - - - /** - * @param string $file - * @param int $width_fit - * @param int $height_fit - * - * - * @since version - */ - public static function fit($file, $width_fit, $height_fit) - { - list($width, $height, $type, $attr) = getimagesize($file); - $newWidth = $width; - $newHeight = $height; - $max_width = (int) $width_fit; - $max_height = (int) $height_fit; - - $manager = self::getInstance(['driver' => self::getNameDriver()]); - $manager - ->make($file) - ->fit($max_width, $max_height, function ($constraint) { - $constraint->aspectRatio(); - }) - ->save($file); - - } - - - /** - * - * @return string - * - * @since version - */ - public static function getNameDriver() - { - if (extension_loaded('imagick')) - { - return 'imagick'; - } - - return 'gd'; - } - - -} \ No newline at end of file + /** + * @param array $options + * + * @return \Intervention\Image\ImageManager + * + * @since version + */ + public static function getInstance($options = ['driver' => 'gd']) + { + require_once dirname(__FILE__, 2) . '/vendor/autoload.php'; + + return Image::configure($options); + } + + + /** + * @param string $source + * @param int $max_width + * @param int $max_height + * @param string $algorithm values: fit|bestfit|resize + * @param string $thumb_path example: cache/images + * @param string $how_save values: folder|file + * + * @return mixed|string + * + * @since version + */ + public static function generateThumb($source, $max_width, $max_height, $algorithm = 'resize', $thumb_path = null, $how_save = 'file') + { + $source = str_replace(JPATH_ROOT . DIRECTORY_SEPARATOR, '', $source); + $paths = explode(DIRECTORY_SEPARATOR, $source); + $file = array_pop($paths); + $file_split = explode('.', $file); + $file_ext = mb_strtolower(array_pop($file_split)); + $extAccept = ['jpg', 'jpeg', 'png', 'gif', 'webp']; + + if (!in_array($file_ext, $extAccept)) { + return $file; + } + + if ($how_save === 'file') { + $file = implode('.', $file_split) . '_' . $max_width . '_' . $max_height . '.' . $file_ext; + } + + if ($thumb_path === null) { + $pathThumb = implode(DIRECTORY_SEPARATOR, array_merge($paths, ['_thumb'])); + $pathFileThumb = implode(DIRECTORY_SEPARATOR, array_merge($paths, ['_thumb'])) . DIRECTORY_SEPARATOR . $file; + } else { + $pathThumb = Path::clean($thumb_path . DIRECTORY_SEPARATOR . '_thumb'); + $pathFileThumb = Path::clean($thumb_path . DIRECTORY_SEPARATOR . '_thumb' . DIRECTORY_SEPARATOR . $file); + } + + if ($how_save === 'folder') { + $pathThumb .= DIRECTORY_SEPARATOR . $max_width . 'x' . $max_height; + $pathFileThumb = Path::clean($pathThumb . DIRECTORY_SEPARATOR . $file); + } + + $params = []; + + $fullPathThumb = Path::clean(JPATH_ROOT . DIRECTORY_SEPARATOR . $pathThumb . DIRECTORY_SEPARATOR . $file); + + //если есть превью, то отдаем ссылку на файл + if (file_exists($fullPathThumb)) { + return $pathFileThumb; + } + + + //если нет, генерируем превью + + //проверяем создан ли каталог для превью + $pathThumbSplit = explode(DIRECTORY_SEPARATOR, $pathThumb); + $pathThumbCurrent = ''; + foreach ($pathThumbSplit as $pathCurrentCheck) { + $pathThumbCurrent .= DIRECTORY_SEPARATOR . $pathCurrentCheck; + $pathThumbCheck = Path::clean(JPATH_ROOT . DIRECTORY_SEPARATOR . $pathThumbCurrent); + if (!file_exists($pathThumbCheck)) { + //создаем каталог + Folder::create($pathThumbCheck); + } + } + + + if (copy(JPATH_ROOT . DIRECTORY_SEPARATOR . $source, $fullPathThumb)) { + if ($algorithm === 'fit') { + self::fit($fullPathThumb, $max_width, $max_height); + } + + if ($algorithm === 'bestfit') { + self::bestFit($fullPathThumb, $max_width, $max_height); + } + + if ($algorithm === 'resize') { + self::resize($fullPathThumb, $max_width, $max_height); + } + } + + + return $pathFileThumb; + } + + + /** + * @param string $file + * @param int $width_fit + * @param int $height_fit + * + * + * @since version + */ + public static function resize($file, $width_fit, $height_fit) + { + list($width, $height, $type, $attr) = getimagesize($file); + $max_width = (int)$width_fit; + $max_height = (int)$height_fit; + + $manager = self::getInstance(['driver' => self::getNameDriver()]); + $manager + ->make($file) + ->resize($max_width, $max_height, function ($constraint) { + $constraint->aspectRatio(); + }) + ->resizeCanvas($max_width, $max_height) + ->save($file); + } + + + /** + * @param string $file + * @param int $width_fit + * @param int $height_fit + * + * + * @since version + */ + public static function bestFit($file, $width_fit, $height_fit) + { + list($width, $height, $type, $attr) = getimagesize($file); + $new_width = $width; + $new_height = $height; + $max_width = (int)$width_fit; + $max_height = (int)$height_fit; + + $ratio = $width / $height; + + if ($width > $max_width) { + $new_width = $max_width; + $new_height = round($new_width / $ratio); + } + + if ($new_height > $max_height) { + $new_height = $max_height; + $new_width = round($new_height * $ratio); + } + + + $manager = self::getInstance(['driver' => self::getNameDriver()]); + $manager + ->make($file) + ->resize($new_width, $new_height, function ($constraint) { + $constraint->aspectRatio(); + $constraint->upsize(); + }) + ->save($file); + } + + + /** + * @param string $file + * @param int $width_fit + * @param int $height_fit + * + * + * @since version + */ + public static function fit($file, $width_fit, $height_fit) + { + list($width, $height, $type, $attr) = getimagesize($file); + $newWidth = $width; + $newHeight = $height; + $max_width = (int)$width_fit; + $max_height = (int)$height_fit; + + $manager = self::getInstance(['driver' => self::getNameDriver()]); + $manager + ->make($file) + ->fit($max_width, $max_height, function ($constraint) { + $constraint->aspectRatio(); + }) + ->save($file); + } + + + /** + * + * @return string + * + * @since version + */ + public static function getNameDriver() + { + if (extension_loaded('imagick')) { + return 'imagick'; + } + + return 'gd'; + } + + +} From de96d5a8fa3b26af5bbce6b75da9713e800359e5 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 13:47:02 +0300 Subject: [PATCH 6/8] CleanUp code --- src/Manager.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Manager.php b/src/Manager.php index c022b2b..32628a1 100644 --- a/src/Manager.php +++ b/src/Manager.php @@ -76,8 +76,6 @@ public static function generateThumb($source, $max_width, $max_height, $algorith $pathFileThumb = Path::clean($pathThumb . DIRECTORY_SEPARATOR . $file); } - $params = []; - $fullPathThumb = Path::clean(JPATH_ROOT . DIRECTORY_SEPARATOR . $pathThumb . DIRECTORY_SEPARATOR . $file); //если есть превью, то отдаем ссылку на файл @@ -130,7 +128,6 @@ public static function generateThumb($source, $max_width, $max_height, $algorith */ public static function resize($file, $width_fit, $height_fit) { - list($width, $height, $type, $attr) = getimagesize($file); $max_width = (int)$width_fit; $max_height = (int)$height_fit; @@ -195,9 +192,6 @@ public static function bestFit($file, $width_fit, $height_fit) */ public static function fit($file, $width_fit, $height_fit) { - list($width, $height, $type, $attr) = getimagesize($file); - $newWidth = $width; - $newHeight = $height; $max_width = (int)$width_fit; $max_height = (int)$height_fit; From 4d4d267efbf842ce9eaf2c8fbb25712a670f659f Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 14:10:55 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D1=83=20=D0=B0=D1=80=D1=82?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=B0=20=D0=BD=D0=B0=20=D1=80?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D0=B7=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/joomla-artefact.yml | 61 +++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/joomla-artefact.yml diff --git a/.github/workflows/joomla-artefact.yml b/.github/workflows/joomla-artefact.yml new file mode 100644 index 0000000..e1a1481 --- /dev/null +++ b/.github/workflows/joomla-artefact.yml @@ -0,0 +1,61 @@ +name: Create Joomla installation package + +on: + release: + types: [ published ] + +jobs: + + createReleasePackage: + + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Compare release and manifest versions + id: check-versions + run: | + MANIFEST_VERSION=$(awk -F'[<>]' '// {print $3}' ./jinterventionimage.xml) + RELEASE_VERSION=${{ github.ref_name }} + if [ "$MANIFEST_VERSION" != "$RELEASE_VERSION" ]; then + echo "Error: The release version must match the version specified in the manifest." + exit 1 + fi + + - name: Install system dependencies + run: | + sudo apt-get update -y + sudo apt-get install git zip unzip curl jq -y + + - name: Setup PHP with PECL extension + uses: shivammathur/setup-php@v2 + with: + php-version: '7.1' + tools: composer + + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Install composer dependencies from source + run: composer install --prefer-dist --no-dev --no-progress --optimize-autoloader + + - name: Run build script + run: | + export TERM=xterm + zip -r lib_jinterventionimage.zip src vendor jinterventionimage.xml + + - name: Upload artifact + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: lib_jinterventionimage.zip From dc79cf53c4ed4f86958d9741b2ea98271f231b56 Mon Sep 17 00:00:00 2001 From: Artem Vasilev Date: Fri, 6 Dec 2024 14:11:30 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20softprops/action-gh-release=20=D0=B4=D0=BE=20v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/joomla-artefact.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/joomla-artefact.yml b/.github/workflows/joomla-artefact.yml index e1a1481..836ca0d 100644 --- a/.github/workflows/joomla-artefact.yml +++ b/.github/workflows/joomla-artefact.yml @@ -55,7 +55,7 @@ jobs: zip -r lib_jinterventionimage.zip src vendor jinterventionimage.xml - name: Upload artifact - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 if: startsWith(github.ref, 'refs/tags/') with: files: lib_jinterventionimage.zip