summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/_inc/lib/class.jetpack-photon-image.php')
-rw-r--r--plugins/jetpack/_inc/lib/class.jetpack-photon-image.php243
1 files changed, 243 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/lib/class.jetpack-photon-image.php b/plugins/jetpack/_inc/lib/class.jetpack-photon-image.php
new file mode 100644
index 00000000..d364f2a3
--- /dev/null
+++ b/plugins/jetpack/_inc/lib/class.jetpack-photon-image.php
@@ -0,0 +1,243 @@
+<?php
+/**
+ * The Image Class.
+ *
+ * @package Jetpack
+ */
+
+/**
+ * Represents a resizable image, exposing properties necessary for properly generating srcset.
+ */
+class Jetpack_Photon_Image {
+
+ /**
+ * @var string $filename Attachment's Filename.
+ */
+ public $filename;
+
+ /**
+ * @var string/WP_Erorr $mime_type Attachment's mime-type, WP_Error on failure when recalculating the dimensions.
+ */
+ private $mime_type;
+
+ /**
+ * @var int $original_width Image original width.
+ */
+ private $original_width;
+
+ /**
+ * @var int $original_width Image original height.
+ */
+ private $original_height;
+
+ /**
+ * @var int $width Current attachment's width.
+ */
+ private $width;
+
+ /**
+ * @var int $height Current attachment's height.
+ */
+ private $height;
+
+ /**
+ * @var bool $is_resized Whether the attachment has been resized yet, or not.
+ */
+ private $is_resized = false;
+
+ /**
+ * Constructs the image object.
+ *
+ * The $data array should provide at least
+ * file : string Image file path
+ * width : int Image width
+ * height : int Image height
+ *
+ * @param array $data Array of attachment metadata, typically value of _wp_attachment_metadata postmeta
+ * @param string|\WP_Error $mime_type Typically value returned from get_post_mime_type function.
+ */
+ public function __construct( $data, $mime_type ) {
+ $this->filename = $data['file'];
+ $this->width = $this->original_width = $data['width'];
+ $this->height = $this->original_height = $data['height'];
+ $this->mime_type = $mime_type;
+ }
+
+ /**
+ * Resizes the image to given size.
+ *
+ * @param array $size_data Array of width, height, and crop properties of a size.
+ *
+ * @return bool|\WP_Error True if resize was successful, WP_Error on failure.
+ */
+ public function resize( $size_data ) {
+
+ $dimensions = $this->image_resize_dimensions( $size_data['width'], $size_data['height'], $size_data['crop'] );
+
+ if ( true === is_wp_error( $dimensions ) ) {
+ return $dimensions; // Returns \WP_Error.
+ }
+
+ if ( true === is_wp_error( $this->mime_type ) ) {
+ return $this->mime_type; // Returns \WP_Error.
+ }
+
+ $this->set_width_height( $dimensions );
+
+ return $this->is_resized = true;
+ }
+
+ /**
+ * Generates size data for usage in $metadata['sizes'];.
+ *
+ * @param array $size_data Array of width, height, and crop properties of a size.
+ *
+ * @return array|\WP_Error An array containing file, width, height, and mime-type keys and it's values. WP_Error on failure.
+ */
+ public function get_size( $size_data ) {
+
+ $is_resized = $this->resize( $size_data );
+
+ if ( true === is_wp_error( $is_resized ) ) {
+ return $is_resized;
+ }
+
+ return array(
+ 'file' => $this->get_filename(),
+ 'width' => $this->get_width(),
+ 'height' => $this->get_height(),
+ 'mime-type' => $this->get_mime_type(),
+ );
+ }
+
+ /**
+ * Resets the image to it's original dimensions.
+ *
+ * @return bool True on successful reset to original dimensions.
+ */
+ public function reset_to_original() {
+ $this->width = $this->original_width;
+ $this->height = $this->original_height;
+ $this->is_resized = false;
+
+ return true;
+ }
+
+ /**
+ * Return the basename filename. If the image has been resized, including
+ * the resizing params for Jetpack CDN.
+ *
+ * @return string Basename of the filename.
+ */
+ public function get_filename() {
+
+ if ( true === $this->is_resized() ) {
+ $filename = $this->get_resized_filename();
+ } else {
+ $filename = $this->filename;
+ }
+
+ return wp_basename( $filename );
+ }
+
+ /**
+ * Returns current image width. Either original, or after resize.
+ *
+ * @return int
+ */
+ public function get_width() {
+ return (int) $this->width;
+ }
+
+ /**
+ * Returns current image height. Either original, or after resize.
+ *
+ * @return int
+ */
+ public function get_height() {
+ return (int) $this->height;
+ }
+
+ /**
+ * Returns image mime type.
+ *
+ * @return string|WP_Error Image's mime type or WP_Error if it was not determined.
+ */
+ public function get_mime_type() {
+ return $this->mime_type;
+ }
+
+ /**
+ * Checks the resize status of the image.
+ *
+ * @return bool If the image has been resized.
+ */
+ public function is_resized() {
+ return ( true === $this->is_resized );
+ }
+
+ /**
+ * Get filename with proper args for the Photon service.
+ *
+ * @return string Filename with query args for Photon service
+ */
+ protected function get_resized_filename() {
+ $query_args = array(
+ 'resize' => join(
+ ',',
+ array(
+ $this->get_width(),
+ $this->get_height(),
+ )
+ ),
+ );
+
+ return add_query_arg( $query_args, $this->filename );
+ }
+
+ /**
+ * Get resize dimensions used for the Jetpack CDN service.
+ *
+ * Converts the list of values returned from `image_resize_dimensions()` to
+ * associative array for the sake of more readable code no relying on index
+ * nor `list`.
+ *
+ * @param int $max_width
+ * @param int $max_height
+ * @param bool|array $crop
+ *
+ * @return array|\WP_Error Array of dimensions matching the parameters to imagecopyresampled. WP_Error on failure.
+ */
+ protected function image_resize_dimensions( $max_width, $max_height, $crop ) {
+ $dimensions = image_resize_dimensions( $this->original_width, $this->original_height, $max_width, $max_height, $crop );
+ if ( ! $dimensions ) {
+ return new WP_Error( 'error_getting_dimensions', __( 'Could not calculate resized image dimensions' ), $this->filename );
+ }
+
+ return array_combine(
+ array(
+ 'dst_x',
+ 'dst_y',
+ 'src_x',
+ 'src_y',
+ 'dst_w',
+ 'dst_h',
+ 'src_w',
+ 'src_h',
+ ),
+ $dimensions
+ );
+ }
+
+ /**
+ * Sets proper width and height from dimensions.
+ *
+ * @param Array $dimensions an array of image dimensions.
+ * @return void
+ */
+ protected function set_width_height( $dimensions ) {
+ $this->width = (int) $dimensions['dst_w'];
+ $this->height = (int) $dimensions['dst_h'];
+ }
+
+}