function _parsepng($file)
{
//Extract info from a PNG file
$f = fopen($file, 'rb');
if (!$f) {
$this->Error('Can\'t open image file: ' . $file);
}
//Check signature
if ($this->_readstream($f, 8) != chr(137) . 'PNG' . chr(13) . chr(10) . chr(26) . chr(10)) {
$this->Error('Not a PNG file: ' . $file);
}
//Read header chunk
$this->_readstream($f, 4);
if ($this->_readstream($f, 4) != 'IHDR') {
$this->Error('Incorrect PNG file: ' . $file);
}
$w = $this->_readint($f);
$h = $this->_readint($f);
$bpc = ord($this->_readstream($f, 1));
if ($bpc > 8) {
$this->Error('16-bit depth not supported: ' . $file);
}
$ct = ord($this->_readstream($f, 1));
if ($ct == 0) {
$colspace = 'DeviceGray';
} elseif ($ct == 2) {
$colspace = 'DeviceRGB';
} elseif ($ct == 3) {
$colspace = 'Indexed';
} else {
fclose($f);
// the only changes are
return 'alpha';
// made in those 2 lines
}
if (ord($this->_readstream($f, 1)) != 0) {
$this->Error('Unknown compression method: ' . $file);
}
if (ord($this->_readstream($f, 1)) != 0) {
$this->Error('Unknown filter method: ' . $file);
}
if (ord($this->_readstream($f, 1)) != 0) {
$this->Error('Interlacing not supported: ' . $file);
}
$this->_readstream($f, 4);
$parms = '/DecodeParms <</Predictor 15 /Colors ' . ($ct == 2 ? 3 : 1) . ' /BitsPerComponent ' . $bpc . ' /Columns ' . $w . '>>';
//Scan chunks looking for palette, transparency and image data
$pal = '';
$trns = '';
$data = '';
do {
$n = $this->_readint($f);
$type = $this->_readstream($f, 4);
if ($type == 'PLTE') {
//Read palette
$pal = $this->_readstream($f, $n);
$this->_readstream($f, 4);
} elseif ($type == 'tRNS') {
//Read transparency info
$t = $this->_readstream($f, $n);
if ($ct == 0) {
$trns = array(ord(substr($t, 1, 1)));
} elseif ($ct == 2) {
$trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1)));
} else {
$pos = strpos($t, chr(0));
if ($pos !== false) {
$trns = array($pos);
}
}
$this->_readstream($f, 4);
} elseif ($type == 'IDAT') {
//Read image data block
$data .= $this->_readstream($f, $n);
$this->_readstream($f, 4);
} elseif ($type == 'IEND') {
break;
} else {
$this->_readstream($f, $n + 4);
}
} while ($n);
if ($colspace == 'Indexed' && empty($pal)) {
$this->Error('Missing palette in ' . $file);
}
fclose($f);
return array('w' => $w, 'h' => $h, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data);
}