Completed
Pull Request — master (#62)
by Roberto
04:31
created

Graphics::getRasterImage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
ccs 5
cts 5
cp 1
rs 9.4285
cc 1
eloc 5
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Posprint\Graphics;
4
5
/**
6
 * Classe Graphics
7
 *
8
 * @category  NFePHP
9
 * @package   Posprint
10
 * @copyright Copyright (c) 2016
11
 * @license   http://www.gnu.org/licenses/lesser.html LGPL v3
12
 * @author    Roberto L. Machado <linux dot rlm at gmail dot com>
13
 * @link      http://github.com/nfephp-org/posprint for the canonical source repository
14
 */
15
16
use Posprint\Graphics\Basic;
17
use Endroid\QrCode\QrCode;
18
use RuntimeException;
19
use InvalidArgumentException;
20
21
class Graphics extends Basic
22
{
23
    /**
24
     * Image prixels in BW
25
     *
26
     * @var string
27
     */
28
    protected $imgData = null;
29
    /**
30
     * Image Raster bit
31
     *
32
     * @var string
33
     */
34
    protected $imgRasterData = null;
35
  
36
    /**
37
     * Constructor
38
     * Load a image, if passed a path to file and adjust dimentions
39
     *
40
     * @param  string $filename
41
     * @param  int    $width
42
     * @param  int    $height
43
     * @throws RuntimeException
44
     */
45 12
    public function __construct($filename = null, $width = null, $height = null)
46
    {
47 12
        if (! $this->isGdSupported()) {
48
            throw new RuntimeException("GD module not found.");
49
        }
50 12
        $this->imgHeight = 0;
51 12
        $this->imgWidth = 0;
52 12
        $this->imgData = null;
53 12
        $this->imgRasterData = null;
54
        // Load the image, if the patch was passed
55 12
        if (! is_null($filename)) {
56 9
            $this->load($filename, $width, $height);
57 7
        }
58 10
    }
59
    
60
    /**
61
     * Return a string of bytes
62
     * for inclusion on printer commands
63
     * This method change image to Black and White and
64
     * reducing the color resolution of 1 bit per pixel
65
     *
66
     * @return string
67
     */
68 2
    public function getRasterImage()
69
    {
70 2
        $this->resizeImage($this->imgWidth);
71 2
        $this->convertPixelBW();
72 2
        $this->convertRaster();
73 2
        return $this->imgRasterData;
74
    }
75
76
    /**
77
     * load
78
     * Load image file and adjust dimentions
79
     *
80
     * @param  string $filename path to image file
81
     * @param  float  $width
82
     * @param  float  $height
83
     * @throws InvalidArgumentException
84
     * @throws RuntimeException
85
     */
86 9
    public function load($filename, $width = null, $height = null)
87
    {
88 9
        if (! is_file($filename)) {
89 1
            throw new InvalidArgumentException("Image file not found.");
90
        }
91 8
        if (! is_readable($filename)) {
92
            throw new RuntimeException("The file can not be read due to lack of permissions.");
93
        }
94
        //identify type of image and load with GD
95 8
        $tipo = $this->identifyImg($filename);
96 8
        if ($tipo == 'BMP') {
97
            $img = $this->loadBMP($filename);
98
            if ($img === false) {
99
                throw new InvalidArgumentException("Image file is not a BMP");
100
            }
101
        } else {
102 8
            $func = 'imagecreatefrom' . strtolower($tipo);
103 8
            if (! function_exists($func)) {
104 1
                throw new RuntimeException("It is not possible to use or handle this type of image with GD");
105
            }
106 7
            $this->img = $func($filename);
107
        }
108 7
        if (! $this->img) {
109
            throw new RuntimeException("Failed to load image '$filename'.");
110
        }
111
        //get image dimentions
112 7
        $this->getDimImage();
113 7
        if ($width != null || $height != null) {
114
            $this->resizeImage($width, $height);
115
        }
116 7
    }
117
    
118
    /**
119
     * Converts a true color image to Black and white
120
     * even if the image have transparency (alpha channel)
121
     */
122
    public function convertBW()
123
    {
124
        $newimg = imagecreatetruecolor($this->imgWidth, $this->imgHeight);
125
        imagealphablending($newimg, false);
126
        imagesavealpha($newimg, true);
127
        imagecopyresampled(
128
            $newimg,
129
            $this->img,
130
            0,
131
            0,
132
            0,
133
            0,
134
            $this->imgWidth,
135
            $this->imgHeight,
136
            $this->imgWidth,
137
            $this->imgHeight
138
        );
139
        $bcg = imagecolorallocate($newimg, 255, 255, 255);
140
        imagefill($newimg, 0, 0, $bcg);
141
        imagefilter($newimg, IMG_FILTER_GRAYSCALE);
142
        imagefilter($newimg, IMG_FILTER_CONTRAST, -1000);
143
        $this->img = $newimg;
144
    }
145
    
146
    /**
147
     * Save image to file
148
     *
149
     * @param string $filename
150
     * @param string $type  PNG, JPG, GIF, BMP
151
     * @param integer $quality 0 - 100 default 75
152
     * @return boolean
153
     */
154 4
    public function save($filename = null, $type = 'PNG', $quality = 75)
155
    {
156 4
        $type = strtoupper($type);
157 4
        if ($type == 'BMP') {
158 2
            $this->saveBMP($filename);
159 1
            return true;
160
        }
161 2
        $aTypes = ['PNG', 'JPG', 'JPEG',  'GIF'];
162 2
        if (! in_array($type, $aTypes)) {
163
            throw InvalidArgumentException('This file type is not supported.');
164
        }
165 2
        return $this->saveImage($filename, $this->img, $type, $quality);
166
    }
167
    
168
    /**
169
     * resizeImage
170
     * Resize an image
171
     * NOTE: the width is always set to the multiple of 8 more
172
     * next, why? printers have a resolution of 8 dots per mm
173
     *
174
     * @param  float $width
175
     * @param  float $height
176
     * @throws InvalidArgumentException
177
     */
178 3
    public function resizeImage($width = null, $height = null)
179
    {
180 3
        if ($width == null && $height == null) {
181 1
            throw new InvalidArgumentException("No dimensions was passed.");
182
        }
183 2
        if ($width != null) {
184 1
            $width = $this->closestMultiple($width);
185 1
            $razao = $width / $this->imgWidth;
186 1
            $height = (int) round($razao * $this->imgHeight);
187 2
        } elseif ($width == null && $height != null) {
188 1
            $razao = $height / $this->imgHeight;
189 1
            $width = (int) round($razao * $this->imgWidth);
190 1
            $width = $this->closestMultiple($width);
191 1
        }
192 2
        $tempimg = imagecreatetruecolor($width, $height);
193 2
        imagecopyresampled($tempimg, $this->img, 0, 0, 0, 0, $width, $height, $this->imgWidth, $this->imgHeight);
194 2
        $this->img = $tempimg;
195 2
        $this->getDimImage();
196 2
    }
197
    
198
    /**
199
     * Creates a  GD QRCode image
200
     *
201
     * @param string $dataText
202
     * @param int    $width
203
     * @param int    $padding
204
     * @param string $errCorretion  LOW, MEDIUM, QUARTILE, HIGH
205
     * @return void
206
     */
207 1
    public function imageQRCode(
208
        $dataText = 'NADA NADA NADA NADA NADA NADA NADA NADA NADA NADA NADA NADA',
209
        $width = 200,
210
        $padding = 10,
211
        $errCorretion = 'MEDIUM'
212
    ) {
213
        //adjust width for a closest multiple of 8
214 1
        $width = $this->closestMultiple($width, 8);
215 1
        $qrCode = new QrCode();
216 1
        $qrCode->setText($dataText)
217 1
            ->setImageType('png')
218 1
            ->setSize($width)
219 1
            ->setPadding($padding)
220 1
            ->setErrorCorrection($errCorretion)
221 1
            ->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0))
222 1
            ->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0))
