~ubuntu-branches/ubuntu/lucid/phpmyadmin/lucid

« back to all changes in this revision

Viewing changes to libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php

  • Committer: Bazaar Package Importer
  • Author(s): Michal Čihař
  • Date: 2010-03-08 15:25:00 UTC
  • mfrom: (1.2.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20100308152500-6e8hmuqc5co39de5
Tags: 4:3.3.0-1
* New upstream version.
* Rediff debian/patches.
* Fix permissions on mediawiki export extension.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/**
 
3
 * PHPExcel
 
4
 *
 
5
 * Copyright (c) 2006 - 2009 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 - 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
 
26
 */
 
27
 
 
28
 
 
29
/**
 
30
 * PHPExcel_Shared_Escher_DggContainer_BstoreContainer
 
31
 *
 
32
 * @category   PHPExcel
 
33
 * @package    PHPExcel_Writer_Excel5
 
34
 * @copyright  Copyright (c) 2006 - 2009 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
        /**
 
57
         * Constructor
 
58
         *
 
59
         * @param mixed
 
60
         */
 
61
        public function __construct($object)
 
62
        {
 
63
                $this->_object = $object;
 
64
        }
 
65
        
 
66
        /**
 
67
         * Process the object to be written
 
68
         */
 
69
        public function close()
 
70
        {
 
71
                // initialize
 
72
                $this->_data = '';
 
73
 
 
74
                switch (get_class($this->_object)) {
 
75
 
 
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();
 
84
                        }
 
85
                        break;
 
86
 
 
87
                case 'PHPExcel_Shared_Escher_DggContainer':
 
88
                        // this is a container record
 
89
 
 
90
                        // initialize
 
91
                        $innerData = '';
 
92
 
 
93
                        // write the dgg
 
94
                        $recVer                 = 0x0;
 
95
                        $recInstance    = 0x0000;
 
96
                        $recType                = 0xF006;
 
97
 
 
98
                        $recVerInstance  = $recVer;
 
99
                        $recVerInstance |= $recInstance << 4;
 
100
 
 
101
                        // dgg data
 
102
                        $dggData =
 
103
                                pack('VVVV'
 
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
 
108
                                );
 
109
                        // add file identifier clusters (one per drawing)
 
110
                        for ($i = 0; $i < $this->_object->getCDgSaved(); ++$i) {
 
111
                                $dggData .= pack('VV', 0, 0);
 
112
                        }
 
113
 
 
114
                        $header = pack('vvV', $recVerInstance, $recType, strlen($dggData));
 
115
                        $innerData .= $header . $dggData;
 
116
 
 
117
                        // write the bstoreContainer
 
118
                        if ($bstoreContainer = $this->_object->getBstoreContainer()) {
 
119
                                $writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);
 
120
                                $innerData .= $writer->close();
 
121
                        }
 
122
 
 
123
                        // write the record
 
124
                        $recVer                 = 0xF;
 
125
                        $recInstance    = 0x0000;
 
126
                        $recType                = 0xF000;
 
127
                        $length                 = strlen($innerData);
 
128
 
 
129
                        $recVerInstance  = $recVer;
 
130
                        $recVerInstance |= $recInstance << 4;
 
131
 
 
132
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
133
 
 
134
                        $this->_data = $header . $innerData;
 
135
                        break;
 
136
 
 
137
                case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':
 
138
                        // this is a container record
 
139
 
 
140
                        // initialize
 
141
                        $innerData = '';
 
142
 
 
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();
 
148
                                }
 
149
                        }
 
150
 
 
151
                        // write the record
 
152
                        $recVer                 = 0xF;
 
153
                        $recInstance    = count($this->_object->getBSECollection());
 
154
                        $recType                = 0xF001;
 
155
                        $length                 = strlen($innerData);
 
156
                        
 
157
                        $recVerInstance  = $recVer;
 
158
                        $recVerInstance |= $recInstance << 4;
 
