MediaWiki  REL1_20
PNG.php
Go to the documentation of this file.
00001 <?php
00029 class PNGHandler extends BitmapHandler {
00030 
00031         const BROKEN_FILE = '0';
00032 
00038         function getMetadata( $image, $filename ) {
00039                 try {
00040                         $metadata = BitmapMetadataHandler::PNG( $filename );
00041                 } catch( Exception $e ) {
00042                         // Broken file?
00043                         wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
00044                         return self::BROKEN_FILE;
00045                 }
00046 
00047                 return serialize($metadata);
00048         }
00049 
00054         function formatMetadata( $image ) {
00055                 $meta = $image->getMetadata();
00056 
00057                 if ( !$meta ) {
00058                         return false;
00059                 }
00060                 $meta = unserialize( $meta );
00061                 if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) {
00062                         return false;
00063                 }
00064 
00065                 if ( isset( $meta['metadata']['_MW_PNG_VERSION'] ) ) {
00066                         unset( $meta['metadata']['_MW_PNG_VERSION'] );
00067                 }
00068                 return $this->formatMetadataHelper( $meta['metadata'] );
00069         }
00070 
00075         function isAnimatedImage( $image ) {
00076                 $ser = $image->getMetadata();
00077                 if ($ser) {
00078                         $metadata = unserialize($ser);
00079                         if( $metadata['frameCount'] > 1 ) return true;
00080                 }
00081                 return false;
00082         }
00088         function canAnimateThumbnail( $image ) {
00089                 return false;
00090         }
00091         
00092         function getMetadataType( $image ) {
00093                 return 'parsed-png';
00094         }
00095         
00096         function isMetadataValid( $image, $metadata ) {
00097 
00098                 if ( $metadata === self::BROKEN_FILE ) {
00099                         // Do not repetitivly regenerate metadata on broken file.
00100                         return self::METADATA_GOOD;
00101                 }
00102 
00103                 wfSuppressWarnings();
00104                 $data = unserialize( $metadata );
00105                 wfRestoreWarnings();
00106 
00107                 if ( !$data || !is_array( $data ) ) {
00108                         wfDebug(__METHOD__ . ' invalid png metadata' );
00109                         return self::METADATA_BAD;
00110                 }
00111 
00112                 if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
00113                         || $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION ) {
00114                         wfDebug(__METHOD__ . ' old but compatible png metadata' );
00115                         return self::METADATA_COMPATIBLE;
00116                 }
00117                 return self::METADATA_GOOD;
00118         }
00119 
00124         function getLongDesc( $image ) {
00125                 global $wgLang;
00126                 $original = parent::getLongDesc( $image );
00127 
00128                 wfSuppressWarnings();
00129                 $metadata = unserialize($image->getMetadata());
00130                 wfRestoreWarnings();
00131 
00132                 if( !$metadata || $metadata['frameCount'] <= 0 )
00133                         return $original;
00134 
00135                 $info = array();
00136                 $info[] = $original;
00137                 
00138                 if ( $metadata['loopCount'] == 0 ) {
00139                         $info[] = wfMessage( 'file-info-png-looped' )->parse();
00140                 } elseif ( $metadata['loopCount'] > 1 ) {
00141                         $info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
00142                 }
00143                 
00144                 if ( $metadata['frameCount'] > 0 ) {
00145                         $info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
00146                 }
00147                 
00148                 if ( $metadata['duration'] ) {
00149                         $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
00150                 }
00151                 
00152                 return $wgLang->commaList( $info );
00153         }
00154 
00155 }