diff options
Diffstat (limited to 'includes/media/Bitmap.php')
-rw-r--r-- | includes/media/Bitmap.php | 84 |
1 files changed, 66 insertions, 18 deletions
diff --git a/includes/media/Bitmap.php b/includes/media/Bitmap.php index 99ac854b..e2dc68b2 100644 --- a/includes/media/Bitmap.php +++ b/includes/media/Bitmap.php @@ -29,7 +29,7 @@ class BitmapHandler extends ImageHandler { /** * @param $image File - * @param $params array Transform parameters. Entries with the keys 'width' + * @param array $params Transform parameters. Entries with the keys 'width' * and 'height' are the respective screen width and height, while the keys * 'physicalWidth' and 'physicalHeight' indicate the thumbnail dimensions. * @return bool @@ -75,7 +75,6 @@ class BitmapHandler extends ImageHandler { return true; } - /** * Extracts the width/height if the image will be scaled before rotating * @@ -84,8 +83,8 @@ class BitmapHandler extends ImageHandler { * stored as raw landscape with 90-degress rotation, the resulting size * will be wider than it is tall. * - * @param $params array Parameters as returned by normaliseParams - * @param $rotation int The rotation angle that will be applied + * @param array $params Parameters as returned by normaliseParams + * @param int $rotation The rotation angle that will be applied * @return array ($width, $height) array */ public function extractPreRotationDimensions( $params, $rotation ) { @@ -100,7 +99,6 @@ class BitmapHandler extends ImageHandler { return array( $width, $height ); } - /** * Function that returns the number of pixels to be thumbnailed. * Intended for animated GIFs to multiply by the number of frames. @@ -158,7 +156,6 @@ class BitmapHandler extends ImageHandler { return $this->getClientScalingThumbnailImage( $image, $scalerParams ); } - if ( $scaler == 'client' ) { # Client-side image scaling, use the source URL # Using the destination URL in a TRANSFORM_LATER request would be incorrect @@ -264,7 +261,7 @@ class BitmapHandler extends ImageHandler { * client side * * @param $image File File associated with this thumbnail - * @param $scalerParams array Array with scaler params + * @param array $scalerParams Array with scaler params * @return ThumbnailImage * * @todo fixme: no rotation support @@ -281,7 +278,7 @@ class BitmapHandler extends ImageHandler { * Transform an image using ImageMagick * * @param $image File File associated with this thumbnail - * @param $params array Array with scaler params + * @param array $params Array with scaler params * * @return MediaTransformError Error object if error occurred, false (=no error) otherwise */ @@ -341,7 +338,7 @@ class BitmapHandler extends ImageHandler { $rotation = $this->getRotation( $image ); list( $width, $height ) = $this->extractPreRotationDimensions( $params, $rotation ); - $cmd = + $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . // Specify white background color, will be used for transparent images // in Internet Explorer/Windows instead of default black. @@ -380,7 +377,7 @@ class BitmapHandler extends ImageHandler { * Transform an image using the Imagick PHP extension * * @param $image File File associated with this thumbnail - * @param $params array Array with scaler params + * @param array $params Array with scaler params * * @return MediaTransformError Error object if error occurred, false (=no error) otherwise */ @@ -457,7 +454,7 @@ class BitmapHandler extends ImageHandler { * Transform an image using a custom command * * @param $image File File associated with this thumbnail - * @param $params array Array with scaler params + * @param array $params Array with scaler params * * @return MediaTransformError Error object if error occurred, false (=no error) otherwise */ @@ -500,8 +497,8 @@ class BitmapHandler extends ImageHandler { /** * Get a MediaTransformError with error 'thumbnail_error' * - * @param $params array Parameter array as passed to the transform* functions - * @param $errMsg string Error message + * @param array $params Parameter array as passed to the transform* functions + * @param string $errMsg Error message * @return MediaTransformError */ public function getMediaTransformError( $params, $errMsg ) { @@ -513,7 +510,7 @@ class BitmapHandler extends ImageHandler { * Transform an image using the built in GD library * * @param $image File File associated with this thumbnail - * @param $params array Array with scaler params + * @param array $params Array with scaler params * * @return MediaTransformError Error object if error occurred, false (=no error) otherwise */ @@ -622,8 +619,9 @@ class BitmapHandler extends ImageHandler { * in a directory, so we're better off escaping and waiting for the bugfix * to filter down to users. * - * @param $path string The file path - * @param $scene string The scene specification, or false if there is none + * @param string $path The file path + * @param bool|string $scene The scene specification, or false if there is none + * @throws MWException * @return string */ function escapeMagickInput( $path, $scene = false ) { @@ -653,8 +651,9 @@ class BitmapHandler extends ImageHandler { * Armour a string against ImageMagick's GetPathComponent(). This is a * helper function for escapeMagickInput() and escapeMagickOutput(). * - * @param $path string The file path - * @param $scene string The scene specification, or false if there is none + * @param string $path The file path + * @param bool|string $scene The scene specification, or false if there is none + * @throws MWException * @return string */ protected function escapeMagickPath( $path, $scene = false ) { @@ -757,6 +756,55 @@ class BitmapHandler extends ImageHandler { } /** + * @param $file File + * @param array $params Rotate parameters. + * 'rotation' clockwise rotation in degrees, allowed are multiples of 90 + * @since 1.21 + * @return bool + */ + public function rotate( $file, $params ) { + global $wgImageMagickConvertCommand; + + $rotation = ( $params[ 'rotation' ] + $this->getRotation( $file ) ) % 360; + $scene = false; + + $scaler = self::getScalerType( null, false ); + switch ( $scaler ) { + case 'im': + $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . " " . + wfEscapeShellArg( $this->escapeMagickInput( $params[ 'srcPath' ], $scene ) ) . + " -rotate -$rotation " . + wfEscapeShellArg( $this->escapeMagickOutput( $params[ 'dstPath' ] ) ) . " 2>&1"; + wfDebug( __METHOD__ . ": running ImageMagick: $cmd\n" ); + wfProfileIn( 'convert' ); + $retval = 0; + $err = wfShellExec( $cmd, $retval, $env ); + wfProfileOut( 'convert' ); + if ( $retval !== 0 ) { + $this->logErrorForExternalProcess( $retval, $err, $cmd ); + return new MediaTransformError( 'thumbnail_error', 0, 0, $err ); + } + return false; + case 'imext': + $im = new Imagick(); + $im->readImage( $params['srcPath'] ); + if ( !$im->rotateImage( new ImagickPixel( 'white' ), 360 - $rotation ) ) { + return new MediaTransformError( 'thumbnail_error', 0, 0, + "Error rotating $rotation degrees" ); + } + $result = $im->writeImage( $params['dstPath'] ); + if ( !$result ) { + return new MediaTransformError( 'thumbnail_error', 0, 0, + "Unable to write image to {$params['dstPath']}" ); + } + return false; + default: + return new MediaTransformError( 'thumbnail_error', 0, 0, + "$scaler rotation not implemented" ); + } + } + + /** * Rerurns whether the file needs to be rendered. Returns true if the * file requires rotation and we are able to rotate it. * |