WordPress.org

Make WordPress Core

Ticket #37840: 37840_1.diff

File 37840_1.diff, 8.2 KB (added by enshrined, 2 years ago)

Patch 1

  • src/wp-admin/includes/image.php

     
    9797                                $sizes[$s]['width'] = intval( $_wp_additional_image_sizes[$s]['width'] );
    9898                        } else {
    9999                                // For default sizes set in options
    100                                 $sizes[$s]['width'] = get_option( "{$s}_size_w" );
     100                                $sizes[$s]['width'] = get_option( "{$s}_size_w", $metadata['width'] );
    101101                        }
    102102
    103103                        if ( isset( $_wp_additional_image_sizes[$s]['height'] ) ) {
     
    105105                                $sizes[$s]['height'] = intval( $_wp_additional_image_sizes[$s]['height'] );
    106106                        } else {
    107107                                // For default sizes set in options
    108                                 $sizes[$s]['height'] = get_option( "{$s}_size_h" );
     108                                $sizes[$s]['height'] = get_option( "{$s}_size_h", $metadata['height'] );
    109109                        }
    110110
    111111                        if ( isset( $_wp_additional_image_sizes[$s]['crop'] ) ) {
     
    113113                                $sizes[$s]['crop'] = $_wp_additional_image_sizes[$s]['crop'];
    114114                        } else {
    115115                                // For default sizes set in options
    116                                 $sizes[$s]['crop'] = get_option( "{$s}_crop" );
     116                                $sizes[$s]['crop'] = get_option( "{$s}_crop", false );
    117117                        }
    118118                }
    119119
  • src/wp-includes/class-wp-image-editor-gd.php

     
    113113                        imagesavealpha( $this->image, true );
    114114                }
    115115
     116                $this->filesize = @filesize( $this->file );
    116117                $this->update_size( $size[0], $size[1] );
    117118                $this->mime_type = $size['mime'];
    118119
     
    243244                        $image = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    244245                        $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
    245246
     247                        if ( 'full' == $size ) {
     248                                if ( true === $this->can_save_optimised_full_size() ) {
     249                                        $duplicate = false;
     250                                }
     251                        }
     252
    246253                        if ( ! is_wp_error( $image ) && ! $duplicate ) {
    247254                                $resized = $this->_save( $image );
    248255
  • src/wp-includes/class-wp-image-editor-imagick.php

     
    170170                        return new WP_Error( 'invalid_image', $e->getMessage(), $this->file );
    171171                }
    172172
     173                $this->filesize = @filesize( $this->file );
    173174                $updated_size = $this->update_size();
    174175                if ( is_wp_error( $updated_size ) ) {
    175176                        return $updated_size;
     
    464465                        $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] );
    465466                        $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) );
    466467
     468                        if ( 'full' == $size ) {
     469                                if ( true === $this->can_save_optimised_full_size() ) {
     470                                        $duplicate = false;
     471                                }
     472                        }
     473
    467474                        if ( ! is_wp_error( $resize_result ) && ! $duplicate ) {
    468475                                $resized = $this->_save( $this->image );
    469476
  • src/wp-includes/class-wp-image-editor.php

     
    1818        protected $default_mime_type = 'image/jpeg';
    1919        protected $quality = false;
    2020        protected $default_quality = 82;
     21        protected $filesize = null;
     22        protected $minimum_filesize_difference = false;
     23        protected $default_minimum_filesize_difference = 15;
    2124
    2225        /**
    2326         * Each instance handles a single file.
     
    486489
    487490                return $extensions[0];
    488491        }
     492
     493        /**
     494         * Gets minimum filesize difference for compressed full size images.
     495         *
     496         * @since 4.8.0
     497         * @access public
     498         *
     499         * @return int $minimum_filesize_difference Minimum filesize difference. Range [0-100]
     500         */
     501        public function get_minimum_filesize_difference() {
     502                if ( ! $this->minimum_filesize_difference ) {
     503                        $this->set_minimum_filesize_difference();
     504                }
     505
     506                return $this->minimum_filesize_difference;
     507        }
     508
     509        /**
     510         * Sets minimum filesize difference for compressed full images, 0-100% scale.
     511         *
     512         * @since 4.8.0
     513         * @access public
     514         *
     515         * @param int $minimum_filesize_difference Minimum filesize difference. Range [0-100]
     516         * @return true|WP_Error True if set successfully; WP_Error on failure.
     517         */
     518        public function set_minimum_filesize_difference( $minimum_filesize_difference = null ) {
     519                if ( null === $minimum_filesize_difference ) {
     520                        /**
     521                         * Filters the default minimum filesize difference. Range [0-100]
     522                         *
     523                         * Applies only during initial editor instantiation, or when set_minimum_filesize_difference() is run
     524                         * manually without the `$minimum_filesize_difference` argument.
     525                         *
     526                         * set_minimum_filesize_difference() has priority over the filter.
     527                         *
     528                         * @since 4.8.0
     529                         *
     530                         * @param int $default_minimum_filesize_difference Minimum filesize difference. Range [0-100]
     531                         * @param string $mime_type Image mime type.
     532                         */
     533                        $minimum_filesize_difference = apply_filters( 'wp_image_set_minimum_filesize_difference', $this->default_minimum_filesize_difference, $this->mime_type );
     534
     535
     536                        if ( $minimum_filesize_difference < 0 || $minimum_filesize_difference > 100 ) {
     537                                $minimum_filesize_difference = $this->default_minimum_filesize_difference;
     538                        }
     539                }
     540
     541                if ( ( $minimum_filesize_difference >= 0 ) && ( $minimum_filesize_difference <= 100 ) ) {
     542                        $this->minimum_filesize_difference = $minimum_filesize_difference;
     543                        return true;
     544                } else {
     545                        return new WP_Error( 'invalid_filesize_difference', __('Attempted to set filesize difference outside of the range [1,100].') );
     546                }
     547        }
     548
     549        /**
     550         * Should we save the optimised version of the 'full' image?
     551         *
     552         * If we're optimising the 'full' image size then we need to compare image sizes.
     553         * If the percentage of the image size decrease is greater than our set value
     554         * then we should store the image.
     555         *
     556         * See trac ticket #37840
     557         *
     558         * @since 4.8.0
     559         * @access protected
     560         *
     561         * @return bool True if we should save the image, otherwise False.
     562         */
     563        protected function can_save_optimised_full_size() {
     564                ob_start();
     565                $this->stream();
     566                $optimised_size = ob_get_length();
     567                ob_end_clean();
     568
     569                // Make sure we've got numbers to calculate with
     570                if( is_numeric( $optimised_size ) && is_numeric( $this->filesize ) ) {
     571                        $perc_decrease = ( ( $optimised_size - $this->filesize ) / ( $this->filesize * - 1 ) ) * 100;
     572
     573                        if ( $this->get_minimum_filesize_difference() <= $perc_decrease ) {
     574                                return true;
     575                        }
     576                }
     577
     578                return false;
     579        }
    489580}
    490581
  • src/wp-includes/media.php

     
    785785 */
    786786function get_intermediate_image_sizes() {
    787787        $_wp_additional_image_sizes = wp_get_additional_image_sizes();
    788         $image_sizes = array('thumbnail', 'medium', 'medium_large', 'large'); // Standard sizes
     788        $image_sizes = array('thumbnail', 'medium', 'medium_large', 'large', 'full'); // Standard sizes
    789789        if ( ! empty( $_wp_additional_image_sizes ) ) {
    790790                $image_sizes = array_merge( $image_sizes, array_keys( $_wp_additional_image_sizes ) );
    791791        }
     
    796796         * @since 2.5.0
    797797         *
    798798         * @param array $image_sizes An array of intermediate image sizes. Defaults
    799          *                           are 'thumbnail', 'medium', 'medium_large', 'large'.
     799         *                           are 'thumbnail', 'medium', 'medium_large', 'large', 'full.
    800800         */
    801801        return apply_filters( 'intermediate_image_sizes', $image_sizes );
    802802}
  • .