Your IP : 216.73.216.85


Current Path : /home/smartconb/www/armencom33/libraries/sobi/ThirdParty/Grafika/
Upload File :
Current File : /home/smartconb/www/armencom33/libraries/sobi/ThirdParty/Grafika/Grafika.php

<?php

/* @modified 16 September 2020 by Sigrid Suski */

namespace Grafika;

use Grafika\Gd\DrawingObject\CubicBezier as GdCubicBezier;
use Grafika\Gd\DrawingObject\Ellipse as GdEllipse;
use Grafika\Gd\DrawingObject\Line as GdLine;
use Grafika\Gd\DrawingObject\Polygon as GdPolygon;
use Grafika\Gd\DrawingObject\QuadraticBezier as GdQuadraticBezier;
use Grafika\Gd\DrawingObject\Rectangle as GdRectangle;
use Grafika\Gd\Editor as GdEditor;
use Grafika\Gd\Filter\Dither as GdDither;
use Grafika\Gd\Filter\Blur as GdBlur;
use Grafika\Gd\Filter\Brightness as GdBrightness;
use Grafika\Gd\Filter\Colorize as GdColorize;
use Grafika\Gd\Filter\Contrast as GdContrast;
use Grafika\Gd\Filter\Gamma as GdGamma;
use Grafika\Gd\Filter\Grayscale as GdGrayscale;
use Grafika\Gd\Filter\Invert as GdInvert;
use Grafika\Gd\Filter\Pixelate as GdPixelate;
use Grafika\Gd\Filter\Sharpen as GdSharpen;
use Grafika\Gd\Filter\Sobel as GdSobel;
use Grafika\Gd\Image as GdImage;
use Grafika\Imagick\DrawingObject\CubicBezier as ImagickCubicBezier;
use Grafika\Imagick\DrawingObject\Ellipse as ImagickEllipse;
use Grafika\Imagick\DrawingObject\Line as ImagickLine;
use Grafika\Imagick\DrawingObject\Polygon as ImagickPolygon;
use Grafika\Imagick\DrawingObject\QuadraticBezier as ImagickQuadraticBezier;
use Grafika\Imagick\DrawingObject\Rectangle as ImagickRectangle;
use Grafika\Imagick\Editor as ImagickEditor;
use Grafika\Imagick\Filter\Blur as ImagickBlur;
use Grafika\Imagick\Filter\Brightness as ImagickBrightness;
use Grafika\Imagick\Filter\Colorize as ImagickColorize;
use Grafika\Imagick\Filter\Contrast as ImagickContrast;
use Grafika\Imagick\Filter\Gamma as ImagickGamma;
use Grafika\Imagick\Filter\Dither as ImagickDither;
use Grafika\Imagick\Filter\Grayscale as ImagickGrayscale;
use Grafika\Imagick\Filter\Invert as ImagickInvert;
use Grafika\Imagick\Filter\Pixelate as ImagickPixelate;
use Grafika\Imagick\Filter\Sharpen as ImagickSharpen;
use Grafika\Imagick\Filter\Sobel as ImagickSobel;
use Grafika\Imagick\Image as ImagickImage;

/**
 * Contains factory methods for detecting editors, creating editors and images.
 * @package Grafika
 */
class Grafika
{
	/**
	 * Grafika root directory
	 */
	const DIR = __DIR__;

	/**
	 * @var array $editorList List of editors to evaluate.
	 */
	private static $editorList = [ 'Imagick', 'Gd' ];

	/**
	 * Returns path to directory containing font
	 * s used in text operations.
	 *
	 * @return string
	 */
	public static function fontsDir()
	{
		$ds = DIRECTORY_SEPARATOR;

		return realpath( self::DIR . $ds . '..' . $ds . '..' ) . $ds . 'fonts';
	}

	/**
	 * Changes the editor list order of evaluation globally.
	 *
	 * @param array $editorList
	 *
	 * @throws \Exception
	 */
	public static function setEditorList( $editorList )
	{
		if ( !is_array( $editorList ) ) {
			throw new \Exception( '$editorList must be an array.' );
		}
		self::$editorList = $editorList;
	}

