Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
50.00% |
1 / 2 |
CRAP | |
46.67% |
7 / 15 |
| Rotate | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
29.36 | |
46.67% |
7 / 15 |
| arguments | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| validateArguments | |
0.00% |
0 / 1 |
12.72 | |
42.86% |
6 / 14 |
|||
| execute | |
100.00% |
1 / 1 |
4 | |
100.00% |
0 / 0 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\system\Plugin\ImageToolkit\Operation\gd\Rotate. | |
| */ | |
| namespace Drupal\system\Plugin\ImageToolkit\Operation\gd; | |
| use Drupal\Component\Utility\Color; | |
| /** | |
| * Defines GD2 rotate operation. | |
| * | |
| * @ImageToolkitOperation( | |
| * id = "gd_rotate", | |
| * toolkit = "gd", | |
| * operation = "rotate", | |
| * label = @Translation("Rotate"), | |
| * description = @Translation("Rotates an image by the given number of degrees.") | |
| * ) | |
| */ | |
| class Rotate extends GDImageToolkitOperationBase { | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function arguments() { | |
| return array( | |
| 'degrees' => array( | |
| 'description' => 'The number of (clockwise) degrees to rotate the image', | |
| ), | |
| 'background' => array( | |
| 'description' => "A string specifying the hexadecimal color code to use as background for the uncovered area of the image after the rotation. E.g. '#000000' for black, '#ff00ff' for magenta, and '#ffffff' for white. For images that support transparency, this will default to transparent white", | |
| 'required' => FALSE, | |
| 'default' => NULL, | |
| ), | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| 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']) + array( 'alpha' => 0 ); | |
| } | |
| else { | |
| // Background color is not specified: use transparent white as background. | |
| $background = array('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; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function execute(array $arguments) { | |
| // PHP installations using non-bundled GD do not have imagerotate. | |
| if (!function_exists('imagerotate')) { | |
| $this->logger->notice('The image %file could not be rotated because the imagerotate() function is not available in this PHP installation.', array('%file' => $this->getToolkit()->getSource())); | |
| return FALSE; | |
| } | |
| // Stores the original GD resource. | |
| $original_res = $this->getToolkit()->getResource(); | |
| if ($new_res = imagerotate($this->getToolkit()->getResource(), 360 - $arguments['degrees'], $arguments['background_idx'])) { | |
| $this->getToolkit()->setResource($new_res); | |
| imagedestroy($original_res); | |
| // GIFs need to reassign the transparent color after performing the | |
| // rotate, but only do so, if the image already had transparency of its | |
| // own, or the rotate added a transparent background. | |
| if (!empty($arguments['gif_transparent_color'])) { | |
| $transparent_idx = imagecolorexactalpha($this->getToolkit()->getResource(), $arguments['gif_transparent_color']['red'], $arguments['gif_transparent_color']['green'], $arguments['gif_transparent_color']['blue'], $arguments['gif_transparent_color']['alpha']); | |
| imagecolortransparent($this->getToolkit()->getResource(), $transparent_idx); | |
| } | |
| return TRUE; | |
| } | |
| return FALSE; | |
| } | |
| } |