MediaWiki  master
XCFHandler.php
Go to the documentation of this file.
1 <?php
35 class XCFHandler extends BitmapHandler {
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 {
121  $header = wfUnpack(
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 }
if(PHP_SAPI !='cli-server') if(!isset( $_SERVER['SCRIPT_FILENAME'])) $file
Item class for a filearchive table row.
Definition: router.php:42
getScalerType( $dstPath, $checkDstPath=true)
Must use "im" for XCF.
Definition: XCFHandler.php:207
serialize()
canRender( $file)
Can we render this file?
Definition: XCFHandler.php:219
isMetadataValid( $file, $metadata)
Should we refresh the metadata.
Definition: XCFHandler.php:191
getThumbType( $ext, $mime, $params=null)
Render files as PNG.
Definition: XCFHandler.php:52
Handler for the Gimp&#39;s native file format; getimagesize() doesn&#39;t support these files.
Definition: XCFHandler.php:35
mustRender( $file)
Definition: XCFHandler.php:40
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
unserialize( $serialized)
$header
getImageSize( $image, $filename)
Get width and height from the XCF header.
Definition: XCFHandler.php:63
if(!is_readable( $file)) $ext
Definition: router.php:48
Generic handler for bitmap images.
getMetadata( $file, $filename)
Store the channel type.
Definition: XCFHandler.php:157
wfUnpack( $format, $data, $length=false)
Wrapper around php&#39;s unpack.
static getXCFMetaData( $filename)
Metadata for a given XCF file.
Definition: XCFHandler.php:92