MediaWiki
REL1_20
|
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 }