159
                        
 
160
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
161
 
 
162
                        $this->_data = $header . $innerData;
 
163
                        break;
 
164
 
 
165
                case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':
 
166
                        // this is a semi-container record
 
167
 
 
168
                        // initialize
 
169
                        $innerData = '';
 
170
                        
 
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();
 
175
                        }
 
176
                        
 
177
                        // initialize
 
178
                        $data = '';
 
179
                        
 
180
                        $btWin32 = $this->_object->getBlipType();
 
181
                        $btMacOS = $this->_object->getBlipType();
 
182
                        $data .= pack('CC', $btWin32, $btMacOS);
 
183
                        
 
184
                        $rgbUid = pack('VVVV', 0,0,0,0); // todo
 
185
                        $data .= $rgbUid;
 
186
                        
 
187
                        $tag = 0;
 
188
                        $size = strlen($innerData);
 
189
                        $cRef = 1;
 
190
                        $foDelay = 0; //todo
 
191
                        $unused1 = 0x0;
 
192
                        $cbName = 0x0;
 
193
                        $unused2 = 0x0;
 
194
                        $unused3 = 0x0;
 
195
                        $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);
 
196
                        
 
197
                        $data .= $innerData;
 
198
                        
 
199
                        // write the record
 
200
                        $recVer                 = 0x2;
 
201
                        $recInstance    = $this->_object->getBlipType();
 
202
                        $recType                = 0xF007;
 
203
                        $length                 = strlen($data);
 
204
                        
 
205
                        $recVerInstance  = $recVer;
 
206
                        $recVerInstance |=      $recInstance << 4;
 
207
                        
 
208
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
209
 
 
210
                        $this->_data = $header;
 
211
                        
 
212
                        $this->_data .= $data;
 
213
                        break;
 
214
 
 
215
                case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':
 
216
                        // this is an atom record
 
217
                        
 
218
                        // write the record
 
219
                        switch ($this->_object->getParent()->getBlipType()) {
 
220
                        
 
221
                        case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:
 
222
                                // initialize
 
223
                                $innerData = '';
 
224
                                
 
225
                                $rgbUid1 = pack('VVVV', 0,0,0,0); // todo
 
226
                                $innerData .= $rgbUid1;
 
227
                                
 
228
                                $tag = 0xFF; // todo
 
229
                                $innerData .= pack('C', $tag);
 
230
                                
 
231
                                $innerData .= $this->_object->getData();
 
232
                                
 
233
                                $recVer                 = 0x0;
 
234
                                $recInstance    = 0x46A;
 
235
                                $recType                = 0xF01D;
 
236
                                $length                 = strlen($innerData);
 
237
                                
 
238
                                $recVerInstance  = $recVer;
 
239
                                $recVerInstance |=      $recInstance << 4;
 
240
                                
 
241
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
242
 
 
243
                                $this->_data = $header;
 
244
                                
 
245
                                $this->_data .= $innerData;
 
246
                                break;
 
247
                                
 
248
                        case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:
 
249
                                // initialize
 
250
                                $innerData = '';
 
251
                                
 
252
                                $rgbUid1 = pack('VVVV', 0,0,0,0); // todo
 
253
                                $innerData .= $rgbUid1;
 
254
                                
 
255
                                $tag = 0xFF; // todo
 
256
                                $innerData .= pack('C', $tag);
 
257
                                
 
258
                                $innerData .= $this->_object->getData();
 
259
                                
 
260
                                $recVer                 = 0x0;
 
261
                                $recInstance    = 0x6E0;
 
262
                                $recType                = 0xF01E;
 
263
                                $length                 = strlen($innerData);
 
264
                                
 
265
                                $recVerInstance  = $recVer;
 
266
                                $recVerInstance |=      $recInstance << 4;
 
267
                                
 
268
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
269
 
 
270
                                $this->_data = $header;
 
271
                                
 
272
                                $this->_data .= $innerData;
 
273
                                break;
 
274
                        
 
275
                        }
 
276
                        break;
 
