Файл: core/asido/class.driver.gd_hack.php
Строк: 151
<?php
/**
* @author Kaloyan K. Tsvetkov <kaloyan@kaloyan.info>
* @license http://opensource.org/licenses/lgpl-license.php GNU Lesser General Public License Version 2.1
* @package Asido
* @subpackage Asido.Driver.GD
* @version $Id: class.driver.gd_hack.php 7 2007-04-09 21:09:09Z mrasnika $
*/
/////////////////////////////////////////////////////////////////////////////
/**
* @see Asido_Driver_GD
*/
require_once ASIDO_DIR . "/class.driver.gd.php";
/////////////////////////////////////////////////////////////////////////////
/**
* Asido GD(GD2) driver with some of the unsupported methods hacked via some work-arounds.
*
* @package Asido
* @subpackage Asido.Driver.GD
*/
Class Asido_Driver_GD_Hack Extends Asido_Driver_GD {
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/**
* Make the image greyscale
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
*/
function __grayscale(&$tmp) {
// the longer path: do it pixel by pixel
//
if (parent::__grayscale(&$tmp)) {
return true;
}
// create 256 color palette
//
$palette = array();
for ($c=0; $c<256; $c++) {
$palette[$c] = imageColorAllocate($tmp->target, $c, $c, $c);
}
// read origonal colors pixel by pixel
//
for ($y=0; $y<$tmp->image_height; $y++) {
for ($x=0; $x<$tmp->image_width; $x++) {
$rgb = imageColorAt($tmp->target, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$gs = (($r*0.299)+($g*0.587)+($b*0.114));
imageSetPixel($tmp->target, $x, $y, $palette[$gs]);
}
}
return true;
}
/**
* Vertically mirror (flip) the image
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
*/
function __flip(&$tmp) {
$t = imageCreateTrueColor($tmp->image_width, $tmp->image_height);
imageAlphaBlending($t, true);
for ($y = 0; $y < $tmp->image_height; ++$y) {
imageCopy(
$t, $tmp->target,
0, $y,
0, $tmp->image_height - $y - 1,
$tmp->image_width, 1
);
}
imageAlphaBlending($t, false);
$this->__destroy_target($tmp);
$tmp->target = $t;
return true;
}
/**
* Horizontally mirror (flop) the image
*
* @param Asido_Image &$image
* @return boolean
* @access protected
*/
function __flop(&$tmp) {
$t = imageCreateTrueColor($tmp->image_width, $tmp->image_height);
imageAlphaBlending($t, true);
for ($x = 0; $x < $tmp->image_width; ++$x) {
imageCopy(
$t,
$tmp->target,
$x, 0,
$tmp->image_width - $x - 1, 0,
1, $tmp->image_height
);
}
imageAlphaBlending($t, false);
$this->__destroy_target($tmp);
$tmp->target = $t;
return true;
}
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/**
* Get canvas
*
* @param integer $width
* @param integer $height
* @param Asido_Color &$color
* @return Asido_TMP
* @access protected
*/
function __canvas($width, $height, &$color) {
$t = new Asido_TMP;
$t->target = imageCreateTrueColor($width, $height);
list($r, $g, $b) = $color->get();
imageFill($t->target, 1, 1,
imageColorAllocate($t->target, $r, $g, $b)
);
$t->image_width = $width;
$t->image_height = $height;
return $t;
}
/**
* Generate a temporary object for the provided argument
*
* @param mixed &$handler
* @param string $filename the filename will be automatically generated
* on the fly, but if you want you can use the filename provided by
* this argument
* @return Asido_TMP
* @access protected
*/
function __tmpimage(&$handler, $filename=null) {
if (!isset($filename)) {
$filename = $this->__tmpfile();
}
imageAlphaBlending($handler, 0);
imageSaveAlpha($handler, 1);
imagePNG($handler, $filename);
// ^
// PNG: no pixel losts
return $this->prepare(
new Asido_Image($filename)
);
}
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/**
* Open the source and target image for processing it
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
*/
function __open(&$tmp) {
$error_source = false;
$error_target = false;
// get image dimensions
//
if ($i = @getImageSize($tmp->source_filename)) {
$tmp->image_width = $i[0];
$tmp->image_height = $i[1];
}
// image type ?
//
switch(@$i[2]) {
case 1: // GIF
$error_source = (false == (
$tmp->source = @imageCreateFromGIF(
$tmp->source_filename
)
));
$error_target = false == (
$tmp->target = imageCreateTrueColor(
$tmp->image_width, $tmp->image_height
)
);
$error_target &= imageCopyResampled(
$tmp->target, $tmp->source,
0, 0, 0, 0,
$tmp->image_width, $tmp->image_height,
$tmp->image_width, $tmp->image_height
);
break;
case 2: // JPG
$error_source = (false == (
$tmp->source = imageCreateFromJPEG(
$tmp->source_filename
)
));
$error_target = (false == (
$tmp->target = imageCreateFromJPEG(
$tmp->source_filename
)
));
break;
case 3: // PNG
$error_source = (false == (
$tmp->source = @imageCreateFromPNG(
$tmp->source_filename
)
));
$error_target = (false == (
$tmp->target = @imageCreateFromPNG(
$tmp->source_filename
)
));
break;
case 15: // WBMP
$error_source = (false == (
$tmp->source = @imageCreateFromWBMP(
$tmp->source_filename
)
));
$error_target = (false == (
$tmp->target = @imageCreateFromWBMP(
$tmp->source_filename
)
));
break;
case 16: // XBM
$error_source = (false == (
$tmp->source = @imageCreateFromXBM(
$tmp->source_filename
)
));
$error_target = (false == (
$tmp->target = @imageCreateFromXBM(
$tmp->source_filename
)
));
break;
case 4: // SWF
case 5: // PSD
case 6: // BMP
case 7: // TIFF(intel byte order)
case 8: // TIFF(motorola byte order)
case 9: // JPC
case 10: // JP2
case 11: // JPX
case 12: // JB2
case 13: // SWC
case 14: // IFF
default:
$error_source = (false == (
$tmp->source = @imageCreateFromString(
file_get_contents(
$tmp->source_filename
)
)
));
$error_target = (false == (
$tmp->source = @imageCreateFromString(
file_get_contents(
$tmp->source_filename
)
)
));
break;
}
return !($error_source || $error_target);
}
/**
* Write the image after being processed
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
*/
function __write(&$tmp) {
// try to guess format from extension
//
if (!$tmp->save) {
$p = pathinfo($tmp->target_filename);
($tmp->save = $this->__mime_metaphone[metaphone($p['extension'])])
|| ($tmp->save = $this->__mime_soundex[soundex($p['extension'])]);
}
$result = false;
switch($tmp->save) {
case 'image/gif' :
imageTrueColorToPalette($tmp->target, true, 256);
$result = @imageGIF($tmp->target, $tmp->target_filename);
break;
case 'image/jpeg' :
$result = @imageJPEG($tmp->target, $tmp->target_filename, ASIDO_GD_JPEG_QUALITY);
break;
case 'image/wbmp' :
$result = @imageWBMP($tmp->target, $tmp->target_filename);
break;
default :
case 'image/png' :
imageSaveAlpha($tmp->target, true);
imageAlphaBlending($tmp->target, false);
$result = @imagePNG($tmp->target, $tmp->target_filename);
break;
}
@$this->__destroy_source($tmp);
@$this->__destroy_target($tmp);
return $result;
}
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/**
* Destroy the source for the provided temporary object
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
* @abstract
*/
function __destroy_source(&$tmp) {
return imageDestroy($tmp->source);
}
/**
* Destroy the target for the provided temporary object
*
* @param Asido_TMP &$tmp
* @return boolean
* @access protected
* @abstract
*/
function __destroy_target(&$tmp) {
return imageDestroy($tmp->target);
}
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
//--end-of-class--
}
/////////////////////////////////////////////////////////////////////////////
?>