diff core/lib/Drupal/Core/Image/Image.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children af1871eacc83
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Image/Image.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,222 @@
+<?php
+
+namespace Drupal\Core\Image;
+
+use Drupal\Core\ImageToolkit\ImageToolkitInterface;
+
+/**
+ * Defines an image object to represent an image file.
+ *
+ * @see \Drupal\Core\ImageToolkit\ImageToolkitInterface
+ * @see \Drupal\image\ImageEffectInterface
+ *
+ * @ingroup image
+ */
+class Image implements ImageInterface {
+
+  /**
+   * Path of the image file.
+   *
+   * @var string
+   */
+  protected $source = '';
+
+  /**
+   * An image toolkit object.
+   *
+   * @var \Drupal\Core\ImageToolkit\ImageToolkitInterface
+   */
+  protected $toolkit;
+
+  /**
+   * File size in bytes.
+   *
+   * @var int
+   */
+  protected $fileSize;
+
+  /**
+   * Constructs a new Image object.
+   *
+   * @param \Drupal\Core\ImageToolkit\ImageToolkitInterface $toolkit
+   *   The image toolkit.
+   * @param string|null $source
+   *   (optional) The path to an image file, or NULL to construct the object
+   *   with no image source.
+   */
+  public function __construct(ImageToolkitInterface $toolkit, $source = NULL) {
+    $this->toolkit = $toolkit;
+    if ($source) {
+      $this->source = $source;
+      $this->getToolkit()->setSource($this->source);
+      // Defer image file validity check to the toolkit.
+      if ($this->getToolkit()->parseFile()) {
+        $this->fileSize = filesize($this->source);
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isValid() {
+    return $this->getToolkit()->isValid();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getHeight() {
+    return $this->getToolkit()->getHeight();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getWidth() {
+    return $this->getToolkit()->getWidth();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFileSize() {
+    return $this->fileSize;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getMimeType() {
+    return $this->getToolkit()->getMimeType();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSource() {
+    return $this->source;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getToolkitId() {
+    return $this->getToolkit()->getPluginId();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getToolkit() {
+    return $this->toolkit;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save($destination = NULL) {
+    // Return immediately if the image is not valid.
+    if (!$this->isValid()) {
+      return FALSE;
+    }
+
+    $destination = $destination ?: $this->getSource();
+    if ($return = $this->getToolkit()->save($destination)) {
+      // Clear the cached file size and refresh the image information.
+      clearstatcache(TRUE, $destination);
+      $this->fileSize = filesize($destination);
+      $this->source = $destination;
+
+      // @todo Use File utility when https://www.drupal.org/node/2050759 is in.
+      if ($this->chmod($destination)) {
+        return $return;
+      }
+    }
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function apply($operation, array $arguments = []) {
+    return $this->getToolkit()->apply($operation, $arguments);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function createNew($width, $height, $extension = 'png', $transparent_color = '#ffffff') {
+    return $this->apply('create_new', ['width' => $width, 'height' => $height, 'extension' => $extension, 'transparent_color' => $transparent_color]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function convert($extension) {
+    return $this->apply('convert', ['extension' => $extension]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function crop($x, $y, $width, $height = NULL) {
+    return $this->apply('crop', ['x' => $x, 'y' => $y, 'width' => $width, 'height' => $height]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function desaturate() {
+    return $this->apply('desaturate', []);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function resize($width, $height) {
+    return $this->apply('resize', ['width' => $width, 'height' => $height]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function rotate($degrees, $background = NULL) {
+    return $this->apply('rotate', ['degrees' => $degrees, 'background' => $background]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function scaleAndCrop($width, $height) {
+    return $this->apply('scale_and_crop', ['width' => $width, 'height' => $height]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function scale($width, $height = NULL, $upscale = FALSE) {
+    return $this->apply('scale', ['width' => $width, 'height' => $height, 'upscale' => $upscale]);
+  }
+
+  /**
+   * Provides a wrapper for drupal_chmod() to allow unit testing.
+   *
+   * @param string $uri
+   *   A string containing a URI file, or directory path.
+   * @param int $mode
+   *   Integer value for the permissions. Consult PHP chmod() documentation for
+   *   more information.
+   *
+   * @see drupal_chmod()
+   *
+   * @todo Remove when https://www.drupal.org/node/2050759 is in.
+   *
+   * @return bool
+   *   TRUE for success, FALSE in the event of an error.
+   */
+  protected function chmod($uri, $mode = NULL) {
+    return drupal_chmod($uri, $mode);
+  }
+
+}