	/**
	 * Detects and returns the name of the first supported editor with WEBP support which can either be "Imagick" or "Gd".
	 * If none has WEBP support, the first supported editor is used (Imagick over Gd).
	 *
	 * @param array $editorList Array of editor list names. Use this to change the order of evaluation for editors for this function call only.
	 * Default order of evaluation is Imagick then GD.
	 *
	 * @param null $editorList
	 *
	 * @return mixed|string
	 * @throws \Exception
	 */
	public static function detectAvailableEditor( $editorList = null )
	{
		/** @var EditorInterface $editorInstance */

		if ( null === $editorList ) {
			$editorList = self::$editorList;
		}

		/* Get first editor which supports WEBP. Order of editorList matters. */
		foreach ( $editorList as $editorName ) {
			if ( 'Imagick' === $editorName ) {
				$editorInstance = new ImagickEditor();
				if ( true === $editorInstance->isAvailable() ) {
					$formats = \Imagick::queryformats( 'WEBP' );
					if ( in_array( 'WEBP', $formats ) ) {
						return $editorName;
					}
				}
			}
			else {
				$editorInstance = new GdEditor();
				if ( true === $editorInstance->isAvailable() ) {
					$formats = gd_info();
					if ( $formats[ 'WebP Support' ] ) {
						return $editorName;
					}
				}
			}
		}

		/* None of the installed editors have WEBP support */
		/* Get first supported editor instance. Order of editorList matters. */
		foreach ( $editorList as $editorName ) {
			if ( 'Imagick' === $editorName ) {
				$editorInstance = new ImagickEditor();
			}
			else {
				$editorInstance = new GdEditor();
			}
			/** @var EditorInterface $editorInstance */
			if ( true === $editorInstance->isAvailable() ) {
				return $editorName;
			}
		}

		throw new \Exception( 'No supported editor.' );
	}

	/**
	 * Creates the first available editor.
	 *
	 * @param array $editorList Array of editor list names. Use this to change the order of evaluation for editors. Default order of evaluation is Imagick then GD.
	 *
	 * @return EditorInterface
	 * @throws \Exception
	 */
	public static function createEditor( $editorList = [ 'Imagick', 'Gd' ] )
	{
		$editorName = self::detectAvailableEditor( $editorList );
		if ( 'Imagick' === $editorName ) {
			return new ImagickEditor();
		}
		else {
			return new GdEditor();
		}
	}

	/**
	 * Creates an image.
	 *
	 * @param string $imageFile Path to image file.
	 *
	 * @return ImageInterface
	 * @throws \Exception
	 */
	public static function createImage( $imageFile )
	{
		$editorName = self::detectAvailableEditor();
		if ( 'Imagick' === $editorName ) {
			return ImagickImage::createFromFile( $imageFile );
		}
		else {
			return GdImage::createFromFile( $imageFile );
		}
	}


	/**
	 * Creates a blank image.
	 *
	 * @param int $width Width of image in pixels.
	 * @param int $height Height of image in pixels.
	 *
	 * @return ImageInterface
	 * @throws \Exception
	 */
	public static function createBlankImage( $width = 1, $height = 1 )
	{
		$editorName = self::detectAvailableEditor();
		if ( 'Imagick' === $editorName ) {
			return ImagickImage::createBlank( $width, $height );
		}
		else {
			return GdImage::createBlank( $width, $height );
		}
	}


	/**
	 * Creates a filter. Detects available editor to use.
	 *
	 * @param string $filterName The name of the filter.
	 *
	 * @return FilterInterface
	 * @throws \Exception
	 */
	public static function createFilter( $filterName )
	{
		$editorName = self::detectAvailableEditor();
		$p = func_get_args();
		if ( 'Imagick' === $editorName ) {
			switch ( $filterName ) {
				case 'Blur':
					return new ImagickBlur(
						( array_key_exists( 1, $p ) ? $p[ 1 ] : 1 )
					);
				case 'Brightness':
					return new ImagickBrightness(
						$p[ 1 ]
					);
				case 'Colorize':
					return new ImagickColorize(
						$p[ 1 ], $p[ 2 ], $p[ 3 ]
					);
				case 'Contrast':
					return new ImagickContrast(
						$p[ 1 ]
					);
				case 'Dither':
					return new ImagickDither(
						$p[ 1 ]
					);
				case 'Gamma':
					return new ImagickGamma(
						$p[ 1 ]
					);
				case 'Grayscale':
					return new ImagickGrayscale();
				case 'Invert':
					return new ImagickInvert();
				case 'Pixelate':
					return new ImagickPixelate(
						$p[ 1 ]
					);
				case 'Sharpen':
					return new ImagickSharpen(
						$p[ 1 ]
					);
				case 'Sobel':
					return new ImagickSobel();
			}
			throw new \Exception( 'Invalid filter name.' );
		}
		else {
			switch ( $filterName ) {
				case 'Blur':
					return new GdBlur(
						( array_key_exists( 1, $p ) ? $p[ 1 ] : 1 )
					);
				case 'Brightness':
					return new GdBrightness(
						$p[ 1 ]
					);
				case 'Colorize':
					return new GdColorize(
						$p[ 1 ], $p[ 2 ], $p[ 3 ]
					);
				case 'Contrast':
					return new GdContrast(
						$p[ 1 ]
					);
				case 'Dither':
					return new GdDither(
						$p[ 1 ]
					);
				case 'Gamma':
					return new GdGamma(
						$p[ 1 ]
					);
				case 'Grayscale':
					return new GdGrayscale();
				case 'Invert':
					return new GdInvert();
				case 'Pixelate':
					return new GdPixelate(
						$p[ 1 ]
					);
				case 'Sharpen':
					return new GdSharpen(
						$p[ 1 ]
					);
				case 'Sobel':
					return new GdSobel();
			}
			throw new \Exception( 'Invalid filter name.' );
		}
	}

