From cf539bb31686590ffaa4b06480dbb15b1f272427 Mon Sep 17 00:00:00 2001 From: Gilles Dubuc Date: Tue, 16 May 2017 14:56:26 +0200 Subject: [PATCH] Apply EXIF rotation to X-Content-Dimensions Also adds integration tests for a few formats. Bug: T150741 Change-Id: I686f7ef42457faf5bc688e60e6ce09a8550ca5aa --- includes/media/BitmapMetadataHandler.php | 6 ++-- includes/media/ExifBitmap.php | 19 ++++++++++-- .../includes/media/XContentDimensionsTest.php | 31 +++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 tests/phpunit/includes/media/XContentDimensionsTest.php 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' ], + ]; + } +} -- 2.20.1