Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
91 / 91
100.00% covered (success)
100.00%
10 / 10
CRAP
100.00% covered (success)
100.00%
1 / 1
Gd
100.00% covered (success)
100.00%
91 / 91
100.00% covered (success)
100.00%
10 / 10
49
100.00% covered (success)
100.00%
1 / 1
 setOpacity
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 line
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
 rectangle
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
7
 square
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 ellipse
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
7
 circle
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 arc
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
5
 chord
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
7
 pie
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
7
 polygon
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
9
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 */
14namespace Pop\Image\Draw;
15
16/**
17 * Draw class for Gd
18 *
19 * @category   Pop
20 * @package    Pop\Image
21 * @author     Nick Sagona, III <dev@nolainteractive.com>
22 * @copyright  Copyright (c) 2009-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
23 * @license    http://www.popphp.org/license     New BSD License
24 * @version    4.0.0
25 */
26class Gd extends AbstractDraw
27{
28
29    /**
30     * Opacity
31     * @var int
32     */
33    protected int|float|null $opacity = 0;
34
35    /**
36     * Set the opacity
37     *
38     * @param  int|float $opacity
39     * @return Gd
40     */
41    public function setOpacity(int|float $opacity): Gd
42    {
43        $this->opacity = (int)round((127 - (127 * ($opacity / 100))));
44        return $this;
45    }
46
47    /**
48     * Draw a line on the image.
49     *
50     * @param  int|float $x1
51     * @param  int|float $y1
52     * @param  int|float $x2
53     * @param  int|float $y2
54     * @return Gd
55     */
56    public function line(int|float $x1, int|float $y1, int|float $x2, int|float $y2): Gd
57    {
58        if ($this->hasImage()) {
59            $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
60                $this->image->createColor($this->strokeColor, $this->opacity);
61
62            // Draw the line.
63            imagesetthickness($this->image->getResource(), (($this->strokeWidth == 0) ? 1 : $this->strokeWidth));
64            imageline($this->image->getResource(), $x1, $y1, $x2, $y2, $strokeColor);
65        }
66        return $this;
67    }
68
69    /**
70     * Draw a rectangle on the image.
71     *
72     * @param  int|float  $x
73     * @param  int|float  $y
74     * @param  int|float  $w
75     * @param  int|float|null $h
76     * @return Gd
77     */
78    public function rectangle(int|float $x, int|float $y, int|float $w, int|float|null $h = null): Gd
79    {
80        if ($this->hasImage()) {
81            $x2 = $x + $w;
82            $y2 = $y + (($h === null) ? $w : $h);
83
84            if ($this->fillColor !== null) {
85                $fillColor = ($this->image->isIndexed()) ? $this->image->createColor($this->fillColor) :
86                    $this->image->createColor($this->fillColor, $this->opacity);
87
88                imagefilledrectangle($this->image->getResource(), (int)$x, (int)$y, (int)$x2, (int)$y2, $fillColor);
89            }
90
91            if ($this->strokeWidth > 0) {
92                $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
93                    $this->image->createColor($this->strokeColor, $this->opacity);
94                imagesetthickness($this->image->getResource(), $this->strokeWidth);
95                imagerectangle($this->image->getResource(), $x, $y, $x2, $y2, $strokeColor);
96            }
97        }
98
99        return $this;
100    }
101
102    /**
103     * Draw a square on the image.
104     *
105     * @param  int|float $x
106     * @param  int|float $y
107     * @param  int|float $w
108     * @return Gd
109     */
110    public function square(int|float $x, int|float $y, int|float $w): Gd
111    {
112        return $this->rectangle($x, $y, $w, $w);
113    }
114
115    /**
116     * Draw an ellipse on the image.
117     *
118     * @param  int|float  $x
119     * @param  int|float  $y
120     * @param  int|float  $w
121     * @param  int|float|null $h
122     * @return Gd
123     */
124    public function ellipse(int|float $x, int|float $y, int|float $w, int|float|null $h = null): Gd
125    {
126        if ($this->hasImage()) {
127            $wid = $w;
128            $hgt = ($h === null) ? $w : $h;
129
130            if ($this->fillColor !== null) {
131                $fillColor = ($this->image->isIndexed()) ? $this->image->createColor($this->fillColor) :
132                    $this->image->createColor($this->fillColor, $this->opacity);
133                imagefilledellipse($this->image->getResource(), $x, $y, $wid, $hgt, $fillColor);
134            }
135
136            if ($this->strokeWidth > 0) {
137                $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
138                    $this->image->createColor($this->strokeColor, $this->opacity);
139
140                imageellipse($this->image->getResource(), $x, $y, ($wid + $this->strokeWidth), ($hgt + $this->strokeWidth), $strokeColor);
141            }
142        }
143
144        return $this;
145    }
146
147    /**
148     * Method to add a circle to the image.
149     *
150     * @param  int|float $x
151     * @param  int|float $y
152     * @param  int|float $w
153     * @return Gd
154     */
155    public function circle(int|float $x, int|float $y, int|float $w): Gd
156    {
157        return $this->ellipse($x, $y, $w, $w);
158    }
159
160    /**
161     * Draw an arc on the image.
162     *
163     * @param  int|float      $x
164     * @param  int|float      $y
165     * @param  int|float      $start
166     * @param  int|float      $end
167     * @param  int|float      $w
168     * @param  int|float|null $h
169     * @return Gd
170     */
171    public function arc(int|float $x, int|float $y, int|float $start, int|float $end, int|float $w, int|float|null $h = null): Gd
172    {
173        if ($this->hasImage()) {
174            if ($this->strokeWidth == 0) {
175                $this->setStrokeWidth(1);
176            }
177
178            $wid = $w;
179            $hgt = ($h === null) ? $w : $h;
180
181            $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
182                $this->image->createColor($this->strokeColor, $this->opacity);
183
184            imagesetthickness($this->image->getResource(), $this->strokeWidth);
185            imagearc($this->image->getResource(), $x, $y, $wid, $hgt, $start, $end, $strokeColor);
186        }
187
188        return $this;
189    }
190
191    /**
192     * Draw a chord on the image.
193     *
194     * @param  int|float      $x
195     * @param  int|float      $y
196     * @param  int|float      $start
197     * @param  int|float      $end
198     * @param  int|float      $w
199     * @param  int|float|null $h
200     * @return Gd
201     */
202    public function chord(int|float $x, int|float $y, int|float $start, int|float $end, int|float $w, int|float|null $h = null): Gd
203    {
204        if ($this->hasImage()) {
205            $wid = $w;
206            $hgt = ($h === null) ? $w : $h;
207
208            if ($this->fillColor !== null) {
209                $fillColor = ($this->image->isIndexed()) ? $this->image->createColor($this->fillColor) :
210                    $this->image->createColor($this->fillColor, $this->opacity);
211                imagefilledarc($this->image->getResource(), $x, $y, $wid, $hgt, $start, $end, $fillColor, IMG_ARC_CHORD);
212            }
213
214            if ($this->strokeWidth > 0) {
215                $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
216                    $this->image->createColor($this->strokeColor, $this->opacity);
217
218                imagesetthickness($this->image->getResource(), $this->strokeWidth);
219                imagefilledarc(
220                    $this->image->getResource(), $x, $y, $wid, $hgt, $start, $end, $strokeColor, IMG_ARC_EDGED | IMG_ARC_CHORD | IMG_ARC_NOFILL
221                );
222            }
223        }
224
225        return $this;
226    }
227
228    /**
229     * Draw a slice on the image.
230     *
231     * @param  int|float      $x
232     * @param  int|float      $y
233     * @param  int|float      $start
234     * @param  int|float      $end
235     * @param  int|float      $w
236     * @param  int|float|null $h
237     * @return Gd
238     */
239    public function pie(int|float $x, int|float $y, int|float $start, int|float $end, int|float $w, int|float|null $h = null): Gd
240    {
241        if ($this->hasImage()) {
242            $wid = $w;
243            $hgt = ($h === null) ? $w : $h;
244
245            if ($this->fillColor !== null) {
246                $fillColor = ($this->image->isIndexed()) ? $this->image->createColor($this->fillColor) :
247                    $this->image->createColor($this->fillColor, $this->opacity);
248                imagefilledarc($this->image->getResource(), $x, $y, $wid, $hgt, $start, $end, $fillColor, IMG_ARC_PIE);
249            }
250
251            if ($this->strokeWidth > 0) {
252                $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
253                    $this->image->createColor($this->strokeColor, $this->opacity);
254
255                imagesetthickness($this->image->getResource(), $this->strokeWidth);
256                imagefilledarc(
257                    $this->image->getResource(), $x, $y, $wid, $hgt, $start, $end, $strokeColor, IMG_ARC_EDGED | IMG_ARC_PIE | IMG_ARC_NOFILL
258                );
259            }
260        }
261
262        return $this;
263    }
264
265    /**
266     * Draw a polygon on the image.
267     *
268     * @param  array   $points
269     * @return Gd
270     */
271    public function polygon(array $points): Gd
272    {
273        if ($this->hasImage()) {
274            $realPoints = [];
275            foreach ($points as $coord) {
276                if (isset($coord['x']) && isset($coord['y'])) {
277                    $realPoints[] = $coord['x'];
278                    $realPoints[] = $coord['y'];
279                }
280            }
281
282            if ($this->fillColor !== null) {
283                $fillColor = ($this->image->isIndexed()) ? $this->image->createColor($this->fillColor) :
284                    $this->image->createColor($this->fillColor, $this->opacity);
285                imagefilledpolygon($this->image->getResource(), $realPoints, $fillColor);
286            }
287
288            if ($this->strokeWidth > 0) {
289                $strokeColor = ($this->image->isIndexed()) ? $this->image->createColor($this->strokeColor) :
290                    $this->image->createColor($this->strokeColor, $this->opacity);
291
292                imagesetthickness($this->image->getResource(), $this->strokeWidth);
293                imagepolygon($this->image->getResource(), $realPoints, $strokeColor);
294            }
295        }
296
297        return $this;
298    }
299
300}