1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
<?php
/**
* Handler for GIF images.
*
* @file
* @ingroup Media
*/
/**
* Handler for GIF images.
*
* @ingroup Media
*/
class GIFHandler extends BitmapHandler {
const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
function getMetadata( $image, $filename ) {
try {
$parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
} catch( Exception $e ) {
// Broken file?
wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
return self::BROKEN_FILE;
}
return serialize($parsedGIFMetadata);
}
/**
* @param $image File
* @return array|bool
*/
function formatMetadata( $image ) {
$meta = $image->getMetadata();
if ( !$meta ) {
return false;
}
$meta = unserialize( $meta );
if ( !isset( $meta['metadata'] ) || count( $meta['metadata'] ) <= 1 ) {
return false;
}
if ( isset( $meta['metadata']['_MW_GIF_VERSION'] ) ) {
unset( $meta['metadata']['_MW_GIF_VERSION'] );
}
return $this->formatMetadataHelper( $meta['metadata'] );
}
/**
* @param $image File
* @todo unittests
* @return bool
*/
function getImageArea( $image ) {
$ser = $image->getMetadata();
if ( $ser ) {
$metadata = unserialize( $ser );
return $image->getWidth() * $image->getHeight() * $metadata['frameCount'];
} else {
return $image->getWidth() * $image->getHeight();
}
}
/**
* @param $image File
* @return bool
*/
function isAnimatedImage( $image ) {
$ser = $image->getMetadata();
if ( $ser ) {
$metadata = unserialize($ser);
if( $metadata['frameCount'] > 1 ) {
return true;
}
}
return false;
}
function getMetadataType( $image ) {
return 'parsed-gif';
}
function isMetadataValid( $image, $metadata ) {
if ( $metadata === self::BROKEN_FILE ) {
// Do not repetitivly regenerate metadata on broken file.
return self::METADATA_GOOD;
}
wfSuppressWarnings();
$data = unserialize( $metadata );
wfRestoreWarnings();
if ( !$data || !is_array( $data ) ) {
wfDebug(__METHOD__ . ' invalid GIF metadata' );
return self::METADATA_BAD;
}
if ( !isset( $data['metadata']['_MW_GIF_VERSION'] )
|| $data['metadata']['_MW_GIF_VERSION'] != GIFMetadataExtractor::VERSION ) {
wfDebug(__METHOD__ . ' old but compatible GIF metadata' );
return self::METADATA_COMPATIBLE;
}
return self::METADATA_GOOD;
}
/**
* @param $image File
* @return string
*/
function getLongDesc( $image ) {
global $wgLang;
$original = parent::getLongDesc( $image );
wfSuppressWarnings();
$metadata = unserialize($image->getMetadata());
wfRestoreWarnings();
if (!$metadata || $metadata['frameCount'] <= 1) {
return $original;
}
/* Preserve original image info string, but strip the last char ')' so we can add even more */
$info = array();
$info[] = $original;
if ( $metadata['looped'] ) {
$info[] = wfMsgExt( 'file-info-gif-looped', 'parseinline' );
}
if ( $metadata['frameCount'] > 1 ) {
$info[] = wfMsgExt( 'file-info-gif-frames', 'parseinline', $metadata['frameCount'] );
}
if ( $metadata['duration'] ) {
$info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
}
return $wgLang->commaList( $info );
}
}
|