Вход Регистрация
Файл: vendor/intervention/gif/src/Decoders/ApplicationExtensionDecoder.php
Строк: 108
<?php

declare(strict_types=1);

namespace 
InterventionGifDecoders;

use 
InterventionGifBlocksApplicationExtension;
use 
InterventionGifBlocksDataSubBlock;
use 
InterventionGifBlocksNetscapeApplicationExtension;
use 
InterventionGifExceptionsDecoderException;
use 
InterventionGifExceptionsInvalidArgumentException;

class 
ApplicationExtensionDecoder extends AbstractDecoder
{
    
/**
     * Decode current source.
     *
     * @throws DecoderException
     */
    
public function decode(): ApplicationExtension
    
{
        
$result = new ApplicationExtension();

        
$this->nextByteOrFail(); // marker
        
$this->nextByteOrFail(); // label
        
$blocksize $this->decodeBlockSize($this->nextByteOrFail());
        
$application $this->nextBytesOrFail($blocksize);

        if (
$application === NetscapeApplicationExtension::IDENTIFIER NetscapeApplicationExtension::AUTH_CODE) {
            
$result = new NetscapeApplicationExtension();

            
// skip length
            
$this->nextByteOrFail();

            try {
                
$result->setBlocks([
                    new 
DataSubBlock($this->nextBytesOrFail(3))
                ]);
            } catch (
InvalidArgumentException $e) {
                throw new 
DecoderException(
                    
'Failed to decode image data sub block of image data',
                    
previous$e
                
);
            }

            
// skip terminator
            
$this->nextByteOrFail();

            return 
$result;
        }

        
$result->setApplication($application);

        
// decode data sub blocks
        
$blocksize $this->decodeBlockSize($this->nextByteOrFail());
        while (
$blocksize 0) {
            try {
                
$result->addBlock(new DataSubBlock($this->nextBytesOrFail($blocksize)));
            } catch (
InvalidArgumentException $e) {
                throw new 
DecoderException(
                    
'Failed to decode image data sub block of image data',
                    
previous$e
                
);
            }

            
$blocksize $this->decodeBlockSize($this->nextByteOrFail());
        }

        return 
$result;
    }

    
/**
     * Decode block size of ApplicationExtension from given byte.
     *
     * @throws DecoderException
     */
    
protected function decodeBlockSize(string $byte): int
    
{
        
$unpacked = @unpack('C'$byte);

        if (
$unpacked === false || !array_key_exists(1$unpacked)) {
            throw new 
DecoderException('Failed to decode block size of application extension');
        }

        return 
intval($unpacked[1]);
    }
}
Онлайн: 0
Реклама