223 1
            ->setLabel('')
224 1
            ->setLabelFontSize(8);
225 1
        $this->img = $qrCode->getImage();
226 1
        $this->getDimImage();
227 1
    }
228
    
229
    /**
230
     * loadBMP
231
     * Create a GD image from BMP file
232
     *
233
     * @param  string $filename
234
     * @return boolean
235
     */
236 1
    protected function loadBMP($filename)
237
    {
238
        //open file as binary
239 1
        if (! $f1 = fopen($filename, "rb")) {
240
            throw InvalidArgumentException('Can not open file.');
241
        }
242
        //get properties from image file
243 1
        $file = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14));
244 1
        if ($file['file_type'] != 19778) {
245
            throw InvalidArgumentException('This file is not a BMP image.');
246
        }
247
        //get properties form image
248 1
        $bmp = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel'.
249 1
           '/Vcompression/Vsize_bitmap/Vhoriz_resolution'.
250 1
           '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40));
251
        //check deep of colors
252 1
        $bmp['colors'] = pow(2, $bmp['bits_per_pixel']);
253 1
        if ($bmp['size_bitmap'] == 0) {
254 1
            $bmp['size_bitmap'] = $file['file_size'] - $file['bitmap_offset'];
255 1
        }
256 1
        $bmp['bytes_per_pixel'] = $bmp['bits_per_pixel']/8;