277
                        
 
278
                case 'PHPExcel_Shared_Escher_DgContainer':
 
279
                        // this is a container record
 
280
 
 
281
                        // initialize
 
282
                        $innerData = '';
 
283
 
 
284
                        // write the dg
 
285
                        $recVer                 = 0x0;
 
286
                        $recInstance    = $this->_object->getDgId();
 
287
                        $recType                = 0xF008;
 
288
                        $length                 = 8;
 
289
                        
 
290
                        $recVerInstance  = $recVer;
 
291
                        $recVerInstance |= $recInstance << 4;
 
292
 
 
293
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
294
                        
 
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);
 
299
 
 
300
                        // write the spgrContainer
 
301
                        if ($spgrContainer = $this->_object->getSpgrContainer()) {
 
302
                                $writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);
 
303
                                $innerData .= $writer->close();
 
304
                                
 
305
                                // get the shape offsets relative to the spgrContainer record
 
306
                                $spOffsets = $writer->getSpOffsets();
 
307
                                
 
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)
 
311
                                }
 
312
                                
 
313
                                $this->_spOffsets = $spOffsets;
 
314
                        }
 
315
 
 
316
                        // write the record
 
317
                        $recVer                 = 0xF;
 
318
                        $recInstance    = 0x0000;
 
319
                        $recType                = 0xF002;
 
320
                        $length                 = strlen($innerData);
 
321
 
 
322
                        $recVerInstance  = $recVer;
 
323
                        $recVerInstance |= $recInstance << 4;
 
324
 
 
325
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
326
 
 
327
                        $this->_data = $header . $innerData;
 
328
                        break;
 
329
 
 
330
                case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':
 
331
                        // this is a container record
 
332
 
 
333
                        // initialize
 
334
                        $innerData = '';
 
335
 
 
336
                        // initialize spape offsets
 
337
                        $totalSize = 8;
 
338
                        $spOffsets = array();
 
339
                        
 
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;
 
345
 
 
346
                                // save the shape offsets (where new shape records begin)
 
347
                                $totalSize += strlen($spData);
 
348
                                $spOffsets[] = $totalSize;
 
349
                        }
 
350
                        
 
351
                        // write the record
 
352
                        $recVer                 = 0xF;
 
353
                        $recInstance    = 0x0000;
 
354
                        $recType                = 0xF003;
 
355
                        $length                 = strlen($innerData);
 
356
 
 
357
                        $recVerInstance  = $recVer;
 
358
                        $recVerInstance |= $recInstance << 4;
 
359
 
 
360
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
361
 
 
362
                        $this->_data = $header . $innerData;
 
363
                        $this->_spOffsets = $spOffsets;
 
364
                        break;
 
365
 
 
366
                case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':
 
367
                        // initialize
 
368
                        $data = '';
 
369
 
 
370
                        // build the data
 
371
                        
 
372
                        // write group shape record, if necessary?
 
373
                        if ($this->_object->getSpgr()) {
 
374
                                $recVer                 = 0x1;
 
375
                                $recInstance    = 0x0000;
 
376
                                $recType                = 0xF009;
 
377
                                $length                 = 0x00000010;
 
378
 
 
379
                                $recVerInstance  = $recVer;
 
380
                                $recVerInstance |= $recInstance << 4;
 
381
 
 
382
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
383
 
 
384
                                $data .= $header . pack('VVVV', 0,0,0,0);
 
385
                        }
 
386
 
 
387
                        // write the shape record
 
388
                        $recVer                 = 0x2;
 
389
                        $recInstance    = $this->_object->getSpType(); // shape type
 
390
                        $recType                = 0xF00A;
 
391
                        $length                 = 0x00000008;
 
392
 
 
393
                        $recVerInstance  = $recVer;
 
394
                        $recVerInstance |= $recInstance << 4;
 
395
 
 
396
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
397
 
 
398
                        $data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0xA000);
 
399
 
 
400
 
 
401
                        // the options
 
