Avatar::render()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 34
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 20
c 0
b 0
f 0
dl 0
loc 34
rs 9.6
cc 4
nc 4
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Minepic\Image\Sections;
6
7
use Minepic\Image\Components\Component;
8
use Minepic\Image\Components\Side;
9
use Minepic\Image\Exceptions\ImageCreateFromPngFailedException;
10
use Minepic\Image\Exceptions\ImageResourceCreationFailedException;
11
use Minepic\Image\Exceptions\ImageTrueColorCreationFailedException;
12
use Minepic\Image\ImageManipulation;
13
use Minepic\Image\ImageSection;
14
use Minepic\Image\LayerValidator;
15
16
class Avatar extends ImageSection
17
{
18
    use ImageManipulation;
19
20
    /**
21
     * Render avatar image.
22
     *
23
     * @param int $size Avatar size
24
     * @param string $type Section rendered
25
     *
26
     * @throws ImageCreateFromPngFailedException
27
     * @throws ImageResourceCreationFailedException
28
     * @throws ImageTrueColorCreationFailedException
29
     */
30
    public function render(int $size = 0, string $type = Side::FRONT): void
31
    {
32
        if ($size <= 0 || $size > (int) env('MAX_AVATAR_SIZE')) {
33
            $size = (int) env('DEFAULT_AVATAR_SIZE');
34
        }
35
        // generate png from url/path
36
        $baseSkinImage = $this->createImageFromPng($this->skinPath);
37
        imagealphablending($baseSkinImage, false);
38
        imagesavealpha($baseSkinImage, true);
39
40
        // Sections Coordinates
41
        $headSide = Component::getHead()->getSideByIdentifier($type);
42
        $helmSide = Component::getHeadLayer()->getSideByIdentifier($type);
43
44
        $tmpImageResource = $this->emptyBaseImage($headSide->getWidth(), $headSide->getHeight());
45
        imagecopy($tmpImageResource, $baseSkinImage, 0, 0, $headSide->getTopLeft()->getX(), $headSide->getTopLeft()->getY(), $headSide->getWidth(), $headSide->getHeight());
46
47
        // if all pixel have transparency or the colors are not the same
48
        if ((new LayerValidator())->check($baseSkinImage, $helmSide)) {
49
            $this->imageCopyMergeAlpha(
50
                $tmpImageResource,
51
                $baseSkinImage,
52
                0,
53
                0,
54
                $helmSide->getTopLeft()->getX(),
55
                $helmSide->getTopLeft()->getY(),
56
                $headSide->getWidth(),
57
                $headSide->getHeight(),
58
                100
59
            );
60
        }
61
62
        $this->imgResource = $this->emptyBaseImage($size, $size);
63
        imagecopyresized($this->imgResource, $tmpImageResource, 0, 0, 0, 0, $size, $size, $headSide->getWidth(), $headSide->getHeight());
64
    }
65
}
66