View source
<?php
namespace Drupal\imagemagick\Plugin\ImageToolkit;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Component\Serialization\Exception\InvalidDataTypeException;
use Drupal\Component\Serialization\Yaml;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Unicode;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\ImageToolkit\ImageToolkitBase;
use Drupal\Core\ImageToolkit\ImageToolkitOperationManagerInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\file_mdm\FileMetadataManagerInterface;
use Drupal\imagemagick\Event\ImagemagickExecutionEvent;
use Drupal\imagemagick\ImagemagickExecArguments;
use Drupal\imagemagick\ImagemagickExecManagerInterface;
use Drupal\imagemagick\ImagemagickFormatMapperInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class ImagemagickToolkit extends ImageToolkitBase {
const EXIF_ORIENTATION_NOT_FETCHED = -99;
const FILE_METADATA_PLUGIN_ID = 'imagemagick_identify';
protected $eventDispatcher;
protected $moduleHandler;
protected $formatMapper;
protected $fileMetadataManager;
protected $execManager;
protected $arguments;
protected $width;
protected $height;
protected $frames;
protected $exifOrientation;
protected $colorspace;
protected $profiles = [];
public function __construct(array $configuration, $plugin_id, array $plugin_definition, ImageToolkitOperationManagerInterface $operation_manager, LoggerInterface $logger, ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, ImagemagickFormatMapperInterface $format_mapper, FileMetadataManagerInterface $file_metadata_manager, ImagemagickExecManagerInterface $exec_manager, EventDispatcherInterface $dispatcher = NULL) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $operation_manager, $logger, $config_factory);
$this->moduleHandler = $module_handler;
$this->formatMapper = $format_mapper;
$this->fileMetadataManager = $file_metadata_manager;
$this->execManager = $exec_manager;
$this->arguments = new ImagemagickExecArguments($this->execManager);
$this->eventDispatcher = $dispatcher ?: \Drupal::service('event_dispatcher');
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('image.toolkit.operation.manager'), $container
->get('logger.channel.image'), $container
->get('config.factory'), $container
->get('module_handler'), $container
->get('imagemagick.format_mapper'), $container
->get('file_metadata_manager'), $container
->get('imagemagick.exec_manager'), $container
->get('event_dispatcher'));
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$config = $this->configFactory
->getEditable('imagemagick.settings');
$form['imagemagick'] = [
'#markup' => $this
->t("<a href=':im-url'>ImageMagick</a> and <a href=':gm-url'>GraphicsMagick</a> are stand-alone packages for image manipulation. At least one of them must be installed on the server, and you need to know where it is located. Consult your server administrator or hosting provider for details.", [
':im-url' => 'http://www.imagemagick.org',
':gm-url' => 'http://www.graphicsmagick.org',
]),
];
$form['quality'] = [
'#type' => 'number',
'#title' => $this
->t('Image quality'),
'#size' => 10,
'#min' => 0,
'#max' => 100,
'#maxlength' => 3,
'#default_value' => $config
->get('quality'),
'#field_suffix' => '%',
'#description' => $this
->t('Define the image quality of processed images. Ranges from 0 to 100. Higher values mean better image quality but bigger files.'),
];
$form['imagemagick_settings'] = [
'#type' => 'vertical_tabs',
'#tree' => FALSE,
];
$form['suite'] = [
'#type' => 'details',
'#title' => $this
->t('Graphics package'),
'#group' => 'imagemagick_settings',
];
$options = [
'imagemagick' => $this
->getExecManager()
->getPackageLabel('imagemagick'),
'graphicsmagick' => $this
->getExecManager()
->getPackageLabel('graphicsmagick'),
];
$form['suite']['binaries'] = [
'#type' => 'radios',
'#title' => $this
->t('Suite'),
'#default_value' => $this
->getExecManager()
->getPackage(),
'#options' => $options,
'#required' => TRUE,
'#description' => $this
->t("Select the graphics package to use."),
];
$form['suite']['path_to_binaries'] = [
'#type' => 'textfield',
'#title' => $this
->t('Path to the package executables'),
'#default_value' => $config
->get('path_to_binaries'),
'#required' => FALSE,
'#description' => $this
->t('If needed, the path to the package executables (<kbd>convert</kbd>, <kbd>identify</kbd>, <kbd>gm</kbd>, etc.), <b>including</b> the trailing slash/backslash. For example: <kbd>/usr/bin/</kbd> or <kbd>C:\\Program Files\\ImageMagick-6.3.4-Q16\\</kbd>.'),
];
$status = $this
->getExecManager()
->checkPath($this->configFactory
->get('imagemagick.settings')
->get('path_to_binaries'));
if (empty($status['errors'])) {
$version_info = explode("\n", preg_replace('/\\r/', '', Html::escape($status['output'])));
}
else {
$version_info = $status['errors'];
}
$form['suite']['version'] = [
'#type' => 'details',
'#collapsible' => TRUE,
'#open' => TRUE,
'#title' => $this
->t('Version information'),
'#description' => '<pre>' . implode('<br />', $version_info) . '</pre>',
];
$form['formats'] = [
'#type' => 'details',
'#title' => $this
->t('Image formats'),
'#group' => 'imagemagick_settings',
];
$form['formats']['enabled'] = [
'#type' => 'item',
'#title' => $this
->t('Currently enabled images'),
'#description' => $this
->t("@suite formats: %formats<br />Image file extensions: %extensions", [
'%formats' => implode(', ', $this->formatMapper
->getEnabledFormats()),
'%extensions' => Unicode::strtolower(implode(', ', static::getSupportedExtensions())),
'@suite' => $this
->getExecManager()
->getPackageLabel(),
]),
];
$form['formats']['mapping'] = [
'#type' => 'details',
'#collapsible' => TRUE,
'#open' => TRUE,
'#title' => $this
->t('Enable/disable image formats'),
'#description' => $this
->t("Edit the map below to enable/disable image formats. Enabled image file extensions will be determined by the enabled formats, through their MIME types. More information in the module's README.txt"),
];
$form['formats']['mapping']['image_formats'] = [
'#type' => 'textarea',
'#rows' => 15,
'#default_value' => Yaml::encode($config
->get('image_formats')),
];
if (empty($status['errors'])) {
$this
->arguments()
->add('-list format', ImagemagickExecArguments::PRE_SOURCE);
$output = NULL;
$this
->getExecManager()
->execute('convert', $this
->arguments(), $output);
$this
->arguments()
->reset();
$formats_info = implode('<br />', explode("\n", preg_replace('/\\r/', '', Html::escape($output))));
$form['formats']['list'] = [
'#type' => 'details',
'#collapsible' => TRUE,
'#open' => FALSE,
'#title' => $this
->t('Format list'),
'#description' => $this
->t("Supported image formats returned by executing <kbd>'convert -list format'</kbd>. <b>Note:</b> these are the formats supported by the installed @suite executable, <b>not</b> by the toolkit.<br /><br />", [
'@suite' => $this
->getExecManager()
->getPackageLabel(),
]),
];
$form['formats']['list']['list'] = [
'#markup' => "<pre>" . $formats_info . "</pre>",
];
}
$form['exec'] = [
'#type' => 'details',
'#title' => $this
->t('Execution options'),
'#group' => 'imagemagick_settings',
];
$form['exec']['use_identify'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Use "identify"'),
'#default_value' => $config
->get('use_identify'),
'#description' => $this
->t('<strong>This setting is deprecated and will be removed in the next major release of the Imagemagick module. Leave it enabled to ensure smooth transition.</strong>') . ' ' . $this
->t('Use the <kbd>identify</kbd> command to parse image files to determine image format and dimensions. If not selected, the PHP <kbd>getimagesize</kbd> function will be used, BUT this will limit the image formats supported by the toolkit.'),
];
$configure_link = Link::fromTextAndUrl($this
->t('Configure File Metadata Manager'), Url::fromRoute('file_mdm.settings'));
$form['exec']['metadata_caching'] = [
'#type' => 'item',
'#title' => $this
->t("Cache image metadata"),
'#description' => $this
->t("The File Metadata Manager module allows to cache image metadata. This reduces file I/O and <kbd>shell</kbd> calls. @configure.", [
'@configure' => $configure_link
->toString(),
]),
];
$form['exec']['prepend'] = [
'#type' => 'details',
'#collapsible' => FALSE,
'#open' => TRUE,
'#title' => $this
->t('Prepend arguments'),
'#description' => $this
->t("Use this to add e.g. <kbd><a href=':limit-url'>-limit</a></kbd> or <kbd><a href=':debug-url'>-debug</a></kbd> arguments in front of the others when executing the <kbd>identify</kbd> and <kbd>convert</kbd> commands. Select 'Before source' to execute the arguments before loading the source image.", [
':limit-url' => 'https://www.imagemagick.org/script/command-line-options.php#limit',
':debug-url' => 'https://www.imagemagick.org/script/command-line-options.php#debug',
]),
];
$form['exec']['prepend']['container'] = [
'#type' => 'container',
'#attributes' => [
'class' => [
'container-inline',
],
],
];
$form['exec']['prepend']['container']['prepend'] = [
'#type' => 'textfield',
'#title' => $this
->t('Arguments'),
'#default_value' => $config
->get('prepend'),
'#required' => FALSE,
];
$form['exec']['prepend']['container']['prepend_pre_source'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Before source'),
'#default_value' => $config
->get('prepend_pre_source'),
];
$form['exec']['locale'] = [
'#type' => 'textfield',
'#title' => $this
->t('Locale'),
'#default_value' => $config
->get('locale'),
'#required' => FALSE,
'#description' => $this
->t("The locale to be used to prepare the command passed to executables. The default, <kbd>'en_US.UTF-8'</kbd>, should work in most cases. If that is not available on the server, enter another locale. 'Installed Locales' below provides a list of locales installed on the server."),
];
$locales = $this
->getExecManager()
->getInstalledLocales();
$locales_info = implode('<br />', explode("\n", preg_replace('/\\r/', '', Html::escape($locales))));
$form['exec']['installed_locales'] = [
'#type' => 'details',
'#collapsible' => TRUE,
'#open' => FALSE,
'#title' => $this
->t('Installed locales'),
'#description' => $this
->t("This is the list of all locales available on this server. It is the output of executing <kbd>'locale -a'</kbd> on the operating system."),
];
$form['exec']['installed_locales']['list'] = [
'#markup' => "<pre>" . $locales_info . "</pre>",
];
$form['exec']['log_warnings'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Log warnings'),
'#default_value' => $config
->get('log_warnings'),
'#description' => $this
->t('Log a warning entry in the watchdog when the execution of a command returns with a non-zero code, but no error message.'),
];
$form['exec']['debug'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Display debugging information'),
'#default_value' => $config
->get('debug'),
'#description' => $this
->t('Shows commands and their output to users with the %permission permission.', [
'%permission' => $this
->t('Administer site configuration'),
]),
];
$form['advanced'] = [
'#type' => 'details',
'#title' => $this
->t('Advanced image settings'),
'#group' => 'imagemagick_settings',
];
$form['advanced']['density'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Change image resolution to 72 ppi'),
'#default_value' => $config
->get('advanced.density'),
'#return_value' => 72,
'#description' => $this
->t("Resamples the image <a href=':help-url'>density</a> to a resolution of 72 pixels per inch, the default for web images. Does not affect the pixel size or quality.", [
':help-url' => 'http://www.imagemagick.org/script/command-line-options.php#density',
]),
];
$form['advanced']['colorspace'] = [
'#type' => 'select',
'#title' => $this
->t('Convert colorspace'),
'#default_value' => $config
->get('advanced.colorspace'),
'#options' => [
'RGB' => $this
->t('RGB'),
'sRGB' => $this
->t('sRGB'),
'GRAY' => $this
->t('Gray'),
],
'#empty_value' => 0,
'#empty_option' => $this
->t('- Original -'),
'#description' => $this
->t("Converts processed images to the specified <a href=':help-url'>colorspace</a>. The color profile option overrides this setting.", [
':help-url' => 'http://www.imagemagick.org/script/command-line-options.php#colorspace',
]),
'#states' => [
'enabled' => [
':input[name="imagemagick[advanced][profile]"]' => [
'value' => '',
],
],
],
];
$form['advanced']['profile'] = [
'#type' => 'textfield',
'#title' => $this
->t('Color profile path'),
'#default_value' => $config
->get('advanced.profile'),
'#description' => $this
->t("The path to a <a href=':help-url'>color profile</a> file that all processed images will be converted to. Leave blank to disable. Use a <a href=':color-url'>sRGB profile</a> to correct the display of professional images and photography.", [
':help-url' => 'http://www.imagemagick.org/script/command-line-options.php#profile',
':color-url' => 'http://www.color.org/profiles.html',
]),
];
return $form;
}
public function getExecManager() {
return $this->execManager;
}
public function getPackage($package = NULL) {
@trigger_error('getPackage() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::getPackage() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->getExecManager()
->getPackage($package);
}
public function getPackageLabel($package = NULL) {
@trigger_error('getPackageLabel() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::getPackageLabel() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->getExecManager()
->getPackageLabel($package);
}
public function checkPath($path, $package = NULL) {
@trigger_error('checkPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecManagerInterface::checkPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->getExecManager()
->checkPath($path, $package);
}
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
try {
$image_formats = Yaml::decode($form_state
->getValue([
'imagemagick',
'formats',
'mapping',
'image_formats',
]));
$errors = $this->formatMapper
->validateMap($image_formats);
if ($errors) {
$form_state
->setErrorByName('imagemagick][formats][mapping][image_formats', new FormattableMarkup("<pre>Image format errors:<br/>@errors</pre>", [
'@errors' => Yaml::encode($errors),
]));
}
} catch (InvalidDataTypeException $e) {
$form_state
->setErrorByName('imagemagick][formats][mapping][image_formats', $this
->t("YAML syntax error: @error", [
'@error' => $e
->getMessage(),
]));
}
if ($form_state
->getValue([
'image_toolkit',
]) === 'imagemagick') {
$status = $this
->getExecManager()
->checkPath($form_state
->getValue([
'imagemagick',
'suite',
'path_to_binaries',
]), $form_state
->getValue([
'imagemagick',
'suite',
'binaries',
]));
if ($status['errors']) {
$form_state
->setErrorByName('imagemagick][suite][path_to_binaries', new FormattableMarkup(implode('<br />', $status['errors']), []));
}
}
}
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$config = $this->configFactory
->getEditable('imagemagick.settings');
$config
->set('quality', (int) $form_state
->getValue([
'imagemagick',
'quality',
]))
->set('binaries', (string) $form_state
->getValue([
'imagemagick',
'suite',
'binaries',
]))
->set('path_to_binaries', (string) $form_state
->getValue([
'imagemagick',
'suite',
'path_to_binaries',
]))
->set('use_identify', (bool) $form_state
->getValue([
'imagemagick',
'exec',
'use_identify',
]))
->set('image_formats', Yaml::decode($form_state
->getValue([
'imagemagick',
'formats',
'mapping',
'image_formats',
])))
->set('prepend', (string) $form_state
->getValue([
'imagemagick',
'exec',
'prepend',
'container',
'prepend',
]))
->set('prepend_pre_source', (bool) $form_state
->getValue([
'imagemagick',
'exec',
'prepend',
'container',
'prepend_pre_source',
]))
->set('locale', (string) $form_state
->getValue([
'imagemagick',
'exec',
'locale',
]))
->set('log_warnings', (bool) $form_state
->getValue([
'imagemagick',
'exec',
'log_warnings',
]))
->set('debug', (bool) $form_state
->getValue([
'imagemagick',
'exec',
'debug',
]))
->set('advanced.density', (int) $form_state
->getValue([
'imagemagick',
'advanced',
'density',
]))
->set('advanced.colorspace', (string) $form_state
->getValue([
'imagemagick',
'advanced',
'colorspace',
]))
->set('advanced.profile', (string) $form_state
->getValue([
'imagemagick',
'advanced',
'profile',
]));
$config
->save();
}
public function isValid() {
return (bool) $this
->getMimeType();
}
public function setSource($source) {
parent::setSource($source);
$this
->arguments()
->setSource($source);
return $this;
}
public function getSource() {
return $this
->arguments()
->getSource();
}
public function getSourceLocalPath() {
@trigger_error('getSourceLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ::ensureSourceLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->ensureSourceLocalPath();
}
public function ensureSourceLocalPath() {
if (!$this
->arguments()
->getSourceLocalPath() && $this
->getSource()) {
$this->moduleHandler
->alterDeprecated('Deprecated in 8.x-2.5, will be removed in 8.x-3.0. Use an event subscriber to react on a ImagemagickExecutionEvent::ENSURE_SOURCE_LOCAL_PATH event. See https://www.drupal.org/project/imagemagick/issues/3043136.', 'imagemagick_pre_parse_file', $this->arguments);
$this->eventDispatcher
->dispatch(ImagemagickExecutionEvent::ENSURE_SOURCE_LOCAL_PATH, new ImagemagickExecutionEvent($this->arguments));
}
return $this
->arguments()
->getSourceLocalPath();
}
public function setSourceLocalPath($path) {
@trigger_error('setSourceLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setSourceLocalPath($path);
return $this;
}
public function getSourceFormat() {
@trigger_error('getSourceFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getSourceFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->arguments()
->getSourceFormat();
}
public function setSourceFormat($format) {
@trigger_error('setSourceFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setSourceFormat($format);
return $this;
}
public function setSourceFormatFromExtension($extension) {
@trigger_error('setSourceFormatFromExtension() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setSourceFormatFromExtension() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setSourceFormatFromExtension($extension);
return $this;
}
public function getExifOrientation() {
if ($this->exifOrientation === static::EXIF_ORIENTATION_NOT_FETCHED) {
if ($this
->getSource() !== NULL) {
$file_md = $this->fileMetadataManager
->uri($this
->getSource());
if ($file_md
->getLocalTempPath() === NULL) {
$file_md
->setLocalTempPath($this
->ensureSourceLocalPath());
}
$orientation = $file_md
->getMetadata('exif', 'Orientation');
$this
->setExifOrientation(isset($orientation['value']) ? $orientation['value'] : NULL);
}
else {
$this
->setExifOrientation(NULL);
}
}
return $this->exifOrientation;
}
public function setExifOrientation($exif_orientation) {
$this->exifOrientation = $exif_orientation ? (int) $exif_orientation : NULL;
return $this;
}
public function getColorspace() {
return $this->colorspace;
}
public function setColorspace($colorspace) {
$this->colorspace = Unicode::strtoupper($colorspace);
return $this;
}
public function getProfiles() {
return $this->profiles;
}
public function setProfiles(array $profiles) {
$this->profiles = $profiles;
return $this;
}
public function getFrames() {
return $this->frames;
}
public function setFrames($frames) {
$this->frames = $frames;
return $this;
}
public function getDestination() {
@trigger_error('getDestination() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestination() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->arguments()
->getDestination();
}
public function setDestination($destination) {
@trigger_error('setDestination() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestination() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setDestination($destination);
return $this;
}
public function getDestinationLocalPath() {
@trigger_error('getDestinationLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestinationLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->arguments()
->getDestinationLocalPath();
}
public function setDestinationLocalPath($path) {
@trigger_error('setDestinationLocalPath() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationLocalPath() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setDestinationLocalPath($path);
return $this;
}
public function getDestinationFormat() {
@trigger_error('getDestinationFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::getDestinationFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
return $this
->arguments()
->getDestinationFormat();
}
public function setDestinationFormat($format) {
@trigger_error('setDestinationFormat() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationFormat() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setDestinationFormat($this->formatMapper
->isFormatEnabled($format) ? $format : '');
return $this;
}
public function setDestinationFormatFromExtension($extension) {
@trigger_error('setDestinationFormatFromExtension() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImagemagickExecArguments::setDestinationFormatFromExtension() instead. See https://www.drupal.org/project/imagemagick/issues/2938375.', E_USER_DEPRECATED);
$this
->arguments()
->setDestinationFormatFromExtension($extension);
return $this;
}
public function getWidth() {
return $this->width;
}
public function setWidth($width) {
$this->width = $width;
return $this;
}
public function getHeight() {
return $this->height;
}
public function setHeight($height) {
$this->height = $height;
return $this;
}
public function getMimeType() {
return $this->formatMapper
->getMimeTypeFromFormat($this
->arguments()
->getSourceFormat());
}
public function arguments() {
return $this->arguments;
}
public function getArguments() {
@trigger_error('getArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ::arguments() instead, using ImagemagickExecArguments methods to manipulate arguments. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
return $this
->arguments()
->getArguments();
}
public function getStringForBinary() {
@trigger_error('getStringForBinary() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::toString() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
return $this
->arguments()
->getStringForBinary();
}
public function addArgument($arg) {
@trigger_error('addArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::add() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
$this
->arguments()
->addArgument($arg);
return $this;
}
public function prependArgument($arg) {
@trigger_error('prependArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::add() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
$this
->arguments()
->prependArgument($arg);
return $this;
}
public function findArgument($arg) {
@trigger_error('findArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::find() instead. See https://www.drupal.org/project/imagemagick/issues/2925780.', E_USER_DEPRECATED);
return $this
->arguments()
->findArgument($arg);
}
public function removeArgument($index) {
@trigger_error('removeArgument() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::remove() instead. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
$this
->arguments()
->removeArgument($index);
return $this;
}
public function resetArguments() {
@trigger_error('resetArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::reset() instead. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
$this
->arguments()
->resetArguments();
return $this;
}
public function countArguments() {
@trigger_error('countArguments() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::find() instead, then count the result. See https://www.drupal.org/project/imagemagick/issues/2936615.', E_USER_DEPRECATED);
return $this
->arguments()
->countArguments();
}
public function escapeShellArg($arg) {
@trigger_error('escapeShellArg() is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use ImageMagickExecArguments::escape() instead. See https://www.drupal.org/project/imagemagick/issues/2936680.', E_USER_DEPRECATED);
return $this
->getExecManager()
->escapeShellArg($arg);
}
public function save($destination) {
$this
->arguments()
->setDestination($destination);
if ($ret = $this
->convert()) {
$this->moduleHandler
->alterDeprecated('Deprecated in 8.x-2.5, will be removed in 8.x-3.0. Use an event subscriber to react on a ImagemagickExecutionEvent::POST_SAVE event. See https://www.drupal.org/project/imagemagick/issues/3043136.', 'imagemagick_post_save', $this->arguments);
$this->eventDispatcher
->dispatch(ImagemagickExecutionEvent::POST_SAVE, new ImagemagickExecutionEvent($this->arguments));
$this
->arguments()
->setDestinationLocalPath('');
}
return $ret;
}
public function parseFile() {
if ($this->configFactory
->get('imagemagick.settings')
->get('use_identify')) {
return $this
->parseFileViaIdentify();
}
else {
return $this
->parseFileViaGetImageSize();
}
}
protected function parseFileViaIdentify() {
if (!($file_md = $this->fileMetadataManager
->uri($this
->getSource()))) {
return FALSE;
}
if (!$file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID)) {
return FALSE;
}
if ($source_local_path = $file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'source_local_path')) {
$this
->arguments()
->setSourceLocalPath($source_local_path);
}
$format = $file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'format');
if ($this->formatMapper
->isFormatEnabled($format)) {
$this
->setWidth((int) $file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'width'))
->setHeight((int) $file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'height'))
->setExifOrientation($file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'exif_orientation'))
->setFrames($file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'frames_count'));
$this
->arguments()
->setSourceFormat($format);
if ($this
->getExecManager()
->getPackage() === 'imagemagick') {
$this
->setColorspace($file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'colorspace'));
$this
->setProfiles($file_md
->getMetadata(static::FILE_METADATA_PLUGIN_ID, 'profiles'));
}
return TRUE;
}
return FALSE;
}
protected function parseFileViaGetImageSize() {
@trigger_error('Image file parsing via \'getimagesize\' is deprecated in 8.x-2.3, will be removed in 8.x-3.0. Use parsing via \'identify\' instead. See https://www.drupal.org/project/imagemagick/issues/2938377.', E_USER_DEPRECATED);
$this->moduleHandler
->alter('imagemagick_pre_parse_file', $this->arguments);
if (!($file_md = $this->fileMetadataManager
->uri($this
->getSource()))) {
return FALSE;
}
if (!($data = $file_md
->getMetadata('getimagesize'))) {
return FALSE;
}
$format = $this->formatMapper
->getFormatFromExtension(image_type_to_extension($data[2], FALSE));
if ($format) {
$this
->setWidth($data[0])
->setHeight($data[1])
->setExifOrientation(static::EXIF_ORIENTATION_NOT_FETCHED)
->setFrames(NULL);
$this
->arguments()
->setSourceFormat($format);
return TRUE;
}
return FALSE;
}
protected function convert() {
$config = $this->configFactory
->get('imagemagick.settings');
$this
->ensureSourceLocalPath();
$command = 'convert';
$this->moduleHandler
->alterDeprecated('Deprecated in 8.x-2.5, will be removed in 8.x-3.0. Use an event subscriber to react on a ImagemagickExecutionEvent::PRE_IDENTIFY_EXECUTE or a ImagemagickExecutionEvent::PRE_CONVERT_EXECUTE event. See https://www.drupal.org/project/imagemagick/issues/3043136.', 'imagemagick_arguments', $this->arguments, $command);
$this->eventDispatcher
->dispatch(ImagemagickExecutionEvent::PRE_CONVERT_EXECUTE, new ImagemagickExecutionEvent($this->arguments));
$this->fileMetadataManager
->deleteCachedMetadata($this
->arguments()
->getDestination());
$this->fileMetadataManager
->release($this
->arguments()
->getDestination());
$destination_format = $this
->arguments()
->getDestinationFormat() ?: $this
->arguments()
->getSourceFormat();
if ($this
->arguments()
->getSourceFormat() !== $destination_format && ($this
->getFrames() === NULL || $this
->getFrames() > 1)) {
$this
->arguments()
->setSourceFrames('[0]');
}
return $this
->getExecManager()
->execute($command, $this->arguments) && file_exists($this
->arguments()
->getDestinationLocalPath());
}
public function getRequirements() {
$reported_info = [];
if (stripos(ini_get('disable_functions'), 'proc_open') !== FALSE) {
$severity = REQUIREMENT_ERROR;
$reported_info[] = $this
->t("The <a href=':proc_open_url'>proc_open()</a> PHP function is disabled. It must be enabled for the toolkit to work. Edit the <a href=':disable_functions_url'>disable_functions</a> entry in your php.ini file, or consult your hosting provider.", [
':proc_open_url' => 'http://php.net/manual/en/function.proc-open.php',
':disable_functions_url' => 'http://php.net/manual/en/ini.core.php#ini.disable-functions',
]);
}
else {
$status = $this
->getExecManager()
->checkPath($this->configFactory
->get('imagemagick.settings')
->get('path_to_binaries'));
if (!empty($status['errors'])) {
$severity = REQUIREMENT_ERROR;
foreach ($status['errors'] as $error) {
$reported_info[] = $error;
}
$reported_info[] = $this
->t('Go to the <a href=":url">Image toolkit</a> page to configure the toolkit.', [
':url' => Url::fromRoute('system.image_toolkit_settings')
->toString(),
]);
}
else {
$severity = REQUIREMENT_INFO;
$version_info = explode("\n", preg_replace('/\\r/', '', Html::escape($status['output'])));
$value = array_shift($version_info);
$more_info_available = FALSE;
foreach ($version_info as $key => $item) {
if (stripos($item, 'feature') !== FALSE || $key > 3) {
$more_info_available = TRUE;
break;
}
$reported_info[] = $item;
}
if ($more_info_available) {
$reported_info[] = $this
->t('To display more information, go to the <a href=":url">Image toolkit</a> page, and expand the \'Version information\' section.', [
':url' => Url::fromRoute('system.image_toolkit_settings')
->toString(),
]);
}
$reported_info[] = '';
$reported_info[] = $this
->t("Enabled image file extensions: %extensions", [
'%extensions' => Unicode::strtolower(implode(', ', static::getSupportedExtensions())),
]);
}
}
$requirements = [
'imagemagick' => [
'title' => $this
->t('ImageMagick'),
'value' => isset($value) ? $value : NULL,
'description' => [
'#markup' => implode('<br />', $reported_info),
],
'severity' => $severity,
],
];
if ($this->configFactory
->getEditable('imagemagick.settings')
->get('use_identify') === FALSE) {
$requirements['imagemagick_getimagesize'] = [
'title' => $this
->t('ImageMagick'),
'value' => $this
->t('Use "identify" to parse image files'),
'description' => $this
->t('The toolkit is set to use the <kbd>getimagesize</kbd> PHP function to parse image files. This functionality will be dropped in the next major release of the Imagemagick module. Go to the <a href=":url">Image toolkit</a> settings page, and ensure that the \'Use "identify"\' flag in the \'Execution options\' tab is selected.', [
':url' => Url::fromRoute('system.image_toolkit_settings')
->toString(),
]),
'severity' => REQUIREMENT_WARNING,
];
}
return $requirements;
}
public static function isAvailable() {
return TRUE;
}
public static function getSupportedExtensions() {
return \Drupal::service('imagemagick.format_mapper')
->getEnabledExtensions();
}
}