Вход Регистрация
Файл: outs/wideimage/vendor/de77/TGA.php
Строк: 113
<?php
    
/**
 * @author Gasper Kozak
 * @copyright 2007-2011

    This file is part of WideImage.
        
    WideImage is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation; either version 2.1 of the License, or
    (at your option) any later version.
        
    WideImage is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.
        
    You should have received a copy of the GNU Lesser General Public License
    along with WideImage; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    * @package Internal/Mappers
  **/

    /**
     * External code for TGA
     * 
     * Adapted for use in WideImage. Code used with permission from the original author de77.
     * http://de77.com/php/open-tga-with-php-imagecreatefromtga
     * 
     * @author de77
     * @license MIT
     * @version 24.08.2010
     * @url http://de77.com
     * 
     * @package Internal/Mappers
     */
class WideImage_vendor_de77_TGA
{
    static function 
rle_decode($data$datalen)
    {
        
$len strlen($data);
        
        
$out '';
        
        
$i 0;
        
$k 0;
        while (
$i<$len)
        {
            
self::dec_bits(ord($data[$i]), $type$value);
            if (
$k >= $datalen)
            {
                break;
            }
    
            
$i++;
            
            if (
$type == 0//raw
            
{
                for (
$j=0$j<3*$value$j++)
                {
                    
$out .= $data[$j+$i];
                    
$k++;            
                }
                
$i += $value*3;
            }
            else 
//rle
            
{
                for (
$j=0$j<$value$j++)
                {
                    
$out .= $data[$i] . $data[$i+1] . $data[$i+2];
                    
$k++;                
                }
                
$i += 3;
            }    
        }
        return 
$out;
    }
    
    static function 
dec_bits($byte, &$type, &$value)
    {
        
$type = ($byte 0x80) >> 7;
        
$value + ($byte 0x7F);
    }
    
    static function 
imagecreatefromstring($bin_data)
    {
        
$bin_pos 0;
        
$header substr($bin_data$bin_pos18);
        
$bin_pos += 18;
        
$header unpack(    "cimage_id_len/ccolor_map_type/cimage_type/vcolor_map_origin/vcolor_map_len/" .
                            
"ccolor_map_entry_size/vx_origin/vy_origin/vwidth/vheight/" .
                            
"cpixel_size/cdescriptor"$header);
    
        switch (
$header['image_type'])
        {
            case 
2:        //no palette, uncompressed
            
case 10:    //no palette, rle
                        
break;
            default:    return 
false//die('Unsupported TGA format');                    
        
}
        
        if (
$header['pixel_size'] != 24)
        {
            return 
false;
            
//die('Unsupported TGA color depth');    
        
}
        
        
$bytes $header['pixel_size'] / 8;
        
        if (
$header['image_id_len'] > 0)
        {
            
$header['image_id'] = substr($bin_data$bin_pos$header['image_id_len']);
            
$bin_pos += $header['image_id_len'];
        }
        else
        {
            
$header['image_id'] = '';    
        }
        
        
$im imagecreatetruecolor($header['width'], $header['height']);
        
        
$size $header['width'] * $header['height'] * 3;
        
        
//-- check whether this is NEW TGA or not
        
$pos $bin_pos;
        
$bin_pos strlen($bin_data) - 26;
        
$newtga substr($bin_data$bin_pos26);
        if (
substr($newtga816) != 'TRUEVISION-XFILE')
        {
            
$newtga false;
        }
        
        
$bin_pos strlen($bin_data);
        
$datasize $bin_pos $pos
        if (
$newtga)
        {
            
$datasize -= 26;
        }
        
        
$bin_pos $pos;
    
        
//-- end of check
        
$data substr($bin_data$bin_pos$datasize);
        
$bin_pos += $datasize;   
        if (
$header['image_type'] == 10)
        {
            
$data self::rle_decode($data$size);                    
        }
        if (
self::bit5($header['descriptor']) == 1)
        {
            
$reverse true;    
        }
        else
        {
            
$reverse false;
        }    
        
        
$pixels str_split($data3);
        
$i 0;
        
        
//read pixels 
        
if ($reverse)
        {   
            for (
$y=0$y<$header['height']; $y++)
            {        
                for (
$x=0$x<$header['width']; $x++)
                {
                    
imagesetpixel($im$x$yself::dwordize($pixels[$i]));
                    
$i++;
                }
            }
        }
        else
        {
            for (
$y=$header['height']-1$y>=0$y--)
            {        
                for (
$x=0$x<$header['width']; $x++)
                {
                    
imagesetpixel($im$x$yself::dwordize($pixels[$i]));
                    
$i++;
                }
            }
        }
        
        return 
$im;
    }
    
    static function 
imagecreatefromtga($filename)
    {
        return 
self::imagecreatefromstring(file_get_contents($filename));
    }
    
    static function 
dwordize($str)
    {
        
$a ord($str[0]);
        
$b ord($str[1]);
        
$c ord($str[2]);
        return 
$c*256*256 $b*256 $a;
    }
    
    static function 
bit5($x)
    {
        return (
$x 32) >> 5;    
    }
}
Онлайн: 2
Реклама