Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
119 / 119 |
|
100.00% |
12 / 12 |
CRAP | |
100.00% |
1 / 1 |
Imagick | |
100.00% |
119 / 119 |
|
100.00% |
12 / 12 |
39 | |
100.00% |
1 / 1 |
setOpacity | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
1 | |||
line | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
3 | |||
rectangle | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
5 | |||
square | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
roundedRectangle | |
100.00% |
14 / 14 |
|
100.00% |
1 / 1 |
6 | |||
roundedSquare | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
ellipse | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
5 | |||
circle | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
arc | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
4 | |||
chord | |
100.00% |
20 / 20 |
|
100.00% |
1 / 1 |
4 | |||
pie | |
100.00% |
27 / 27 |
|
100.00% |
1 / 1 |
4 | |||
polygon | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
4 |
1 | <?php |
2 | /** |
3 | * Pop PHP Framework (http://www.popphp.org/) |
4 | * |
5 | * @link https://github.com/popphp/popphp-framework |
6 | * @author Nick Sagona, III <dev@nolainteractive.com> |
7 | * @copyright Copyright (c) 2009-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com) |
8 | * @license http://www.popphp.org/license New BSD License |
9 | */ |
10 | |
11 | /** |
12 | * @namespace |
13 | */ |
14 | namespace Pop\Image\Draw; |
15 | |
16 | use ImagickDrawException; |
17 | |
18 | /** |
19 | * Draw class for Imagick |
20 | * |
21 | * @category Pop |
22 | * @package Pop\Image |
23 | * @author Nick Sagona, III <dev@nolainteractive.com> |
24 | * @copyright Copyright (c) 2009-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com) |
25 | * @license http://www.popphp.org/license New BSD License |
26 | * @version 4.0.0 |
27 | */ |
28 | class Imagick extends AbstractDraw |
29 | { |
30 | |
31 | /** |
32 | * Opacity |
33 | * @var int|float|null |
34 | */ |
35 | protected int|float|null $opacity = 1.0; |
36 | |
37 | /** |
38 | * Set the opacity |
39 | * |
40 | * @param int|float $opacity |
41 | * @return Imagick |
42 | */ |
43 | public function setOpacity(int|float $opacity): Imagick |
44 | { |
45 | $this->opacity = $opacity; |
46 | return $this; |
47 | } |
48 | |
49 | /** |
50 | * Draw a line on the image. |
51 | * |
52 | * @param int $x1 |
53 | * @param int $y1 |
54 | * @param int $x2 |
55 | * @param int $y2 |
56 | * @throws ImagickDrawException |
57 | * @return Imagick |
58 | */ |
59 | public function line(int $x1, int $y1, int $x2, int $y2): Imagick |
60 | { |
61 | if ($this->hasImage()) { |
62 | $draw = new \ImagickDraw(); |
63 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
64 | $draw->setStrokeWidth(($this->strokeWidth === null) ? 1 : $this->strokeWidth); |
65 | $draw->line($x1, $y1, $x2, $y2); |
66 | $this->image->getResource()->drawImage($draw); |
67 | } |
68 | |
69 | return $this; |
70 | } |
71 | |
72 | /** |
73 | * Draw a rectangle on the image. |
74 | * |
75 | * @param int $x |
76 | * @param int $y |
77 | * @param int $w |
78 | * @param ?int $h |
79 | * @throws ImagickDrawException |
80 | * @return Imagick |
81 | */ |
82 | public function rectangle(int $x, int $y, int $w, ?int $h = null): Imagick |
83 | { |
84 | if ($this->hasImage()) { |
85 | $x2 = $x + $w; |
86 | $y2 = $y + (($h === null) ? $w : $h); |
87 | |
88 | $draw = new \ImagickDraw(); |
89 | |
90 | if ($this->fillColor !== null) { |
91 | $draw->setFillColor($this->image->createColor($this->fillColor, $this->opacity)); |
92 | } |
93 | |
94 | if ($this->strokeWidth > 0) { |
95 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
96 | $draw->setStrokeWidth($this->strokeWidth); |
97 | } |
98 | |
99 | $draw->rectangle($x, $y, $x2, $y2); |
100 | $this->image->getResource()->drawImage($draw); |
101 | } |
102 | |
103 | return $this; |
104 | } |
105 | |
106 | /** |
107 | * Draw a square on the image. |
108 | * |
109 | * @param int $x |
110 | * @param int $y |
111 | * @param int $w |
112 | * @throws ImagickDrawException |
113 | * @return Imagick |
114 | */ |
115 | public function square(int $x, int $y, int $w): Imagick |
116 | { |
117 | return $this->rectangle($x, $y, $w, $w); |
118 | } |
119 | |
120 | /** |
121 | * Draw a rounded rectangle on the image. |
122 | * |
123 | * @param int $x |
124 | * @param int $y |
125 | * @param int $w |
126 | * @param ?int $h |
127 | * @param ?int $rx |
128 | * @param ?int $ry |
129 | * @throws ImagickDrawException |
130 | * @return Imagick |
131 | */ |
132 | public function roundedRectangle(int $x, int $y, int $w, ?int $h = null, ?int $rx = 10, ?int $ry = null): Imagick |
133 | { |
134 | if ($this->hasImage()) { |
135 | $x2 = $x + $w; |
136 | $y2 = $y + (($h === null) ? $w : $h); |
137 | if ($ry === null) { |
138 | $ry = $rx; |
139 | } |
140 | |
141 | $draw = new \ImagickDraw(); |
142 | |
143 | if ($this->fillColor !== null) { |
144 | $draw->setFillColor($this->image->createColor($this->fillColor, $this->opacity)); |
145 | } |
146 | |
147 | if ($this->strokeWidth > 0) { |
148 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
149 | $draw->setStrokeWidth($this->strokeWidth); |
150 | } |
151 | |
152 | $draw->roundRectangle($x, $y, $x2, $y2, $rx, $ry); |
153 | $this->image->getResource()->drawImage($draw); |
154 | } |
155 | |
156 | return $this; |
157 | } |
158 | |
159 | /** |
160 | * Draw a rounded square on the image. |
161 | * |
162 | * @param int $x |
163 | * @param int $y |
164 | * @param int $w |
165 | * @param int $rx |
166 | * @param ?int $ry |
167 | * @throws ImagickDrawException |
168 | * @return Imagick |
169 | */ |
170 | public function roundedSquare(int $x, int $y, int $w, int $rx = 10, ?int $ry = null): Imagick |
171 | { |
172 | return $this->roundedRectangle($x, $y, $w, $w, $rx, $ry); |
173 | } |
174 | |
175 | /** |
176 | * Draw an ellipse on the image. |
177 | * |
178 | * @param int $x |
179 | * @param int $y |
180 | * @param int $w |
181 | * @param ?int $h |
182 | * @throws ImagickDrawException |
183 | * @return Imagick |
184 | */ |
185 | public function ellipse(int $x, int $y, int $w, ?int $h = null): Imagick |
186 | { |
187 | if ($this->hasImage()) { |
188 | $wid = $w; |
189 | $hgt = ($h === null) ? $w : $h; |
190 | |
191 | $draw = new \ImagickDraw(); |
192 | |
193 | if ($this->fillColor !== null) { |
194 | $draw->setFillColor($this->image->createColor($this->fillColor, $this->opacity)); |
195 | } |
196 | |
197 | if ($this->strokeWidth > 0) { |
198 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
199 | $draw->setStrokeWidth($this->strokeWidth); |
200 | } |
201 | |
202 | $draw->ellipse($x, $y, $wid, $hgt, 0, 360); |
203 | $this->image->getResource()->drawImage($draw); |
204 | } |
205 | |
206 | return $this; |
207 | } |
208 | |
209 | /** |
210 | * Method to add a circle to the image. |
211 | * |
212 | * @param int $x |
213 | * @param int $y |
214 | * @param int $w |
215 | * @throws ImagickDrawException |
216 | * @return Imagick |
217 | */ |
218 | public function circle(int $x, int $y, int $w): Imagick |
219 | { |
220 | return $this->ellipse($x, $y, $w, $w); |
221 | } |
222 | |
223 | /** |
224 | * Draw an arc on the image. |
225 | * |
226 | * @param int $x |
227 | * @param int $y |
228 | * @param int $start |
229 | * @param int $end |
230 | * @param int $w |
231 | * @param ?int $h |
232 | * @throws ImagickDrawException |
233 | * @return Imagick |
234 | */ |
235 | public function arc(int $x, int $y, int $start, int $end, int $w, ?int $h = null): Imagick |
236 | { |
237 | if ($this->hasImage()) { |
238 | if ($this->strokeWidth == 0) { |
239 | $this->setStrokeWidth(1); |
240 | } |
241 | |
242 | $wid = $w; |
243 | $hgt = ($h === null) ? $w : $h; |
244 | |
245 | $draw = new \ImagickDraw(); |
246 | $draw->setFillOpacity(0); |
247 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
248 | $draw->setStrokeWidth($this->strokeWidth); |
249 | |
250 | $draw->ellipse($x, $y, $wid, $hgt, $start, $end); |
251 | |
252 | $this->image->getResource()->drawImage($draw); |
253 | } |
254 | |
255 | return $this; |
256 | } |
257 | |
258 | /** |
259 | * Draw a chord on the image. |
260 | * |
261 | * @param int $x |
262 | * @param int $y |
263 | * @param int $start |
264 | * @param int $end |
265 | * @param int $w |
266 | * @param ?int $h |
267 | * @throws ImagickDrawException |
268 | * @return Imagick |
269 | */ |
270 | public function chord(int $x, int $y, int $start, int $end, int $w, ?int $h = null): Imagick |
271 | { |
272 | if ($this->hasImage()) { |
273 | $wid = $w; |
274 | $hgt = ($h === null) ? $w : $h; |
275 | |
276 | $draw = new \ImagickDraw(); |
277 | $draw->setFillColor($this->image->createColor($this->fillColor)); |
278 | |
279 | $x1 = $w * cos($start / 180 * pi()); |
280 | $y1 = $h * sin($start / 180 * pi()); |
281 | $x2 = $w * cos($end / 180 * pi()); |
282 | $y2 = $h * sin($end / 180 * pi()); |
283 | |
284 | $draw->ellipse($x, $y, $wid, $hgt, $start, $end); |
285 | $this->image->getResource()->drawImage($draw); |
286 | |
287 | if ($this->strokeWidth > 0) { |
288 | $draw = new \ImagickDraw(); |
289 | |
290 | $draw->setFillColor($this->image->createColor($this->fillColor)); |
291 | $draw->setStrokeColor($this->image->createColor($this->strokeColor)); |
292 | $draw->setStrokeWidth($this->strokeWidth); |
293 | |
294 | $draw->ellipse($x, $y, $wid, $hgt, $start, $end); |
295 | $draw->line($x + $x1, $y + $y1, $x + $x2, $y + $y2); |
296 | |
297 | $this->image->getResource()->drawImage($draw); |
298 | } |
299 | } |
300 | |
301 | return $this; |
302 | } |
303 | |
304 | /** |
305 | * Draw a pie slice on the image. |
306 | * |
307 | * @param int $x |
308 | * @param int $y |
309 | * @param int $start |
310 | * @param int $end |
311 | * @param int $w |
312 | * @param ?int $h |
313 | * @throws ImagickDrawException |
314 | * @return Imagick |
315 | */ |
316 | public function pie(int $x, int $y, int $start, int $end, int $w, ?int $h = null): Imagick |
317 | { |
318 | if ($this->hasImage()) { |
319 | $wid = $w; |
320 | $hgt = ($h === null) ? $w : $h; |
321 | |
322 | $draw = new \ImagickDraw(); |
323 | $draw->setFillColor($this->image->createColor($this->fillColor)); |
324 | |
325 | $x1 = $w * cos($start / 180 * pi()); |
326 | $y1 = $h * sin($start / 180 * pi()); |
327 | $x2 = $w * cos($end / 180 * pi()); |
328 | $y2 = $h * sin($end / 180 * pi()); |
329 | |
330 | $points = [ |
331 | ['x' => $x, 'y' => $y], |
332 | ['x' => $x + $x1, 'y' => $y + $y1], |
333 | ['x' => $x + $x2, 'y' => $y + $y2] |
334 | ]; |
335 | |
336 | $draw->polygon($points); |
337 | |
338 | $draw->ellipse($x, $y, $wid, $hgt, $start, $end); |
339 | $this->image->getResource()->drawImage($draw); |
340 | |
341 | if ($this->strokeWidth > 0) { |
342 | $draw = new \ImagickDraw(); |
343 | |
344 | $draw->setFillColor($this->image->createColor($this->fillColor)); |
345 | $draw->setStrokeColor($this->image->createColor($this->strokeColor)); |
346 | $draw->setStrokeWidth($this->strokeWidth); |
347 | |
348 | $draw->ellipse($x, $y, $wid, $hgt, $start, $end); |
349 | $draw->line($x, $y, $x + $x1, $y + $y1); |
350 | $draw->line($x, $y, $x + $x2, $y + $y2); |
351 | |
352 | $this->image->getResource()->drawImage($draw); |
353 | } |
354 | } |
355 | |
356 | return $this; |
357 | } |
358 | |
359 | /** |
360 | * Draw a polygon on the image. |
361 | * |
362 | * @param array $points |
363 | * @throws ImagickDrawException |
364 | * @return Imagick |
365 | */ |
366 | public function polygon(array $points): Imagick |
367 | { |
368 | if ($this->hasImage()) { |
369 | $draw = new \ImagickDraw(); |
370 | if ($this->fillColor !== null) { |
371 | $draw->setFillColor($this->image->createColor($this->fillColor, $this->opacity)); |
372 | } |
373 | |
374 | if ($this->strokeWidth > 0) { |
375 | $draw->setStrokeColor($this->image->createColor($this->strokeColor, $this->opacity)); |
376 | $draw->setStrokeWidth($this->strokeWidth); |
377 | } |
378 | |
379 | $draw->polygon($points); |
380 | $this->image->getResource()->drawImage($draw); |
381 | } |
382 | |
383 | return $this; |
384 | } |
385 | |
386 | } |