/**
  * Returns the plugin ID for a given toolkit and operation.
  *
  * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit
  *   The toolkit instance.
  * @param string $operation
  *   The operation (e.g. "crop").
  *
  * @return string
  *   The plugin ID.
  *
  * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
  *   When no plugin is available.
  */
 protected function getToolkitOperationPluginId(ImageToolkitInterface $toolkit, $operation)
 {
     $toolkit_id = $toolkit->getPluginId();
     $definitions = $this->getDefinitions();
     $definitions = array_filter($definitions, function ($definition) use($toolkit_id, $operation) {
         return $definition['toolkit'] == $toolkit_id && $definition['operation'] == $operation;
     });
     if (!$definitions) {
         // If this image toolkit plugin is a derivative and returns no operation,
         // try once again with its base plugin.
         $base_toolkit_id = $toolkit->getBaseId();
         if ($toolkit_id != $base_toolkit_id && !empty($base_toolkit_id)) {
             $base_toolkit = $this->toolkitManager->createInstance($base_toolkit_id);
             return $this->getToolkitOperationPluginId($base_toolkit, $operation);
         }
         $message = SafeMarkup::format("No image operation plugin for '@toolkit' toolkit and '@operation' operation.", array('@toolkit' => $toolkit_id, '@operation' => $operation));
         throw new PluginNotFoundException($toolkit_id . '.' . $operation, $message);
     } else {
         // Pickup the first plugin found.
         // @todo In https://www.drupal.org/node/2110591 we'll return here the UI
         //   selected plugin or the first found if missed.
         $definition = reset($definitions);
         return $definition['id'];
     }
 }
 /**
  * Constructs a ImageToolkitForm object.
  *
  * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
  *   The factory for configuration objects.
  * @param \Drupal\Core\ImageToolkit\ImageToolkitManager $manager
  *   The image toolkit plugin manager.
  */
 public function __construct(ConfigFactoryInterface $config_factory, ImageToolkitManager $manager)
 {
     parent::__construct($config_factory);
     foreach ($manager->getAvailableToolkits() as $id => $definition) {
         $this->availableToolkits[$id] = $manager->createInstance($id);
     }
 }
 /**
  * Constructs a new Image object.
  *
  * Normally, the toolkit set as default in the admin UI is used by the
  * factory to create new Image objects. This can be overridden through
  * \Drupal\Core\Image\ImageInterface::setToolkitId() so that any new Image
  * object created will use the new toolkit specified. Finally, a single
  * Image object can be created using a specific toolkit, regardless of the
  * current factory settings, by passing its plugin ID in the $toolkit_id
  * argument.
  *
  * @param string|null $source
  *   (optional) The path to an image file, or NULL to construct the object
  *   with no image source.
  * @param string|null $toolkit_id
  *   (optional) The ID of the image toolkit to use for this image, or NULL
  *   to use the current toolkit.
  *
  * @return \Drupal\Core\Image\ImageInterface
  *   An Image object.
  *
  * @see ImageFactory::setToolkitId()
  */
 public function get($source = NULL, $toolkit_id = NULL)
 {
     $toolkit_id = $toolkit_id ?: $this->toolkitId;
     return new Image($this->toolkitManager->createInstance($toolkit_id), $source);
 }