Esempio n. 1
0
 /**
  * @param FileHandler $fh
  */
 public function decode($fh)
 {
     $fh->seekForward(1);
     $this->screenLeftPos = $fh->readUint16();
     $this->screenTopPos = $fh->readUint16();
     $this->screenWidth = $fh->readUint16();
     $this->screenHeight = $fh->readUint16();
     $packedFields = ord($fh->readByte());
     $this->colorTableFlag = ($packedFields & 0x80) > 0;
     $this->interlaceFlag = ($packedFields & 0x40) > 0;
     $this->sortFlag = ($packedFields & 0x20) > 0;
     $this->reserved = ($packedFields & 0x18) >> 3;
     $ctSize = $packedFields & 0x7;
     $this->colorTableSize = pow(2, $ctSize + 1);
     $this->colorTable = "";
     if ($this->colorTableFlag && $this->colorTableSize > 0) {
         $this->colorTable = $fh->readData($this->colorTableSize * 3);
     }
     // Here comes the image frame:
     $this->lzwMinCodeSize = $fh->readByte();
     // After the Min Code Size, the LZW stream behaves similarly to the data sub-blocks, and the data will be stored in that variable.
     $this->readDataSubBlocks($fh);
     // Spool past the \x00 terminator byte. There *should* only be one.
     while ($fh->peekByte() == "") {
         $fh->seekForward(1);
     }
 }
 /**
  * @param FileHandler $fh
  */
 public function decode($fh)
 {
     $fh->seekForward(1);
     // skip block label.
     $this->blockLength = $fh->readByteUint();
     // 4
     $packedFields = $fh->readByteUint();
     $this->reserved = ($packedFields & 0x70) >> 5;
     $this->disposalMethod = ($packedFields & 0x1c) >> 2;
     $this->userInputFlag = ($packedFields & 0x2) > 0;
     $this->transparentColorFlag = ($packedFields & 0x1) > 0;
     $this->delayTime = $fh->readUint16();
     $this->transparentColorIndex = $fh->readByteUint();
     // Spool past the \x00 terminator byte. There *should* only be one.
     while ($fh->compareByte("")) {
         $fh->readByte();
     }
     // The GCE will always be followed by the Image Descriptor.
     $this->imageDescriptor = new ImageDescriptor($fh);
     $this->imageDescriptor->parentGCE = $this;
 }
 /**
  * @param FileHandler $fh
  *
  * @throws Exception
  */
 public function decode($fh)
 {
     if ($fh->getRemainingBytes() < 7) {
         throw new Exception("Insufficient data. Need 7 bytes, got " . $fh->getRemainingBytes());
     }
     $this->screenWidth = $fh->readUint16();
     $this->screenHeight = $fh->readUint16();
     $packedFields = ord($fh->readByte());
     $this->colorTableFlag = ($packedFields & 0x80) > 0;
     $this->colorResolution = ($packedFields & 0x70) >> 4;
     $this->sortFlag = ($packedFields & 0x8) > 0;
     // For just 8 possible values, the lookup table is faster.
     // the commented lines below is the pedantic way of doing it.
     // $v = ($packedFields & 0x07);
     // $this->colorTableSize = pow(2, $v + 1);
     $this->colorTableSize = $this->ctSizeListRev[$packedFields & 0x7];
     $this->bgColorIndex = $fh->readByteUint();
     $v = $fh->readByteUint();
     $this->pixelAspectRatio = $v > 0 ? ($v + 15) / 64 : 0;
     if ($this->colorTableFlag && $this->colorTableSize > 0) {
         $this->colorTable = $fh->readData($this->colorTableSize * 3);
     }
 }
