You are here

class ImageWatermark in Image effect kit 8

Defines IEK - Watermark operation.

Plugin annotation


@ImageToolkitOperation(
  id = "gd_iek_image_watermark",
  toolkit = "gd",
  operation = "iek_image_watermark",
  label = @Translation("IEK - Watermark"),
  description = @Translation("Add a watermark text on an image.")
)

Hierarchy

Expanded class hierarchy of ImageWatermark

File

src/Plugin/ImageToolkit/Operation/gd/ImageWatermark.php, line 23
Contains \Drupal\iek\Plugin\ImageToolkit\Operation\gd\ImageWatermark.

Namespace

Drupal\iek\Plugin\ImageToolkit\Operation\gd
View source
class ImageWatermark extends GDImageToolkitOperationBase {

  /**
   * {@inheritdoc}
   */
  protected function arguments() {
    return [
      'text' => [
        'description' => 'Text',
      ],
      'font' => [
        'description' => 'Font',
      ],
      'color' => [
        'description' => 'Color',
      ],
      'size' => [
        'description' => 'Size',
      ],
      'angle' => [
        'description' => 'Angle',
      ],
      'position' => [
        'description' => 'Position',
      ],
      'padding_top' => [
        'description' => 'Padding top',
      ],
      'padding_right' => [
        'description' => 'Padding right',
      ],
      'padding_bottom' => [
        'description' => 'Padding bottom',
      ],
      'padding_left' => [
        'description' => 'Padding left',
      ],
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function validateArguments(array $arguments) {
    if (empty($arguments['text'])) {
      throw new \InvalidArgumentException("Invalid text ('{$arguments['text']}') specified for the image 'iek_image_watermark' operation");
    }
    if (empty($arguments['font'])) {
      throw new \InvalidArgumentException("Invalid font ('{$arguments['font']}') specified for the image 'iek_image_watermark' operation");
    }

    // TODO - validate color code.
    if ((int) $arguments['size'] <= 0) {
      throw new \InvalidArgumentException("Invalid size ('{$arguments['size']}') specified for the image 'iek_image_watermark' operation");
    }
    if (!is_numeric($arguments['angle'])) {
      throw new \InvalidArgumentException("Invalid angle ('{$arguments['angle']}') specified for the image 'iek_image_watermark' operation");
    }

    // Fail when padding is negative.
    if ((int) $arguments['padding_top'] < 0) {
      throw new \InvalidArgumentException("Invalid padding ('{$arguments['padding_top']}') specified for the image 'iek_image_watermark' operation");
    }

    // Fail when padding is negative.
    if ((int) $arguments['padding_right'] < 0) {
      throw new \InvalidArgumentException("Invalid padding ('{$arguments['padding_right']}') specified for the image 'iek_image_watermark' operation");
    }

    // Fail when padding is negative.
    if ((int) $arguments['padding_bottom'] < 0) {
      throw new \InvalidArgumentException("Invalid padding ('{$arguments['padding_bottom']}') specified for the image 'iek_image_watermark' operation");
    }

    // Fail when padding is negative.
    if ((int) $arguments['padding_left'] < 0) {
      throw new \InvalidArgumentException("Invalid padding ('{$arguments['padding_left']}') specified for the image 'iek_image_watermark' operation");
    }
    return $arguments;
  }

  /**
   * {@inheritdoc}
   */
  protected function execute(array $arguments = []) {
    $file_system = \Drupal::service('file_system');
    $token = \Drupal::hasService('token') ? \Drupal::service('token') : NULL;
    $data = $arguments;
    $width = $this
      ->getToolkit()
      ->getWidth();
    $height = $this
      ->getToolkit()
      ->getHeight();
    $text = $token ? $token
      ->replace($data['text']) : $data['text'];
    $angle = 360 - $data['angle'];
    $size = $data['size'];
    $position = $data['position'];
    $padding_top = $data['padding_top'];
    $padding_right = $data['padding_right'];
    $padding_bottom = $data['padding_bottom'];
    $padding_left = $data['padding_left'];
    $iek_font = iek_get_watermark_fonts($data['font']);
    $font = $file_system
      ->realpath($iek_font['path'] . '/' . $iek_font['file']);
    $dst = imagecreatetruecolor($width, $height);
    $text_rgb = iek_hex2rgb($data['color']);
    $text_color = imagecolorallocate($dst, $text_rgb['red'], $text_rgb['green'], $text_rgb['blue']);

    // Wraps the watermark text.
    $bbox = imagettfbbox($size, $angle, $font, $text);
    $bbox_width = abs($bbox[2] - $bbox[0]);
    $bbox_height = abs($bbox[5] - $bbox[3]);
    $bbox_character_width = 0;
    if (strlen($text)) {
      $bbox_character_width = ceil($bbox_width / strlen($text));
    }
    $bbox_character_height = ceil($bbox_height);
    $text_arr = [];
    if ($bbox_character_width) {
      $text_arr = chunk_split($text, ceil(($width - abs(($padding_left + $padding_right) * 2)) / $bbox_character_width), ':::');
      $text_arr = explode(':::', $text_arr);
    }
    switch ($position) {
      case 'top_left':
        $new_y = $bbox_character_height + $padding_top;
        foreach ($text_arr as $text_arr_item) {
          $new_x = $padding_left;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'top_center':
        $new_y = $bbox_character_height + $padding_top;
        foreach ($text_arr as $text_arr_item) {
          $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'top_right':
        $new_y = $bbox_character_height + $padding_top;
        foreach ($text_arr as $text_arr_item) {
          $cur_bbox = imagettfbbox($size, $angle, $font, $text_arr_item);
          $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
          $new_x = $width - $cur_bbox_width - $padding_right;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'middle_left':
        $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
        foreach ($text_arr as $text_arr_item) {
          $new_x = $padding_left;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'middle_center':
        $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
        foreach ($text_arr as $text_arr_item) {
          $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'middle_right':
        $new_y = $height / 2 - $bbox_character_height * count($text_arr) / 2 + $bbox_character_height;
        foreach ($text_arr as $text_arr_item) {
          $cur_bbox = imagettfbbox($size, $angle, $font, $text_arr_item);
          $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
          $new_x = $width - $cur_bbox_width - $padding_left;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'bottom_left':
        $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
        foreach ($text_arr as $text_arr_item) {
          $new_x = $padding_left;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'bottom_center':
        $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
        foreach ($text_arr as $text_arr_item) {
          $new_x = ($width - $bbox_character_width * strlen($text_arr_item)) / 2;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      case 'bottom_right':
        $new_y = $height - $bbox_character_height * count($text_arr) - $padding_bottom + $bbox_character_height * 2;
        foreach ($text_arr as $text_arr_item) {
          $cur_bbox = imagettfbbox($size, 0, $font, $text_arr_item);
          $cur_bbox_width = abs($cur_bbox[2] - $cur_bbox[0]);
          $new_x = $width - $cur_bbox_width - $padding_left;
          imagettftext($this
            ->getToolkit()
            ->getResource(), $size, $angle, $new_x, $new_y, $text_color, $font, $text_arr_item);
          $new_y += $bbox_character_height;
        }
        break;
      default:
        $new_x = 0;
        $new_y = 0;
    }
    return TRUE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
GDImageToolkitOperationBase::getToolkit protected function The correctly typed image toolkit for GD operations. Overrides ImageToolkitOperationBase::getToolkit
ImageToolkitOperationBase::$logger protected property A logger instance.
ImageToolkitOperationBase::$toolkit protected property The image toolkit.
ImageToolkitOperationBase::apply final public function Applies a toolkit specific operation to an image. Overrides ImageToolkitOperationInterface::apply
ImageToolkitOperationBase::prepareArguments protected function Checks if required arguments are passed in and adds defaults for non passed in optional arguments.
ImageToolkitOperationBase::__construct public function Constructs an image toolkit operation plugin. Overrides PluginBase::__construct
ImageWatermark::arguments protected function Returns the definition of the operation arguments. Overrides ImageToolkitOperationBase::arguments
ImageWatermark::execute protected function Performs the actual manipulation on the image. Overrides ImageToolkitOperationBase::execute
ImageWatermark::validateArguments protected function Validates the arguments. Overrides ImageToolkitOperationBase::validateArguments
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.