Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/imagine/imagine/lib/Imagine/Gd/Drawer.php
Строк: 435
<?php

/*
 * This file is part of the Imagine package.
 *
 * (c) Bulat Shakirzyanov <mallluhuct@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace ImagineGd;

use 
ImagineDrawDrawerInterface;
use 
ImagineExceptionInvalidArgumentException;
use 
ImagineExceptionRuntimeException;
use 
ImagineImageAbstractFont;
use 
ImagineImageBoxInterface;
use 
ImagineImagePaletteColorColorInterface;
use 
ImagineImagePaletteColorRGB as RGBColor;
use 
ImagineImagePointInterface;

/**
 * Drawer implementation using the GD library
 */
final class Drawer implements DrawerInterface
{
    
/**
     * @var resource
     */
    
private $resource;

    
/**
     * @var array
     */
    
private $info;

    
/**
     * Constructs Drawer with a given gd image resource
     *
     * @param resource $resource
     */
    
public function __construct($resource)
    {
        
$this->loadGdInfo();
        
$this->resource $resource;
    }

    
/**
     * {@inheritdoc}
     */
    
public function arc(PointInterface $centerBoxInterface $size$start$endColorInterface $color$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw arc operation failed');
        }

        if (
false === imagearc($this->resource$center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start$end$this->getColor($color))) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw arc operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw arc operation failed');
        }

        return 
$this;
    }

    
/**
     * This function does not work properly because of a bug in GD
     *
     * {@inheritdoc}
     */
    
public function chord(PointInterface $centerBoxInterface $size$start$endColorInterface $color$fill false$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
$fill) {
            
$style IMG_ARC_CHORD;
        } else {
            
$style IMG_ARC_CHORD IMG_ARC_NOFILL;
        }

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw chord operation failed');
        }

        if (
false === imagefilledarc($this->resource$center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start$end$this->getColor($color), $style)) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw chord operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw chord operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function ellipse(PointInterface $centerBoxInterface $sizeColorInterface $color$fill false$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
$fill) {
            
$callback 'imagefilledellipse';
        } else {
            
$callback 'imageellipse';
        }

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw ellipse operation failed');
        }

        if (
false === $callback($this->resource$center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $this->getColor($color))) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw ellipse operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw ellipse operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function line(PointInterface $startPointInterface $endColorInterface $color$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw line operation failed');
        }

        if (
false === imageline($this->resource$start->getX(), $start->getY(), $end->getX(), $end->getY(), $this->getColor($color))) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw line operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw line operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function pieSlice(PointInterface $centerBoxInterface $size$start$endColorInterface $color$fill false$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
$fill) {
            
$style IMG_ARC_EDGED;
        } else {
            
$style IMG_ARC_EDGED IMG_ARC_NOFILL;
        }

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw chord operation failed');
        }

        if (
false === imagefilledarc($this->resource$center->getX(), $center->getY(), $size->getWidth(), $size->getHeight(), $start$end$this->getColor($color), $style)) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw chord operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw chord operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function dot(PointInterface $positionColorInterface $color)
    {
        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw point operation failed');
        }

        if (
false === imagesetpixel($this->resource$position->getX(), $position->getY(), $this->getColor($color))) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw point operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw point operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function polygon(array $coordinatesColorInterface $color$fill false$thickness 1)
    {
        
imagesetthickness($this->resourcemax(1, (int) $thickness));

        if (
count($coordinates) < 3) {
            throw new 
InvalidArgumentException(sprintf('A polygon must consist of at least 3 points, %d given'count($coordinates)));
        }

        
$points call_user_func_array('array_merge'array_map(function (PointInterface $p) {
            return array(
$p->getX(), $p->getY());
        }, 
$coordinates));

        if (
$fill) {
            
$callback 'imagefilledpolygon';
        } else {
            
$callback 'imagepolygon';
        }

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Draw polygon operation failed');
        }

        if (
false === $callback($this->resource$pointscount($coordinates), $this->getColor($color))) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Draw polygon operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Draw polygon operation failed');
        }

        return 
$this;
    }

    
/**
     * {@inheritdoc}
     */
    
public function text($stringAbstractFont $fontPointInterface $position$angle 0$width null)
    {
        if (!
$this->info['FreeType Support']) {
            throw new 
RuntimeException('GD is not compiled with FreeType support');
        }

        
$angle    = -$angle;
        
$fontsize $font->getSize();
        
$fontfile $font->getFile();
        
$x        $position->getX();
        
$y        $position->getY() + $fontsize;

        if (
$width !== null) {
            
$string $this->wrapText($string$font$angle$width);
        }

        if (
false === imagealphablending($this->resourcetrue)) {
            throw new 
RuntimeException('Font mask operation failed');
        }

        if (
false === imagefttext($this->resource$fontsize$angle$x$y$this->getColor($font->getColor()), $fontfile$string)) {
            
imagealphablending($this->resourcefalse);
            throw new 
RuntimeException('Font mask operation failed');
        }

        if (
false === imagealphablending($this->resourcefalse)) {
            throw new 
RuntimeException('Font mask operation failed');
        }

        return 
$this;
    }

    
/**
     * Internal
     *
     * Generates a GD color from Color instance
     *
     * @param ColorInterface $color
     *
     * @return resource
     *
     * @throws RuntimeException
     * @throws InvalidArgumentException
     */
    
private function getColor(ColorInterface $color)
    {
        if (!
$color instanceof RGBColor) {
            throw new 
InvalidArgumentException('GD driver only supports RGB colors');
        }

        
$gdColor imagecolorallocatealpha($this->resource$color->getRed(), $color->getGreen(), $color->getBlue(), (100 $color->getAlpha()) * 127 100);
        if (
false === $gdColor) {
            throw new 
RuntimeException(sprintf('Unable to allocate color "RGB(%s, %s, %s)" with transparency of %d percent'$color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha()));
        }

        return 
$gdColor;
    }

    private function 
loadGdInfo()
    {
        if (!
function_exists('gd_info')) {
            throw new 
RuntimeException('Gd not installed');
        }

        
$this->info gd_info();
    }

    
/**
     * Internal
     *
     * Fits a string into box with given width
     */
    
private function wrapText($stringAbstractFont $font$angle$width)
    {
        
$result '';
        
$words explode(' '$string);
        foreach (
$words as $word) {
            
$teststring $result ' ' $word;
            
$testbox imagettfbbox($font->getSize(), $angle$font->getFile(), $teststring);
            if (
$testbox[2] > $width) {
                
$result .= ($result == '' '' "n") . $word;
            } else {
                
$result .= ($result == '' '' ' ') . $word;
            }
        }

        return 
$result;
    }
}
Онлайн: 1
Реклама