MediaWiki REL1_34
XCFHandler.php
Go to the documentation of this file.
1<?php
40 public function mustRender( $file ) {
41 return true;
42 }
43
52 public function getThumbType( $ext, $mime, $params = null ) {
53 return [ 'png', 'image/png' ];
54 }
55
63 function getImageSize( $image, $filename ) {
64 $header = self::getXCFMetaData( $filename );
65 if ( !$header ) {
66 return false;
67 }
68
69 # Forge a return array containing metadata information just like getimagesize()
70 # See PHP documentation at: https://www.php.net/getimagesize
71 return [
72 0 => $header['width'],
73 1 => $header['height'],
74 2 => null, # IMAGETYPE constant, none exist for XCF.
75 3 => "height=\"{$header['height']}\" width=\"{$header['width']}\"",
76 'mime' => 'image/x-xcf',
77 'channels' => null,
78 'bits' => 8, # Always 8-bits per color
79 ];
80 }
81
92 static function getXCFMetaData( $filename ) {
93 # Decode master structure
94 $f = fopen( $filename, 'rb' );
95 if ( !$f ) {
96 return false;
97 }
98 # The image structure always starts at offset 0 in the XCF file.
99 # So we just read it :-)
100 $binaryHeader = fread( $f, 26 );
101 fclose( $f );
102
120 try {
122 "A9magic" . # A: space padded
123 "/a5version" . # a: zero padded
124 "/Nwidth" . # \
125 "/Nheight" . # N: unsigned long 32bit big endian
126 "/Nbase_type", # /
127 $binaryHeader
128 );
129 } catch ( Exception $mwe ) {
130 return false;
131 }
132
133 # Check values
134 if ( $header['magic'] !== 'gimp xcf' ) {
135 wfDebug( __METHOD__ . " '$filename' has invalid magic signature.\n" );
136
137 return false;
138 }
139 # TODO: we might want to check for sane values of width and height
140
141 wfDebug( __METHOD__ .
142 ": canvas size of '$filename' is {$header['width']} x {$header['height']} px\n" );
143
144 return $header;
145 }
146
157 public function getMetadata( $file, $filename ) {
158 $header = self::getXCFMetaData( $filename );
159 $metadata = [];
160 if ( $header ) {
161 // Try to be consistent with the names used by PNG files.
162 // Unclear from base media type if it has an alpha layer,
163 // so just assume that it does since it "potentially" could.
164 switch ( $header['base_type'] ) {
165 case 0:
166 $metadata['colorType'] = 'truecolour-alpha';
167 break;
168 case 1:
169 $metadata['colorType'] = 'greyscale-alpha';
170 break;
171 case 2:
172 $metadata['colorType'] = 'index-coloured';
173 break;
174 default:
175 $metadata['colorType'] = 'unknown';
176 }
177 } else {
178 // Marker to prevent repeated attempted extraction
179 $metadata['error'] = true;
180 }
181 return serialize( $metadata );
182 }
183
191 public function isMetadataValid( $file, $metadata ) {
192 if ( !$metadata ) {
193 // Old metadata when we just put an empty string in there
194 return self::METADATA_BAD;
195 } else {
196 return self::METADATA_GOOD;
197 }
198 }
199
207 protected function getScalerType( $dstPath, $checkDstPath = true ) {
208 return "im";
209 }
210
219 public function canRender( $file ) {
220 Wikimedia\suppressWarnings();
221 $xcfMeta = unserialize( $file->getMetadata() );
222 Wikimedia\restoreWarnings();
223 if ( isset( $xcfMeta['colorType'] ) && $xcfMeta['colorType'] === 'index-coloured' ) {
224 return false;
225 }
226 return parent::canRender( $file );
227 }
228}
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.
wfUnpack( $format, $data, $length=false)
Wrapper around php's unpack.
Generic handler for bitmap images.
const METADATA_GOOD
Handler for the Gimp's native file format; getimagesize() doesn't support these files.
canRender( $file)
Can we render this file?
getImageSize( $image, $filename)
Get width and height from the XCF header.
static getXCFMetaData( $filename)
Metadata for a given XCF file.
getThumbType( $ext, $mime, $params=null)
Render files as PNG.
isMetadataValid( $file, $metadata)
Should we refresh the metadata.
mustRender( $file)
getScalerType( $dstPath, $checkDstPath=true)
Must use "im" for XCF.
getMetadata( $file, $filename)
Store the channel type.
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition router.php:42
if(!is_readable( $file)) $ext
Definition router.php:48
$header