X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2Fmedia%2FGIF.php;h=da8fc6f87b2210d0dd89a05e7b6b25bf4acfc6a4;hb=86a180097bbe38cc314798b48a5a8b8e70566273;hp=dbe5f81309ca7a8bbad4fb23c118337bbe67b82b;hpb=2807a6df29e0601baf603b85e13def8da407948c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/media/GIF.php b/includes/media/GIF.php index dbe5f81309..da8fc6f87b 100644 --- a/includes/media/GIF.php +++ b/includes/media/GIF.php @@ -1,5 +1,22 @@ parsedGIFMetadata) ) { - try { - $image->parsedGIFMetadata = GIFMetadataExtractor::getMetadata( $filename ); - } catch( Exception $e ) { - // Broken file? - wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" ); - return '0'; - } + try { + $parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename ); + } catch( Exception $e ) { + // Broken file? + wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" ); + return self::BROKEN_FILE; } - return serialize($image->parsedGIFMetadata); - + return serialize($parsedGIFMetadata); } - + + /** + * @param $image File + * @return array|bool + */ function formatMetadata( $image ) { - return false; + $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'] ); } - - function getImageArea( $image, $width, $height ) { + + /** + * @param $image File + * @todo unittests + * @return bool + */ + function getImageArea( $image ) { $ser = $image->getMetadata(); - if ($ser) { - $metadata = unserialize($ser); - return $width * $height * $metadata['frameCount']; + if ( $ser ) { + $metadata = unserialize( $ser ); + return $image->getWidth() * $image->getHeight() * $metadata['frameCount']; } else { - return $width * $height; + 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; } - + + /** + * We cannot animate thumbnails that are bigger than a particular size + * @param File $file + * @return bool + */ + function canAnimateThumbnail( $file ) { + global $wgMaxAnimatedGifArea; + $answer = $this->getImageArea( $file ) <= $wgMaxAnimatedGifArea; + return $answer; + } + 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 $wgUser, $wgLang; - $sk = $wgUser->getSkin(); - - $metadata = @unserialize($image->getMetadata()); - - if (!$metadata) return parent::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[] = $image->getMimeType(); - $info[] = $sk->formatSize( $image->getSize() ); - - 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[] = $original; + + if ( $metadata['looped'] ) { + $info[] = wfMessage( 'file-info-gif-looped' )->parse(); + } + + if ( $metadata['frameCount'] > 1 ) { + $info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse(); + } + + if ( $metadata['duration'] ) { $info[] = $wgLang->formatTimePeriod( $metadata['duration'] ); - - $infoString = $wgLang->commaList( $info ); - - return "($infoString)"; + } + + return $wgLang->commaList( $info ); } }