	/**
	 * Draws an object. Detects available editor to use.
	 *
	 * @param string $drawingObjectName The name of the DrawingObject.
	 *
	 * @return DrawingObjectInterface
	 * @throws \Exception
	 *
	 * We use array_key_exist() instead of isset() to be able to detect a parameter with a NULL value.
	 */
	public static function createDrawingObject( $drawingObjectName )
	{
		$editorName = self::detectAvailableEditor();
		$p = func_get_args();
		if ( 'Imagick' === $editorName ) {
			switch ( $drawingObjectName ) {
				case 'CubicBezier':
					return new ImagickCubicBezier(
						$p[ 1 ],
						$p[ 2 ],
						$p[ 3 ],
						$p[ 4 ],
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' )
					);
				case 'Ellipse':
					return new ImagickEllipse(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : [ 0, 0 ] ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : 1 ),
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' ),
						( array_key_exists( 6, $p ) ? $p[ 6 ] : '#FFFFFF' )
					);
				case 'Line':
					return new ImagickLine(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : 1 ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#000000' )
					);
				case 'Polygon':
					return new ImagickPolygon(
						$p[ 1 ],
						( array_key_exists( 2, $p ) ? $p[ 2 ] : 1 ),
						( array_key_exists( 3, $p ) ? $p[ 3 ] : '#000000' ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#FFFFFF' )
					);
				case 'Rectangle':
					return new ImagickRectangle(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : [ 0, 0 ] ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : 1 ),
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' ),
						( array_key_exists( 6, $p ) ? $p[ 6 ] : '#FFFFFF' )
					);
				case 'QuadraticBezier':
					return new ImagickQuadraticBezier(
						$p[ 1 ],
						$p[ 2 ],
						$p[ 3 ],
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#000000' )
					);

			}
			throw new \Exception( 'Invalid drawing object name.' );
		}
		else {
			switch ( $drawingObjectName ) {
				case 'CubicBezier':
					return new GdCubicBezier(
						$p[ 1 ],
						$p[ 2 ],
						$p[ 3 ],
						$p[ 4 ],
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' )
					);
				case 'Ellipse':
					return new GdEllipse(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : [ 0, 0 ] ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : 1 ),
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' ),
						( array_key_exists( 6, $p ) ? $p[ 6 ] : '#FFFFFF' )
					);
				case 'Line':
					return new GdLine(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : 1 ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#000000' )
					);
				case 'Polygon':
					return new GdPolygon(
						$p[ 1 ],
						( array_key_exists( 2, $p ) ? $p[ 2 ] : 1 ),
						( array_key_exists( 3, $p ) ? $p[ 3 ] : '#000000' ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#FFFFFF' )
					);
				case 'Rectangle':
					return new GdRectangle(
						$p[ 1 ],
						$p[ 2 ],
						( array_key_exists( 3, $p ) ? $p[ 3 ] : [ 0, 0 ] ),
						( array_key_exists( 4, $p ) ? $p[ 4 ] : 1 ),
						( array_key_exists( 5, $p ) ? $p[ 5 ] : '#000000' ),
						( array_key_exists( 6, $p ) ? $p[ 6 ] : '#FFFFFF' )
					);
				case 'QuadraticBezier':
					return new GdQuadraticBezier(
						$p[ 1 ],
						$p[ 2 ],
						$p[ 3 ],
						( array_key_exists( 4, $p ) ? $p[ 4 ] : '#000000' )
					);
			}
			throw new \Exception( 'Invalid drawing object name.' );
		}
	}
}