Passed
Push — master ( 08b589...961b46 )
by Michael
08:46
created

ThumbsNails::resizeImage()   F

Complexity

Conditions 26
Paths 7336

Size

Total Lines 110
Code Lines 72

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 26
eloc 72
nc 7336
nop 0
dl 0
loc 110
rs 0
c 0
b 0
f 0

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
namespace XoopsModules\Wflinks;
4
5
/**
6
 * this is the image that will be return apon error
7
 */
8
9
use XoopsModules\Wflinks;
10
11
if (!\defined('_PATH')) {
12
    \define('_PATH', XOOPS_ROOT_PATH);
13
}
14
15
if (!\defined('DEFAULT_PATH')) {
16
    \define('DEFAULT_PATH', XOOPS_UPLOAD_URL . '/blank.gif');
17
}
18
19
/**
20
 * ThumbsNails
21
 *
22
 * @package
23
 * @author    John N
24
 * @copyright WF-Projects Copyright (c) 2005
25
 * @copyright Using this class without our permission or removing this notice voids the license agreement.
26
 * @access    public
27
 */
28
class ThumbsNails
29
{
30
    public $_img_name     = 'blank.gif';
31
    public $_img_path     = 'uploads';
32
    public $_img_savepath = 'thumbs';
33
34
    public $_source_path  = '';
35
    public $_save_path    = '';
36
    public $_source_url   = '';
37
    public $_source_image = '';
38
    public $_save_image   = '';
39
40
    public $_usethumbs       = 0;
41
    public $_image_type      = 'gd2';
42
    public $_return_fullpath = 0;
43
44
    public $img_width   = 100;
45
    public $img_height  = 100;
46
    public $img_quality = 100;
47
    public $img_update  = 1;
48
    public $img_aspect  = 1;
49
50
    /**
51
     * @access private
52
     */
53
    public $_img_info = [];
54
55
    /**
56
     * Constructor
57
     *
58
     * @param null $img_name
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $img_name is correct as it would always require null to be passed?
Loading history...
59
     * @param null $img_path
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $img_path is correct as it would always require null to be passed?
Loading history...
60
     * @param null $img_savepath
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $img_savepath is correct as it would always require null to be passed?
Loading history...
61
     *
62
     * @internal param string $_img_name
63
     * @internal param string $_img_path
64
     * @internal param string $_img_savepath
65
     */
66
    public function __construct($img_name = null, $img_path = null, $img_savepath = null)
67
    {
68
        if (!\preg_match("/\.(jpg|gif|png|jpeg)$/i", $img_name)) {
69
            //            return false;
70
        }
71
72
        /*
73
        * The actual image we will be processing
74
        */
75
        if (null !== $img_name) {
0 ignored issues
show
introduced by
The condition null !== $img_name is always false.
Loading history...
76
            $this->_img_name = \trim($img_name);
77
        }
78
79
        /*
80
        * The image path
81
        */
82
        if (null !== $img_path) {
0 ignored issues
show
introduced by
The condition null !== $img_path is always false.
Loading history...
83
            $this->_img_path = \trim($img_path);
84
        }
85
86
        /*
87
        * The image save path
88
        */
89
        if (null !== $img_savepath) {
0 ignored issues
show
introduced by
The condition null !== $img_savepath is always false.
Loading history...
90
            $this->_img_savepath = \trim($img_savepath);
91
        }
92
93
        $path_to_check = XOOPS_ROOT_PATH . "/$img_path/$img_savepath";
94
95
        if (!\is_dir($path_to_check)) {
96
            if (!mkdir($path_to_check, 0777) && !is_dir($path_to_check)) {
97
                //                return false;
98
            }
99
        }
100
        //        return null;
101
    }
102
103
    /**
104
     * WfThumbsNails::setUseThumbs()
105
     *
106
     * @param int $value
107
     */
108
    public function setUseThumbs($value = 1)
109
    {
110
        $this->_usethumbs = $value;
111
    }
112
113
    /**
114
     * WfThumbsNails::setImageType()
115
     *
116
     * @param string $value
117
     */
118
    public function setImageType($value = 'gd2')
119
    {
120
        $this->_image_type = $value;
121
    }
122
123
    /**
124
     * ThumbsNails::createThumb()
125
     *
126
     * @param int|null $img_width
127
     * @param int|null $img_height
128
     * @param int|null $img_quality
129
     * @param int|null $img_update
130
     * @param int|null $img_aspect
131
     *
132
     * @return bool|string
133
     */
134
    public function createThumb(
135
        $img_width = null,
136
        $img_height = null,
137
        $img_quality = null,
138
        $img_update = null,
139
        $img_aspect = null
140
    ) {
141
        $this->_source_path  = XOOPS_ROOT_PATH . "/{$this->_img_path}";
142
        $this->_save_path    = XOOPS_ROOT_PATH . "/{$this->_img_path}/{$this->_img_savepath}";
143
        $this->_source_url   = XOOPS_URL . "/{$this->_img_path}";
144
        $this->_source_image = "{$this->_source_path}/{$this->_img_name}";
145
146
        if (null !== $img_width) {
147
            $this->img_width = (int)$img_width;
148
        }
149
150
        if (null !== $img_height) {
151
            $this->img_height = (int)$img_height;
152
        }
153
154
        if (null !== $img_quality) {
155
            $this->img_quality = (int)$img_quality;
156
        }
157
158
        if (null !== $img_update) {
159
            $this->img_update = (int)$img_update;
160
        }
161
162
        if (null !== $img_aspect) {
163
            $this->img_aspect = (int)$img_aspect;
164
        }
165
166
        /**
167
         * Return false if we are not using thumb nails
168
         */
169
        if (!$this->isUsingThumbs()) {
170
            return $this->_source_url . '/' . $this->_img_name;
171
        }
172
        /**
173
         * Return false if the server does not have gd lib installed or activated
174
         */
175
        if (!$this->checkGdLibrary()) {
176
            return $this->_source_url . '/' . $this->_img_name;
177
        }
178
179
        /**
180
         * Return false if the paths to the file are wrong
181
         */
182
        if (!$this->checkPaths()) {
183
            return DEFAULT_PATH;
184
        }
185
186
        if (!$this->checkImage()) {
187
            return DEFAULT_PATH;
188
        }
189
190
        $image = $this->resizeImage();
191
        if (false === $image) {
192
            return DEFAULT_PATH;
193
        }
194
195
        return $image;
196
    }
197
198
    /**
199
     * @param $value
200
     */
201
    public function setImgName($value)
202
    {
203
        $this->_img_name = \trim($value);
204
    }
205
206
    /**
207
     * @param $value
208
     */
209
    public function setImgPath($value)
210
    {
211
        $this->_img_path = \trim($value);
212
    }
213
214
    /**
215
     * @param $value
216
     */
217
    public function setImgSavePath($value)
218
    {
219
        $this->_img_savepath = \trim($value);
220
    }
221
222
    /**
223
     * ThumbsNails::resizeImage()
224
     *
225
     * @return bool|string
226
     */
227
    public function resizeImage()
228
    {
229
        /** @var Wflinks\Helper $helper */
230
        $helper = Wflinks\Helper::getInstance();
231
232
        // $this->_img_info = info array to the image being resized
233
        // $this->_img_info[0] == width
234
        // $this->_img_info[1] == height
235
        // $this->_img_info[2] == is a flag indicating the type of the image: 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order)
236
        // $this->_img_info[3] == is a text string with the correct height="yyy" width="xxx" string that can be used directly in an IMG tag
237
        /**
238
         * Get image size and scale ratio
239
         */
240
        $scale = \min($this->img_width / $this->_img_info[0], $this->img_height / $this->_img_info[1]);
241
        /**
242
         * If the image is larger than the max shrink it
243
         */
244
        $newWidth  = $this->img_width;
245
        $newHeight = $this->img_height;
246
        if ($scale < 1 && 1 == $this->img_aspect) {
247
            $newWidth  = \floor($scale * $this->_img_info[0]);
248
            $newHeight = \floor($scale * $this->_img_info[1]);
249
        }
250
        $newWidth  = ($newWidth > $this->_img_info[0]) ? $this->_img_info[0] : $newWidth;
251
        $newHeight = ($newHeight > $this->_img_info[0]) ? $this->_img_info[0] : $newHeight;
252
253
        $savefile          = "{$newWidth}x{$newHeight}_{$this->_img_name}";
254
        $this->_save_image = "{$this->_save_path}/{$savefile}";
255
256
        if (0 == $this->img_update && \file_exists($this->_save_image)) {
257
            if (1 == $this->_return_fullpath) {
258
                return $this->_source_url . "/{$this->_img_savepath}/{$savefile}";
259
            }
260
261
            return "{$this->_img_savepath}/{$savefile}";
262
        }
263
264
        switch ($this->_image_type) {
265
            case 'im':
266
                if (!empty($helper->getConfig('path_magick')) && \is_dir($helper->getConfig('path_magick'))) {
267
                    if (\preg_match('#[A-Z]:|\\\\#Ai', __FILE__)) {
268
                        $cur_dir     = __DIR__;
269
                        $src_file_im = '"' . $cur_dir . '\\' . \str_replace('/', '\\', $this->_source_image) . '"';
0 ignored issues
show
Unused Code introduced by
The assignment to $src_file_im is dead and can be removed.
Loading history...
270
                        $new_file_im = '"' . $cur_dir . '\\' . \str_replace('/', '\\', $this->_save_image) . '"';
271
                    } else {
272
                        $src_file_im = \escapeshellarg($this->_source_image);
273
                        $new_file_im = \escapeshellarg($this->_save_image);
274
                    }
275
                    $magick_command = $helper->getConfig('path_magick') . '/convert -quality {$helper->getConfig("imagequality")} -antialias -sample {$newWidth}x{$newHeight} {$src_file_im} +profile "*" ' . \str_replace('\\', '/', $new_file_im) . '';
276
                    \passthru($magick_command);
277
278
                    return $this->_source_url . "/{$this->_img_savepath}/{$savefile}";
279
                }
280
281
                return false;
282
                break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
283
            case 'gd1':
284
            case 'gd2':
285
            default:
286
287
                $imageCreateFunction = (\function_exists('imagecreatetruecolor')
288
                                        && 'gd2' === $this->_image_type) ? 'imagecreatetruecolor' : 'imagecreate';
289
                $imageCopyfunction   = (\function_exists('imagecopyresampled')
290
                                        && 'gd2' === $this->_image_type) ? 'imagecopyresampled' : 'imagecopyresized';
291
292
                switch ($this->_img_info[2]) {
293
                    case 1:
294
                        // GIF image
295
                        $img     = \function_exists('imagecreatefromgif') ? \imagecreatefromgif($this->_source_image) : \imagecreatefrompng($this->_source_image);
296
                        $tmp_img = $imageCreateFunction($newWidth, $newHeight);
297
                        $imageCopyfunction($tmp_img, $img, 0, 0, 0, 0, $newWidth, $newHeight, $this->_img_info[0], $this->_img_info[1]);
298
                        if (\function_exists('imagegif')) {
299
                            \imagegif($tmp_img, $this->_save_image);
300
                        } else {
301
                            \imagepng($tmp_img, $this->_save_image);
302
                        }
303
                        \imagedestroy($tmp_img);
304
                        break;
305
                    case 2:
306
                        // echo $this->_save_image;
307
                        $img     = \function_exists('imagecreatefromjpeg') ? \imagecreatefromjpeg($this->_source_image) : \imagecreatefrompng($this->_source_image);
308
                        $tmp_img = $imageCreateFunction($newWidth, $newHeight);
309
                        $imageCopyfunction($tmp_img, $img, 0, 0, 0, 0, $newWidth, $newHeight, $this->_img_info[0], $this->_img_info[1]);
310
                        if (\function_exists('imagejpeg')) {
311
                            \imagejpeg($tmp_img, $this->_save_image, $this->img_quality);
312
                        } else {
313
                            \imagepng($tmp_img, $this->_save_image);
314
                        }
315
                        \imagedestroy($tmp_img);
316
                        break;
317
                    case 3:
318
                        // PNG image
319
                        $img     = \imagecreatefrompng($this->_source_image);
320
                        $tmp_img = $imageCreateFunction($newWidth, $newHeight);
321
                        $imageCopyfunction($tmp_img, $img, 0, 0, 0, 0, $newWidth, $newHeight, $this->_img_info[0], $this->_img_info[1]);
322
                        \imagepng($tmp_img, $this->_save_image);
323
                        \imagedestroy($tmp_img);
324
                        break;
325
                    default:
326
                        return false;
327
                }
328
                if (1 == $this->_return_fullpath) {
329
                    return $this->_source_url . "/{$this->_img_savepath}/{$savefile}";
330
                }
331
332
                return "{$this->_img_savepath}/{$savefile}";
333
                break;
334
        }
335
336
        return false;
0 ignored issues
show
Unused Code introduced by
return false is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
337
    }
338
339
    /**
340
     * ThumbsNails::checkPaths()
341
     *
342
     * @return bool
343
     */
344
    public function checkPaths()
345
    {
346
        if (\file_exists($this->_source_image) || \is_readable($this->_source_image)) {
347
            return true;
348
        }
349
        if (\is_dir($this->_save_image) || \is_writable($this->_save_image)) {
350
            return true;
351
        }
352
353
        return false;
354
    }
355
356
    /**
357
     * @return bool
358
     */
359
    public function checkImage()
360
    {
361
        $this->_img_info = \getimagesize($this->_source_image, $imageinfo);
362
        // if ( $this->_img_info[0] < $this->img_width && $this->_img_info[1] < $this->img_height )
363
        // return false;
364
        return !(null === $this->_img_info);
365
    }
366
367
    /**
368
     * wfsThumbs::checkGdLibrary()
369
     *
370
     * Private function
371
     *
372
     * @return array|false if gd lib not found on the system
373
     */
374
    public function checkGdLibrary()
375
    {
376
        if (!\extension_loaded('gd')) {
377
            return false;
378
        }
379
        $gdlib = \function_exists('gd_info');
0 ignored issues
show
Unused Code introduced by
The assignment to $gdlib is dead and can be removed.
Loading history...
380
        if (false === $gdlib = gd_info()) {
381
            return false;
382
        }
383
384
        return $gdlib;
385
    }
386
387
    /**
388
     * ThumbsNails::isUsingThumbs()
389
     *
390
     * @return bool
391
     */
392
    public function isUsingThumbs()
393
    {
394
        if ($this->_usethumbs) {
395
            return true;
396
        }
397
398
        return false;
399
    }
400
}
401