<?php
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;
class Grafika
{
const DIR = __DIR__;
private static $editorList = array('Imagick', 'Gd');
public static function fontsDir()
{
$ds = DIRECTORY_SEPARATOR;
return realpath(self::DIR . $ds . '..' . $ds . '..') . $ds . 'fonts';
}
public static function setEditorList($editorList){
if(!is_array($editorList)){
throw new \Exception('$editorList must be an array.');
}
self::$editorList = $editorList;
}
public static function detectAvailableEditor($editorList = null)
{
if(null === $editorList){
$editorList = self::$editorList;
}
foreach ($editorList as $editorName) {
if ('Imagick' === $editorName) {
$editorInstance = new ImagickEditor();
} else {
$editorInstance = new GdEditor();
}
if (true === $editorInstance->isAvailable()) {
return $editorName;
}
}
throw new \Exception('No supported editor.');
}
public static function createEditor($editorList = array('Imagick', 'Gd'))
{
$editorName = self::detectAvailableEditor($editorList);
if ('Imagick' === $editorName) {
return new ImagickEditor();
} else {
return new GdEditor();
}
}
public static function createImage($imageFile)
{
$editorName = self::detectAvailableEditor();
if ('Imagick' === $editorName) {
return ImagickImage::createFromFile($imageFile);
} else {
return GdImage::createFromFile($imageFile);
}
}
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);
}
}
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.');
}
}
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] : array(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] : array(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] : array(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] : array(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.');
}
}
}