MediaWiki fundraising/REL1_35
PNGHandler.php
Go to the documentation of this file.
1<?php
30 private const BROKEN_FILE = '0';
31
37 public function getMetadata( $image, $filename ) {
38 try {
39 $metadata = BitmapMetadataHandler::PNG( $filename );
40 } catch ( Exception $e ) {
41 // Broken file?
42 wfDebug( __METHOD__ . ': ' . $e->getMessage() );
43
44 return self::BROKEN_FILE;
45 }
46
47 return serialize( $metadata );
48 }
49
55 public function formatMetadata( $image, $context = false ) {
56 $meta = $this->getCommonMetaArray( $image );
57 if ( count( $meta ) === 0 ) {
58 return false;
59 }
60
61 return $this->formatMetadataHelper( $meta, $context );
62 }
63
70 public function getCommonMetaArray( File $image ) {
71 $meta = $image->getMetadata();
72
73 if ( !$meta ) {
74 return [];
75 }
76 $meta = unserialize( $meta );
77 if ( !isset( $meta['metadata'] ) ) {
78 return [];
79 }
80 unset( $meta['metadata']['_MW_PNG_VERSION'] );
81
82 return $meta['metadata'];
83 }
84
89 public function isAnimatedImage( $image ) {
90 $ser = $image->getMetadata();
91 if ( $ser ) {
92 $metadata = unserialize( $ser );
93 if ( $metadata['frameCount'] > 1 ) {
94 return true;
95 }
96 }
97
98 return false;
99 }
100
106 public function canAnimateThumbnail( $image ) {
107 return false;
108 }
109
110 public function getMetadataType( $image ) {
111 return 'parsed-png';
112 }
113
114 public function isMetadataValid( $image, $metadata ) {
115 if ( $metadata === self::BROKEN_FILE ) {
116 // Do not repetitivly regenerate metadata on broken file.
117 return self::METADATA_GOOD;
118 }
119
120 Wikimedia\suppressWarnings();
121 $data = unserialize( $metadata );
122 Wikimedia\restoreWarnings();
123
124 if ( !$data || !is_array( $data ) ) {
125 wfDebug( __METHOD__ . " invalid png metadata" );
126
127 return self::METADATA_BAD;
128 }
129
130 if ( !isset( $data['metadata']['_MW_PNG_VERSION'] )
131 || $data['metadata']['_MW_PNG_VERSION'] != PNGMetadataExtractor::VERSION
132 ) {
133 wfDebug( __METHOD__ . " old but compatible png metadata" );
134
136 }
137
138 return self::METADATA_GOOD;
139 }
140
145 public function getLongDesc( $image ) {
146 global $wgLang;
147 $original = parent::getLongDesc( $image );
148
149 Wikimedia\suppressWarnings();
150 $metadata = unserialize( $image->getMetadata() );
151 Wikimedia\restoreWarnings();
152
153 if ( !$metadata || $metadata['frameCount'] <= 0 ) {
154 return $original;
155 }
156
157 $info = [];
158 $info[] = $original;
159
160 if ( $metadata['loopCount'] == 0 ) {
161 $info[] = wfMessage( 'file-info-png-looped' )->parse();
162 } elseif ( $metadata['loopCount'] > 1 ) {
163 $info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
164 }
165
166 if ( $metadata['frameCount'] > 0 ) {
167 $info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
168 }
169
170 if ( $metadata['duration'] ) {
171 $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
172 }
173
174 return $wgLang->commaList( $info );
175 }
176
185 public function getLength( $file ) {
186 $serMeta = $file->getMetadata();
187 Wikimedia\suppressWarnings();
188 $metadata = unserialize( $serMeta );
189 Wikimedia\restoreWarnings();
190
191 if ( !$metadata || !isset( $metadata['duration'] ) || !$metadata['duration'] ) {
192 return 0.0;
193 } else {
194 return (float)$metadata['duration'];
195 }
196 }
197
198 // PNGs should be easy to support, but it will need some sharpening applied
199 // and another user test to check if the perceived quality change is noticeable
200 public function supportsBucketing() {
201 return false;
202 }
203}
serialize()
unserialize( $serialized)
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
$wgLang
Definition Setup.php:781
Generic handler for bitmap images.
static PNG( $filename)
Entry point for png At some point in the future this might merge the png various tEXt chunks to that ...
Implements some public methods and some protected utility functions which are required by multiple ch...
Definition File.php:63
getMetadata()
Get handler-specific metadata Overridden by LocalFile, UnregisteredLocalFile STUB Stable to override.
Definition File.php:722
const METADATA_COMPATIBLE
formatMetadataHelper( $metadataArray, $context=false)
sorts the visible/invisible field.
const METADATA_GOOD
Handler for PNG images.
isAnimatedImage( $image)
formatMetadata( $image, $context=false)
const BROKEN_FILE
getCommonMetaArray(File $image)
Get a file type independent array of metadata.
supportsBucketing()
Returns whether or not this handler supports the chained generation of thumbnails according to bucket...
getLength( $file)
Return the duration of an APNG file.
getLongDesc( $image)
getMetadata( $image, $filename)
getMetadataType( $image)
Get a string describing the type of metadata, for display purposes.
canAnimateThumbnail( $image)
We do not support making APNG thumbnails, so always false.
isMetadataValid( $image, $metadata)
Check if the metadata string is valid for this handler.
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition router.php:42