X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=web%2Fcore%2Fmodules%2Fsystem%2Fsrc%2FPlugin%2FImageToolkit%2FOperation%2Fgd%2FScale.php;fp=web%2Fcore%2Fmodules%2Fsystem%2Fsrc%2FPlugin%2FImageToolkit%2FOperation%2Fgd%2FScale.php;h=37097d864ee93fe2f7acd6e33de5379436fd601b;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/system/src/Plugin/ImageToolkit/Operation/gd/Scale.php b/web/core/modules/system/src/Plugin/ImageToolkit/Operation/gd/Scale.php new file mode 100644 index 000000000..37097d864 --- /dev/null +++ b/web/core/modules/system/src/Plugin/ImageToolkit/Operation/gd/Scale.php @@ -0,0 +1,92 @@ + [ + 'description' => 'The target width, in pixels. This value is omitted then the scaling will based only on the height value', + 'required' => FALSE, + 'default' => NULL, + ], + 'height' => [ + 'description' => 'The target height, in pixels. This value is omitted then the scaling will based only on the width value', + 'required' => FALSE, + 'default' => NULL, + ], + 'upscale' => [ + 'description' => 'Boolean indicating that files smaller than the dimensions will be scaled up. This generally results in a low quality image', + 'required' => FALSE, + 'default' => FALSE, + ], + ]; + } + + /** + * {@inheritdoc} + */ + protected function validateArguments(array $arguments) { + // Assure at least one dimension. + if (empty($arguments['width']) && empty($arguments['height'])) { + throw new \InvalidArgumentException("At least one dimension ('width' or 'height') must be provided to the image 'scale' operation"); + } + + // Calculate one of the dimensions from the other target dimension, + // ensuring the same aspect ratio as the source dimensions. If one of the + // target dimensions is missing, that is the one that is calculated. If both + // are specified then the dimension calculated is the one that would not be + // calculated to be bigger than its target. + $aspect = $this->getToolkit()->getHeight() / $this->getToolkit()->getWidth(); + if (($arguments['width'] && !$arguments['height']) || ($arguments['width'] && $arguments['height'] && $aspect < $arguments['height'] / $arguments['width'])) { + $arguments['height'] = (int) round($arguments['width'] * $aspect); + } + else { + $arguments['width'] = (int) round($arguments['height'] / $aspect); + } + + // Assure integers for all arguments. + $arguments['width'] = (int) round($arguments['width']); + $arguments['height'] = (int) round($arguments['height']); + + // Fail when width or height are 0 or negative. + if ($arguments['width'] <= 0) { + throw new \InvalidArgumentException("Invalid width ('{$arguments['width']}') specified for the image 'scale' operation"); + } + if ($arguments['height'] <= 0) { + throw new \InvalidArgumentException("Invalid height ('{$arguments['height']}') specified for the image 'scale' operation"); + } + + return $arguments; + } + + /** + * {@inheritdoc} + */ + protected function execute(array $arguments = []) { + // Don't scale if we don't change the dimensions at all. + if ($arguments['width'] !== $this->getToolkit()->getWidth() || $arguments['height'] !== $this->getToolkit()->getHeight()) { + // Don't upscale if the option isn't enabled. + if ($arguments['upscale'] || ($arguments['width'] <= $this->getToolkit()->getWidth() && $arguments['height'] <= $this->getToolkit()->getHeight())) { + return parent::execute($arguments); + } + } + return TRUE; + } + +}