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

declare(strict_types=1);

namespace 
InterventionGifDecoders;

use 
InterventionGifBlocksGraphicControlExtension;
use 
InterventionGifDisposalMethod;
use 
InterventionGifExceptionsDecoderException;
use 
TypeError;
use 
ValueError;

class 
GraphicControlExtensionDecoder extends AbstractPackedBitDecoder
{
    
/**
     * Decode given string to current instance.
     *
     * @throws DecoderException
     */
    
public function decode(): GraphicControlExtension
    
{
        
$result = new GraphicControlExtension();

        
// bytes 1-3
        
$this->nextBytesOrFail(3); // skip marker, label & bytesize

        // byte #4
        
$packedField $this->nextByteOrFail();
        
$result->setDisposalMethod($this->decodeDisposalMethod($packedField));
        
$result->setUserInput($this->decodeUserInput($packedField));
        
$result->setTransparentColorExistance($this->decodeTransparentColorExistance($packedField));

        
// bytes 5-6
        
$result->setDelay($this->decodeDelay($this->nextBytesOrFail(2)));

        
// byte #7
        
$result->setTransparentColorIndex($this->decodeTransparentColorIndex(
            
$this->nextByteOrFail()
        ));

        
// byte #8 (terminator)
        
$this->nextByteOrFail();

        return 
$result;
    }

    
/**
     * Decode disposal method
     *
     * @throws DecoderException
     */
    
protected function decodeDisposalMethod(string $byte): DisposalMethod
    
{
        try {
            return 
DisposalMethod::from(
                
intval(bindec($this->packedBits($byte33)))
            );
        } catch (
TypeError ValueError $e) {
            throw new 
DecoderException(
                
'Failed to decode disposal method in graphic control extension',
                
previous$e,
            );
        }
    }

    
/**
     * Decode user input flag.
     *
     * @throws DecoderException
     */
    
private function decodeUserInput(string $byte): bool
    
{
        return 
$this->hasPackedBit($byte6);
    }

    
/**
     * Decode transparent color existance.
     *
     * @throws DecoderException
     */
    
private function decodeTransparentColorExistance(string $byte): bool
    
{
        return 
$this->hasPackedBit($byte7);
    }

    
/**
     * Decode delay value.
     *
     * @throws DecoderException
     */
    
private function decodeDelay(string $bytes): int
    
{
        
$unpacked unpack('v*'$bytes);

        if (
$unpacked === false || !array_key_exists(1$unpacked)) {
            throw new 
DecoderException('Failed to decode animation delay in graphic control extension');
        }

        return 
$unpacked[1];
    }

    
/**
     * Decode transparent color index.
     *
     * @throws DecoderException
     */
    
private function decodeTransparentColorIndex(string $byte): int
    
{
        
$unpacked unpack('C'$byte);

        if (
$unpacked === false || !array_key_exists(1$unpacked)) {
            throw new 
DecoderException('Failed to decode transparent color index in graphic control extension');
        }

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