257 1
        $bmp['bytes_per_pixel2'] = ceil($bmp['bytes_per_pixel']);
258 1
        $bmp['decal'] = ($bmp['width']*$bmp['bytes_per_pixel']/4);
259 1
        $bmp['decal'] -= floor($bmp['width']*$bmp['bytes_per_pixel']/4);
260 1
        $bmp['decal'] = 4-(4*$bmp['decal']);
261 1
        if ($bmp['decal'] == 4) {
262
            $bmp['decal'] = 0;
263
        }
264 1
        $palette = array();
265 1
        if ($bmp['colors'] < 16777216) {
266
            $palette = unpack('V'.$bmp['colors'], fread($f1, $bmp['colors']*4));
267
        }
268
        //read all data form image but not the header
269 1
        $img = fread($f1, $bmp['size_bitmap']);
270 1
        fclose($f1);
271
        //create a true color GD resource
272 1
        $vide = chr(0);
273 1
        $res = imagecreatetruecolor($bmp['width'], $bmp['height']);
274 1
        $p = 0;
275 1
        $y = $bmp['height']-1;
276
        //read all bytes form original file
277 1
        while ($y >= 0) {
278 1
            $x=0;
279 1
            while ($x < $bmp['width']) {
280
                //get byte color from BMP
281 1
                $color = $this->getBMPColor($bmp['bits_per_pixel'], $img, $vide, $p, $palette);
0 ignored issues
show
Documentation introduced by
$palette is of type array, but the function expects a integer.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
282 1
                if ($color === false) {
283
                    throw RuntimeException('Fail during conversion from BMP number bit per pixel incorrect!');
284
                }
285 1
                imagesetpixel($res, $x, $y, $color[1]);
286 1
                $x++;
287 1
                $p += $bmp['bytes_per_pixel'];
288 1
            }
289 1
            $y--;
290 1
            $p += $bmp['decal'];
291 1
        }
292 1
        $this->img = $res;
293 1
        return true;
294
    }
295
296
    /**
297
     * Convert a GD image into a BMP string representation
298
     *
299
     * @param string $filename
300
     * @return string
301
     */
302 2
    protected function saveBMP($filename = null)
