1 |
2
|
Manuela
|
<?php
|
2 |
|
|
/**
|
3 |
|
|
* GD Reflection Lib Plugin Definition File
|
4 |
|
|
*
|
5 |
|
|
* This file contains the plugin definition for the GD Reflection Lib for PHP Thumb
|
6 |
|
|
*
|
7 |
|
|
* PHP Version 5 with GD 2.0+
|
8 |
|
|
* PhpThumb : PHP Thumb Library <http://phpthumb.gxdlabs.com>
|
9 |
|
|
* Copyright (c) 2009, Ian Selby/Gen X Design
|
10 |
|
|
*
|
11 |
|
|
* Author(s): Ian Selby <ian@gen-x-design.com>
|
12 |
|
|
*
|
13 |
|
|
* Licensed under the MIT License
|
14 |
|
|
* Redistributions of files must retain the above copyright notice.
|
15 |
|
|
*
|
16 |
|
|
* @author Ian Selby <ian@gen-x-design.com>
|
17 |
|
|
* @copyright Copyright (c) 2009 Gen X Design
|
18 |
|
|
* @link http://phpthumb.gxdlabs.com
|
19 |
|
|
* @license http://www.opensource.org/licenses/mit-license.php The MIT License
|
20 |
|
|
* @version 3.0
|
21 |
|
|
* @package PhpThumb
|
22 |
|
|
* @filesource
|
23 |
|
|
*/
|
24 |
|
|
|
25 |
|
|
/**
|
26 |
|
|
* GD Reflection Lib Plugin
|
27 |
|
|
*
|
28 |
|
|
* This plugin allows you to create those fun Apple(tm)-style reflections in your images
|
29 |
|
|
*
|
30 |
|
|
* @package PhpThumb
|
31 |
|
|
* @subpackage Plugins
|
32 |
|
|
*/
|
33 |
|
|
class GdReflectionLib
|
34 |
|
|
{
|
35 |
|
|
/**
|
36 |
|
|
* Instance of GdThumb passed to this class
|
37 |
|
|
*
|
38 |
|
|
* @var GdThumb
|
39 |
|
|
*/
|
40 |
|
|
protected $parentInstance;
|
41 |
|
|
protected $currentDimensions;
|
42 |
|
|
protected $workingImage;
|
43 |
|
|
protected $newImage;
|
44 |
|
|
protected $options;
|
45 |
|
|
|
46 |
|
|
public function createReflection ($percent, $reflection, $white, $border, $borderColor, &$that)
|
47 |
|
|
{
|
48 |
|
|
// bring stuff from the parent class into this class...
|
49 |
|
|
$this->parentInstance = $that;
|
50 |
|
|
$this->currentDimensions = $this->parentInstance->getCurrentDimensions();
|
51 |
|
|
$this->workingImage = $this->parentInstance->getWorkingImage();
|
52 |
|
|
$this->newImage = $this->parentInstance->getOldImage();
|
53 |
|
|
$this->options = $this->parentInstance->getOptions();
|
54 |
|
|
|
55 |
|
|
$width = $this->currentDimensions['width'];
|
56 |
|
|
$height = $this->currentDimensions['height'];
|
57 |
|
|
$reflectionHeight = intval($height * ($reflection / 100));
|
58 |
|
|
$newHeight = $height + $reflectionHeight;
|
59 |
|
|
$reflectedPart = $height * ($percent / 100);
|
60 |
|
|
|
61 |
|
|
$this->workingImage = imagecreatetruecolor($width, $newHeight);
|
62 |
|
|
|
63 |
|
|
imagealphablending($this->workingImage, true);
|
64 |
|
|
|
65 |
|
|
$colorToPaint = imagecolorallocatealpha($this->workingImage,255,255,255,0);
|
66 |
|
|
imagefilledrectangle($this->workingImage,0,0,$width,$newHeight,$colorToPaint);
|
67 |
|
|
|
68 |
|
|
imagecopyresampled
|
69 |
|
|
(
|
70 |
|
|
$this->workingImage,
|
71 |
|
|
$this->newImage,
|
72 |
|
|
0,
|
73 |
|
|
0,
|
74 |
|
|
0,
|
75 |
|
|
$reflectedPart,
|
76 |
|
|
$width,
|
77 |
|
|
$reflectionHeight,
|
78 |
|
|
$width,
|
79 |
|
|
($height - $reflectedPart)
|
80 |
|
|
);
|
81 |
|
|
|
82 |
|
|
$this->imageFlipVertical();
|
83 |
|
|
|
84 |
|
|
imagecopy($this->workingImage, $this->newImage, 0, 0, 0, 0, $width, $height);
|
85 |
|
|
|
86 |
|
|
imagealphablending($this->workingImage, true);
|
87 |
|
|
|
88 |
|
|
for ($i = 0; $i < $reflectionHeight; $i++)
|
89 |
|
|
{
|
90 |
|
|
$colorToPaint = imagecolorallocatealpha($this->workingImage, 255, 255, 255, ($i/$reflectionHeight*-1+1)*$white);
|
91 |
|
|
|
92 |
|
|
imagefilledrectangle($this->workingImage, 0, $height + $i, $width, $height + $i, $colorToPaint);
|
93 |
|
|
}
|
94 |
|
|
|
95 |
|
|
if($border == true)
|
96 |
|
|
{
|
97 |
|
|
$rgb = $this->hex2rgb($borderColor, false);
|
98 |
|
|
$colorToPaint = imagecolorallocate($this->workingImage, $rgb[0], $rgb[1], $rgb[2]);
|
99 |
|
|
|
100 |
|
|
imageline($this->workingImage, 0, 0, $width, 0, $colorToPaint); //top line
|
101 |
|
|
imageline($this->workingImage, 0, $height, $width, $height, $colorToPaint); //bottom line
|
102 |
|
|
imageline($this->workingImage, 0, 0, 0, $height, $colorToPaint); //left line
|
103 |
|
|
imageline($this->workingImage, $width-1, 0, $width-1, $height, $colorToPaint); //right line
|
104 |
|
|
}
|
105 |
|
|
|
106 |
|
|
if ($this->parentInstance->getFormat() == 'PNG')
|
107 |
|
|
{
|
108 |
|
|
$colorTransparent = imagecolorallocatealpha
|
109 |
|
|
(
|
110 |
|
|
$this->workingImage,
|
111 |
|
|
$this->options['alphaMaskColor'][0],
|
112 |
|
|
$this->options['alphaMaskColor'][1],
|
113 |
|
|
$this->options['alphaMaskColor'][2],
|
114 |
|
|
0
|
115 |
|
|
);
|
116 |
|
|
|
117 |
|
|
imagefill($this->workingImage, 0, 0, $colorTransparent);
|
118 |
|
|
imagesavealpha($this->workingImage, true);
|
119 |
|
|
}
|
120 |
|
|
|
121 |
|
|
$this->parentInstance->setOldImage($this->workingImage);
|
122 |
|
|
$this->currentDimensions['width'] = $width;
|
123 |
|
|
$this->currentDimensions['height'] = $newHeight;
|
124 |
|
|
$this->parentInstance->setCurrentDimensions($this->currentDimensions);
|
125 |
|
|
|
126 |
|
|
return $that;
|
127 |
|
|
}
|
128 |
|
|
|
129 |
|
|
/**
|
130 |
|
|
* Flips the image vertically
|
131 |
|
|
*
|
132 |
|
|
*/
|
133 |
|
|
protected function imageFlipVertical ()
|
134 |
|
|
{
|
135 |
|
|
$x_i = imagesx($this->workingImage);
|
136 |
|
|
$y_i = imagesy($this->workingImage);
|
137 |
|
|
|
138 |
|
|
for ($x = 0; $x < $x_i; $x++)
|
139 |
|
|
{
|
140 |
|
|
for ($y = 0; $y < $y_i; $y++)
|
141 |
|
|
{
|
142 |
|
|
imagecopy($this->workingImage, $this->workingImage, $x, $y_i - $y - 1, $x, $y, 1, 1);
|
143 |
|
|
}
|
144 |
|
|
}
|
145 |
|
|
}
|
146 |
|
|
|
147 |
|
|
/**
|
148 |
|
|
* Converts a hex color to rgb tuples
|
149 |
|
|
*
|
150 |
|
|
* @return mixed
|
151 |
|
|
* @param string $hex
|
152 |
|
|
* @param bool $asString
|
153 |
|
|
*/
|
154 |
|
|
protected function hex2rgb ($hex, $asString = false)
|
155 |
|
|
{
|
156 |
|
|
// strip off any leading #
|
157 |
|
|
if (0 === strpos($hex, '#'))
|
158 |
|
|
{
|
159 |
|
|
$hex = substr($hex, 1);
|
160 |
|
|
}
|
161 |
|
|
elseif (0 === strpos($hex, '&H'))
|
162 |
|
|
{
|
163 |
|
|
$hex = substr($hex, 2);
|
164 |
|
|
}
|
165 |
|
|
|
166 |
|
|
// break into hex 3-tuple
|
167 |
|
|
$cutpoint = ceil(strlen($hex) / 2)-1;
|
168 |
|
|
$rgb = explode(':', wordwrap($hex, $cutpoint, ':', $cutpoint), 3);
|
169 |
|
|
|
170 |
|
|
// convert each tuple to decimal
|
171 |
|
|
$rgb[0] = (isset($rgb[0]) ? hexdec($rgb[0]) : 0);
|
172 |
|
|
$rgb[1] = (isset($rgb[1]) ? hexdec($rgb[1]) : 0);
|
173 |
|
|
$rgb[2] = (isset($rgb[2]) ? hexdec($rgb[2]) : 0);
|
174 |
|
|
|
175 |
|
|
return ($asString ? "{$rgb[0]} {$rgb[1]} {$rgb[2]}" : $rgb);
|
176 |
|
|
}
|
177 |
|
|
}
|
178 |
|
|
|
179 |
|
|
$pt = PhpThumb::getInstance();
|
180 |
|
|
$pt->registerPlugin('GdReflectionLib', 'gd');
|