Вход Регистрация
Файл: DESURE-dcms-f12de01ac63e/sys/plugins/classes/sprite.class.php
Строк: 116
<?php

class sprite_icon
{
    public 
$path;
    public 
$w, $h; // размеры
    
public $x, $y; // позиция в спрайте
    
protected $_image;

    function 
__construct($path)
    {
        
$this->path = $path;
        
$info = getimagesize($this->path);
        
$this->w = $info[0];
        
$this->h = $info[1];
    }

    function 
getImage()
    {
        if (!
$this->_image)
            
$this->_image = imagecreatefromstring(file_get_contents($this->path));
        return 
$this->_image;
    }
}

/**
 * Class sprite
 * @property sprite_icon[] _icons
 */
class sprite
{
    protected 
$_icons = array();
    protected
        
$_width = 0, // ширина спрайта
        
$_height = 0, // высота спрайта
        
$_max_width = 512, // максимальная высота спрайта
        
$_top_index = 0, // позиция для вставки следующей иконки
        
$_left_index = 0; // позиция для вставки следующей иконки

    
public $class_prefix = 'DCMS_';

    function 
__construct()
    {

    }

    function 
addImages($array)
    {
        foreach (
$array AS $path)
            
$this->addImage($path);
    }

    function 
addImage($path)
    {
        try {
            
$icon = new sprite_icon($path);
            
$this->_icons[] = $icon;
        } catch (
Exception $e) {
            return 
false;
        }


        return 
true;
    }

    function 
cmp($i1, $i2)
    {
        if (
$i1->h > $i2->h)
            return 
1;
        if (
$i1->h < $i2->h)
            return -
1;
        return 
0;
    }

    function 
bindIndexes()
    {
        
usort($this->_icons, array($this, 'cmp'));

        
$this->_width = 0;
        
$this->_left_index = 0;
        
$this->_top_index = 0;
        
$this->_height = 0;

        for (
$i = 0; $i < count($this->_icons); $i++) {
            
$icon = $this->_icons[$i];

            if (
$this->_left_index + $icon->w > $this->_max_width) {
                
$this->_left_index = 0;
                
$this->_top_index = $this->_height;
            }

            
$icon->x = $this->_left_index;
            
$icon->y = $this->_top_index;

            
$this->_width = max($this->_width, $this->_left_index + $icon->w);
            
$this->_height = max($this->_height, $this->_top_index + $icon->h);

            
$this->_left_index += $icon->w;
        }
    }

    function 
saveSpriteImage($path)
    {
        
$img = imagecreatetruecolor($this->_width, $this->_height);
        
$black = imagecolorallocate($img, 0, 0, 0);
        
imagecolortransparent($img, $black);
        
imagealphablending($img, false);
        
imagesavealpha($img, true);
        foreach (
$this->_icons AS $icon) {
            
imagecopy($img, $icon->getImage(), $icon->x, $icon->y, 0, 0, $icon->w, $icon->h);
        }
        
imagepng($img, $path);
    }

    function 
saveSpriteCss($path, $sprite_src, $class_prefix)
    {
        
$css = '.' . $class_prefix . 'icon{' . "n";
        
$css .= 'display: inline-block;' . "n";
        
$css .= 'overflow: hidden;' . "n";
        
$css .= 'background-image: url(' . $sprite_src . ');' . "n";
        
$css .= '}' . "n";

        foreach (
$this->_icons AS $icon) {
            
$css .= '.' . implode('.', self::getClassName($icon->path, $class_prefix)) . "{n";
            
$css .= 'width: ' . $icon->w . 'px;' . "n";
            
$css .= 'height: ' . $icon->h . 'px;' . "n";
            
$css .= 'background-position: -' . $icon->x . 'px -' . $icon->y . 'px;' . "n";
            
$css .= "}n";
        }
        
file_put_contents($path, $css);
    }

    static function 
getClassName($path, $prefix = '')
    {
        
$name = basename($path, '.png');
        
$name = str_replace(array('.', '@'), array('_dot_', '_at_'), $name);
        return array(
$prefix . 'icon', $name);
    }
}
Онлайн: 2
Реклама