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