CGIF   F
last analyzed

Complexity

Total Complexity 67

Size/Duplication

Total Lines 372
Duplicated Lines 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 202
dl 0
loc 372
rs 3.04
c 4
b 0
f 0
wmc 67

12 Methods

Rating   Name   Duplication   Size   Complexity  
A ndword() 0 4 1
A dword() 0 4 1
D getPng() 0 96 18
A loaded() 0 3 1
C getGD_PixelPlotterVersion() 0 54 14
A comment() 0 3 1
A __construct() 0 6 1
F getBmp() 0 95 19
A loadFile() 0 28 6
A height() 0 3 1
A width() 0 3 1
A getSize() 0 16 3

How to fix   Complexity   

Complex Class

Complex classes like CGIF often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use CGIF, and based on these observations, apply Extract Interface, too.

1
<?php
2
///////////////////////////////////////////////////////////////////////////////////////////////////
3
// GIF Util - (C) 2003 Yamasoft (S/C)
4
// http://www.yamasoft.com
5
// All Rights Reserved
6
// This file can be freely copied, distributed, modified, updated by anyone under the only
7
// condition to leave the original address (Yamasoft, http://www.yamasoft.com) and this header.
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9
// <gif>  = gif_loadFile(filename, [index])
10
// <bool> = gif_getSize(<gif> or filename, &width, &height)
11
// <bool> = gif_outputAsPng(<gif>, filename, [bgColor])
12
// <bool> = gif_outputAsBmp(<gif>, filename, [bgcolor])
13
// <bool> = gif_outputAsJpeg(<gif>, filename, [bgcolor]) - use cjpeg if available otherwise uses GD
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15
// Original code by Fabien Ezber
16
// Modified by James Heinrich <[email protected]> for use in phpThumb() - December 10, 2003
17
// * Added function gif_loadFileToGDimageResource() - this returns a GD image resource
18
// * Modified gif_outputAsJpeg() to check if it's running under Windows, or if cjpeg is not
19
//   available, in which case it will attempt to output JPEG using GD functions
20
// * added @ error-suppression to two lines where it checks: if ($this->m_img->m_bTrans)
21
//   otherwise warnings are generated if error_reporting == E_ALL
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23
24
function gif_loadFile($lpszFileName, $iIndex = 0)
25
{
26
    $gif = new CGIF();
27
    if ($gif->loadFile($lpszFileName, $iIndex)) {
28
        return $gif;
29
    }
30
    return false;
31
}
32
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34
35
// Added by James Heinrich <[email protected]> - December 10, 2003
36
function gif_loadFileToGDimageResource($gifFilename, $bgColor = -1)
37
{
38
    if ($gif = gif_loadFile($gifFilename)) {
39
        if (!phpthumb_functions::FunctionIsDisabled('set_time_limit')) {
40
            // shouldn't take nearly this long
41
            set_time_limit(120);
42
        }
43
        // general strategy: convert raw data to PNG then convert PNG data to GD image resource
44
        $PNGdata = $gif->getPng($bgColor);
45
        if ($img = @imagecreatefromstring($PNGdata)) {
0 ignored issues
show
Bug introduced by
It seems like $PNGdata can also be of type false; however, parameter $image of imagecreatefromstring() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

45
        if ($img = @imagecreatefromstring(/** @scrutinizer ignore-type */ $PNGdata)) {
Loading history...
46
            // excellent - PNG image data successfully converted to GD image
47
            return $img;
48
        } elseif ($img = $gif->getGD_PixelPlotterVersion()) {
49
            // problem: imagecreatefromstring() didn't like the PNG image data.
50
            //   This has been known to happen in PHP v4.0.6
51
            // solution: take the raw image data and create a new GD image and plot
52
            //   pixel-by-pixel on the GD image. This is extremely slow, but it does
53
            //   work and a slow solution is better than no solution, right? :)
54
            return $img;
55
        }
56
    }
57
    return false;
58
}
59
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
62
function gif_outputAsBmp($gif, $lpszFileName, $bgColor = -1)
63
{
64
    if (!isset($gif) || (@get_class($gif) <> 'cgif') || !$gif->loaded() || ($lpszFileName == '')) {
65
        return false;
66
    }
67
68
    $fd = $gif->getBmp($bgColor);
69
    if (strlen($fd) <= 0) {
70
        return false;
71
    }
72
73
    if (!($fh = @fopen($lpszFileName, 'wb'))) {
74
        return false;
75
    }
76
    @fwrite($fh, $fd, strlen($fd));
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fwrite(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

76
    /** @scrutinizer ignore-unhandled */ @fwrite($fh, $fd, strlen($fd));

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
77
    @fflush($fh);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fflush(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

77
    /** @scrutinizer ignore-unhandled */ @fflush($fh);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
78
    @fclose($fh);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fclose(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

78
    /** @scrutinizer ignore-unhandled */ @fclose($fh);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
79
    return true;
80
}
81
82
///////////////////////////////////////////////////////////////////////////////////////////////////
83
84
function gif_outputAsPng($gif, $lpszFileName, $bgColor = -1)
85
{
86
    if (!isset($gif) || (@get_class($gif) <> 'cgif') || !$gif->loaded() || ($lpszFileName == '')) {
87
        return false;
88
    }
89
90
    $fd = $gif->getPng($bgColor);
91
    if (strlen($fd) <= 0) {
92
        return false;
93
    }
94
95
    if (!($fh = @fopen($lpszFileName, 'wb'))) {
96
        return false;
97
    }
98
    @fwrite($fh, $fd, strlen($fd));
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fwrite(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

98
    /** @scrutinizer ignore-unhandled */ @fwrite($fh, $fd, strlen($fd));

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
99
    @fflush($fh);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fflush(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

99
    /** @scrutinizer ignore-unhandled */ @fflush($fh);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
100
    @fclose($fh);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fclose(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

100
    /** @scrutinizer ignore-unhandled */ @fclose($fh);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
101
    return true;
102
}
103
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106
function gif_outputAsJpeg($gif, $lpszFileName, $bgColor = -1)
107
{
108
    // JPEG output that does not require cjpeg added by James Heinrich <[email protected]> - December 10, 2003
109
    if ((strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') && (file_exists('/usr/local/bin/cjpeg') || shell_exec('which cjpeg'))) {
110
        if (gif_outputAsBmp($gif, $lpszFileName . '.bmp', $bgColor)) {
111
            exec('cjpeg ' . $lpszFileName . '.bmp >' . $lpszFileName . ' 2>/dev/null');
112
            @unlink($lpszFileName . '.bmp');
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for unlink(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

112
            /** @scrutinizer ignore-unhandled */ @unlink($lpszFileName . '.bmp');

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
113
114
            if (@file_exists($lpszFileName)) {
115
                if (@filesize($lpszFileName) > 0) {
116
                    return true;
117
                }
118
119
                @unlink($lpszFileName);
120
            }
121
        }
122
    } else {
123
        // either Windows, or cjpeg not found in path
124
        if ($img = @imagecreatefromstring($gif->getPng($bgColor))) {
125
            if (@imagejpeg($img, $lpszFileName)) {
126
                return true;
127
            }
128
        }
129
    }
130
131
    return false;
132
}
133
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135
136
function gif_getSize($gif, &$width, &$height)
137
{
138
    if (isset($gif) && (@get_class($gif) == 'cgif') && $gif->loaded()) {
139
        $width  = $gif->width();
140
        $height = $gif->height();
141
    } elseif (@file_exists($gif)) {
142
        $myGIF = new CGIF();
143
        if (!$myGIF->getSize($gif, $width, $height)) {
144
            return false;
145
        }
146
    } else {
147
        return false;
148
    }
149
150
    return true;
151
}
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155
class CGIFLZW
156
{
157
    public $MAX_LZW_BITS;
158
    public $Fresh, $CodeSize, $SetCodeSize, $MaxCode, $MaxCodeSize, $FirstCode, $OldCode;
159
    public $ClearCode, $EndCode, $Next, $Vals, $Stack, $sp, $Buf, $CurBit, $LastBit, $Done, $LastByte;
160
    ///////////////////////////////////////////////////////////////////////////
161
162
    // CONSTRUCTOR
163
    public function __construct()
164
    {
165
        $this->MAX_LZW_BITS = 12;
166
        unset($this->Next);
167
        unset($this->Vals);
168
        unset($this->Stack);
169
        unset($this->Buf);
170
171
        $this->Next  = range(0, (1 << $this->MAX_LZW_BITS) - 1);
172
        $this->Vals  = range(0, (1 << $this->MAX_LZW_BITS) - 1);
173
        $this->Stack = range(0, (1 << ($this->MAX_LZW_BITS + 1)) - 1);
174
        $this->Buf   = range(0, 279);
175
    }
176
177
    ///////////////////////////////////////////////////////////////////////////
178
179
    public function deCompress($data, &$datLen)
180
    {
181
        $stLen  = strlen($data);
182
        $datLen = 0;
183
        $ret    = '';
184
185
        // INITIALIZATION
186
        $this->LZWCommand($data, true);
187
188
        while (($iIndex = $this->LZWCommand($data, false)) >= 0) {
189
            $ret .= chr($iIndex);
190
        }
191
192
        $datLen = $stLen - strlen($data);
193
194
        if ($iIndex != -2) {
195
            return false;
196
        }
197
198
        return $ret;
199
    }
200
201
    ///////////////////////////////////////////////////////////////////////////
202
203
    public function LZWCommand(&$data, $bInit)
204
    {
205
        if ($bInit) {
206
            $this->SetCodeSize = ord($data[0]);
207
            $data              = substr($data, 1);
208
209
            $this->CodeSize    = $this->SetCodeSize + 1;
210
            $this->ClearCode   = 1 << $this->SetCodeSize;
211
            $this->EndCode     = $this->ClearCode + 1;
212
            $this->MaxCode     = $this->ClearCode + 2;
213
            $this->MaxCodeSize = $this->ClearCode << 1;
214
215
            $this->GetCode($data, $bInit);
216
217
            $this->Fresh = 1;
218
            for ($i = 0; $i < $this->ClearCode; $i++) {
219
                $this->Next[$i] = 0;
220
                $this->Vals[$i] = $i;
221
            }
222
223
            for (; $i < (1 << $this->MAX_LZW_BITS); $i++) {
224
                $this->Next[$i] = 0;
225
                $this->Vals[$i] = 0;
226
            }
227
228
            $this->sp = 0;
229
            return 1;
230
        }
231
232
        if ($this->Fresh) {
233
            $this->Fresh = 0;
234
            do {
235
                $this->FirstCode = $this->GetCode($data, $bInit);
236
                $this->OldCode   = $this->FirstCode;
237
            } while ($this->FirstCode == $this->ClearCode);
238
239
            return $this->FirstCode;
240
        }
241
242
        if ($this->sp > 0) {
243
            $this->sp--;
244
            return $this->Stack[$this->sp];
245
        }
246
247
        while (($Code = $this->GetCode($data, $bInit)) >= 0) {
248
            if ($Code == $this->ClearCode) {
249
                for ($i = 0; $i < $this->ClearCode; $i++) {
250
                    $this->Next[$i] = 0;
251
                    $this->Vals[$i] = $i;
252
                }
253
254
                for (; $i < (1 << $this->MAX_LZW_BITS); $i++) {
255
                    $this->Next[$i] = 0;
256
                    $this->Vals[$i] = 0;
257
                }
258
259
                $this->CodeSize    = $this->SetCodeSize + 1;
260
                $this->MaxCodeSize = $this->ClearCode << 1;
261
                $this->MaxCode     = $this->ClearCode + 2;
262
                $this->sp          = 0;
263
                $this->FirstCode   = $this->GetCode($data, $bInit);
264
                $this->OldCode     = $this->FirstCode;
265
266
                return $this->FirstCode;
267
            }
268
269
            if ($Code == $this->EndCode) {
270
                return -2;
271
            }
272
273
            $InCode = $Code;
274
            if ($Code >= $this->MaxCode) {
275
                $this->Stack[$this->sp] = $this->FirstCode;
276
                $this->sp++;
277
                $Code = $this->OldCode;
278
            }
279
280
            while ($Code >= $this->ClearCode) {
281
                $this->Stack[$this->sp] = $this->Vals[$Code];
282
                $this->sp++;
283
284
                if ($Code == $this->Next[$Code]) // Circular table entry, big GIF Error!
285
                {
286
                    return -1;
287
                }
288
289
                $Code = $this->Next[$Code];
290
            }
291
292
            $this->FirstCode        = $this->Vals[$Code];
293
            $this->Stack[$this->sp] = $this->FirstCode;
294
            $this->sp++;
295
296
            if (($Code = $this->MaxCode) < (1 << $this->MAX_LZW_BITS)) {
297
                $this->Next[$Code] = $this->OldCode;
298
                $this->Vals[$Code] = $this->FirstCode;
299
                $this->MaxCode++;
300
301
                if (($this->MaxCode >= $this->MaxCodeSize) && ($this->MaxCodeSize < (1 << $this->MAX_LZW_BITS))) {
302
                    $this->MaxCodeSize *= 2;
303
                    $this->CodeSize++;
304
                }
305
            }
306
307
            $this->OldCode = $InCode;
308
            if ($this->sp > 0) {
309
                $this->sp--;
310
                return $this->Stack[$this->sp];
311
            }
312
        }
313
314
        return $Code;
315
    }
316
317
    ///////////////////////////////////////////////////////////////////////////
318
319
    public function GetCode(&$data, $bInit)
320
    {
321
        if ($bInit) {
322
            $this->CurBit   = 0;
323
            $this->LastBit  = 0;
324
            $this->Done     = 0;
325
            $this->LastByte = 2;
326
            return 1;
327
        }
328
329
        if (($this->CurBit + $this->CodeSize) >= $this->LastBit) {
330
            if ($this->Done) {
331
                if ($this->CurBit >= $this->LastBit) {
332
                    // Ran off the end of my bits
333
                    return 0;
334
                }
335
                return -1;
336
            }
337
338
            $this->Buf[0] = $this->Buf[$this->LastByte - 2];
339
            $this->Buf[1] = $this->Buf[$this->LastByte - 1];
340
341
            $Count = ord($data[0]);
342
            $data  = substr($data, 1);
343
344
            if ($Count) {
345
                for ($i = 0; $i < $Count; $i++) {
346
                    $this->Buf[2 + $i] = ord($data[$i]);
347
                }
348
                $data = substr($data, $Count);
349
            } else {
350
                $this->Done = 1;
351
            }
352
353
            $this->LastByte = 2 + $Count;
354
            $this->CurBit   = ($this->CurBit - $this->LastBit) + 16;
355
            $this->LastBit  = (2 + $Count) << 3;
356
        }
357
358
        $iRet = 0;
359
        for ($i = $this->CurBit, $j = 0; $j < $this->CodeSize; $i++, $j++) {
360
            $iRet |= (($this->Buf[(int)($i / 8)] & (1 << ($i % 8))) != 0) << $j;
361
        }
362
363
        $this->CurBit += $this->CodeSize;
364
        return $iRet;
365
    }
366
}
367
368
///////////////////////////////////////////////////////////////////////////////////////////////////
369
370
class CGIFCOLORTABLE
371
{
372
    public $m_nColors;
373
    public $m_arColors;
374
    ///////////////////////////////////////////////////////////////////////////
375
376
    // CONSTRUCTOR
377
    public function __construct()
378
    {
379
        unset($this->m_nColors);
380
        unset($this->m_arColors);
381
    }
382
383
    ///////////////////////////////////////////////////////////////////////////
384
385
    public function load($lpData, $num)
386
    {
387
        $this->m_nColors  = 0;
388
        $this->m_arColors = [];
389
390
        for ($i = 0; $i < $num; $i++) {
391
            $rgb = substr($lpData, $i * 3, 3);
392
            if (strlen($rgb) < 3) {
393
                return false;
394
            }
395
396
            $this->m_arColors[] = (ord($rgb[2]) << 16) + (ord($rgb[1]) << 8) + ord($rgb[0]);
397
            $this->m_nColors++;
398
        }
399
400
        return true;
401
    }
402
403
    ///////////////////////////////////////////////////////////////////////////
404
405
    public function toString()
406
    {
407
        $ret = '';
408
409
        for ($i = 0; $i < $this->m_nColors; $i++) {
410
            $ret .= chr($this->m_arColors[$i] & 0x000000FF) . // R
411
                    chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G
412
                    chr(($this->m_arColors[$i] & 0x00FF0000) >> 16);  // B
413
        }
414
415
        return $ret;
416
    }
417
418
    ///////////////////////////////////////////////////////////////////////////
419
420
    public function toRGBQuad()
421
    {
422
        $ret = '';
423
424
        for ($i = 0; $i < $this->m_nColors; $i++) {
425
            $ret .= chr(($this->m_arColors[$i] & 0x00FF0000) >> 16) . // B
426
                    chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G
427
                    chr($this->m_arColors[$i] & 0x000000FF) . // R
428
                    "\x00";
429
        }
430
431
        return $ret;
432
    }
433
434
    ///////////////////////////////////////////////////////////////////////////
435
436
    public function colorIndex($rgb)
437
    {
438
        $rgb = (int)$rgb & 0xFFFFFF;
439
        $r1  = ($rgb & 0x0000FF);
440
        $g1  = ($rgb & 0x00FF00) >> 8;
441
        $b1  = ($rgb & 0xFF0000) >> 16;
442
        $idx = -1;
443
        $dif = 0;
444
445
        for ($i = 0; $i < $this->m_nColors; $i++) {
446
            $r2 = ($this->m_arColors[$i] & 0x000000FF);
447
            $g2 = ($this->m_arColors[$i] & 0x0000FF00) >> 8;
448
            $b2 = ($this->m_arColors[$i] & 0x00FF0000) >> 16;
449
            $d  = abs($r2 - $r1) + abs($g2 - $g1) + abs($b2 - $b1);
450
451
            if (($idx == -1) || ($d < $dif)) {
452
                $idx = $i;
453
                $dif = $d;
454
            }
455
        }
456
457
        return $idx;
458
    }
459
}
460
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462
463
class CGIFFILEHEADER
464
{
465
    public $m_lpVer;
466
    public $m_nWidth;
467
    public $m_nHeight;
468
    public $m_bGlobalClr;
469
    public $m_nColorRes;
470
    public $m_bSorted;
471
    public $m_nTableSize;
472
    public $m_nBgColor;
473
    public $m_nPixelRatio;
474
    public $m_colorTable;
475
    ///////////////////////////////////////////////////////////////////////////
476
477
    // CONSTRUCTOR
478
    public function __construct()
479
    {
480
        unset($this->m_lpVer);
481
        unset($this->m_nWidth);
482
        unset($this->m_nHeight);
483
        unset($this->m_bGlobalClr);
484
        unset($this->m_nColorRes);
485
        unset($this->m_bSorted);
486
        unset($this->m_nTableSize);
487
        unset($this->m_nBgColor);
488
        unset($this->m_nPixelRatio);
489
        unset($this->m_colorTable);
490
    }
491
492
    ///////////////////////////////////////////////////////////////////////////
493
494
    public function load($lpData, &$hdrLen)
495
    {
496
        $hdrLen = 0;
497
498
        $this->m_lpVer = substr($lpData, 0, 6);
499
        if (($this->m_lpVer <> 'GIF87a') && ($this->m_lpVer <> 'GIF89a')) {
500
            return false;
501
        }
502
503
        $this->m_nWidth  = $this->w2i(substr($lpData, 6, 2));
504
        $this->m_nHeight = $this->w2i(substr($lpData, 8, 2));
505
        if (!$this->m_nWidth || !$this->m_nHeight) {
506
            return false;
507
        }
508
509
        $b                   = ord($lpData[10]);
510
        $this->m_bGlobalClr  = ($b & 0x80) ? true : false;
511
        $this->m_nColorRes   = ($b & 0x70) >> 4;
512
        $this->m_bSorted     = ($b & 0x08) ? true : false;
513
        $this->m_nTableSize  = 2 << ($b & 0x07);
514
        $this->m_nBgColor    = ord($lpData[11]);
515
        $this->m_nPixelRatio = ord($lpData[12]);
516
        $hdrLen              = 13;
517
518
        if ($this->m_bGlobalClr) {
519
            $this->m_colorTable = new CGIFCOLORTABLE();
520
            if (!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
521
                return false;
522
            }
523
            $hdrLen += 3 * $this->m_nTableSize;
524
        }
525
526
        return true;
527
    }
528
529
    ///////////////////////////////////////////////////////////////////////////
530
531
    public function w2i($str)
532
    {
533
        return ord($str[0]) + (ord($str[1]) << 8);
534
    }
535
}
536
537
///////////////////////////////////////////////////////////////////////////////////////////////////
538
539
class CGIFIMAGEHEADER
540
{
541
    public $m_nLeft;
542
    public $m_nTop;
543
    public $m_nWidth;
544
    public $m_nHeight;
545
    public $m_bLocalClr;
546
    public $m_bInterlace;
547
    public $m_bSorted;
548
    public $m_nTableSize;
549
    public $m_colorTable;
550
    ///////////////////////////////////////////////////////////////////////////
551
552
    // CONSTRUCTOR
553
    public function __construct()
554
    {
555
        unset($this->m_nLeft);
556
        unset($this->m_nTop);
557
        unset($this->m_nWidth);
558
        unset($this->m_nHeight);
559
        unset($this->m_bLocalClr);
560
        unset($this->m_bInterlace);
561
        unset($this->m_bSorted);
562
        unset($this->m_nTableSize);
563
        unset($this->m_colorTable);
564
    }
565
566
    ///////////////////////////////////////////////////////////////////////////
567
568
    public function load($lpData, &$hdrLen)
569
    {
570
        $hdrLen = 0;
571
572
        $this->m_nLeft   = $this->w2i(substr($lpData, 0, 2));
573
        $this->m_nTop    = $this->w2i(substr($lpData, 2, 2));
574
        $this->m_nWidth  = $this->w2i(substr($lpData, 4, 2));
575
        $this->m_nHeight = $this->w2i(substr($lpData, 6, 2));
576
577
        if (!$this->m_nWidth || !$this->m_nHeight) {
578
            return false;
579
        }
580
581
        $b                  = ord($lpData[8]);
582
        $this->m_bLocalClr  = ($b & 0x80) ? true : false;
583
        $this->m_bInterlace = ($b & 0x40) ? true : false;
584
        $this->m_bSorted    = ($b & 0x20) ? true : false;
585
        $this->m_nTableSize = 2 << ($b & 0x07);
586
        $hdrLen             = 9;
587
588
        if ($this->m_bLocalClr) {
589
            $this->m_colorTable = new CGIFCOLORTABLE();
590
            if (!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) {
591
                return false;
592
            }
593
            $hdrLen += 3 * $this->m_nTableSize;
594
        }
595
596
        return true;
597
    }
598
599
    ///////////////////////////////////////////////////////////////////////////
600
601
    public function w2i($str)
602
    {
603
        return ord($str[0]) + (ord($str[1]) << 8);
604
    }
605
}
606
607
///////////////////////////////////////////////////////////////////////////////////////////////////
608
609
class CGIFIMAGE
610
{
611
    public $m_disp;
612
    public $m_bUser;
613
    public $m_bTrans;
614
    public $m_nDelay;
615
    public $m_nTrans;
616
    public $m_lpComm;
617
    public $m_gih;
618
    public $m_data;
619
    public $m_lzw;
620
621
    ///////////////////////////////////////////////////////////////////////////
622
623
    public function __construct()
624
    {
625
        unset($this->m_disp);
626
        unset($this->m_bUser);
627
        unset($this->m_bTrans);
628
        unset($this->m_nDelay);
629
        unset($this->m_nTrans);
630
        unset($this->m_lpComm);
631
        unset($this->m_data);
632
        $this->m_gih = new CGIFIMAGEHEADER();
633
        $this->m_lzw = new CGIFLZW();
634
    }
635
636
    ///////////////////////////////////////////////////////////////////////////
637
638
    public function load($data, &$datLen)
639
    {
640
        $datLen = 0;
641
642
        while (true) {
643
            $b    = ord($data[0]);
644
            $data = substr($data, 1);
645
            $datLen++;
646
647
            switch ($b) {
648
                case 0x21: // Extension
649
                    if (!$this->skipExt($data, $len = 0)) {
0 ignored issues
show
Bug introduced by
$len = 0 cannot be passed to CGIFIMAGE::skipExt() as the parameter $extLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

649
                    if (!$this->skipExt($data, /** @scrutinizer ignore-type */ $len = 0)) {
Loading history...
650
                        return false;
651
                    }
652
                    $datLen += $len;
653
                    break;
654
655
                case 0x2C: // Image
656
                    // LOAD HEADER & COLOR TABLE
657
                    if (!$this->m_gih->load($data, $len = 0)) {
0 ignored issues
show
Bug introduced by
$len = 0 cannot be passed to CGIFIMAGEHEADER::load() as the parameter $hdrLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

657
                    if (!$this->m_gih->load($data, /** @scrutinizer ignore-type */ $len = 0)) {
Loading history...
658
                        return false;
659
                    }
660
                    $data   = substr($data, $len);
661
                    $datLen += $len;
662
663
                    // ALLOC BUFFER
664
                    if (!($this->m_data = $this->m_lzw->deCompress($data, $len = 0))) {
0 ignored issues
show
Bug introduced by
$len = 0 cannot be passed to CGIFLZW::deCompress() as the parameter $datLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

664
                    if (!($this->m_data = $this->m_lzw->deCompress($data, /** @scrutinizer ignore-type */ $len = 0))) {
Loading history...
665
                        return false;
666
                    }
667
                    $data   = substr($data, $len);
0 ignored issues
show
Unused Code introduced by
The assignment to $data is dead and can be removed.
Loading history...
668
                    $datLen += $len;
669
670
                    if ($this->m_gih->m_bInterlace) {
671
                        $this->deInterlace();
672
                    }
673
                    return true;
674
675
                case 0x3B: // EOF
676
                default:
677
                    return false;
678
            }
679
        }
680
        return false;
681
    }
682
683
    ///////////////////////////////////////////////////////////////////////////
684
685
    public function skipExt(&$data, &$extLen)
686
    {
687
        $extLen = 0;
688
689
        $b    = ord($data[0]);
690
        $data = substr($data, 1);
691
        $extLen++;
692
693
        switch ($b) {
694
            case 0xF9: // Graphic Control
695
                $b              = ord($data[1]);
696
                $this->m_disp   = ($b & 0x1C) >> 2;
697
                $this->m_bUser  = ($b & 0x02) ? true : false;
698
                $this->m_bTrans = ($b & 0x01) ? true : false;
699
                $this->m_nDelay = $this->w2i(substr($data, 2, 2));
700
                $this->m_nTrans = ord($data[4]);
701
                break;
702
703
            case 0xFE: // Comment
704
                $this->m_lpComm = substr($data, 1, ord($data[0]));
705
                break;
706
707
            case 0x01: // Plain text
708
                break;
709
710
            case 0xFF: // Application
711
                break;
712
        }
713
714
        // SKIP DEFAULT AS DEFS MAY CHANGE
715
        $b    = ord($data[0]);
716
        $data = substr($data, 1);
717
        $extLen++;
718
        while ($b > 0) {
719
            $data   = substr($data, $b);
720
            $extLen += $b;
721
            $b      = ord($data[0]);
722
            $data   = substr($data, 1);
723
            $extLen++;
724
        }
725
        return true;
726
    }
727
728
    ///////////////////////////////////////////////////////////////////////////
729
730
    public function w2i($str)
731
    {
732
        return ord($str[0]) + (ord($str[1]) << 8);
733
    }
734
735
    ///////////////////////////////////////////////////////////////////////////
736
737
    public function deInterlace()
738
    {
739
        $data = $this->m_data;
740
        $s    = 0;
741
        $y    = 0;
742
743
        for ($i = 0; $i < 4; $i++) {
744
            switch ($i) {
745
                case 0:
746
                    $s = 8;
747
                    $y = 0;
748
                    break;
749
750
                case 1:
751
                    $s = 8;
752
                    $y = 4;
753
                    break;
754
755
                case 2:
756
                    $s = 4;
757
                    $y = 2;
758
                    break;
759
760
                case 3:
761
                    $s = 2;
762
                    $y = 1;
763
                    break;
764
            }
765
766
            for (; $y < $this->m_gih->m_nHeight; $y += $s) {
767
                $lne          = substr($this->m_data, 0, $this->m_gih->m_nWidth);
768
                $this->m_data = substr($this->m_data, $this->m_gih->m_nWidth);
769
770
                $data = substr($data, 0, $y * $this->m_gih->m_nWidth) . $lne . substr($data, ($y + 1) * $this->m_gih->m_nWidth);
771
            }
772
        }
773
774
        $this->m_data = $data;
775
    }
776
}
777
778
///////////////////////////////////////////////////////////////////////////////////////////////////
779
780
class CGIF
781
{
782
    public $m_gfh;
783
    public $m_lpData;
784
    public $m_img;
785
    public $m_bLoaded;
786
    ///////////////////////////////////////////////////////////////////////////
787
788
    // CONSTRUCTOR
789
    public function __construct()
790
    {
791
        $this->m_gfh     = new CGIFFILEHEADER();
792
        $this->m_img     = new CGIFIMAGE();
793
        $this->m_lpData  = '';
794
        $this->m_bLoaded = false;
795
    }
796
797
    ///////////////////////////////////////////////////////////////////////////
798
799
    public function loadFile($lpszFileName, $iIndex)
800
    {
801
        if ($iIndex < 0) {
802
            return false;
803
        }
804
805
        // READ FILE
806
        if (!($fh = @fopen($lpszFileName, 'rb'))) {
807
            return false;
808
        }
809
        $this->m_lpData = @fread($fh, @filesize($lpszFileName));
0 ignored issues
show
Bug introduced by
It seems like @filesize($lpszFileName) can also be of type false; however, parameter $length of fread() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

809
        $this->m_lpData = @fread($fh, /** @scrutinizer ignore-type */ @filesize($lpszFileName));
Loading history...
810
        fclose($fh);
811
812
        // GET FILE HEADER
813
        if (!$this->m_gfh->load($this->m_lpData, $len = 0)) {
0 ignored issues
show
Bug introduced by
$len = 0 cannot be passed to CGIFFILEHEADER::load() as the parameter $hdrLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

813
        if (!$this->m_gfh->load($this->m_lpData, /** @scrutinizer ignore-type */ $len = 0)) {
Loading history...
814
            return false;
815
        }
816
        $this->m_lpData = substr($this->m_lpData, $len);
0 ignored issues
show
Bug introduced by
It seems like $this->m_lpData can also be of type false; however, parameter $string of substr() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

816
        $this->m_lpData = substr(/** @scrutinizer ignore-type */ $this->m_lpData, $len);
Loading history...
817
818
        do {
819
            if (!$this->m_img->load($this->m_lpData, $imgLen = 0)) {
0 ignored issues
show
Bug introduced by
$imgLen = 0 cannot be passed to CGIFIMAGE::load() as the parameter $datLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

819
            if (!$this->m_img->load($this->m_lpData, /** @scrutinizer ignore-type */ $imgLen = 0)) {
Loading history...
820
                return false;
821
            }
822
            $this->m_lpData = substr($this->m_lpData, $imgLen);
823
        } while ($iIndex-- > 0);
824
825
        $this->m_bLoaded = true;
826
        return true;
827
    }
828
829
    ///////////////////////////////////////////////////////////////////////////
830
831
    public function getSize($lpszFileName, &$width, &$height)
832
    {
833
        if (!($fh = @fopen($lpszFileName, 'rb'))) {
834
            return false;
835
        }
836
        $data = @fread($fh, @filesize($lpszFileName));
0 ignored issues
show
Bug introduced by
It seems like @filesize($lpszFileName) can also be of type false; however, parameter $length of fread() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

836
        $data = @fread($fh, /** @scrutinizer ignore-type */ @filesize($lpszFileName));
Loading history...
837
        @fclose($fh);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition for fclose(). This can introduce security issues, and is generally not recommended. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unhandled  annotation

837
        /** @scrutinizer ignore-unhandled */ @fclose($fh);

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
838
839
        $gfh = new CGIFFILEHEADER();
840
        if (!$gfh->load($data, $len = 0)) {
0 ignored issues
show
Bug introduced by
$len = 0 cannot be passed to CGIFFILEHEADER::load() as the parameter $hdrLen expects a reference. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

840
        if (!$gfh->load($data, /** @scrutinizer ignore-type */ $len = 0)) {
Loading history...
841
            return false;
842
        }
843
844
        $width  = $gfh->m_nWidth;
845
        $height = $gfh->m_nHeight;
846
        return true;
847
    }
848
849
    ///////////////////////////////////////////////////////////////////////////
850
851
    public function getBmp($bgColor)
852
    {
853
        $out = '';
854
855
        if (!$this->m_bLoaded) {
856
            return false;
857
        }
858
859
        // PREPARE COLOR TABLE (RGBQUADs)
860
        if ($this->m_img->m_gih->m_bLocalClr) {
861
            $nColors = $this->m_img->m_gih->m_nTableSize;
862
            $rgbq    = $this->m_img->m_gih->m_colorTable->toRGBQuad();
863
            if ($bgColor != -1) {
864
                $bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor);
865
            }
866
        } elseif ($this->m_gfh->m_bGlobalClr) {
867
            $nColors = $this->m_gfh->m_nTableSize;
868
            $rgbq    = $this->m_gfh->m_colorTable->toRGBQuad();
869
            if ($bgColor != -1) {
870
                $bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor);
871
            }
872
        } else {
873
            $nColors = 0;
874
            $rgbq    = '';
875
            $bgColor = -1;
876
        }
877
878
        // PREPARE BITMAP BITS
879
        $data = $this->m_img->m_data;
880
        $nPxl = ($this->m_gfh->m_nHeight - 1) * $this->m_gfh->m_nWidth;
881
        $bmp  = '';
882
        $nPad = ($this->m_gfh->m_nWidth % 4) ? 4 - ($this->m_gfh->m_nWidth % 4) : 0;
883
        for ($y = 0; $y < $this->m_gfh->m_nHeight; $y++) {
884
            for ($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) {
885
                if (($x >= $this->m_img->m_gih->m_nLeft)
886
                    && ($y >= $this->m_img->m_gih->m_nTop)
887
                    && ($x < ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth))
888
                    && ($y < ($this->m_img->m_gih->m_nTop + $this->m_img->m_gih->m_nHeight))) {
889
                    // PART OF IMAGE
890
                    if (@$this->m_img->m_bTrans && (ord($data[$nPxl]) == $this->m_img->m_nTrans)) {
891
                        // TRANSPARENT -> BACKGROUND
892
                        if ($bgColor == -1) {
893
                            $bmp .= chr($this->m_gfh->m_nBgColor);
894
                        } else {
895
                            $bmp .= chr($bgColor);
896
                        }
897
                    } else {
898
                        $bmp .= $data[$nPxl];
899
                    }
900
                } else {
901
                    // BACKGROUND
902
                    if ($bgColor == -1) {
903
                        $bmp .= chr($this->m_gfh->m_nBgColor);
904
                    } else {
905
                        $bmp .= chr($bgColor);
906
                    }
907
                }
908
            }
909
            $nPxl -= $this->m_gfh->m_nWidth << 1;
910
911
            // ADD PADDING
912
            for ($x = 0; $x < $nPad; $x++) {
913
                $bmp .= "\x00";
914
            }
915
        }
916
917
        // BITMAPFILEHEADER
918
        $out .= 'BM';
919
        $out .= $this->dword(14 + 40 + ($nColors << 2) + strlen($bmp));
920
        $out .= "\x00\x00";
921
        $out .= "\x00\x00";
922
        $out .= $this->dword(14 + 40 + ($nColors << 2));
923
924
        // BITMAPINFOHEADER
925
        $out .= $this->dword(40);
926
        $out .= $this->dword($this->m_gfh->m_nWidth);
927
        $out .= $this->dword($this->m_gfh->m_nHeight);
928
        $out .= "\x01\x00";
929
        $out .= "\x08\x00";
930
        $out .= "\x00\x00\x00\x00";
931
        $out .= "\x00\x00\x00\x00";
932
        $out .= "\x12\x0B\x00\x00";
933
        $out .= "\x12\x0B\x00\x00";
934
        $out .= $this->dword($nColors % 256);
935
        $out .= "\x00\x00\x00\x00";
936
937
        // COLOR TABLE
938
        if ($nColors > 0) {
939
            $out .= $rgbq;
940
        }
941
942
        // DATA
943
        $out .= $bmp;
944
945
        return $out;
946
    }
947
948
    ///////////////////////////////////////////////////////////////////////////
949
950
    public function getPng($bgColor)
951
    {
952
        $out = '';
953
954
        if (!$this->m_bLoaded) {
955
            return false;
956
        }
957
958
        // PREPARE COLOR TABLE (RGBQUADs)
959
        if ($this->m_img->m_gih->m_bLocalClr) {
960
            $nColors = $this->m_img->m_gih->m_nTableSize;
961
            $pal     = $this->m_img->m_gih->m_colorTable->toString();
962
            if ($bgColor != -1) {
963
                $bgColor = $this->m_img->m_gih->m_colorTable->colorIndex($bgColor);
964
            }
965
        } elseif ($this->m_gfh->m_bGlobalClr) {
966
            $nColors = $this->m_gfh->m_nTableSize;
967
            $pal     = $this->m_gfh->m_colorTable->toString();
968
            if ($bgColor != -1) {
969
                $bgColor = $this->m_gfh->m_colorTable->colorIndex($bgColor);
970
            }
971
        } else {
972
            $nColors = 0;
973
            $pal     = '';
974
            $bgColor = -1;
975
        }
976
977
        // PREPARE BITMAP BITS
978
        $data = $this->m_img->m_data;
979
        $nPxl = 0;
980
        $bmp  = '';
981
        for ($y = 0; $y < $this->m_gfh->m_nHeight; $y++) {
982
            $bmp .= "\x00";
983
            for ($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) {
984
                if (($x >= $this->m_img->m_gih->m_nLeft)
985
                    && ($y >= $this->m_img->m_gih->m_nTop)
986
                    && ($x < ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth))
987
                    && ($y < ($this->m_img->m_gih->m_nTop + $this->m_img->m_gih->m_nHeight))) {
988
                    // PART OF IMAGE
989
                    $bmp .= $data[$nPxl];
990
                } else {
991
                    // BACKGROUND
992
                    if ($bgColor == -1) {
993
                        $bmp .= chr($this->m_gfh->m_nBgColor);
994
                    } else {
995
                        $bmp .= chr($bgColor);
996
                    }
997
                }
998
            }
999
        }
1000
        $bmp = gzcompress($bmp, 9);
1001
1002
        ///////////////////////////////////////////////////////////////////////
1003
        // SIGNATURE
1004
        $out .= "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A";
1005
        ///////////////////////////////////////////////////////////////////////
1006
        // HEADER
1007
        $out .= "\x00\x00\x00\x0D";
1008
        $tmp = 'IHDR';
1009
        $tmp .= $this->ndword($this->m_gfh->m_nWidth);
1010
        $tmp .= $this->ndword($this->m_gfh->m_nHeight);
1011
        $tmp .= "\x08\x03\x00\x00\x00";
1012
        $out .= $tmp;
1013
        $out .= $this->ndword(crc32($tmp));
1014
        ///////////////////////////////////////////////////////////////////////
1015
        // PALETTE
1016
        if ($nColors > 0) {
1017
            $out .= $this->ndword($nColors * 3);
1018
            $tmp = 'PLTE';
1019
            $tmp .= $pal;
1020
            $out .= $tmp;
1021
            $out .= $this->ndword(crc32($tmp));
1022
        }
1023
        ///////////////////////////////////////////////////////////////////////
1024
        // TRANSPARENCY
1025
        if (@$this->m_img->m_bTrans && ($nColors > 0)) {
1026
            $out .= $this->ndword($nColors);
1027
            $tmp = 'tRNS';
1028
            for ($i = 0; $i < $nColors; $i++) {
1029
                $tmp .= ($i == $this->m_img->m_nTrans) ? "\x00" : "\xFF";
1030
            }
1031
            $out .= $tmp;
1032
            $out .= $this->ndword(crc32($tmp));
1033
        }
1034
        ///////////////////////////////////////////////////////////////////////
1035
        // DATA BITS
1036
        $out .= $this->ndword(strlen($bmp));
1037
        $tmp = 'IDAT';
1038
        $tmp .= $bmp;
1039
        $out .= $tmp;
1040
        $out .= $this->ndword(crc32($tmp));
1041
        ///////////////////////////////////////////////////////////////////////
1042
        // END OF FILE
1043
        $out .= "\x00\x00\x00\x00IEND\xAE\x42\x60\x82";
1044
1045
        return $out;
1046
    }
1047
1048
    ///////////////////////////////////////////////////////////////////////////
1049
1050
    // Added by James Heinrich <[email protected]> - January 5, 2003
1051
1052
    // Takes raw image data and plots it pixel-by-pixel on a new GD image and returns that
1053
    // It's extremely slow, but the only solution when imagecreatefromstring() fails
1054
    public function getGD_PixelPlotterVersion()
1055
    {
1056
        if (!$this->m_bLoaded) {
1057
            return false;
1058
        }
1059
1060
        // PREPARE COLOR TABLE (RGBQUADs)
1061
        if ($this->m_img->m_gih->m_bLocalClr) {
1062
            $pal = $this->m_img->m_gih->m_colorTable->toString();
1063
        } elseif ($this->m_gfh->m_bGlobalClr) {
1064
            $pal = $this->m_gfh->m_colorTable->toString();
1065
        } else {
1066
            die('No color table available in getGD_PixelPlotterVersion()');
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
1067
        }
1068
1069
        $PlottingIMG    = imagecreate($this->m_gfh->m_nWidth, $this->m_gfh->m_nHeight);
1070
        $NumColorsInPal = floor(strlen($pal) / 3);
1071
        $ThisImageColor = [];
1072
        for ($i = 0; $i < $NumColorsInPal; $i++) {
1073
            $ThisImageColor[$i] = imagecolorallocate(
1074
                $PlottingIMG,
1075
                ord($pal{($i * 3) + 0}),
1076
                ord($pal{($i * 3) + 1}),
1077
                ord($pal{($i * 3) + 2})
1078
            );
1079
        }
1080
1081
        // PREPARE BITMAP BITS
1082
        $data = $this->m_img->m_data;
1083
        $nPxl = ($this->m_gfh->m_nHeight - 1) * $this->m_gfh->m_nWidth;
1084
        for ($y = 0; $y < $this->m_gfh->m_nHeight; $y++) {
1085
            if (!phpthumb_functions::FunctionIsDisabled('set_time_limit')) {
1086
                set_time_limit(30);
1087
            }
1088
            for ($x = 0; $x < $this->m_gfh->m_nWidth; $x++, $nPxl++) {
1089
                if (($x >= $this->m_img->m_gih->m_nLeft)
1090
                    && ($y >= $this->m_img->m_gih->m_nTop)
1091
                    && ($x < ($this->m_img->m_gih->m_nLeft + $this->m_img->m_gih->m_nWidth))
1092
                    && ($y < ($this->m_img->m_gih->m_nTop + $this->m_img->m_gih->m_nHeight))) {
1093
                    // PART OF IMAGE
1094
                    if (@$this->m_img->m_bTrans && (ord($data[$nPxl]) == $this->m_img->m_nTrans)) {
1095
                        imagesetpixel($PlottingIMG, $x, $this->m_gfh->m_nHeight - $y - 1, $ThisImageColor[$this->m_gfh->m_nBgColor]);
1096
                    } else {
1097
                        imagesetpixel($PlottingIMG, $x, $this->m_gfh->m_nHeight - $y - 1, $ThisImageColor[ord($data[$nPxl])]);
1098
                    }
1099
                } else {
1100
                    // BACKGROUND
1101
                    imagesetpixel($PlottingIMG, $x, $this->m_gfh->m_nHeight - $y - 1, $ThisImageColor[$this->m_gfh->m_nBgColor]);
1102
                }
1103
            }
1104
            $nPxl -= $this->m_gfh->m_nWidth << 1;
1105
        }
1106
1107
        return $PlottingIMG;
1108
    }
1109
1110
    ///////////////////////////////////////////////////////////////////////////
1111
1112
    public function dword($val)
1113
    {
1114
        $val = (int)$val;
1115
        return chr($val & 0xFF) . chr(($val & 0xFF00) >> 8) . chr(($val & 0xFF0000) >> 16) . chr(($val & 0xFF000000) >> 24);
1116
    }
1117
1118
    ///////////////////////////////////////////////////////////////////////////
1119
1120
    public function ndword($val)
1121
    {
1122
        $val = (int)$val;
1123
        return chr(($val & 0xFF000000) >> 24) . chr(($val & 0xFF0000) >> 16) . chr(($val & 0xFF00) >> 8) . chr($val & 0xFF);
1124
    }
1125
1126
    ///////////////////////////////////////////////////////////////////////////
1127
1128
    public function width()
1129
    {
1130
        return $this->m_gfh->m_nWidth;
1131
    }
1132
1133
    ///////////////////////////////////////////////////////////////////////////
1134
1135
    public function height()
1136
    {
1137
        return $this->m_gfh->m_nHeight;
1138
    }
1139
1140
    ///////////////////////////////////////////////////////////////////////////
1141
1142
    public function comment()
1143
    {
1144
        return $this->m_img->m_lpComm;
1145
    }
1146
1147
    ///////////////////////////////////////////////////////////////////////////
1148
1149
    public function loaded()
1150
    {
1151
        return $this->m_bLoaded;
1152
    }
1153
}
1154