PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 2.2.0
Visualizer – Tables & Charts Manager with Built-in AI Generator v2.2.0
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
visualizer / vendor / phpoffice / phpexcel / Classes / PHPExcel / Writer / Excel5 / Escher.php

Escher.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 2.2.0, at vendor/phpoffice/phpexcel/Classes/PHPExcel/Writer/Excel5/Escher.php

538 lines 13.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * PHPExcel
4 *
5 * Copyright (c) 2006 - 2014 PHPExcel
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 * @category PHPExcel
22 * @package PHPExcel_Writer_Excel5
23 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25 * @version ##VERSION##, ##DATE##
26 */
27
28
29 /**
30 * PHPExcel_Shared_Escher_DggContainer_BstoreContainer
31 *
32 * @category PHPExcel
33 * @package PHPExcel_Writer_Excel5
34 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35 */
36 class PHPExcel_Writer_Excel5_Escher
37 {
38 /**
39 * The object we are writing
40 */
41 private $_object;
42
43 /**
44 * The written binary data
45 */
46 private $_data;
47
48 /**
49 * Shape offsets. Positions in binary stream where a new shape record begins
50 *
51 * @var array
52 */
53 private $_spOffsets;
54
55 /**
56 * Shape types.
57 *
58 * @var array
59 */
60 private $_spTypes;
61
62 /**
63 * Constructor
64 *
65 * @param mixed
66 */
67 public function __construct($object)
68 {
69 $this->_object = $object;
70 }
71
72 /**
73 * Process the object to be written
74 */
75 public function close()
76 {
77 // initialize
78 $this->_data = '';
79
80 switch (get_class($this->_object)) {
81
82 case 'PHPExcel_Shared_Escher':
83 if ($dggContainer = $this->_object->getDggContainer()) {
84 $writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);
85 $this->_data = $writer->close();
86 } else if ($dgContainer = $this->_object->getDgContainer()) {
87 $writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);
88 $this->_data = $writer->close();
89 $this->_spOffsets = $writer->getSpOffsets();
90 $this->_spTypes = $writer->getSpTypes();
91 }
92 break;
93
94 case 'PHPExcel_Shared_Escher_DggContainer':
95 // this is a container record
96
97 // initialize
98 $innerData = '';
99
100 // write the dgg
101 $recVer = 0x0;
102 $recInstance = 0x0000;
103 $recType = 0xF006;
104
105 $recVerInstance = $recVer;
106 $recVerInstance |= $recInstance << 4;
107
108 // dgg data
109 $dggData =
110 pack('VVVV'
111 , $this->_object->getSpIdMax() // maximum shape identifier increased by one
112 , $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one
113 , $this->_object->getCSpSaved()
114 , $this->_object->getCDgSaved() // count total number of drawings saved
115 );
116
117 // add file identifier clusters (one per drawing)
118 $IDCLs = $this->_object->getIDCLs();
119
120 foreach ($IDCLs as $dgId => $maxReducedSpId) {
121 $dggData .= pack('VV', $dgId, $maxReducedSpId + 1);
122 }
123
124 $header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
125 $innerData .= $header . $dggData;
126
127 // write the bstoreContainer
128 if ($bstoreContainer = $this->_object->getBstoreContainer()) {
129 $writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);
130 $innerData .= $writer->close();
131 }
132
133 // write the record
134 $recVer = 0xF;
135 $recInstance = 0x0000;
136 $recType = 0xF000;
137 $length = strlen($innerData);
138
139 $recVerInstance = $recVer;
140 $recVerInstance |= $recInstance << 4;
141
142 $header = pack('vvV', $recVerInstance, $recType, $length);
143
144 $this->_data = $header . $innerData;
145 break;
146
147 case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':
148 // this is a container record
149
150 // initialize
151 $innerData = '';
152
153 // treat the inner data
154 if ($BSECollection = $this->_object->getBSECollection()) {
155 foreach ($BSECollection as $BSE) {
156 $writer = new PHPExcel_Writer_Excel5_Escher($BSE);
157 $innerData .= $writer->close();
158 }
159 }
160
161 // write the record
162 $recVer = 0xF;
163 $recInstance = count($this->_object->getBSECollection());
164 $recType = 0xF001;
165 $length = strlen($innerData);
166
167 $recVerInstance = $recVer;
168 $recVerInstance |= $recInstance << 4;
169
170 $header = pack('vvV', $recVerInstance, $recType, $length);
171
172 $this->_data = $header . $innerData;
173 break;
174
175 case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':
176 // this is a semi-container record
177
178 // initialize
179 $innerData = '';
180
181 // here we treat the inner data
182 if ($blip = $this->_object->getBlip()) {
183 $writer = new PHPExcel_Writer_Excel5_Escher($blip);
184 $innerData .= $writer->close();
185 }
186
187 // initialize
188 $data = '';
189
190 $btWin32 = $this->_object->getBlipType();
191 $btMacOS = $this->_object->getBlipType();
192 $data .= pack('CC', $btWin32, $btMacOS);
193
194 $rgbUid = pack('VVVV', 0,0,0,0); // todo
195 $data .= $rgbUid;
196
197 $tag = 0;
198 $size = strlen($innerData);
199 $cRef = 1;
200 $foDelay = 0; //todo
201 $unused1 = 0x0;
202 $cbName = 0x0;
203 $unused2 = 0x0;
204 $unused3 = 0x0;
205 $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
206
207 $data .= $innerData;
208
209 // write the record
210 $recVer = 0x2;
211 $recInstance = $this->_object->getBlipType();
212 $recType = 0xF007;
213 $length = strlen($data);
214
215 $recVerInstance = $recVer;
216 $recVerInstance |= $recInstance << 4;
217
218 $header = pack('vvV', $recVerInstance, $recType, $length);
219
220 $this->_data = $header;
221
222 $this->_data .= $data;
223 break;
224
225 case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':
226 // this is an atom record
227
228 // write the record
229 switch ($this->_object->getParent()->getBlipType()) {
230
231 case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
232 // initialize
233 $innerData = '';
234
235 $rgbUid1 = pack('VVVV', 0,0,0,0); // todo
236 $innerData .= $rgbUid1;
237
238 $tag = 0xFF; // todo
239 $innerData .= pack('C', $tag);
240
241 $innerData .= $this->_object->getData();
242
243 $recVer = 0x0;
244 $recInstance = 0x46A;
245 $recType = 0xF01D;
246 $length = strlen($innerData);
247
248 $recVerInstance = $recVer;
249 $recVerInstance |= $recInstance << 4;
250
251 $header = pack('vvV', $recVerInstance, $recType, $length);
252
253 $this->_data = $header;
254
255 $this->_data .= $innerData;
256 break;
257
258 case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:
259 // initialize
260 $innerData = '';
261
262 $rgbUid1 = pack('VVVV', 0,0,0,0); // todo
263 $innerData .= $rgbUid1;
264
265 $tag = 0xFF; // todo
266 $innerData .= pack('C', $tag);
267
268 $innerData .= $this->_object->getData();
269
270 $recVer = 0x0;
271 $recInstance = 0x6E0;
272 $recType = 0xF01E;
273 $length = strlen($innerData);
274
275 $recVerInstance = $recVer;
276 $recVerInstance |= $recInstance << 4;
277
278 $header = pack('vvV', $recVerInstance, $recType, $length);
279
280 $this->_data = $header;
281
282 $this->_data .= $innerData;
283 break;
284
285 }
286 break;
287
288 case 'PHPExcel_Shared_Escher_DgContainer':
289 // this is a container record
290
291 // initialize
292 $innerData = '';
293
294 // write the dg
295 $recVer = 0x0;
296 $recInstance = $this->_object->getDgId();
297 $recType = 0xF008;
298 $length = 8;
299
300 $recVerInstance = $recVer;
301 $recVerInstance |= $recInstance << 4;
302
303 $header = pack('vvV', $recVerInstance, $recType, $length);
304
305 // number of shapes in this drawing (including group shape)
306 $countShapes = count($this->_object->getSpgrContainer()->getChildren());
307 $innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId());
308 //$innerData .= $header . pack('VV', 0, 0);
309
310 // write the spgrContainer
311 if ($spgrContainer = $this->_object->getSpgrContainer()) {
312 $writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);
313 $innerData .= $writer->close();
314
315 // get the shape offsets relative to the spgrContainer record
316 $spOffsets = $writer->getSpOffsets();
317 $spTypes = $writer->getSpTypes();
318
319 // save the shape offsets relative to dgContainer
320 foreach ($spOffsets as & $spOffset) {
321 $spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)
322 }
323
324 $this->_spOffsets = $spOffsets;
325 $this->_spTypes = $spTypes;
326 }
327
328 // write the record
329 $recVer = 0xF;
330 $recInstance = 0x0000;
331 $recType = 0xF002;
332 $length = strlen($innerData);
333
334 $recVerInstance = $recVer;
335 $recVerInstance |= $recInstance << 4;
336
337 $header = pack('vvV', $recVerInstance, $recType, $length);
338
339 $this->_data = $header . $innerData;
340 break;
341
342 case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':
343 // this is a container record
344
345 // initialize
346 $innerData = '';
347
348 // initialize spape offsets
349 $totalSize = 8;
350 $spOffsets = array();
351 $spTypes = array();
352
353 // treat the inner data
354 foreach ($this->_object->getChildren() as $spContainer) {
355 $writer = new PHPExcel_Writer_Excel5_Escher($spContainer);
356 $spData = $writer->close();
357 $innerData .= $spData;
358
359 // save the shape offsets (where new shape records begin)
360 $totalSize += strlen($spData);
361 $spOffsets[] = $totalSize;
362
363 $spTypes = array_merge($spTypes, $writer->getSpTypes());
364 }
365
366 // write the record
367 $recVer = 0xF;
368 $recInstance = 0x0000;
369 $recType = 0xF003;
370 $length = strlen($innerData);
371
372 $recVerInstance = $recVer;
373 $recVerInstance |= $recInstance << 4;
374
375 $header = pack('vvV', $recVerInstance, $recType, $length);
376
377 $this->_data = $header . $innerData;
378 $this->_spOffsets = $spOffsets;
379 $this->_spTypes = $spTypes;
380 break;
381
382 case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':
383 // initialize
384 $data = '';
385
386 // build the data
387
388 // write group shape record, if necessary?
389 if ($this->_object->getSpgr()) {
390 $recVer = 0x1;
391 $recInstance = 0x0000;
392 $recType = 0xF009;
393 $length = 0x00000010;
394
395 $recVerInstance = $recVer;
396 $recVerInstance |= $recInstance << 4;
397
398 $header = pack('vvV', $recVerInstance, $recType, $length);
399
400 $data .= $header . pack('VVVV', 0,0,0,0);
401 }
402 $this->_spTypes[] = ($this->_object->getSpType());
403
404 // write the shape record
405 $recVer = 0x2;
406 $recInstance = $this->_object->getSpType(); // shape type
407 $recType = 0xF00A;
408 $length = 0x00000008;
409
410 $recVerInstance = $recVer;
411 $recVerInstance |= $recInstance << 4;
412
413 $header = pack('vvV', $recVerInstance, $recType, $length);
414
415 $data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00);
416
417
418 // the options
419 if ($this->_object->getOPTCollection()) {
420 $optData = '';
421
422 $recVer = 0x3;
423 $recInstance = count($this->_object->getOPTCollection());
424 $recType = 0xF00B;
425 foreach ($this->_object->getOPTCollection() as $property => $value) {
426 $optData .= pack('vV', $property, $value);
427 }
428 $length = strlen($optData);
429
430 $recVerInstance = $recVer;
431 $recVerInstance |= $recInstance << 4;
432
433 $header = pack('vvV', $recVerInstance, $recType, $length);
434 $data .= $header . $optData;
435 }
436
437 // the client anchor
438 if ($this->_object->getStartCoordinates()) {
439 $clientAnchorData = '';
440
441 $recVer = 0x0;
442 $recInstance = 0x0;
443 $recType = 0xF010;
444
445 // start coordinates
446 list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
447 $c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;
448 $r1 = $row - 1;
449
450 // start offsetX
451 $startOffsetX = $this->_object->getStartOffsetX();
452
453 // start offsetY
454 $startOffsetY = $this->_object->getStartOffsetY();
455
456 // end coordinates
457 list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
458 $c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;
459 $r2 = $row - 1;
460
461 // end offsetX
462 $endOffsetX = $this->_object->getEndOffsetX();
463
464 // end offsetY
465 $endOffsetY = $this->_object->getEndOffsetY();
466
467 $clientAnchorData = pack('vvvvvvvvv', $this->_object->getSpFlag(),
468 $c1, $startOffsetX, $r1, $startOffsetY,
469 $c2, $endOffsetX, $r2, $endOffsetY);
470
471 $length = strlen($clientAnchorData);
472
473 $recVerInstance = $recVer;
474 $recVerInstance |= $recInstance << 4;
475
476 $header = pack('vvV', $recVerInstance, $recType, $length);
477 $data .= $header . $clientAnchorData;
478 }
479
480 // the client data, just empty for now
481 if (!$this->_object->getSpgr()) {
482 $clientDataData = '';
483
484 $recVer = 0x0;
485 $recInstance = 0x0;
486 $recType = 0xF011;
487
488 $length = strlen($clientDataData);
489
490 $recVerInstance = $recVer;
491 $recVerInstance |= $recInstance << 4;
492
493 $header = pack('vvV', $recVerInstance, $recType, $length);
494 $data .= $header . $clientDataData;
495 }
496
497 // write the record
498 $recVer = 0xF;
499 $recInstance = 0x0000;
500 $recType = 0xF004;
501 $length = strlen($data);
502
503 $recVerInstance = $recVer;
504 $recVerInstance |= $recInstance << 4;
505
506 $header = pack('vvV', $recVerInstance, $recType, $length);
507
508 $this->_data = $header . $data;
509 break;
510
511 }
512
513 return $this->_data;
514 }
515
516 /**
517 * Gets the shape offsets
518 *
519 * @return array
520 */
521 public function getSpOffsets()
522 {
523 return $this->_spOffsets;
524 }
525
526 /**
527 * Gets the shape types
528 *
529 * @return array
530 */
531 public function getSpTypes()
532 {
533 return $this->_spTypes;
534 }
535
536
537 }
538