From: Gilles Dubuc Date: Tue, 16 May 2017 12:56:26 +0000 (+0200) Subject: Apply EXIF rotation to X-Content-Dimensions X-Git-Tag: 1.31.0-rc.0~3236^2 X-Git-Url: http://git.cyclocoop.org/%22.htmlspecialchars%28%24url_syndic%29.%22?a=commitdiff_plain;h=cf539bb31686590ffaa4b06480dbb15b1f272427;p=lhc%2Fweb%2Fwiklou.git Apply EXIF rotation to X-Content-Dimensions Also adds integration tests for a few formats. Bug: T150741 Change-Id: I686f7ef42457faf5bc688e60e6ce09a8550ca5aa --- diff --git a/includes/media/BitmapMetadataHandler.php b/includes/media/BitmapMetadataHandler.php index 7999bbbf86..c5f9cbbdd5 100644 --- a/includes/media/BitmapMetadataHandler.php +++ b/includes/media/BitmapMetadataHandler.php @@ -160,6 +160,7 @@ class BitmapMetadataHandler { $meta = new self(); $seg = JpegMetadataExtractor::segmentSplitter( $filename ); + if ( isset( $seg['COM'] ) && isset( $seg['COM'][0] ) ) { $meta->addMetadata( [ 'JPEGFileComment' => $seg['COM'] ], 'native' ); } @@ -182,9 +183,8 @@ class BitmapMetadataHandler { $meta->addMetadata( $array, $type ); } } - if ( isset( $seg['byteOrder'] ) ) { - $meta->getExif( $filename, $seg['byteOrder'] ); - } + + $meta->getExif( $filename, isset( $seg['byteOrder'] ) ? $seg['byteOrder'] : 'BE' ); return $meta->getMetadataArray(); } diff --git a/includes/media/ExifBitmap.php b/includes/media/ExifBitmap.php index 2fe4872789..cf4b12ef3b 100644 --- a/includes/media/ExifBitmap.php +++ b/includes/media/ExifBitmap.php @@ -254,8 +254,23 @@ class ExifBitmapHandler extends BitmapHandler { } $dimensionsMetadata = []; - $dimensionsMetadata['width'] = $metadata['Width']; - $dimensionsMetadata['height'] = $metadata['Height']; + + if ( $this->autoRotateEnabled() && isset( $metadata['Orientation'] ) ) { + switch ( $metadata['Orientation'] ) { + case 5: // CCW flipped + case 6: // CCW + case 7: // CW flipped + case 8: // CW + $dimensionsMetadata['width'] = $metadata['Height']; + $dimensionsMetadata['height'] = $metadata['Width']; + break; + } + } + + if ( !isset( $dimensionsMetadata['width'] ) ) { + $dimensionsMetadata['width'] = $metadata['Width']; + $dimensionsMetadata['height'] = $metadata['Height']; + } return parent::getContentHeaders( $dimensionsMetadata ); } diff --git a/tests/phpunit/includes/media/XContentDimensionsTest.php b/tests/phpunit/includes/media/XContentDimensionsTest.php new file mode 100644 index 0000000000..dddcc98829 --- /dev/null +++ b/tests/phpunit/includes/media/XContentDimensionsTest.php @@ -0,0 +1,31 @@ +dataFile( $filename ); + $headers = $file->getContentHeaders(); + $this->assertEquals( true, isset( $headers['X-Content-Dimensions'] ) ); + $this->assertEquals( $headers['X-Content-Dimensions'], $expectedXContentDimensions ); + } + + public static function provideGetContentHeaders() { + return [ + [ '80x60-2layers.xcf', '80x60:1' ], + [ 'animated.gif', '45x30:1' ], + [ 'landscape-plain.jpg', '1024x768:1' ], + [ 'portrait-rotated.jpg', '768x1024:1' ], + [ 'Wikimedia-logo.svg', '1024x1024:1' ], + [ 'webp_animated.webp', '300x225:1' ], + [ 'test.tiff', '20x20:1' ], + ]; + } +}