Esempio n. 4
0
 /**
  * @param FileHandler             $fh
  * @param FileHandler             $fhW
  * @param float                   $ratio
  * @param LogicalScreenDescriptor $lsd
  */
 private static function readExtensionBlock($fh, $fhW, $ratio, $lsd)
 {
     $fh->seekForward(1);
     $blockLabel = $fh->peekByte();
     switch (ord($blockLabel)) {
         case AbstractExtensionBlock::LABEL_APPLICATION:
             $adb = new ApplicationExtension($fh);
             $adb->encodeToFile($fhW);
             break;
         case AbstractExtensionBlock::LABEL_COMMENT:
             $ceb = new CommentExtension($fh);
             $ceb->encodeToFile($fhW);
             break;
         case AbstractExtensionBlock::LABEL_GRAPHICS_CONTROL:
             $gce = new GraphicControlExtension($fh);
             self::resizeGraphicControlExtensionBlock($gce, $ratio, $fhW, $lsd);
             break;
         case AbstractExtensionBlock::LABEL_PLAIN_TEXT:
             $pte = new PlainTextExtension($fh);
             $pte->encodeToFile($fhW);
             break;
         case AbstractExtensionBlock::CONTROL_TRAILER:
             break;
         default:
             $fh->seekForward(1);
             while (!$fh->compareByte("")) {
                 $fh->seekForward(1);
             }
     }
     if ($fh->compareByte("")) {
         $fh->readByte();
     }
 }
Esempio n. 5
0
 /**
  * @param FileHandler             $fh
  * @param int                     $frameCount
  * @param LogicalScreenDescriptor $lsd
  * @param string                  $dstPath
  */
 private static function readExtensionBlock($fh, &$frameCount, $lsd, $dstPath)
 {
     $fh->seekForward(1);
     $blockLabel = $fh->peekByte();
     switch (ord($blockLabel)) {
         case AbstractExtensionBlock::LABEL_APPLICATION:
             new ApplicationExtension($fh);
             break;
         case AbstractExtensionBlock::LABEL_COMMENT:
             new CommentExtension($fh);
             break;
         case AbstractExtensionBlock::LABEL_GRAPHICS_CONTROL:
             $gce = new GraphicControlExtension($fh);
             self::writeFrame($dstPath, $frameCount, $lsd, $gce);
             break;
         case AbstractExtensionBlock::LABEL_PLAIN_TEXT:
             new PlainTextExtension($fh);
             break;
         case AbstractExtensionBlock::CONTROL_TRAILER:
             break;
         default:
             $fh->seekForward(1);
             while (!$fh->compareByte("")) {
                 $fh->seekForward(1);
             }
     }
     if ($fh->compareByte("")) {
         $fh->readByte();
     }
 }
Esempio n. 6
0
 /**
  * @param FileHandler             $fh
  * @param int                     $frameCount
  * @param LogicalScreenDescriptor $lsd
  * @param string                  $dstPath
  */
 public static function dumpExtensionBlock($fh, &$frameCount, $lsd, $dstPath = null)
 {
     $fh->seekForward(1);
     $blockLabel = $fh->peekByte();
     switch (ord($blockLabel)) {
         case AbstractExtensionBlock::LABEL_APPLICATION:
             $adb = new ApplicationExtension($fh);
             self::dumpApplicationExtensionBlock($adb);
             break;
         case AbstractExtensionBlock::LABEL_COMMENT:
             $ceb = new CommentExtension($fh);
             self::dumpCommentExtensionBlock($ceb);
             break;
         case AbstractExtensionBlock::LABEL_GRAPHICS_CONTROL:
             $gce = new GraphicControlExtension($fh);
             $frameCount++;
             self::dumpGraphicControlExtensionBlock($gce, $frameCount, $lsd, $dstPath);
             break;
         case AbstractExtensionBlock::LABEL_PLAIN_TEXT:
             $pte = new PlainTextExtension($fh);
             self::dumpPlainTextExtensionBlock($pte);
             break;
         case AbstractExtensionBlock::CONTROL_TRAILER:
             break;
         default:
             $fh->seekForward(1);
             echo "Unknown Extension block found.......: 0x" . bin2hex($blockLabel) . " (" . ord($blockLabel) . ")\n";
             while (!$fh->compareByte("")) {
                 $fh->seekForward(1);
             }
     }
     if ($fh->compareByte("")) {
         $fh->readByte();
     }
 }