You are here

protected function Scale::validateArguments in ImageMagick 8.2

Same name and namespace in other branches
  1. 8.3 src/Plugin/ImageToolkit/Operation/imagemagick/Scale.php \Drupal\imagemagick\Plugin\ImageToolkit\Operation\imagemagick\Scale::validateArguments()
  2. 8 src/Plugin/ImageToolkit/Operation/imagemagick/Scale.php \Drupal\imagemagick\Plugin\ImageToolkit\Operation\imagemagick\Scale::validateArguments()

Validates the arguments.

Image toolkit operation implementers should place any argument validation in this method, throwing an InvalidArgumentException when an error is encountered.

Validation typically includes things like:

  • Checking that width and height are not negative.
  • Checking that a color value is indeed a color.

But validation may also include correcting the arguments, e.g:

  • Casting arguments to the correct type.
  • Rounding pixel values to an integer.

This base implementation just returns the array of arguments and thus does not need to be called by overriding methods.

Parameters

array $arguments: An associative array of arguments to be used by the toolkit operation.

Return value

array The validated and corrected arguments array.

Throws

\InvalidArgumentException If one or more of the arguments are not valid.

\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException If the plugin does not define a default for an optional argument.

Overrides Resize::validateArguments

File

src/Plugin/ImageToolkit/Operation/imagemagick/Scale.php, line 49

Class

Scale
Defines imagemagick Scale operation.

Namespace

Drupal\imagemagick\Plugin\ImageToolkit\Operation\imagemagick

Code

protected function validateArguments(array $arguments) {

  // Fail if no dimensions available for current image.
  if (is_null($this
    ->getToolkit()
    ->getWidth()) || is_null($this
    ->getToolkit()
    ->getHeight())) {

    // @todo \InvalidArgumentException is incorrect, but other exceptions
    // would not be managed by toolkits that implement ImageToolkitBase.
    // Change to \RuntimeException when
    // https://www.drupal.org/project/drupal/issues/2583041 is committed.
    throw new \InvalidArgumentException("No image dimensions available for the image '{$this->getPluginDefinition()['operation']}' operation");
  }

  // 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;
}