protected function ImageWatermark::execute in Image effect kit 8
Performs the actual manipulation on the image.
Image toolkit operation implementers must implement this method. This method is responsible for actually performing the operation on the image. When this method gets called, the implementer may assume all arguments, also the optional ones, to be available, validated and corrected.
Parameters
array $arguments: An associative array of arguments to be used by the toolkit operation.
Return value
bool TRUE if the operation was performed successfully, FALSE otherwise.
Overrides ImageToolkitOperationBase::execute
File
- src/
Plugin/ ImageToolkit/ Operation/ gd/ ImageWatermark.php, line 111 - Contains \Drupal\iek\Plugin\ImageToolkit\Operation\gd\ImageWatermark.
Class
- ImageWatermark
- Defines IEK - Watermark operation.
Namespace
Drupal\iek\Plugin\ImageToolkit\Operation\gdCode
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;
}