http://www.mediawiki.org/wiki/Special:Code/MediaWiki/71783
Revision: 71783
Author: tstarling
Date: 2010-08-27 08:21:26 +0000 (Fri, 27 Aug 2010)
Log Message:
-----------
Merged trunk changes through to r71782.
Modified Paths:
--------------
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.image.php
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.php
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler_body.php
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/PagedTiffHandlerTest.php
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/SOURCES.txt
Added Paths:
-----------
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/380mhz.tiff
Property Changed:
----------------
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/
Property changes on: branches/wmf/1.16wmf4/extensions/PagedTiffHandler
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/wmf-deployment/extensions/PagedTiffHandler:60970
/trunk/extensions/PagedTiffHandler:71187-71620
/trunk/phase3/extensions/PagedTiffHandler:63545-63546,63549,63643,63764,63897-63901,64113,64509,65387,65391,65555,65590,65650,65816
+ /branches/wmf-deployment/extensions/PagedTiffHandler:60970
/trunk/extensions/PagedTiffHandler:71187-71782
/trunk/phase3/extensions/PagedTiffHandler:63545-63546,63549,63643,63764,63897-63901,64113,64509,65387,65391,65555,65590,65650,65816
Modified:
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.image.php
===================================================================
---
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.image.php
2010-08-27 08:10:10 UTC (rev 71782)
+++
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.image.php
2010-08-27 08:21:26 UTC (rev 71783)
@@ -171,16 +171,44 @@
$this->_meta['exif'] = $data;
}
}
+
+ unset( $this->_meta['exif']['Image'] );
+ unset( $this->_meta['exif']['filename'] );
+ unset( $this->_meta['exif']['Base filename'] );
+ unset( $this->_meta['exif']['XMLPacket'] );
+ unset( $this->_meta['exif']['ImageResources'] );
+
+ $this->_meta['TIFF_METADATA_VERSION'] =
TIFF_METADATA_VERSION;
+
wfProfileOut( 'PagedTiffImage::retrieveMetaData' );
}
- unset( $this->_meta['exif']['Image'] );
- unset( $this->_meta['exif']['filename'] );
- unset( $this->_meta['exif']['Base filename'] );
- unset( $this->_meta['exif']['XMLPacket'] );
- unset( $this->_meta['exif']['ImageResources'] );
+
return $this->_meta;
}
+ private function addPageEntry( $entry, &$metadata, &$prevPage ) {
+ if ( !isset( $entry['page'] ) ) {
+ $entry['page'] = $prevPage +1;
+ } else {
+ if ( $prevPage >= $entry['page'] ) {
+ $metadata['errors'][] = "inconsistent page
numbering in TIFF directory";
+ return false;
+ }
+ }
+
+ $prevPage = max($prevPage, $entry['page']);
+
+ if ( !isset( $entry['alpha'] ) ) {
+ $entry['alpha'] = 'false';
+ }
+
+ $entry['pixels'] = $entry['height'] * $entry['width'];
+ $metadata['page_data'][$entry['page']] = $entry;
+
+ $entry = array();
+ return true;
+ }
+
/**
* helper function of retrieveMetaData().
* parses shell return from tiffinfo-command into an array.
@@ -196,6 +224,8 @@
$entry = array();
+ $prevPage = 0;
+
foreach ( $rows as $row ) {
$row = trim( $row );
@@ -216,12 +246,12 @@
if ( $error ) continue;
if ( preg_match('/^TIFF Directory at/', $row) ) {
- if ( isset( $entry['page'] ) ) {
- $entry['pixels'] = $entry['height'] *
$entry['width'];
- $data['page_data'][$entry['page'] +1] =
$entry;
-
- $entry = array();
- $entry['alpha'] = 'false';
+ if ( $entry ) {
+ $ok = $this->addPageEntry($entry,
$data, $prevPage);
+ if ( !$ok ) {
+ $error = true;
+ continue;
+ }
}
} else if ( preg_match('#^(TIFF.*?Directory):
(.*?/.*?): (.*)#i', $row, $m) ) {
$bypass = false;
@@ -244,10 +274,9 @@
if ( $key == 'Page Number' &&
preg_match('/(\d+)-(\d+)/', $value, $m) ) {
$data['page_amount'] = (int)$m[2];
- $entry['page'] = (int)$m[1];
+ $entry['page'] = (int)$m[1] +1;
} else if ( $key == 'Samples/Pixel' ) {
if ($value == '4') $entry['alpha'] =
'true';
- else $entry['alpha'] = 'false';
} else if ( $key == 'Extra samples' ) {
if (preg_match('.*alpha.*', $value))
$entry['alpha'] = 'true';
} else if ( $key == 'Image Width' || $key ==
'PixelXDimension' ) {
@@ -258,17 +287,21 @@
} else {
// strange line
}
+
}
- if ( !empty( $entry['page'] ) ) {
- $entry['pixels'] = $entry['height'] * $entry['width'];
- $data['page_data'][$entry['page'] +1] = $entry;
+ if ( $entry ) {
+ $ok = $this->addPageEntry($entry, $data, $prevPage);
}
if ( !isset( $data['page_amount'] ) ) {
$data['page_amount'] = count( $data['page_data'] );
}
+ if ( ! $data['page_data'] ) {
+ $data['errors'][] = 'no page data found in tiff
directory!';
+ }
+
return $data;
}
Modified: branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.php
===================================================================
--- branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.php
2010-08-27 08:10:10 UTC (rev 71782)
+++ branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler.php
2010-08-27 08:21:26 UTC (rev 71783)
@@ -124,6 +124,8 @@
$wgHooks['UploadVerification'][] = 'PagedTiffHandler::check';
$wgHooks['LanguageGetMagic'][] = 'PagedTiffHandler::addTiffLossyMagicWordLang';
+define('TIFF_METADATA_VERSION', '1.0');
+
//$wgHooks['PagedTiffHandlerRenderCommand'][] =
'PagedTiffHandler::renderCommand';
//$wgHooks['PagedTiffHandlerTiffData'][] = 'PagedTiffImage::tiffData';
//$wgHooks['PagedTiffHandlerExifData'][] = 'PagedTiffImage::exifData';
Modified:
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler_body.php
===================================================================
--- branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler_body.php
2010-08-27 08:10:10 UTC (rev 71782)
+++ branches/wmf/1.16wmf4/extensions/PagedTiffHandler/PagedTiffHandler_body.php
2010-08-27 08:21:26 UTC (rev 71783)
@@ -143,7 +143,17 @@
function validateParam( $name, $value ) {
if ( in_array( $name, array( 'width', 'height', 'page', 'lossy'
) ) ) {
if ( $name == 'lossy' ) {
- return in_array( $value, array( 1, 0, '1', '0',
'true', 'false', 'lossy', 'lossless' ) );
+ # NOTE: make sure to use === for comparison. in
PHP, '' == 0 and 'foo' == 1.
+
+ if ( $value === 1 || $value === 0 || $value ===
'1' || $value === '0' ) {
+ return true;
+ }
+
+ if ( $value === 'true' || $value === 'false' ||
$value === 'lossy' || $value === 'lossless' ) {
+ return true;
+ }
+
+ return false;
} elseif ( $value <= 0 || $value > 65535 ) { //
ImageMagick overflows for values > 65536
return false;
} else {
@@ -482,19 +492,17 @@
* If it returns false, Image will reload the metadata from the file
and update the database
*/
function isMetadataValid( $image, $metadata ) {
-
- if ( !empty( $metadata ) && $metadata != serialize( array() ) )
{
- $meta = unserialize( $metadata );
- if ( isset( $meta['errors'] ) ) {
- // metadata contains an error message, but it's
valid.
- // don't try to re-render until the error is
resolved!
- return true;
- }
- if ( !empty( $meta['page_amount'] ) && !empty(
$meta['page_data'] ) ) {
- return true;
- }
+ if ( is_string( $metadata ) ) $metadata = unserialize(
$metadata );
+
+ if ( !isset( $metadata['TIFF_METADATA_VERSION'] ) ) {
+ return false;
}
- return false;
+
+ if ( $metadata['TIFF_METADATA_VERSION'] !=
TIFF_METADATA_VERSION ) {
+ return false;
+ }
+
+ return true;
}
/**
Modified:
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/PagedTiffHandlerTest.php
===================================================================
---
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/PagedTiffHandlerTest.php
2010-08-27 08:10:10 UTC (rev 71782)
+++
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/PagedTiffHandlerTest.php
2010-08-27 08:21:26 UTC (rev 71783)
@@ -57,6 +57,7 @@
$this->multipage_path = dirname(__FILE__) .
'/testImages/multipage.tiff';
$this->truncated_path = dirname(__FILE__) .
'/testImages/truncated.tiff';
+ $this->mhz_path = dirname(__FILE__) . '/testImages/380mhz.tiff';
$this->test_path = dirname(__FILE__) . '/testImages/test.tif';
if ( !file_exists( $this->truncated_path ) ) {
@@ -71,6 +72,12 @@
return false;
}
+ if ( !file_exists( $this->mhz_path ) ) {
+ echo "{$this->mhz_path} cannot be found.\n";
+ $this->preCheckError = true;
+ return false;
+ }
+
if ( !file_exists( $this->test_path ) ) {
echo "{$this->test_path} cannot be found.\n";
$this->preCheckError = true;
@@ -99,6 +106,17 @@
}
}
+ $mhzTitle = Title::newFromText( 'Image:380mhz.tiff' );
+ $this->mhz_image = wfFindFile( $mhzTitle );
+ if ( !$this->mhz_image && $autoUpload ) {
+ $this->mhz_image = $this->upload( $multipageTitle,
$this->mhz_path );
+
+ if ( !$this->mhz_image ) {
+ $this->preCheckError = true;
+ return false;
+ }
+ }
+
// force re-reading of meta-data
$truncated_tiff = $this->handler->getTiffImage(
$this->truncated_image, $this->truncated_path );
$truncated_tiff->resetMetaData();
@@ -106,6 +124,9 @@
$multipage_tiff = $this->handler->getTiffImage(
$this->multipage_image, $this->multipage_path );
$multipage_tiff->resetMetaData();
+ $mhz_tiff = $this->handler->getTiffImage( $this->mhz_image,
$this->mhz_path );
+ $mhz_tiff->resetMetaData();
+
return !$this->preCheckError;
}
@@ -120,6 +141,34 @@
$this->handler->getMetadata( $this->multipage_image,
$this->multipage_path );
$this->handler->getMetadata( $this->truncated_image,
$this->truncated_path );
+
+ // ---- Metadata handling
+ // getMetadata
+ $metadata = $this->handler->getMetadata( false,
$this->multipage_path );
+ $this->assertTrue( strpos( $metadata, '"page_amount";i:7' ) !==
false );
+ $this->assertTrue( $this->handler->isMetadataValid(
$this->multipage_image, $metadata ) );
+
+ $metadata = $this->handler->getMetadata( false,
$this->mhz_path );
+ $this->assertTrue( strpos( $metadata, '"page_amount";i:1' ) !==
false );
+ $this->assertTrue( $this->handler->isMetadataValid(
$this->mhz_image, $metadata ) );
+
+ // getMetaArray
+ $metaArray = $this->handler->getMetaArray( $this->mhz_image );
+ if ( !empty( $metaArray['errors'] ) ) $this->fail( join('; ',
$metaArray['error']) );
+ $this->assertEquals( $metaArray['page_amount'], 1 );
+
+ $this->assertEquals( strtolower(
$metaArray['page_data'][1]['alpha'] ), 'true' );
+
+ $metaArray = $this->handler->getMetaArray(
$this->multipage_image );
+ if ( !empty( $metaArray['errors'] ) ) $this->fail( join('; ',
$metaArray['error']) );
+ $this->assertEquals( $metaArray['page_amount'], 7 );
+
+ $this->assertEquals( strtolower(
$metaArray['page_data'][1]['alpha'] ), 'false' );
+ $this->assertEquals( strtolower(
$metaArray['page_data'][2]['alpha'] ), 'true' );
+
+ $interp = $metaArray['exif']['PhotometricInterpretation'];
+ $this->assertTrue( $interp == 2 || $interp == 'RGB' ); //RGB
+
// ---- Parameter handling and lossy parameter
// validateParam
$this->assertTrue( $this->handler->validateParam( 'lossy', '0'
) );
@@ -129,19 +178,45 @@
$this->assertTrue( $this->handler->validateParam( 'lossy',
'lossy' ) );
$this->assertTrue( $this->handler->validateParam( 'lossy',
'lossless' ) );
+ $this->assertTrue( $this->handler->validateParam( 'width',
'60000' ) );
+ $this->assertTrue( $this->handler->validateParam( 'height',
'60000' ) );
+ $this->assertTrue( $this->handler->validateParam( 'page',
'60000' ) );
+
+ $this->assertFalse( $this->handler->validateParam( 'lossy', ''
) );
+ $this->assertFalse( $this->handler->validateParam( 'lossy',
'quark' ) );
+
+ $this->assertFalse( $this->handler->validateParam( 'width',
'160000' ) );
+ $this->assertFalse( $this->handler->validateParam( 'height',
'160000' ) );
+ $this->assertFalse( $this->handler->validateParam( 'page',
'160000' ) );
+
+ $this->assertFalse( $this->handler->validateParam( 'width', '0'
) );
+ $this->assertFalse( $this->handler->validateParam( 'height',
'0' ) );
+ $this->assertFalse( $this->handler->validateParam( 'page', '0'
) );
+
+ $this->assertFalse( $this->handler->validateParam( 'width',
'-1' ) );
+ $this->assertFalse( $this->handler->validateParam( 'height',
'-1' ) );
+ $this->assertFalse( $this->handler->validateParam( 'page', '-1'
) );
+
// normaliseParams
// here, boxfit behavior is tested
$params = array( 'width' => '100', 'height' => '100', 'page' =>
'4' );
$this->assertTrue( $this->handler->normaliseParams(
$this->multipage_image, $params ) );
$this->assertEquals( $params['height'], 75 );
+
// lossy and lossless
$params = array('width'=>'100', 'height'=>'100', 'page'=>'1');
$this->handler->normaliseParams($this->multipage_image, $params
);
$this->assertEquals($params['lossy'], 'lossy');
+
$params = array('width'=>'100', 'height'=>'100', 'page'=>'2');
$this->handler->normaliseParams($this->multipage_image, $params
);
$this->assertEquals($params['lossy'], 'lossless');
+ // single page
+ $params = array('width'=>'100', 'height'=>'100', 'page'=>'1');
+ $this->handler->normaliseParams($this->mhz_image, $params );
+ $this->assertEquals($params['lossy'], 'lossless');
+
// makeParamString
$this->assertEquals(
$this->handler->makeParamString(
@@ -185,6 +260,8 @@
// pageCount
$this->assertEquals( $this->handler->pageCount(
$this->multipage_image ), 7 );
+ $this->assertEquals( $this->handler->pageCount(
$this->mhz_image ), 1 );
+
// getPageDimensions
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 0 ), array( 'width' => 1024, 'height' => 768 ) );
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 1 ), array( 'width' => 1024, 'height' => 768 ) );
@@ -194,27 +271,17 @@
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 5 ), array( 'width' => 1024, 'height' => 768 ) );
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 6 ), array( 'width' => 1024, 'height' => 768 ) );
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 7 ), array( 'width' => 768, 'height' => 1024 ) );
+
+ $this->assertEquals( $this->handler->getPageDimensions(
$this->mhz_image, 0 ), array( 'width' => 643, 'height' => 452 ) );
+
// return dimensions of last page if page number is too high
$this->assertEquals( $this->handler->getPageDimensions(
$this->multipage_image, 8 ), array( 'width' => 768, 'height' => 1024 ) );
+ $this->assertEquals( $this->handler->getPageDimensions(
$this->mhz_image, 1 ), array( 'width' => 643, 'height' => 452 ) );
+
// isMultiPage
$this->assertTrue( $this->handler->isMultiPage(
$this->multipage_image ) );
+ $this->assertFalse( $this->handler->isMultiPage(
$this->mhz_image ) );
- // ---- Metadata handling
- // getMetadata
- $metadata = $this->handler->getMetadata( false,
$this->multipage_path );
- $this->assertTrue( strpos( $metadata, '"page_amount";i:7' ) !==
false );
- // isMetadataValid
- $this->assertTrue( $this->handler->isMetadataValid(
$this->multipage_image, $metadata ) );
- // getMetaArray
- $metaArray = $this->handler->getMetaArray(
$this->multipage_image );
-
- $this->assertEquals( $metaArray['page_amount'], 7 );
- //this is also strtolower in PagedTiffHandler::getThumbExtension
- $this->assertEquals( strtolower(
$metaArray['page_data'][1]['alpha'] ), 'false' );
- $this->assertEquals( strtolower(
$metaArray['page_data'][2]['alpha'] ), 'true' );
-
- $interp = $metaArray['exif']['PhotometricInterpretation'];
- $this->assertTrue( $interp == 2 || $interp == 'RGB' ); //RGB
// formatMetadata
$formattedMetadata = $this->handler->formatMetadata(
$this->multipage_image );
Copied:
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/380mhz.tiff
(from rev 71782, trunk/extensions/PagedTiffHandler/tests/testImages/380mhz.tiff)
===================================================================
(Binary files differ)
Modified:
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/SOURCES.txt
===================================================================
---
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/SOURCES.txt
2010-08-27 08:10:10 UTC (rev 71782)
+++
branches/wmf/1.16wmf4/extensions/PagedTiffHandler/tests/testImages/SOURCES.txt
2010-08-27 08:21:26 UTC (rev 71783)
@@ -13,4 +13,8 @@
----------
caspian.tif taken from libtiff test images. Obviously they are under no
license. you can obtain the
- whole set of test images from http://www.libtiff.org/images.html
\ No newline at end of file
+ whole set of test images from http://www.libtiff.org/images.html
+
+380mhz.tiff was taken from Wikimedia Commons, at
http://commons.wikimedia.org/wiki/File:380mhz.tiff
+ It was published by Travis Bland under the Creative Commons
Attribution-Share Alike 3.0
+ Unported license.
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs