Completed
Branch master (4d68bf)
by John
02:46
created

FieldRendererFixedText   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 121
Duplicated Lines 0 %

Test Coverage

Coverage 95.92%

Importance

Changes 0
Metric Value
eloc 43
dl 0
loc 121
rs 10
c 0
b 0
f 0
ccs 47
cts 49
cp 0.9592
wmc 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A render() 0 45 5
A __construct() 0 3 1
A renderLine() 0 31 3
A factory() 0 4 1
1
<?php
2
3
namespace Graze\CiffRenderer\Renderer\FieldRenderer;
4
5
use Graze\CiffRenderer\Renderer\FieldRenderer\FieldRendererInterface;
6
use Graze\CiffRenderer\Parser\FieldParser\FieldParserInterface;
7
use Intervention\Image\ImageManager;
8
use Intervention\Image\Gd\Font;
9
10
class FieldRendererFixedText implements FieldRendererInterface
11
{
12
    /**
13
     * @var float
14
     */
15
    const LETTER_SPACING_ADJUSTMENT = 0.97;
16
17
    /**
18
     * @var Font
19
     */
20
    private $font;
21
22
    /**
23
     * @param Font $font
24
     */
25 6
    public function __construct(Font $font)
26
    {
27 6
        $this->font = $font;
28 6
    }
29
30
    /**
31
     * @param ImageManager $imageManager
32
     * @param FieldParserInterface $parser
33
     * @param null|callable $fontResolver
34
     * @param null|callable $graphicResolver
35
     * @return \Intervention\Image\Image
36
     */
37 1
    public function render(
38
        ImageManager $imageManager,
39
        FieldParserInterface $parser,
40
        callable $fontResolver = null,
41
        callable $graphicResolver = null
42
    ) {
43 1
        $fontPath = $fontResolver($parser->getFontFace());
44
45
        // split text into lines
46 1
        $lines = explode("\n", $parser->getText());
47 1
        $texts = [];
48 1
        $width = 0;
49 1
        $height = 0;
50 1
        foreach ($lines as $line) {
51 1
            $text = $this->renderLine($imageManager, $parser, $fontPath, $line);
52 1
            if (is_null($text)) {
53
                continue;
54
            }
55
56
            // store dimensions ready to create a canvas
57 1
            $width = max($width, $text->getWidth());
58 1
            $height += $text->getHeight();
59
60 1
            $texts[] = $text;
61 1
        }
62
63
        // create a canvas to add each line of text to
64 1
        $canvas = $imageManager->canvas($width, $height);
65
66 1
        $offsetX = 0;
67 1
        $offsetY = 0;
68 1
        foreach ($texts as $text) {
69
            // add the text to the canvas
70 1
            $canvas->insert($text, 'top-left', (int) $offsetX, (int) $offsetY);
71
72
            // increase the offset for the next line
73 1
            $offsetY += $text->getHeight();
74 1
        }
75
76 1
        $orientation = $parser->getOrientation();
77 1
        if ($orientation) {
78 1
            $canvas->rotate(360 - $orientation);
79 1
        }
80
81 1
        return $canvas;
82
    }
83
84
    /**
85
     * @param ImageManager $imageManager
86
     * @param FieldParserInterface $parser
87
     * @param string $fontPath
88
     * @param string $text
89
     * @return \Intervention\Image\Image
90
     */
91 1
    private function renderLine(ImageManager $imageManager, FieldParserInterface $parser, $fontPath, $text)
92
    {
93
        // create the text here so it can be measured
94 1
        $this->font->text($text);
95
96 1
        $this->font->file($fontPath);
97 1
        $this->font->size($parser->getFontSize());
98 1
        $this->font->color('#000');
99 1
        $this->font->valign('top');
100
101 1
        $size = $this->font->getBoxSize();
102
103
        // if text consists of invisible chars, measured size will be zero, nothing to print
104 1
        if ($size['width'] < 1 || $size['height'] < 1) {
105
            return null;
106
        }
107
108 1
        $fontCallback = function (&$font) {
109
            // override the font created by Canvas::text()
110 1
            $font = $this->font;
111 1
        };
112
113 1
        $canvas = $imageManager->canvas($size['width'], $size['height']);
114
115
        // no need to pass the text in here as we override the font in the callback
116 1
        $canvas->text('', null, null, $fontCallback);
117
118 1
        $width = (int) round($size['width'] * self::LETTER_SPACING_ADJUSTMENT);
119 1
        $canvas->resize($width, $size['height']);
120
121 1
        return $canvas;
122
    }
123
124
    /**
125
     * @return FieldRendererInterface
126
     */
127 5
    public static function factory()
128
    {
129 5
        return new static(
130 5
            new Font()
131 5
        );
132
    }
133
}
134