303
    {
304 2
        if (! is_resource($this->img)) {
305
            return '';
306
        }
307
        //to remove alpha color and put white instead
308 2
        $img = $this->img;
309 2
        $imageX = imagesx($img);
310 2
        $imageY = imagesy($img);
311 2
        $bmp = '';
312 2
        for ($yInd = ($imageY - 1); $yInd >= 0; $yInd--) {
313 2
            $thisline = '';
314 2
            for ($xInd = 0; $xInd < $imageX; $xInd++) {
315 2
                $argb = self::getPixelColor($img, $xInd, $yInd);
316 2
                $thisline .= chr($argb['blue']).chr($argb['green']).chr($argb['red']);
317 2
            }
318 2
            while (strlen($thisline) % 4) {
319 2
                $thisline .= "\x00";
320 2
            }
321 2
            $bmp .= $thisline;
322 2
        }
323 2
        $bmpSize = strlen($bmp) + 14 + 40;
324
        // bitMapHeader [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp
325 2
        $bitMapHeader  = 'BM'; // WORD bfType;
326 2
        $bitMapHeader .= self::littleEndian2String($bmpSize, 4); // DWORD bfSize;
327 2
        $bitMapHeader .= self::littleEndian2String(0, 2); // WORD bfReserved1;
328 2
        $bitMapHeader .= self::littleEndian2String(0, 2); // WORD bfReserved2;
329 2
        $bitMapHeader .= self::littleEndian2String(54, 4); // DWORD bfOffBits;
330
        // bitMapInfoHeader - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp
331 2
        $bitMapInfoHeader  = self::littleEndian2String(40, 4); // DWORD biSize;
332 2
        $bitMapInfoHeader .= self::littleEndian2String($imageX, 4); // LONG biWidth;
333 2
        $bitMapInfoHeader .= self::littleEndian2String($imageY, 4); // LONG biHeight;
334 2
        $bitMapInfoHeader .= self::littleEndian2String(1, 2); // WORD biPlanes;
335 2
        $bitMapInfoHeader .= self::littleEndian2String(24, 2); // WORD biBitCount;
336 2
        $bitMapInfoHeader .= self::littleEndian2String(0, 4); // DWORD biCompression;
337 2
        $bitMapInfoHeader .= self::littleEndian2String(0, 4); // DWORD biSizeImage;
338 2
        $bitMapInfoHeader .= self::littleEndian2String(2835, 4); // LONG biXPelsPerMeter;
339 2
        $bitMapInfoHeader .= self::littleEndian2String(2835, 4); // LONG biYPelsPerMeter;
340 2
        $bitMapInfoHeader .= self::littleEndian2String(0, 4); // DWORD biClrUsed;
341 2
        $bitMapInfoHeader .= self::littleEndian2String(0, 4); // DWORD biClrImportant;
342 2
        $data = $bitMapHeader.$bitMapInfoHeader.$bmp;
343 2
        $this->saveImage($filename, $data);
344 1
        return $data;
345
    }
346
    
347
    /**
348
     * Convert image from GD resource
349
     * into Black and White pixels image
350
     *
351
     * @return string Representation of bytes image in BW
352
     */
353 1
    protected function convertPixelBW()
354
    {
355
        // Make a string of 1's and 0's
356 1
        $this->imgData = str_repeat("\0", $this->imgHeight * $this->imgWidth);
357 1
        for ($yInd = 0; $yInd < $this->imgHeight; $yInd++) {
358 1
            for ($xInd = 0; $xInd < $this->imgWidth; $xInd++) {
359
                //get colors from byte image
360 1
                $cols = imagecolorsforindex($this->img, imagecolorat($this->img, $xInd, $yInd));
361
                //convert to greyness color 1 for white, 0 for black
362 1
                $greyness = (int)(($cols['red'] + $cols['green'] + $cols['blue']) / 3) >> 7;
363
                //switch to Black and white
364
                //1 for black, 0 for white, taking into account transparency color
365 1
                $black = (1 - $greyness) >> ($cols['alpha'] >> 6);
366 1
                $this->imgData[$yInd * $this->imgWidth + $xInd] = $black;
367 1
            }
368 1
        }
369 1
        return $this->imgData;
370
    }
371
372
    /**
373
     * Output the image in raster (row) format.
374
     * This can result in padding on the right of the image,
375
     * if its width is not divisible by 8.
376
     *
377
     * @throws RuntimeException Where the generated data is
378
     *         unsuitable for the printer (indicates a bug or oversized image).
379
     * @return string The image in raster format.
380
     */
381 2
    protected function convertRaster()
382
    {
383 2
        if (! is_null($this->imgRasterData)) {
384 1
             return $this->imgRasterData;
385
        }
386 2
        if (is_null($this->imgData)) {
387
            $this->convertPixelBW();
388
        }
389
        //get width in Pixels
390 2
        $widthPixels = $this->getWidth();
391
        //get heightin in Pixels
392 2
        $heightPixels = $this->getHeight();
393
        //get width in Bytes
394 2
        $widthBytes = $this->getWidthBytes();
395
        //initialize vars
396 2
        $xCount = $yCount = $bit = $byte = $byteVal = 0;
397
        //create a string for converted bytes
398 2
        $data = str_repeat("\0", $widthBytes * $heightPixels);
399 2
        if (strlen($data) == 0) {
400
            return $data;
401
        }
402
        /* Loop through and convert format */
403
        do {
404 2
            $byteVal |= (int) $this->imgData[$yCount * $widthPixels + $xCount] << (7 - $bit);
405 2
            $xCount++;
406 2
            $bit++;
407 2
            if ($xCount >= $widthPixels) {
408 2
                $xCount = 0;
409 2
                $yCount++;
410 2
                $bit = 8;
411 2
                if ($yCount >= $heightPixels) {
412 2
                    $data[$byte] = chr($byteVal);
413 2
                    break;
414
                }
415 2
            }
416 2
            if ($bit >= 8) {
417 2
                $data[$byte] = chr($byteVal);
418 2
                $byteVal = 0;
419 2
                $bit = 0;
420 2
                $byte++;
421 2
            }
422 2
        } while (true);
423 2
        if (strlen($data) != ($this->getWidthBytes() * $this->getHeight())) {
424
            throw new RuntimeException("Bug in " . __FUNCTION__ . ", wrong number of bytes.");
425
        }
426 2
         $this->imgRasterData = $data;
427 2
         return $this->imgRasterData;
428
    }
429
    
430
    /**
431
     * Save safety binary image file
432
     *
433
     * @param string               $filename
434
     * @param resource|string|null $data
435
     * @param string $type PNG, JPG, GIF, BMP
436
     * @param integer $quality
437
     * @return boolean
438
     * @throws InvalidArgumentException
439
     * @throws RuntimeException
440
     */
441 4
    protected function saveImage($filename = null, $data = null, $type = 'PNG', $quality = 75)
442
    {
443 4
        if (empty($filename) || empty($data)) {
444
            return false;
445
        }
446 4
        if (is_resource($data)) {
447
            //use GD to save image to file
448
            switch ($type) {
449 2
                case 'JPG':
450 2
                case 'JPEG':
451
                    $result = imagejpeg($data, $filename, $quality);
452
                    break;
453 2
                case 'GIF':
454
                    $result = imagegif($data, $filename);
455
                    break;
456 2
                default:
457 2
                    $result = imagepng($data, $filename);
458 2
                    break;
459 2
            }
460 2
            if (!$result) {
461
                throw new InvalidArgumentException("Fail to write in $filename.");
462
            }
463 2
            return true;
464
        }
465 2
        $handle = @fopen($filename, 'w');
466 2
        if (!is_resource($handle)) {
467 1
            throw new InvalidArgumentException("Cant open file $filename. Check permissions.");
468
        }
469 1
        $nbytes = fwrite($handle, $data);
470 1
        fclose($handle);
471 1
        if (!$nbytes) {
472
            throw new RuntimeException("Fail to write in $filename.");
473
        }
474 1
        return true;
475
    }
476
477
    /**
478
     * Get byte color form BMP
479
     *
480
     * @param integer $bpp bytes_per_pixel
481
     * @param string $img bytes read of file
482
     * @param string $vide
483
     * @param integer $p
484
     * @param integer $palette
485
     * @return integer|boolean
486
     */
487
    private function getBMPColor($bpp, $img, $vide, $p, $palette)
488
    {
489
        switch ($bpp) {
490
            case 24:
491
                return unpack("V", substr($img, $p, 3).$vide);
492
                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...
493
            case 16:
494
                $color = unpack("v", substr($img, $p, 2));
495
                $blue = ($color[1] & 0x001f) << 3;
496
                $green = ($color[1] & 0x07e0) >> 3;
497
                $red = ($color[1] & 0xf800) >> 8;
498
                $color[1] = $red * 65536 + $green * 256 + $blue;
499
                return $color;
500
                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...
501
            case 8:
502
                $color = unpack("n", $vide.substr($img, $p, 1));
503
                $color[1] = $palette[$color[1]+1];
504
                return $color;
505
                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...
506
            case 4:
507
                $color = unpack("n", $vide.substr($img, floor($p), 1));
508
                if (($p*2)%2 == 0) {
509
                    $color[1] = ($color[1] >> 4) ;
510
                } else {
511
                    $color[1] = ($color[1] & 0x0F);
512
                }
513
                $color[1] = $palette[$color[1]+1];
514
                return $color;
515
                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...
516
            case 1:
517
                $color = unpack("n", $vide.substr($img, floor($p), 1));
518
                if (($p*8)%8 == 0) {
519
                    $color[1] = $color[1]>>7;
520
                } elseif (($p*8)%8 == 1) {
521
                    $color[1] = ($color[1] & 0x40)>>6;
522
                } elseif (($p*8)%8 == 2) {
523
                    $color[1] = ($color[1] & 0x20)>>5;
524
                } elseif (($p*8)%8 == 3) {
525
                    $color[1] = ($color[1] & 0x10)>>4;
526
                } elseif (($P*8)%8 == 4) {
0 ignored issues
show
Bug introduced by
The variable $P does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
527
                    $color[1] = ($color[1] & 0x8)>>3;
528
                } elseif (($p*8)%8 == 5) {
529
                    $color[1] = ($color[1] & 0x4)>>2;
530
                } elseif (($p*8)%8 == 6) {
531
                    $color[1] = ($color[1] & 0x2)>>1;
532
                } elseif (($p*8)%8 == 7) {
533
                    $color[1] = ($color[1] & 0x1);
534
                }
535
                $color[1] = $palette[$color[1]+1];
536
                return $color;
537
                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...
538
            default:
539
                return false;
540
        }
541
    }
542
    
543
    /**
544
     * Converts Litte Endian Bytes do String
545
     *
546
     * @param  int $number
547
     * @param  int $minbytes
548
     * @return string
549
     */
550 2
    private static function littleEndian2String($number, $minbytes = 1)
551
    {
552 2
        $intstring = '';
553 2
        while ($number > 0) {
554 2
            $intstring = $intstring.chr($number & 255);
555 2
            $number >>= 8;
556 2
        }
557 2
        return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT);
558
    }
559
    
560
    /**
561
     * Get pixel colors
562
     *
563
     * @param  resource $img
564
     * @param  int      $x
565
     * @param  int      $y
566
     * @return array
567
     */
568 2
    private static function getPixelColor($img, $x, $y)
569
    {
570 2
        return imageColorsForIndex($img, imageColorAt($img, $x, $y));
571
    }
572
    
573
    /**
574
     * Ajusta o numero para o multiplo mais proximo de base
575
     *
576
     * @param  float $num
577
     * @param  int   $num
578
     * @return int
579
     */
580 3
    private function closestMultiple($num = 0, $base = 8)
581
    {
582 3
        $iNum = ceil($num);
583 3
        if (($iNum % $base) === 0) {
584 1
            return $iNum;
585
        }
586 2
        return round($num/$base) * $base;
587
    }
588
}
589