public function encode($data)
{
$hex = '';
// header block
$hex .= $this->_fixSize($this->_asciiToHex($data['signature']), 3);
$hex .= $this->_fixSize($this->_asciiToHex($data['version']), 3);
// logical screen descriptor block
$hex .= $this->_switchEndian($this->_fixSize(dechex($data['canvasWidth']), 4));
$hex .= $this->_switchEndian($this->_fixSize(dechex($data['canvasHeight']), 4));
$packedField = decbin($data['globalColorTableFlag']);
$packedField .= $this->_fixSize(decbin($data['colorResolution']), 3);
$packedField .= decbin($data['sortFlag']);
$packedField .= $this->_fixSize(decbin($data['sizeOfGlobalColorTable']), 3);
$hex .= $this->_fixSize(dechex(bindec($packedField)), 2);
$hex .= $this->_fixSize(dechex($data['backgroundColorIndex']), 2);
$hex .= $this->_fixSize(dechex($data['pixelAspectRatio']), 2);
// global color table optional
if ($data['globalColorTableFlag'] > 0) {
$hex .= $data['globalColorTable'];
}
// app ext optional
if (isset($data['applicationExtension'])) {
foreach ($data['applicationExtension'] as $app) {
$hex .= '21ff0b';
$hex .= $this->_fixSize($this->_asciiToHex($app['appId']), 8);
$hex .= $this->_fixSize($this->_asciiToHex($app['appCode']), 3);
foreach ($app['subBlocks'] as $subBlock) {
$len = $this->_fixSize(dechex(strlen($subBlock) / 2), 2);
$hex .= $len . $subBlock;
}
$hex .= '00';
}
}
foreach ($data['frames'] as $i => $frame) {
// graphics control optional
if (isset($frame['delayTime'])) {
$hex .= '21f904';
$packedField = '000';
// reserved
$packedField .= $this->_fixSize(decbin($frame['disposalMethod']), 3);
$packedField .= decbin($frame['userInputFlag']);
$packedField .= decbin($frame['transparentColorFlag']);
$hex .= $this->_fixSize(dechex(bindec($packedField)), 2);
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['delayTime']), 4));
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['transparentColorIndex']), 2));
$hex .= '00';
}
//image desc
$hex .= '2c';
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['imageLeft']), 4));
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['imageTop']), 4));
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['imageWidth']), 4));
$hex .= $this->_switchEndian($this->_fixSize(dechex($frame['imageHeight']), 4));
$packedField = decbin($frame['localColorTableFlag']);
$packedField .= decbin($frame['interlaceFlag']);
$packedField .= decbin($frame['sortFlag']);
$packedField .= '00';
// reserved
$packedField .= $this->_fixSize(decbin($frame['sizeOfLocalColorTable']), 3);
$hex .= $this->_fixSize(dechex(bindec($packedField)), 2);
// local color table optional
if ($frame['localColorTableFlag'] > 0) {
$hex .= $frame['localColorTable'];
}
$hex .= $frame['imageData'];
}
$hex .= $data['trailer'];
return $hex;
}