Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/intervention/image/src/Intervention/Image/Size.php
<?php

namespace Intervention\Image;

use
Closure;
use
Intervention\Image\Exception\InvalidArgumentException;

class
Size
{
   
/**
     * Width
     *
     * @var int
     */
   
public $width;

   
/**
     * Height
     *
     * @var int
     */
   
public $height;

   
/**
     * Pivot point
     *
     * @var Point
     */
   
public $pivot;

   
/**
     * Creates a new Size instance
     *
     * @param int   $width
     * @param int   $height
     * @param Point $pivot
     */
   
public function __construct($width = null, $height = null, Point $pivot = null)
    {
       
$this->width = is_numeric($width) ? intval($width) : 1;
       
$this->height = is_numeric($height) ? intval($height) : 1;
       
$this->pivot = $pivot ? $pivot : new Point;
    }

   
/**
     * Set the width and height absolutely
     *
     * @param int $width
     * @param int $height
     */
   
public function set($width, $height)
    {
       
$this->width = $width;
       
$this->height = $height;
    }

   
/**
     * Set current pivot point
     *
     * @param Point $point
     */
   
public function setPivot(Point $point)
    {
       
$this->pivot = $point;
    }

   
/**
     * Get the current width
     *
     * @return int
     */
   
public function getWidth()
    {
        return
$this->width;
    }

   
/**
     * Get the current height
     *
     * @return int
     */
   
public function getHeight()
    {
        return
$this->height;
    }

   
/**
     * Calculate the current aspect ratio
     *
     * @return float
     */
   
public function getRatio()
    {
        return
$this->width / $this->height;
    }

   
/**
     * Resize to desired width and/or height
     *
     * @param  int     $width
     * @param  int     $height
     * @param  Closure $callback
     * @return Size
     */
   
public function resize($width, $height, Closure $callback = null)
    {
        if (
is_null($width) && is_null($height)) {
            throw new
InvalidArgumentException(
               
"Width or height needs to be defined."
           
);
        }

       
// new size with dominant width
       
$dominant_w_size = clone $this;
       
$dominant_w_size->resizeHeight($height, $callback);
       
$dominant_w_size->resizeWidth($width, $callback);

       
// new size with dominant height
       
$dominant_h_size = clone $this;
       
$dominant_h_size->resizeWidth($width, $callback);
       
$dominant_h_size->resizeHeight($height, $callback);

       
// decide which size to use
       
if ($dominant_h_size->fitsInto(new self($width, $height))) {
           
$this->set($dominant_h_size->width, $dominant_h_size->height);
        } else {
           
$this->set($dominant_w_size->width, $dominant_w_size->height);
        }

        return
$this;
    }

   
/**
     * Scale size according to given constraints
     *
     * @param  int     $width
     * @param  Closure $callback
     * @return Size
     */
   
private function resizeWidth($width, Closure $callback = null)
    {
       
$constraint = $this->getConstraint($callback);

        if (
$constraint->isFixed(Constraint::UPSIZE)) {
           
$max_width = $constraint->getSize()->getWidth();
           
$max_height = $constraint->getSize()->getHeight();
        }

        if (
is_numeric($width)) {

            if (
$constraint->isFixed(Constraint::UPSIZE)) {
               
$this->width = ($width > $max_width) ? $max_width : $width;
            } else {
               
$this->width = $width;
            }

            if (
$constraint->isFixed(Constraint::ASPECTRATIO)) {
               
$h = max(1, intval(round($this->width / $constraint->getSize()->getRatio())));

                if (
$constraint->isFixed(Constraint::UPSIZE)) {
                   
$this->height = ($h > $max_height) ? $max_height : $h;
                } else {
                   
$this->height = $h;
                }
            }
        }
    }

   
/**
     * Scale size according to given constraints
     *
     * @param  int     $height
     * @param  Closure $callback
     * @return Size
     */
   
private function resizeHeight($height, Closure $callback = null)
    {
       
$constraint = $this->getConstraint($callback);

        if (
$constraint->isFixed(Constraint::UPSIZE)) {
           
$max_width = $constraint->getSize()->getWidth();
           
$max_height = $constraint->getSize()->getHeight();
        }

        if (
is_numeric($height)) {

            if (
$constraint->isFixed(Constraint::UPSIZE)) {
               
$this->height = ($height > $max_height) ? $max_height : $height;
            } else {
               
$this->height = $height;
            }

            if (
$constraint->isFixed(Constraint::ASPECTRATIO)) {
               
$w = max(1, intval(round($this->height * $constraint->getSize()->getRatio())));

                if (
$constraint->isFixed(Constraint::UPSIZE)) {
                   
$this->width = ($w > $max_width) ? $max_width : $w;
                } else {
                   
$this->width = $w;
                }
            }
        }
    }

   
/**
     * Calculate the relative position to another Size
     * based on the pivot point settings of both sizes.
     *
     * @param  Size   $size
     * @return \Intervention\Image\Point
     */
   
public function relativePosition(Size $size)
    {
       
$x = $this->pivot->x - $size->pivot->x;
       
$y = $this->pivot->y - $size->pivot->y;

        return new
Point($x, $y);
    }

   
/**
     * Resize given Size to best fitting size of current size.
     *
     * @param  Size   $size
     * @return \Intervention\Image\Size
     */
   
public function fit(Size $size, $position = 'center')
    {
       
// create size with auto height
       
$auto_height = clone $size;

       
$auto_height->resize($this->width, null, function ($constraint) {
           
$constraint->aspectRatio();
        });

       
// decide which version to use
       
if ($auto_height->fitsInto($this)) {

           
$size = $auto_height;

        } else {

           
// create size with auto width
           
$auto_width = clone $size;

           
$auto_width->resize(null, $this->height, function ($constraint) {
               
$constraint->aspectRatio();
            });

           
$size = $auto_width;
        }

       
$this->align($position);
       
$size->align($position);
       
$size->setPivot($this->relativePosition($size));

        return
$size;
    }

   
/**
     * Checks if given size fits into current size
     *
     * @param  Size   $size
     * @return boolean
     */
   
public function fitsInto(Size $size)
    {
        return (
$this->width <= $size->width) && ($this->height <= $size->height);
    }

   
/**
     * Aligns current size's pivot point to given position
     * and moves point automatically by offset.
     *
     * @param  string  $position
     * @param  int     $offset_x
     * @param  int     $offset_y
     * @return \Intervention\Image\Size
     */
   
public function align($position, $offset_x = 0, $offset_y = 0)
    {
        switch (
strtolower($position)) {

            case
'top':
            case
'top-center':
            case
'top-middle':
            case
'center-top':
            case
'middle-top':
               
$x = intval($this->width / 2);
               
$y = 0 + $offset_y;
                break;

            case
'top-right':
            case
'right-top':
               
$x = $this->width - $offset_x;
               
$y = 0 + $offset_y;
                break;

            case
'left':
            case
'left-center':
            case
'left-middle':
            case
'center-left':
            case
'middle-left':
               
$x = 0 + $offset_x;
               
$y = intval($this->height / 2);
                break;

            case
'right':
            case
'right-center':
            case
'right-middle':
            case
'center-right':
            case
'middle-right':
               
$x = $this->width - $offset_x;
               
$y = intval($this->height / 2);
                break;

            case
'bottom-left':
            case
'left-bottom':
               
$x = 0 + $offset_x;
               
$y = $this->height - $offset_y;
                break;

            case
'bottom':
            case
'bottom-center':
            case
'bottom-middle':
            case
'center-bottom':
            case
'middle-bottom':
               
$x = intval($this->width / 2);
               
$y = $this->height - $offset_y;
                break;

            case
'bottom-right':
            case
'right-bottom':
               
$x = $this->width - $offset_x;
               
$y = $this->height - $offset_y;
                break;

            case
'center':
            case
'middle':
            case
'center-center':
            case
'middle-middle':
               
$x = intval($this->width / 2);
               
$y = intval($this->height / 2);
                break;

            default:
            case
'top-left':
            case
'left-top':
               
$x = 0 + $offset_x;
               
$y = 0 + $offset_y;
                break;
        }

       
$this->pivot->setPosition($x, $y);

        return
$this;
    }

   
/**
     * Runs constraints on current size
     *
     * @param  Closure $callback
     * @return \Intervention\Image\Constraint
     */
   
private function getConstraint(Closure $callback = null)
    {
       
$constraint = new Constraint(clone $this);

        if (
is_callable($callback)) {
           
$callback($constraint);
        }

        return
$constraint;
    }
}