diff options
Diffstat (limited to 'plugins/jetpack/_inc/lib/class.jetpack-photon-image.php')
-rw-r--r-- | plugins/jetpack/_inc/lib/class.jetpack-photon-image.php | 243 |
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']; + } + +} |