diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/class-wp-image-editor.php --- a/wp/wp-includes/class-wp-image-editor.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/class-wp-image-editor.php Tue Dec 15 13:49:49 2020 +0100 @@ -30,7 +30,7 @@ /** * Checks to see if current environment supports the editor chosen. - * Must be overridden in a sub-class. + * Must be overridden in a subclass. * * @since 3.5.0 * @@ -45,7 +45,7 @@ /** * Checks to see if editor supports the mime-type specified. - * Must be overridden in a sub-class. + * Must be overridden in a subclass. * * @since 3.5.0 * @@ -90,9 +90,9 @@ * @since 3.5.0 * @abstract * - * @param int|null $max_w Image width. - * @param int|null $max_h Image height. - * @param bool $crop + * @param int|null $max_w Image width. + * @param int|null $max_h Image height. + * @param bool $crop * @return bool|WP_Error */ abstract public function resize( $max_w, $max_h, $crop = false ); @@ -122,12 +122,12 @@ * @since 3.5.0 * @abstract * - * @param int $src_x The start x position to crop from. - * @param int $src_y The start y position to crop from. - * @param int $src_w The width to crop. - * @param int $src_h The height to crop. - * @param int $dst_w Optional. The destination width. - * @param int $dst_h Optional. The destination height. + * @param int $src_x The start x position to crop from. + * @param int $src_y The start y position to crop from. + * @param int $src_w The width to crop. + * @param int $src_h The height to crop. + * @param int $dst_w Optional. The destination width. + * @param int $dst_h Optional. The destination height. * @param bool $src_abs Optional. If the source crop points are absolute. * @return bool|WP_Error */ @@ -172,7 +172,12 @@ * * @since 3.5.0 * - * @return array {'width'=>int, 'height'=>int} + * @return array { + * Dimensions of the image. + * + * @type int $width The image width. + * @type int $height The image height. + * } */ public function get_size() { return $this->size; @@ -200,7 +205,7 @@ * * @since 4.0.0 * - * @return int $quality Compression Quality. Range: [1,100] + * @return int Compression Quality. Range: [1,100] */ public function get_quality() { if ( ! $this->quality ) { @@ -226,7 +231,7 @@ * Applies only during initial editor instantiation, or when set_quality() is run * manually without the `$quality` argument. * - * set_quality() has priority over the filter. + * The WP_Image_Editor::set_quality() method has priority over the filter. * * @since 3.5.0 * @@ -235,14 +240,14 @@ */ $quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type ); - if ( 'image/jpeg' == $this->mime_type ) { + if ( 'image/jpeg' === $this->mime_type ) { /** * Filters the JPEG compression quality for backward-compatibility. * * Applies only during initial editor instantiation, or when set_quality() is run * manually without the `$quality` argument. * - * set_quality() has priority over the filter. + * The WP_Image_Editor::set_quality() method has priority over the filter. * * The filter is evaluated under two contexts: 'image_resize', and 'edit_image', * (when a JPEG image is saved to file). @@ -290,7 +295,7 @@ protected function get_output_format( $filename = null, $mime_type = null ) { $new_ext = null; - // By default, assume specified type takes priority + // By default, assume specified type takes priority. if ( $mime_type ) { $new_ext = $this->get_extension( $mime_type ); } @@ -305,7 +310,7 @@ } // Check to see if specified mime-type is the same as type implied by - // file extension. If so, prefer extension from file. + // file extension. If so, prefer extension from file. if ( ! $mime_type || ( $file_mime == $mime_type ) ) { $mime_type = $file_mime; $new_ext = $file_ext; @@ -348,7 +353,7 @@ * @return string filename */ public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) { - // $suffix will be appended to the destination filename, just before the extension + // $suffix will be appended to the destination filename, just before the extension. if ( ! $suffix ) { $suffix = $this->get_suffix(); } @@ -359,8 +364,11 @@ $name = wp_basename( $this->file, ".$ext" ); $new_ext = strtolower( $extension ? $extension : $ext ); - if ( ! is_null( $dest_path ) && $_dest_path = realpath( $dest_path ) ) { - $dir = $_dest_path; + if ( ! is_null( $dest_path ) ) { + $_dest_path = realpath( $dest_path ); + if ( $_dest_path ) { + $dir = $_dest_path; + } } return trailingslashit( $dir ) . "{$name}-{$suffix}.{$new_ext}"; @@ -371,7 +379,7 @@ * * @since 3.5.0 * - * @return false|string suffix + * @return string|false suffix */ public function get_suffix() { if ( ! $this->get_size() ) { @@ -382,17 +390,96 @@ } /** + * Check if a JPEG image has EXIF Orientation tag and rotate it if needed. + * + * @since 5.3.0 + * + * @return bool|WP_Error True if the image was rotated. False if not rotated (no EXIF data or the image doesn't need to be rotated). + * WP_Error if error while rotating. + */ + public function maybe_exif_rotate() { + $orientation = null; + + if ( is_callable( 'exif_read_data' ) && 'image/jpeg' === $this->mime_type ) { + $exif_data = @exif_read_data( $this->file ); + + if ( ! empty( $exif_data['Orientation'] ) ) { + $orientation = (int) $exif_data['Orientation']; + } + } + + /** + * Filters the `$orientation` value to correct it before rotating or to prevemnt rotating the image. + * + * @since 5.3.0 + * + * @param int $orientation EXIF Orientation value as retrieved from the image file. + * @param string $file Path to the image file. + */ + $orientation = apply_filters( 'wp_image_maybe_exif_rotate', $orientation, $this->file ); + + if ( ! $orientation || 1 === $orientation ) { + return false; + } + + switch ( $orientation ) { + case 2: + // Flip horizontally. + $result = $this->flip( true, false ); + break; + case 3: + // Rotate 180 degrees or flip horizontally and vertically. + // Flipping seems faster and uses less resources. + $result = $this->flip( true, true ); + break; + case 4: + // Flip vertically. + $result = $this->flip( false, true ); + break; + case 5: + // Rotate 90 degrees counter-clockwise and flip vertically. + $result = $this->rotate( 90 ); + + if ( ! is_wp_error( $result ) ) { + $result = $this->flip( false, true ); + } + + break; + case 6: + // Rotate 90 degrees clockwise (270 counter-clockwise). + $result = $this->rotate( 270 ); + break; + case 7: + // Rotate 90 degrees counter-clockwise and flip horizontally. + $result = $this->rotate( 90 ); + + if ( ! is_wp_error( $result ) ) { + $result = $this->flip( true, false ); + } + + break; + case 8: + // Rotate 90 degrees counter-clockwise. + $result = $this->rotate( 90 ); + break; + } + + return $result; + } + + /** * Either calls editor's save function or handles file as a stream. * * @since 3.5.0 * * @param string|stream $filename - * @param callable $function - * @param array $arguments + * @param callable $function + * @param array $arguments * @return bool */ protected function make_image( $filename, $function, $arguments ) { - if ( $stream = wp_is_stream( $filename ) ) { + $stream = wp_is_stream( $filename ); + if ( $stream ) { ob_start(); } else { // The directory containing the original file may no longer exist when using a replication plugin. @@ -458,7 +545,7 @@ * @return string|false */ protected static function get_extension( $mime_type = null ) { - $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types() ) ); + $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types(), true ) ); if ( empty( $extensions[0] ) ) { return false;