5
* Copyright (c) 2006 - 2009 PHPExcel
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.
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.
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
22
* @package PHPExcel_Writer_Excel5
23
* @copyright Copyright (c) 2006 - 2009 PHPExcel (http://www.codeplex.com/PHPExcel)
24
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25
* @version 1.7.0, 2009-08-10
30
* PHPExcel_Shared_Escher_DggContainer_BstoreContainer
33
* @package PHPExcel_Writer_Excel5
34
* @copyright Copyright (c) 2006 - 2009 PHPExcel (http://www.codeplex.com/PHPExcel)
36
class PHPExcel_Writer_Excel5_Escher
39
* The object we are writing
44
* The written binary data
49
* Shape offsets. Positions in binary stream where a new shape record begins
61
public function __construct($object)
63
$this->_object = $object;
67
* Process the object to be written
69
public function close()
74
switch (get_class($this->_object)) {
76
case 'PHPExcel_Shared_Escher':
77
if ($dggContainer = $this->_object->getDggContainer()) {
78
$writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);
79
$this->_data = $writer->close();
80
} else if ($dgContainer = $this->_object->getDgContainer()) {
81
$writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);
82
$this->_data = $writer->close();
83
$this->_spOffsets = $writer->getSpOffsets();
87
case 'PHPExcel_Shared_Escher_DggContainer':
88
// this is a container record
95
$recInstance = 0x0000;
98
$recVerInstance = $recVer;
99
$recVerInstance |= $recInstance << 4;
104
, $this->_object->getSpIdMax() // maximum shape identifier increased by one
105
, $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one
106
, $this->_object->getCSpSaved()
107
, $this->_object->getCDgSaved() // count total number of drawings saved
109
// add file identifier clusters (one per drawing)
110
for ($i = 0; $i < $this->_object->getCDgSaved(); ++$i) {
111
$dggData .= pack('VV', 0, 0);
114
$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
115
$innerData .= $header . $dggData;
117
// write the bstoreContainer
118
if ($bstoreContainer = $this->_object->getBstoreContainer()) {
119
$writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);
120
$innerData .= $writer->close();
125
$recInstance = 0x0000;
127
$length = strlen($innerData);
129
$recVerInstance = $recVer;
130
$recVerInstance |= $recInstance << 4;
132
$header = pack('vvV', $recVerInstance, $recType, $length);
134
$this->_data = $header . $innerData;
137
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':
138
// this is a container record
143
// treat the inner data
144
if ($BSECollection = $this->_object->getBSECollection()) {
145
foreach ($BSECollection as $BSE) {
146
$writer = new PHPExcel_Writer_Excel5_Escher($BSE);
147
$innerData .= $writer->close();
153
$recInstance = count($this->_object->getBSECollection());
155
$length = strlen($innerData);
157
$recVerInstance = $recVer;
158
$recVerInstance |= $recInstance << 4;
160
$header = pack('vvV', $recVerInstance, $recType, $length);
162
$this->_data = $header . $innerData;
165
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':
166
// this is a semi-container record
171
// here we treat the inner data
172
if ($blip = $this->_object->getBlip()) {
173
$writer = new PHPExcel_Writer_Excel5_Escher($blip);
174
$innerData .= $writer->close();
180
$btWin32 = $this->_object->getBlipType();
181
$btMacOS = $this->_object->getBlipType();
182
$data .= pack('CC', $btWin32, $btMacOS);
184
$rgbUid = pack('VVVV', 0,0,0,0); // todo
188
$size = strlen($innerData);
195
$data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
201
$recInstance = $this->_object->getBlipType();
203
$length = strlen($data);
205
$recVerInstance = $recVer;
206
$recVerInstance |= $recInstance << 4;
208
$header = pack('vvV', $recVerInstance, $recType, $length);
210
$this->_data = $header;
212
$this->_data .= $data;
215
case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':
216
// this is an atom record
219
switch ($this->_object->getParent()->getBlipType()) {
221
case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
225
$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
226
$innerData .= $rgbUid1;
229
$innerData .= pack('C', $tag);
231
$innerData .= $this->_object->getData();
234
$recInstance = 0x46A;
236
$length = strlen($innerData);
238
$recVerInstance = $recVer;
239
$recVerInstance |= $recInstance << 4;
241
$header = pack('vvV', $recVerInstance, $recType, $length);
243
$this->_data = $header;
245
$this->_data .= $innerData;
248
case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:
252
$rgbUid1 = pack('VVVV', 0,0,0,0); // todo
253
$innerData .= $rgbUid1;
256
$innerData .= pack('C', $tag);
258
$innerData .= $this->_object->getData();
261
$recInstance = 0x6E0;
263
$length = strlen($innerData);
265
$recVerInstance = $recVer;
266
$recVerInstance |= $recInstance << 4;
268
$header = pack('vvV', $recVerInstance, $recType, $length);
270
$this->_data = $header;
272
$this->_data .= $innerData;
278
case 'PHPExcel_Shared_Escher_DgContainer':
279
// this is a container record
286
$recInstance = $this->_object->getDgId();
290
$recVerInstance = $recVer;
291
$recVerInstance |= $recInstance << 4;
293
$header = pack('vvV', $recVerInstance, $recType, $length);
295
// number of shapes in this drawing (including group shape)
296
$countShapes = count($this->_object->getSpgrContainer()->getChildren());
297
$innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId());
298
//$innerData .= $header . pack('VV', 0, 0);
300
// write the spgrContainer
301
if ($spgrContainer = $this->_object->getSpgrContainer()) {
302
$writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);
303
$innerData .= $writer->close();
305
// get the shape offsets relative to the spgrContainer record
306
$spOffsets = $writer->getSpOffsets();
308
// save the shape offsets relative to dgContainer
309
foreach ($spOffsets as & $spOffset) {
310
$spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)
313
$this->_spOffsets = $spOffsets;
318
$recInstance = 0x0000;
320
$length = strlen($innerData);
322
$recVerInstance = $recVer;
323
$recVerInstance |= $recInstance << 4;
325
$header = pack('vvV', $recVerInstance, $recType, $length);
327
$this->_data = $header . $innerData;
330
case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':
331
// this is a container record
336
// initialize spape offsets
338
$spOffsets = array();
340
// treat the inner data
341
foreach ($this->_object->getChildren() as $spContainer) {
342
$writer = new PHPExcel_Writer_Excel5_Escher($spContainer);
343
$spData = $writer->close();
344
$innerData .= $spData;
346
// save the shape offsets (where new shape records begin)
347
$totalSize += strlen($spData);
348
$spOffsets[] = $totalSize;
353
$recInstance = 0x0000;
355
$length = strlen($innerData);
357
$recVerInstance = $recVer;
358
$recVerInstance |= $recInstance << 4;
360
$header = pack('vvV', $recVerInstance, $recType, $length);
362
$this->_data = $header . $innerData;
363
$this->_spOffsets = $spOffsets;
366
case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':
372
// write group shape record, if necessary?
373
if ($this->_object->getSpgr()) {
375
$recInstance = 0x0000;
377
$length = 0x00000010;
379
$recVerInstance = $recVer;
380
$recVerInstance |= $recInstance << 4;
382
$header = pack('vvV', $recVerInstance, $recType, $length);
384
$data .= $header . pack('VVVV', 0,0,0,0);
387
// write the shape record
389
$recInstance = $this->_object->getSpType(); // shape type
391
$length = 0x00000008;
393
$recVerInstance = $recVer;
394
$recVerInstance |= $recInstance << 4;
396
$header = pack('vvV', $recVerInstance, $recType, $length);
398
$data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0xA000);
402
if ($this->_object->getOPTCollection()) {
406
$recInstance = count($this->_object->getOPTCollection());
408
foreach ($this->_object->getOPTCollection() as $property => $value) {
409
$optData .= pack('vV', $property, $value);
411
$length = strlen($optData);
413
$recVerInstance = $recVer;
414
$recVerInstance |= $recInstance << 4;
416
$header = pack('vvV', $recVerInstance, $recType, $length);
417
$data .= $header . $optData;
421
if ($this->_object->getStartCoordinates()) {
422
$clientAnchorData = '';
429
list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
430
$c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;
434
$startOffsetX = $this->_object->getStartOffsetX();
437
$startOffsetY = $this->_object->getStartOffsetY();
440
list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
441
$c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;
445
$endOffsetX = $this->_object->getEndOffsetX();
448
$endOffsetY = $this->_object->getEndOffsetY();
450
$clientAnchorData = pack('vvvvvvvvv', 0x00,
451
$c1, $startOffsetX, $r1, $startOffsetY,
452
$c2, $endOffsetX, $r2, $endOffsetY);
454
$length = strlen($clientAnchorData);
456
$recVerInstance = $recVer;
457
$recVerInstance |= $recInstance << 4;
459
$header = pack('vvV', $recVerInstance, $recType, $length);
460
$data .= $header . $clientAnchorData;
463
// the client data, just empty for now
464
if (!$this->_object->getSpgr()) {
465
$clientDataData = '';
471
$length = strlen($clientDataData);
473
$recVerInstance = $recVer;
474
$recVerInstance |= $recInstance << 4;
476
$header = pack('vvV', $recVerInstance, $recType, $length);
477
$data .= $header . $clientDataData;
482
$recInstance = 0x0000;
484
$length = strlen($data);
486
$recVerInstance = $recVer;
487
$recVerInstance |= $recInstance << 4;
489
$header = pack('vvV', $recVerInstance, $recType, $length);
491
$this->_data = $header . $data;
500
* Gets the shape offsets
504
public function getSpOffsets()
506
return $this->_spOffsets;