Make WordPress Core

Ticket #48202: 48202.diff

File 48202.diff, 1.8 KB (added by azaozz, 5 years ago)
  • src/wp-includes/class-wp-image-editor-gd.php

     
    343343         */
    344344        public function rotate( $angle ) {
    345345                if ( function_exists( 'imagerotate' ) ) {
    346                         $transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 );
    347                         $rotated      = imagerotate( $this->image, $angle, $transparency );
     346                        // Set the background fill color when an image is partially rotated ($angle is not 90, 180, or 270).
     347                        if ( 'image/png' === $this->mime_type || 'image/gif' === $this->mime_type ) {
     348                                $bg_color = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 );
     349                        } else {
     350                                $bg_color = imagecolorallocate( $this->image, 255, 255, 255 );
     351                        }
    348352
     353                        $rotated = imagerotate( $this->image, $angle, $bg_color );
     354
    349355                        if ( is_resource( $rotated ) ) {
    350                                 imagealphablending( $rotated, true );
    351                                 imagesavealpha( $rotated, true );
     356                                // Disable blending mode for images that support transparency.
     357                                // It "blends" the pixels and makes them opaque.
     358                                if ( 'image/png' === $this->mime_type || 'image/gif' === $this->mime_type ) {
     359                                        imagealphablending( $rotated, false );
     360                                }
     361
     362                                // Preserve trnasparency for PNGs.
     363                                if ( 'image/png' === $this->mime_type ) {
     364                                        imagesavealpha( $rotated, true );
     365                                }
     366
    352367                                imagedestroy( $this->image );
    353368                                $this->image = $rotated;
    354369                                $this->update_size();
     370
    355371                                return true;
    356372                        }
    357373                }
     374
    358375                return new WP_Error( 'image_rotate_error', __( 'Image rotate failed.' ), $this->file );
    359376        }
    360377
     
    384401                                return true;
    385402                        }
    386403                }
     404
    387405                return new WP_Error( 'image_flip_error', __( 'Image flip failed.' ), $this->file );
    388406        }
    389407