DCX is a simple extension of PCX image format allowing to bundle many PCX images (typically, pages of a document) in one file. It saw some limited use in DOS-era fax software, but was largely superseded with multi-page TIFFs and PDFs since then.
This page hosts a formal specification of .dcx file format using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
<?php
// This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
/**
* DCX is a simple extension of PCX image format allowing to bundle
* many PCX images (typically, pages of a document) in one file. It saw
* some limited use in DOS-era fax software, but was largely
* superseded with multi-page TIFFs and PDFs since then.
*/
namespace {
class PcxDcx extends \Kaitai\Struct\Struct {
public function __construct(\Kaitai\Struct\Stream $_io, \Kaitai\Struct\Struct $_parent = null, \PcxDcx $_root = null) {
parent::__construct($_io, $_parent, $_root);
$this->_read();
}
private function _read() {
$this->_m_magic = $this->_io->readBytes(4);
if (!($this->magic() == "\xB1\x68\xDE\x3A")) {
throw new \Kaitai\Struct\Error\ValidationNotEqualError("\xB1\x68\xDE\x3A", $this->magic(), $this->_io(), "/seq/0");
}
$this->_m_files = [];
$i = 0;
do {
$_ = new \PcxDcx\PcxOffset($this->_io, $this, $this->_root);
$this->_m_files[] = $_;
$i++;
} while (!($_->ofsBody() == 0));
}
protected $_m_magic;
protected $_m_files;
public function magic() { return $this->_m_magic; }
public function files() { return $this->_m_files; }
}
}
namespace PcxDcx {
class PcxOffset extends \Kaitai\Struct\Struct {
public function __construct(\Kaitai\Struct\Stream $_io, \PcxDcx $_parent = null, \PcxDcx $_root = null) {
parent::__construct($_io, $_parent, $_root);
$this->_read();
}
private function _read() {
$this->_m_ofsBody = $this->_io->readU4le();
}
protected $_m_body;
public function body() {
if ($this->_m_body !== null)
return $this->_m_body;
if ($this->ofsBody() != 0) {
$_pos = $this->_io->pos();
$this->_io->seek($this->ofsBody());
$this->_m_body = new \Pcx($this->_io);
$this->_io->seek($_pos);
}
return $this->_m_body;
}
protected $_m_ofsBody;
public function ofsBody() { return $this->_m_ofsBody; }
}
}