PieGraph::Stroke()   F
last analyzed

Complexity

Conditions 25
Paths 204

Size

Total Lines 164
Code Lines 92

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 57
CRAP Score 55.8185

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 25
eloc 92
c 1
b 0
f 0
nc 204
nop 1
dl 0
loc 164
ccs 57
cts 90
cp 0.6333
crap 55.8185
rs 3.2833

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * JPGraph v4.0.3
5
 */
6
7
namespace Amenadiel\JpGraph\Graph;
8
9 1
require_once __DIR__ . '/../config.inc.php';
10
11
use Amenadiel\JpGraph\Image;
12
use Amenadiel\JpGraph\Plot;
13
use Amenadiel\JpGraph\Text;
14
15
/**
16
 * @class PieGraph
17
 * // Description:
18
 */
19
class PieGraph extends Graph
20
{
21
    private $posx;
22
    private $posy;
23
    private $radius;
0 ignored issues
show
introduced by
The private property $radius is not used, and could be removed.
Loading history...
24
    private $legends = [];
0 ignored issues
show
introduced by
The private property $legends is not used, and could be removed.
Loading history...
25
    public $plots    = [];
26
    public $pieaa    = false;
27
28
    /**
29
     * CONSTRUCTOR.
30
     *
31
     * @param mixed $width
32
     * @param mixed $height
33
     * @param mixed $cachedName
34
     * @param mixed $timeout
35
     * @param mixed $inline
36
     */
37 3
    public function __construct($width = 300, $height = 200, $cachedName = '', $timeout = 0, $inline = 1)
38
    {
39 3
        parent::__construct($width, $height, $cachedName, $timeout, $inline);
40 3
        $this->posx = $width / 2;
41 3
        $this->posy = $height / 2;
42 3
        $this->SetColor([255, 255, 255]);
43
44 3
        if ($this->graph_theme) {
45 3
            $this->graph_theme->ApplyGraph($this);
46
        }
47 3
    }
48
49
    /**
50
     * PUBLIC METHODS.
51
     *
52
     * @param mixed $aObj
53
     */
54 3
    public function Add($aObj)
55
    {
56 3
        if (is_array($aObj) && safe_count($aObj) > 0) {
57
            $cl = $aObj[0];
58
        } else {
59 3
            $cl = $aObj;
60
        }
61
62 3
        if ($cl instanceof Text\Text) {
63
            $this->AddText($aObj);
64 3
        } elseif (($cl instanceof Plot\IconPlot)) {
65
            $this->AddIcon($aObj);
66
        } else {
67 3
            if (is_array($aObj)) {
68
                $n = safe_count($aObj);
69
                for ($i = 0; $i < $n; ++$i) {
70
                    //if ($aObj[$i]->theme) {
71
                    //    $this->ClearTheme();
72
                    //}
73
                    $this->plots[] = $aObj[$i];
74
                }
75
            } else {
76
                //if ($aObj->theme) {
77
                //    $this->ClearTheme();
78
                //}
79 3
                $this->plots[] = $aObj;
80
            }
81
        }
82
83 3
        if ($this->graph_theme) {
84 3
            $this->graph_theme->SetupPlot($aObj);
85 3
            if ($aObj->is_using_plot_theme) {
86 3
                $aObj->UsePlotThemeColors();
87
            }
88
        }
89 3
    }
90
91 3
    public function SetAntiAliasing($aFlg = true)
92
    {
93 3
        $this->pieaa = $aFlg;
94 3
    }
95
96 3
    public function SetColor($c)
97
    {
98 3
        $this->SetMarginColor($c);
99 3
    }
100
101
    public function DisplayCSIMAreas()
102
    {
103
        $csim = '';
104
        foreach ($this->plots as $p) {
105
            $csim .= $p->GetCSIMareas();
106
        }
107
108
        $csim .= $this->legend->GetCSIMareas();
109
        if (preg_match_all('/area shape="(\\w+)" coords="([0-9\\, ]+)"/', $csim, $coords)) {
110
            $this->img->SetColor($this->csimcolor);
111
            $n = safe_count($coords[0]);
112
            for ($i = 0; $i < $n; ++$i) {
113
                if ($coords[1][$i] == 'poly') {
114
                    preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/', $coords[2][$i], $pts);
115
                    $this->img->SetStartPoint($pts[1][count($pts[0]) - 1], $pts[2][count($pts[0]) - 1]);
116
                    $m = safe_count($pts[0]);
117
                    for ($j = 0; $j < $m; ++$j) {
118
                        $this->img->LineTo($pts[1][$j], $pts[2][$j]);
119
                    }
120
                } elseif ($coords[1][$i] == 'rect') {
121
                    $pts = preg_split('/,/', $coords[2][$i]);
122
                    $this->img->SetStartPoint($pts[0], $pts[1]);
123
                    $this->img->LineTo($pts[2], $pts[1]);
124
                    $this->img->LineTo($pts[2], $pts[3]);
125
                    $this->img->LineTo($pts[0], $pts[3]);
126
                    $this->img->LineTo($pts[0], $pts[1]);
127
                }
128
            }
129
        }
130
    }
131
132
    // Method description
133 3
    public function Stroke($aStrokeFileName = '')
134
    {
135
        // If the filename is the predefined value = '_csim_special_'
136
        // we assume that the call to stroke only needs to do enough
137
        // to correctly generate the CSIM maps.
138
        // We use this variable to skip things we don't strictly need
139
        // to do to generate the image map to improve performance
140
        // a best we can. Therefor you will see a lot of tests !$_csim in the
141
        // code below.
142 3
        $_csim = ($aStrokeFileName === _CSIM_SPECIALFILE);
143
144
        // If we are called the second time (perhaps the user has called GetHTMLImageMap()
145
        // himself then the legends have alsready been populated once in order to get the
146
        // CSIM coordinats. Since we do not want the legends to be populated a second time
147
        // we clear the legends
148 3
        $this->legend->Clear();
149
150
        // We need to know if we have stroked the plot in the
151
        // GetCSIMareas. Otherwise the CSIM hasn't been generated
152
        // and in the case of GetCSIM called before stroke to generate
153
        // CSIM without storing an image to disk GetCSIM must call Stroke.
154 3
        $this->iHasStroked = true;
155
156 3
        $n = safe_count($this->plots);
157
158 3
        if ($this->pieaa) {
159 3
            if (!$_csim) {
160 3
                if ($this->background_image != '') {
161
                    $this->StrokeFrameBackground();
162
                } else {
163 3
                    $this->StrokeFrame();
164 3
                    $this->StrokeBackgroundGrad();
165
                }
166
            }
167
168 3
            $w      = $this->img->width;
169 3
            $h      = $this->img->height;
170 3
            $oldimg = $this->img->img;
171
172 3
            $this->img->CreateImgCanvas(2 * $w, 2 * $h);
173
174 3
            $this->img->SetColor($this->margin_color);
175 3
            $this->img->FilledRectangle(0, 0, 2 * $w - 1, 2 * $h - 1);
176
177
            // Make all icons *2 i size since we will be scaling down the
178
            // imahe to do the anti aliasing
179 3
            $ni = safe_count($this->iIcons);
180 3
            for ($i = 0; $i < $ni; ++$i) {
181
                $this->iIcons[$i]->iScale *= 2;
182
                if ($this->iIcons[$i]->iX > 1) {
183
                    $this->iIcons[$i]->iX *= 2;
184
                }
185
186
                if ($this->iIcons[$i]->iY > 1) {
187
                    $this->iIcons[$i]->iY *= 2;
188
                }
189
            }
190
191 3
            $this->StrokeIcons();
192
193 3
            for ($i = 0; $i < $n; ++$i) {
194 3
                if ($this->plots[$i]->posx > 1) {
195
                    $this->plots[$i]->posx *= 2;
196
                }
197
198 3
                if ($this->plots[$i]->posy > 1) {
199
                    $this->plots[$i]->posy *= 2;
200
                }
201
202 3
                $this->plots[$i]->Stroke($this->img, 1);
203
204 3
                if ($this->plots[$i]->posx > 1) {
205
                    $this->plots[$i]->posx /= 2;
206
                }
207
208 3
                if ($this->plots[$i]->posy > 1) {
209
                    $this->plots[$i]->posy /= 2;
210
                }
211
            }
212
213 3
            $indent = $this->doframe ? ($this->frame_weight + ($this->doshadow ? $this->shadow_width : 0)) : 0;
214 3
            $indent += $this->framebevel ? $this->framebeveldepth + 1 : 0;
215 3
            $this->img->CopyCanvasH(
216 3
                $oldimg,
217 3
                $this->img->img,
218 3
                $indent,
219 3
                $indent,
220 3
                $indent,
221 3
                $indent,
222 3
                $w - 2 * $indent,
223 3
                $h - 2 * $indent,
224 3
                2 * ($w - $indent),
225 3
                2 * ($h - $indent)
226
            );
227
228 3
            $this->img->img    = $oldimg;
229 3
            $this->img->width  = $w;
230 3
            $this->img->height = $h;
231
232 3
            for ($i = 0; $i < $n; ++$i) {
233 3
                $this->plots[$i]->Stroke($this->img, 2); // Stroke labels
234 3
                $this->plots[$i]->Legend($this);
235
            }
236
        } else {
237
            if (!$_csim) {
238
                if ($this->background_image != '') {
239
                    $this->StrokeFrameBackground();
240
                } else {
241
                    $this->StrokeFrame();
242
                    $this->StrokeBackgroundGrad();
243
                }
244
            }
245
246
            $this->StrokeIcons();
247
248
            for ($i = 0; $i < $n; ++$i) {
249
                $this->plots[$i]->Stroke($this->img);
250
                $this->plots[$i]->Legend($this);
251
            }
252
        }
253
254 3
        $this->legend->Stroke($this->img);
255 3
        $this->footer->Stroke($this->img);
256 3
        $this->StrokeTitles();
257
258 3
        if (!$_csim) {
259
            // Stroke texts
260 3
            if ($this->texts != null) {
261
                $n = safe_count($this->texts);
262
                for ($i = 0; $i < $n; ++$i) {
263
                    $this->texts[$i]->Stroke($this->img);
264
                }
265
            }
266
267 3
            if (_JPG_DEBUG) {
268
                $this->DisplayCSIMAreas();
269
            }
270
271
            // Should we do any final image transformation
272 3
            if ($this->iImgTrans) {
273
                $tform          = new Image\ImgTrans($this->img->img);
274
                $this->img->img = $tform->Skew3D(
275
                    $this->iImgTransHorizon,
276
                    $this->iImgTransSkewDist,
277
                    $this->iImgTransDirection,
278
                    $this->iImgTransHighQ,
279
                    $this->iImgTransMinSize,
280
                    $this->iImgTransFillColor,
281
                    $this->iImgTransBorder
282
                );
283
            }
284
285
            // If the filename is given as the special "__handle"
286
            // then the image handler is returned and the image is NOT
287
            // streamed back
288 3
            if ($aStrokeFileName == _IMG_HANDLER) {
289
                return $this->img->img;
290
            }
291
            // Finally stream the generated picture
292 3
            $this->cache->PutAndStream(
293 3
                $this->img,
294 3
                $this->cache_name,
295 3
                $this->inline,
296 3
                $aStrokeFileName
297
            );
298
        }
299 3
    }
300
} // @class
301