You are here

protected function Rotate::validateArguments in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/system/src/Plugin/ImageToolkit/Operation/gd/Rotate.php \Drupal\system\Plugin\ImageToolkit\Operation\gd\Rotate::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 ImageToolkitOperationBase::validateArguments

File

core/modules/system/src/Plugin/ImageToolkit/Operation/gd/Rotate.php, line 39

Class

Rotate
Defines GD2 rotate operation.

Namespace

Drupal\system\Plugin\ImageToolkit\Operation\gd

Code

protected function validateArguments(array $arguments) {

  // PHP 5.5 GD bug: https://bugs.php.net/bug.php?id=65148: To prevent buggy
  // behavior on negative multiples of 90 degrees we convert any negative
  // angle to a positive one between 0 and 360 degrees.
  $arguments['degrees'] -= floor($arguments['degrees'] / 360) * 360;

  // Validate or set background color argument.
  if (!empty($arguments['background'])) {

    // Validate the background color: Color::hexToRgb does so for us.
    $background = Color::hexToRgb($arguments['background']) + [
      'alpha' => 0,
    ];
  }
  else {

    // Background color is not specified: use transparent white as background.
    $background = [
      'red' => 255,
      'green' => 255,
      'blue' => 255,
      'alpha' => 127,
    ];
  }

  // Store the color index for the background as that is what GD uses.
  $arguments['background_idx'] = imagecolorallocatealpha($this
    ->getToolkit()
    ->getResource(), $background['red'], $background['green'], $background['blue'], $background['alpha']);
  if ($this
    ->getToolkit()
    ->getType() === IMAGETYPE_GIF) {

    // GIF does not work with a transparency channel, but can define 1 color
    // in its palette to act as transparent.
    // Get the current transparent color, if any.
    $gif_transparent_id = imagecolortransparent($this
      ->getToolkit()
      ->getResource());
    if ($gif_transparent_id !== -1) {

      // The gif already has a transparent color set: remember it to set it on
      // the rotated image as well.
      $arguments['gif_transparent_color'] = imagecolorsforindex($this
        ->getToolkit()
        ->getResource(), $gif_transparent_id);
      if ($background['alpha'] >= 127) {

        // We want a transparent background: use the color already set to act
        // as transparent, as background.
        $arguments['background_idx'] = $gif_transparent_id;
      }
    }
    else {

      // The gif does not currently have a transparent color set.
      if ($background['alpha'] >= 127) {

        // But as the background is transparent, it should get one.
        $arguments['gif_transparent_color'] = $background;
      }
    }
  }
  return $arguments;
}