402
                        if ($this->_object->getOPTCollection()) {
 
403
                                $optData = '';
 
404
 
 
405
                                $recVer                 = 0x3;
 
406
                                $recInstance    = count($this->_object->getOPTCollection());
 
407
                                $recType                = 0xF00B;
 
408
                                foreach ($this->_object->getOPTCollection() as $property => $value) {
 
409
                                        $optData .= pack('vV', $property, $value);
 
410
                                }
 
411
                                $length                 = strlen($optData);
 
412
                                
 
413
                                $recVerInstance  = $recVer;
 
414
                                $recVerInstance |= $recInstance << 4;
 
415
 
 
416
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
417
                                $data .= $header . $optData;
 
418
                        }
 
419
 
 
420
                        // the client anchor
 
421
                        if ($this->_object->getStartCoordinates()) {
 
422
                                $clientAnchorData = '';
 
423
 
 
424
                                $recVer                 = 0x0;
 
425
                                $recInstance    = 0x0;
 
426
                                $recType                = 0xF010;
 
427
 
 
428
                                // start coordinates
 
429
                                list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
 
430
                                $c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;
 
431
                                $r1 = $row - 1;
 
432
 
 
433
                                // start offsetX
 
434
                                $startOffsetX = $this->_object->getStartOffsetX();
 
435
 
 
436
                                // start offsetY
 
437
                                $startOffsetY = $this->_object->getStartOffsetY();
 
438
 
 
439
                                // end coordinates
 
440
                                list($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
 
441
                                $c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;
 
442
                                $r2 = $row - 1;
 
443
 
 
444
                                // end offsetX
 
445
                                $endOffsetX = $this->_object->getEndOffsetX();
 
446
 
 
447
                                // end offsetY
 
448
                                $endOffsetY = $this->_object->getEndOffsetY();
 
449
 
 
450
                                $clientAnchorData = pack('vvvvvvvvv', 0x00,
 
451
                                        $c1, $startOffsetX, $r1, $startOffsetY,
 
452
                                        $c2, $endOffsetX, $r2, $endOffsetY);
 
453
 
 
454
                                $length                 = strlen($clientAnchorData);
 
455
 
 
456
                                $recVerInstance  = $recVer;
 
457
                                $recVerInstance |= $recInstance << 4;
 
458
 
 
459
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
460
                                $data .= $header . $clientAnchorData;
 
461
                        }
 
462
 
 
463
                        // the client data, just empty for now
 
464
                        if (!$this->_object->getSpgr()) {
 
465
                                $clientDataData = '';
 
466
 
 
467
                                $recVer                 = 0x0;
 
468
                                $recInstance    = 0x0;
 
469
                                $recType                = 0xF011;
 
470
 
 
471
                                $length = strlen($clientDataData);
 
472
 
 
473
                                $recVerInstance  = $recVer;
 
474
                                $recVerInstance |= $recInstance << 4;
 
475
 
 
476
                                $header = pack('vvV', $recVerInstance, $recType, $length);
 
477
                                $data .= $header . $clientDataData;
 
478
                        }
 
479
 
 
480
                        // write the record
 
481
                        $recVer                 = 0xF;
 
482
                        $recInstance    = 0x0000;
 
483
                        $recType                = 0xF004;
 
484
                        $length                 = strlen($data);
 
485
 
 
486
                        $recVerInstance  = $recVer;
 
487
                        $recVerInstance |= $recInstance << 4;
 
488
 
 
489
                        $header = pack('vvV', $recVerInstance, $recType, $length);
 
490
 
 
491
                        $this->_data = $header . $data;
 
492
                        break;
 
493
 
 
494
                }
 
495
 
 
496
                return $this->_data;
 
497
        }
 
498
        
 
499
        /**
 
500
         * Gets the shape offsets
 
501
         *
 
502
         * @return array
 
503
         */
 
504
        public function getSpOffsets()
 
505
        {
 
506
                return $this->_spOffsets;
 
507
        }
 
508
        
 
509
}