1: <?php
2: /**
3: ##DOC-SIGNATURE##
4:
5: This file is part of WideImage.
6:
7: WideImage is free software; you can redistribute it and/or modify
8: it under the terms of the GNU Lesser General Public License as published by
9: the Free Software Foundation; either version 2.1 of the License, or
10: (at your option) any later version.
11:
12: WideImage is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU Lesser General Public License for more details.
16:
17: You should have received a copy of the GNU Lesser General Public License
18: along with WideImage; if not, write to the Free Software
19: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20:
21: * @package Internal/Operations
22: **/
23:
24: namespace WideImage\Operation;
25:
26: use WideImage\Coordinate;
27: use WideImage\PaletteImage;
28: use WideImage\Exception\Exception;
29: use WideImage\Exception\GDFunctionResultException;
30:
31: /**
32: * Crop operation class
33: *
34: * @package Internal/Operations
35: */
36: class Crop
37: {
38: /**
39: * Returns a cropped image
40: *
41: * @param \WideImage\Image $img
42: * @param smart_coordinate $left
43: * @param smart_coordinate $top
44: * @param smart_coordinate $width
45: * @param smart_coordinate $height
46: * @return \WideImage\Image
47: */
48: public function execute($img, $left, $top, $width, $height)
49: {
50: $width = Coordinate::fix($width, $img->getWidth(), $width);
51: $height = Coordinate::fix($height, $img->getHeight(), $height);
52: $left = Coordinate::fix($left, $img->getWidth(), $width);
53: $top = Coordinate::fix($top, $img->getHeight(), $height);
54:
55: if ($left < 0) {
56: $width = $left + $width;
57: $left = 0;
58: }
59:
60: if ($width > $img->getWidth() - $left) {
61: $width = $img->getWidth() - $left;
62: }
63:
64: if ($top < 0) {
65: $height = $top + $height;
66: $top = 0;
67: }
68:
69: if ($height > $img->getHeight() - $top) {
70: $height = $img->getHeight() - $top;
71: }
72:
73: if ($width <= 0 || $height <= 0) {
74: throw new Exception("Can't crop outside of an image.");
75: }
76:
77: $new = $img->doCreate($width, $height);
78:
79: if ($img->isTransparent() || $img instanceof PaletteImage) {
80: $new->copyTransparencyFrom($img);
81:
82: if (!imagecopyresized($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height)) {
83: throw new GDFunctionResultException("imagecopyresized() returned false");
84: }
85: } else {
86: $new->alphaBlending(false);
87: $new->saveAlpha(true);
88:
89: if (!imagecopyresampled($new->getHandle(), $img->getHandle(), 0, 0, $left, $top, $width, $height, $width, $height)) {
90: throw new GDFunctionResultException("imagecopyresampled() returned false");
91: }
92: }
93:
94: return $new;
95: }
96: }
97: