Вход Регистрация
Файл: vendor/intervention/image/src/Geometry/Rectangle.php
Строк: 604
<?php

declare(strict_types=1);

namespace 
InterventionImageGeometry;

use 
ArrayIterator;
use 
DivisionByZeroError;
use 
InterventionImageAlignment;
use 
InterventionImageExceptionsInvalidArgumentException;
use 
InterventionImageExceptionsRuntimeException;
use 
InterventionImageExceptionsStateException;
use 
InterventionImageGeometryFactoriesRectangleFactory;
use 
InterventionImageGeometryToolsResizer;
use 
InterventionImageInterfacesDrawableFactoryInterface;
use 
InterventionImageInterfacesDrawableInterface;
use 
InterventionImageInterfacesPointInterface;
use 
InterventionImageInterfacesSizeInterface;
use 
Traversable;

class 
Rectangle extends Polygon implements DrawableInterfaceSizeInterface
{
    
/**
     * Create new rectangle.
     *
     * @throws InvalidArgumentException
     */
    
public function __construct(
        
int $width,
        
int $height,
        protected 
PointInterface $pivot = new Point(),
    ) {
        if (
$width 0) {
            throw new 
InvalidArgumentException(
                
'Width of ' $this::class . ' must be greater than or equal to 0',
            );
        }

        if (
$height 0) {
            throw new 
InvalidArgumentException(
                
'Height of ' $this::class . ' must be greater than or equal to 0',
            );
        }

        
parent::__construct([
            new 
Point(00),
            new 
Point($width0),
            new 
Point($width$height * -1),
            new 
Point(0$height * -1),
        ], 
$pivot);
    }

    
/**
     * Create rectangle statically.
     *
     * @deprecated Use InterventionImageSize::class instead.
     *
     * @throws InvalidArgumentException
     */
    
public static function create(int $widthint $heightPointInterface $pivot = new Point()): self
    
{
        return new 
self($width$height$pivot);
    }

    
/**
     * Calculate width of rectangle.
     */
    
public function width(): int
    
{
        return 
abs($this->mostLeftPoint()->x() - $this->mostRightPoint()->x());
    }

    
/**
     * Calculate height of rectangle.
     */
    
public function height(): int
    
{
        return 
abs($this->mostBottomPoint()->y() - $this->mostTopPoint()->y());
    }

    
/**
     * {@inheritdoc}
     *
     * @see SizeInterface::setWidth()
     */
    
public function setWidth(int $width): self
    
{
        
$this[1]->setX($this[0]->x() + $width);
        
$this[2]->setX($this[3]->x() + $width);

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @see SizeInterface::setHeight()
     */
    
public function setHeight(int $height): self
    
{
        
$this[2]->setY($this[1]->y() + $height);
        
$this[3]->setY($this[0]->y() + $height);

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @see DrawableInterface::setPosition()
     */
    
public function setPosition(PointInterface $position): self
    
{
        
$this->pivot $position;

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @see DrawableInterface::position()
     */
    
public function position(): PointInterface
    
{
        return 
$this->pivot;
    }

    
/**
     * {@inheritdoc}
     *
     * @see DrawableInterface::factory()
     *
     * @throws RuntimeException
     */
    
public function factory(): DrawableFactoryInterface
    
{
        
// @phpstan-ignore missingType.checkedException
        
return new RectangleFactory($this);
    }

    
/**
     * {@inheritdoc}
     *
     * @see DrawableInterface::adjust()
     *
     * @throws RuntimeException
     */
    
public function adjust(callable $adjustments): DrawableInterface
    
{
        
$factory $this->factory();
        
$adjustments($factory);

        return 
$factory->drawable();
    }

    
/**
     * Set size of rectangle.
     *
     * @deprecated Use InterventionImageSize::class instead.
     */
    
public function setSize(int $widthint $height): self
    
{
        return 
$this->setWidth($width)->setHeight($height);
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::aspectRatio()
     *
     * @throws RuntimeException
     */
    
public function aspectRatio(): float
    
{
        try {
            return 
$this->width() / $this->height();
        } catch (
DivisionByZeroError) {
            throw new 
RuntimeException('Division by zero');
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::fitsWithin()
     */
    
public function fitsWithin(SizeInterface $size): bool
    
{
        if (
$this->width() > $size->width()) {
            return 
false;
        }

        if (
$this->height() > $size->height()) {
            return 
false;
        }

        return 
true;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::isLandscape()
     */
    
public function isLandscape(): bool
    
{
        return 
$this->width() > $this->height();
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::isPortrait()
     */
    
public function isPortrait(): bool
    
{
        return 
$this->width() < $this->height();
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::setPivot()
     */
    
public function setPivot(PointInterface $pivot): self
    
{
        
$this->pivot $pivot;

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::movePivot()
     *
     * @throws InvalidArgumentException
     */
    
public function movePivot(string|Alignment $alignmentint $x 0int $y 0): self
    
{
        
$alignment Alignment::create($alignment); // normalize alignment

        
$point match ($alignment) {
            
Alignment::TOP => new Point(
                
intval(round($this->width() / 2)) + $x,
                
$y,
            ),
            
Alignment::TOP_RIGHT => new Point(
                
$this->width() - $x,
                
$y,
            ),
            
Alignment::LEFT => new Point(
                
$x,
                
intval(round($this->height() / 2)) + $y,
            ),
            
Alignment::RIGHT => new Point(
                
$this->width() - $x,
                
intval(round($this->height() / 2)) + $y,
            ),
            
Alignment::BOTTOM_LEFT => new Point(
                
$x,
                
$this->height() - $y,
            ),
            
Alignment::BOTTOM => new Point(
                
intval(round($this->width() / 2)) + $x,
                
$this->height() - $y,
            ),
            
Alignment::BOTTOM_RIGHT => new Point(
                
$this->width() - $x,
                
$this->height() - $y,
            ),
            
Alignment::CENTER => new Point(
                
intval(round($this->width() / 2)) + $x,
                
intval(round($this->height() / 2)) + $y,
            ),
            
Alignment::TOP_LEFT => new Point(
                
$x,
                
$y,
            ),
        };

        
$this->pivot->setPosition(...$point);

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::alignPivotTo()
     *
     * @throws InvalidArgumentException
     */
    
public function alignPivotTo(SizeInterface $sizestring|Alignment $alignment): self
    
{
        
$reference = new self($size->width(), $size->height());
        
$reference->movePivot($alignment);

        
$this->movePivot($alignment)->setPivot(
            
$reference->offsetTo($this),
        );

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::offsetTo()
     */
    
public function offsetTo(SizeInterface $rectangle): PointInterface
    
{
        return new 
Point(
            
$this->pivot()->x() - $rectangle->pivot()->x(),
            
$this->pivot()->y() - $rectangle->pivot()->y(),
        );
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::resize()
     *
     * @throws InvalidArgumentException
     */
    
public function resize(?int $width null, ?int $height null): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->resize($this);
        } catch (
InvalidArgumentException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::resizeDown()
     *
     * @throws InvalidArgumentException
     */
    
public function resizeDown(?int $width null, ?int $height null): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->resizeDown($this);
        } catch (
InvalidArgumentException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::scale()
     *
     * @throws InvalidArgumentException
     */
    
public function scale(?int $width null, ?int $height null): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->scale($this);
        } catch (
InvalidArgumentException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::scaleDown()
     *
     * @throws InvalidArgumentException
     */
    
public function scaleDown(?int $width null, ?int $height null): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->scaleDown($this);
        } catch (
InvalidArgumentException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::cover()
     *
     * @throws InvalidArgumentException
     */
    
public function cover(int $widthint $height): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->cover($this);
        } catch (
InvalidArgumentException StateException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::contain()
     *
     * @throws InvalidArgumentException
     */
    
public function contain(int $widthint $height): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->contain($this);
        } catch (
StateException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * {@inheritdoc}
     *
     * @deprecated Use InterventionImageSize::class instead.
     * @see SizeInterface::containDown()
     *
     * @throws InvalidArgumentException
     */
    
public function containDown(int $widthint $height): SizeInterface
    
{
        try {
            return 
$this->resizer($width$height)->containDown($this);
        } catch (
StateException $e) {
            throw new 
InvalidArgumentException(
                
'Invalid target size ' $width 'x' $height,
                
previous$e,
            );
        }
    }

    
/**
     * Create resizer instance with given target size.
     *
     * @deprecated Use InterventionImageSize::class instead.
     *
     * @throws InvalidArgumentException
     */
    
protected function resizer(?int $width null, ?int $height null): Resizer
    
{
        return new 
Resizer($width$height);
    }

    
/**
     * Implement iteration.
     *
     * @return Traversable<mixed>
     */
    
public function getIterator(): Traversable
    
{
        return new 
ArrayIterator([$this->width(), $this->height()]);
    }

    
/**
     * Show debug info for the current rectangle.
     *
     * @return array<string, int|object>
     */
    
public function __debugInfo(): array
    {
        return [
            
'width' => $this->width(),
            
'height' => $this->height(),
            
'pivot' => $this->pivot,
        ];
    }
}
Онлайн: 2
Реклама