Completed
Pull Request — develop (#208)
by Franck
15:34 queued 07:45
created

AbstractDecoratorWriter::writeFill()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 22
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 22
ccs 11
cts 11
cp 1
rs 8.6737
cc 5
eloc 10
nc 4
nop 2
crap 5
1
<?php
2
3
namespace PhpOffice\PhpPresentation\Writer\PowerPoint2007;
4
5
use PhpOffice\Common\Drawing as CommonDrawing;
6
use PhpOffice\Common\XMLWriter;
7
use PhpOffice\PhpPresentation\Style\Border;
8
use PhpOffice\PhpPresentation\Style\Fill;
9
use PhpOffice\PhpPresentation\Style\Outline;
10
11
abstract class AbstractDecoratorWriter extends \PhpOffice\PhpPresentation\Writer\AbstractDecoratorWriter
12
{
13
    /**
14
     * Write relationship
15
     *
16
     * @param  \PhpOffice\Common\XMLWriter $objWriter   XML Writer
17
     * @param  int                            $pId         Relationship ID. rId will be prepended!
18
     * @param  string                         $pType       Relationship type
19
     * @param  string                         $pTarget     Relationship target
20
     * @param  string                         $pTargetMode Relationship target mode
21
     * @throws \Exception
22
     */
23 93
    protected function writeRelationship(XMLWriter $objWriter, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '')
24
    {
25 93
        if ($pType != '' && $pTarget != '') {
26 93
            if (strpos($pId, 'rId') === false) {
27 93
                $pId = 'rId' . $pId;
28 93
            }
29
30
            // Write relationship
31 93
            $objWriter->startElement('Relationship');
32 93
            $objWriter->writeAttribute('Id', $pId);
33 93
            $objWriter->writeAttribute('Type', $pType);
34 93
            $objWriter->writeAttribute('Target', $pTarget);
35
36 93
            if ($pTargetMode != '') {
37 4
                $objWriter->writeAttribute('TargetMode', $pTargetMode);
38 4
            }
39
40 93
            $objWriter->endElement();
41 93
        } else {
42
            throw new \Exception("Invalid parameters passed.");
43
        }
44 93
    }
45
46
    /**
47
     * Write Border
48
     *
49
     * @param  \PhpOffice\Common\XMLWriter $objWriter    XML Writer
50
     * @param  \PhpOffice\PhpPresentation\Style\Border     $pBorder      Border
51
     * @param  string                         $pElementName Element name
52
     * @throws \Exception
53
     */
54 35
    protected function writeBorder(XMLWriter $objWriter, Border $pBorder, $pElementName = 'L')
55
    {
56
        // Line style
57 35
        $lineStyle = $pBorder->getLineStyle();
58 35
        if ($lineStyle == Border::LINE_NONE) {
59 9
            $lineStyle = Border::LINE_SINGLE;
60 9
        }
61
62
        // Line width
63 35
        $lineWidth = 12700 * $pBorder->getLineWidth();
64
65
        // a:ln $pElementName
66 35
        $objWriter->startElement('a:ln' . $pElementName);
67 35
        $objWriter->writeAttribute('w', $lineWidth);
68 35
        $objWriter->writeAttribute('cap', 'flat');
69 35
        $objWriter->writeAttribute('cmpd', $lineStyle);
70 35
        $objWriter->writeAttribute('algn', 'ctr');
71
72
        // Fill?
73 35
        if ($pBorder->getLineStyle() == Border::LINE_NONE) {
74
            // a:noFill
75 9
            $objWriter->writeElement('a:noFill', null);
76 9
        } else {
77
            // a:solidFill
78 35
            $objWriter->startElement('a:solidFill');
79
80
            // a:srgbClr
81 35
            $objWriter->startElement('a:srgbClr');
82 35
            $objWriter->writeAttribute('val', $pBorder->getColor()->getRGB());
83 35
            $objWriter->endElement();
84
85 35
            $objWriter->endElement();
86
        }
87
88
        // Dash
89 35
        $objWriter->startElement('a:prstDash');
90 35
        $objWriter->writeAttribute('val', $pBorder->getDashStyle());
91 35
        $objWriter->endElement();
92
93
        // a:round
94 35
        $objWriter->writeElement('a:round', null);
95
96
        // a:headEnd
97 35
        $objWriter->startElement('a:headEnd');
98 35
        $objWriter->writeAttribute('type', 'none');
99 35
        $objWriter->writeAttribute('w', 'med');
100 35
        $objWriter->writeAttribute('len', 'med');
101 35
        $objWriter->endElement();
102
103
        // a:tailEnd
104 35
        $objWriter->startElement('a:tailEnd');
105 35
        $objWriter->writeAttribute('type', 'none');
106 35
        $objWriter->writeAttribute('w', 'med');
107 35
        $objWriter->writeAttribute('len', 'med');
108 35
        $objWriter->endElement();
109
110 35
        $objWriter->endElement();
111 35
    }
112
113
    /**
114
     * Write Fill
115
     *
116
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
117
     * @param  \PhpOffice\PhpPresentation\Style\Fill       $pFill     Fill style
118
     * @throws \Exception
119
     */
120 54
    protected function writeFill(XMLWriter $objWriter, Fill $pFill)
121
    {
122
        // Is it a fill?
123 54
        if ($pFill->getFillType() == Fill::FILL_NONE) {
124 47
            return;
125
        }
126
127
        // Is it a solid fill?
128 14
        if ($pFill->getFillType() == Fill::FILL_SOLID) {
129 9
            $this->writeSolidFill($objWriter, $pFill);
130 9
            return;
131
        }
132
133
        // Check if this is a pattern type or gradient type
134 5
        if ($pFill->getFillType() == Fill::FILL_GRADIENT_LINEAR || $pFill->getFillType() == Fill::FILL_GRADIENT_PATH) {
135
            // Gradient fill
136 4
            $this->writeGradientFill($objWriter, $pFill);
137 4
        } else {
138
            // Pattern fill
139 1
            $this->writePatternFill($objWriter, $pFill);
140
        }
141 5
    }
142
143
    /**
144
     * Write Solid Fill
145
     *
146
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
147
     * @param  \PhpOffice\PhpPresentation\Style\Fill       $pFill     Fill style
148
     * @throws \Exception
149
     */
150 9
    protected function writeSolidFill(XMLWriter $objWriter, Fill $pFill)
151
    {
152
        // a:gradFill
153 9
        $objWriter->startElement('a:solidFill');
154
155
        // srgbClr
156 9
        $objWriter->startElement('a:srgbClr');
157 9
        $objWriter->writeAttribute('val', $pFill->getStartColor()->getRGB());
158 9
        $objWriter->endElement();
159
160 9
        $objWriter->endElement();
161 9
    }
162
163
    /**
164
     * Write Gradient Fill
165
     *
166
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
167
     * @param  \PhpOffice\PhpPresentation\Style\Fill       $pFill     Fill style
168
     * @throws \Exception
169
     */
170 4
    protected function writeGradientFill(XMLWriter $objWriter, Fill $pFill)
171
    {
172
        // a:gradFill
173 4
        $objWriter->startElement('a:gradFill');
174
175
        // a:gsLst
176 4
        $objWriter->startElement('a:gsLst');
177
        // a:gs
178 4
        $objWriter->startElement('a:gs');
179 4
        $objWriter->writeAttribute('pos', '0');
180
181
        // srgbClr
182 4
        $objWriter->startElement('a:srgbClr');
183 4
        $objWriter->writeAttribute('val', $pFill->getStartColor()->getRGB());
184 4
        $objWriter->endElement();
185
186 4
        $objWriter->endElement();
187
188
        // a:gs
189 4
        $objWriter->startElement('a:gs');
190 4
        $objWriter->writeAttribute('pos', '100000');
191
192
        // srgbClr
193 4
        $objWriter->startElement('a:srgbClr');
194 4
        $objWriter->writeAttribute('val', $pFill->getEndColor()->getRGB());
195 4
        $objWriter->endElement();
196
197 4
        $objWriter->endElement();
198
199 4
        $objWriter->endElement();
200
201
        // a:lin
202 4
        $objWriter->startElement('a:lin');
203 4
        $objWriter->writeAttribute('ang', CommonDrawing::degreesToAngle($pFill->getRotation()));
204 4
        $objWriter->writeAttribute('scaled', '0');
205 4
        $objWriter->endElement();
206
207 4
        $objWriter->endElement();
208 4
    }
209
210
    /**
211
     * Write Pattern Fill
212
     *
213
     * @param  \PhpOffice\Common\XMLWriter $objWriter XML Writer
214
     * @param  \PhpOffice\PhpPresentation\Style\Fill       $pFill     Fill style
215
     * @throws \Exception
216
     */
217 1
    protected function writePatternFill(XMLWriter $objWriter, Fill $pFill)
218
    {
219
        // a:pattFill
220 1
        $objWriter->startElement('a:pattFill');
221
222
        // fgClr
223 1
        $objWriter->startElement('a:fgClr');
224
225
        // srgbClr
226 1
        $objWriter->startElement('a:srgbClr');
227 1
        $objWriter->writeAttribute('val', $pFill->getStartColor()->getRGB());
228 1
        $objWriter->endElement();
229
230 1
        $objWriter->endElement();
231
232
        // bgClr
233 1
        $objWriter->startElement('a:bgClr');
234
235
        // srgbClr
236 1
        $objWriter->startElement('a:srgbClr');
237 1
        $objWriter->writeAttribute('val', $pFill->getEndColor()->getRGB());
238 1
        $objWriter->endElement();
239
240 1
        $objWriter->endElement();
241
242 1
        $objWriter->endElement();
243 1
    }
244
245
    /**
246
     * Write Outline
247
     * @param XMLWriter $objWriter
248
     * @param Outline $oOutline
249
     */
250 11
    protected function writeOutline(XMLWriter $objWriter, $oOutline)
251
    {
252 11
        if (!$oOutline instanceof Outline) {
253 11
            return;
254
        }
255
        // Width : pts
256 3
        $width = $oOutline->getWidth();
257
        // Width : pts => px
258 3
        $width = CommonDrawing::pointsToPixels($width);
259
        // Width : px => emu
260 3
        $width = CommonDrawing::pixelsToEmu($width);
261
262
        // a:ln
263 3
        $objWriter->startElement('a:ln');
264 3
        $objWriter->writeAttribute('w', $width);
265
266
        // Fill
267 3
        $this->writeFill($objWriter, $oOutline->getFill());
268
269
        // > a:ln
270 3
        $objWriter->endElement();
271 3
    }
272
273
    /**
274
     * Determine absolute zip path
275
     *
276
     * @param  string $path
277
     * @return string
278
     */
279
    protected function absoluteZipPath($path)
280
    {
281
        $path      = str_replace(array(
282
            '/',
283
            '\\'
284
        ), DIRECTORY_SEPARATOR, $path);
285
        $parts     = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen');
286
        $absolutes = array();
287
        foreach ($parts as $part) {
288
            if ('.' == $part) {
289
                continue;
290
            }
291
            if ('..' == $part) {
292
                array_pop($absolutes);
293
            } else {
294
                $absolutes[] = $part;
295
            }
296
        }
297
298
        return implode('/', $absolutes);
299
    }
300
}
301