Version 1
[yaffs-website] / web / core / modules / image / src / Plugin / ImageEffect / RotateImageEffect.php
1 <?php
2
3 namespace Drupal\image\Plugin\ImageEffect;
4
5 use Drupal\Component\Utility\Color;
6 use Drupal\Component\Utility\Rectangle;
7 use Drupal\Core\Form\FormStateInterface;
8 use Drupal\Core\Image\ImageInterface;
9 use Drupal\image\ConfigurableImageEffectBase;
10
11 /**
12  * Rotates an image resource.
13  *
14  * @ImageEffect(
15  *   id = "image_rotate",
16  *   label = @Translation("Rotate"),
17  *   description = @Translation("Rotating an image may cause the dimensions of an image to increase to fit the diagonal.")
18  * )
19  */
20 class RotateImageEffect extends ConfigurableImageEffectBase {
21
22   /**
23    * {@inheritdoc}
24    */
25   public function applyEffect(ImageInterface $image) {
26     if (!empty($this->configuration['random'])) {
27       $degrees = abs((float) $this->configuration['degrees']);
28       $this->configuration['degrees'] = rand(-$degrees, $degrees);
29     }
30
31     if (!$image->rotate($this->configuration['degrees'], $this->configuration['bgcolor'])) {
32       $this->logger->error('Image rotate failed using the %toolkit toolkit on %path (%mimetype, %dimensions)', ['%toolkit' => $image->getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image->getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image->getHeight()]);
33       return FALSE;
34     }
35     return TRUE;
36   }
37
38   /**
39    * {@inheritdoc}
40    */
41   public function transformDimensions(array &$dimensions, $uri) {
42     // If the rotate is not random and current dimensions are set,
43     // then the new dimensions can be determined.
44     if (!$this->configuration['random'] && $dimensions['width'] && $dimensions['height']) {
45       $rect = new Rectangle($dimensions['width'], $dimensions['height']);
46       $rect = $rect->rotate($this->configuration['degrees']);
47       $dimensions['width'] = $rect->getBoundingWidth();
48       $dimensions['height'] = $rect->getBoundingHeight();
49     }
50     else {
51       $dimensions['width'] = $dimensions['height'] = NULL;
52     }
53   }
54
55   /**
56    * {@inheritdoc}
57    */
58   public function getSummary() {
59     $summary = [
60       '#theme' => 'image_rotate_summary',
61       '#data' => $this->configuration,
62     ];
63     $summary += parent::getSummary();
64
65     return $summary;
66   }
67
68   /**
69    * {@inheritdoc}
70    */
71   public function defaultConfiguration() {
72     return [
73       'degrees' => 0,
74       'bgcolor' => NULL,
75       'random' => FALSE,
76     ];
77   }
78
79   /**
80    * {@inheritdoc}
81    */
82   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
83     $form['degrees'] = [
84       '#type' => 'number',
85       '#default_value' => $this->configuration['degrees'],
86       '#title' => t('Rotation angle'),
87       '#description' => t('The number of degrees the image should be rotated. Positive numbers are clockwise, negative are counter-clockwise.'),
88       '#field_suffix' => '°',
89       '#required' => TRUE,
90     ];
91     $form['bgcolor'] = [
92       '#type' => 'textfield',
93       '#default_value' => $this->configuration['bgcolor'],
94       '#title' => t('Background color'),
95       '#description' => t('The background color to use for exposed areas of the image. Use web-style hex colors (#FFFFFF for white, #000000 for black). Leave blank for transparency on image types that support it.'),
96       '#size' => 7,
97       '#maxlength' => 7,
98     ];
99     $form['random'] = [
100       '#type' => 'checkbox',
101       '#default_value' => $this->configuration['random'],
102       '#title' => t('Randomize'),
103       '#description' => t('Randomize the rotation angle for each image. The angle specified above is used as a maximum.'),
104     ];
105     return $form;
106   }
107
108   /**
109    * {@inheritdoc}
110    */
111   public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
112     if (!$form_state->isValueEmpty('bgcolor') && !Color::validateHex($form_state->getValue('bgcolor'))) {
113       $form_state->setErrorByName('bgcolor', $this->t('Background color must be a hexadecimal color value.'));
114     }
115   }
116
117   /**
118    * {@inheritdoc}
119    */
120   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
121     parent::submitConfigurationForm($form, $form_state);
122
123     $this->configuration['degrees'] = $form_state->getValue('degrees');
124     $this->configuration['bgcolor'] = $form_state->getValue('bgcolor');
125     $this->configuration['random'] = $form_state->getValue('random');
126   }
127
128 }