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

Reply via email to