Rev 2388 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** PHPExcel** Copyright (c) 2006 - 2013 PHPExcel** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2.1 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the Free Software* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA** @category PHPExcel* @package PHPExcel_Writer_Excel5* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL* @version ##VERSION##, ##DATE##*//*** PHPExcel_Shared_Escher_DggContainer_BstoreContainer** @category PHPExcel* @package PHPExcel_Writer_Excel5* @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel)*/class PHPExcel_Writer_Excel5_Escher{/*** The object we are writing*/private $_object;/*** The written binary data*/private $_data;/*** Shape offsets. Positions in binary stream where a new shape record begins** @var array*/private $_spOffsets;/*** Shape types.** @var array*/private $_spTypes;/*** Constructor** @param mixed*/public function __construct($object){$this->_object = $object;}/*** Process the object to be written*/public function close(){// initialize$this->_data = '';switch (get_class($this->_object)) {case 'PHPExcel_Shared_Escher':if ($dggContainer = $this->_object->getDggContainer()) {$writer = new PHPExcel_Writer_Excel5_Escher($dggContainer);$this->_data = $writer->close();} else if ($dgContainer = $this->_object->getDgContainer()) {$writer = new PHPExcel_Writer_Excel5_Escher($dgContainer);$this->_data = $writer->close();$this->_spOffsets = $writer->getSpOffsets();$this->_spTypes = $writer->getSpTypes();}break;case 'PHPExcel_Shared_Escher_DggContainer':// this is a container record// initialize$innerData = '';// write the dgg$recVer = 0x0;$recInstance = 0x0000;$recType = 0xF006;$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;// dgg data$dggData =pack('VVVV', $this->_object->getSpIdMax() // maximum shape identifier increased by one, $this->_object->getCDgSaved() + 1 // number of file identifier clusters increased by one, $this->_object->getCSpSaved(), $this->_object->getCDgSaved() // count total number of drawings saved);// add file identifier clusters (one per drawing)$IDCLs = $this->_object->getIDCLs();foreach ($IDCLs as $dgId => $maxReducedSpId) {$dggData .= pack('VV', $dgId, $maxReducedSpId + 1);}$header = pack('vvV', $recVerInstance, $recType, strlen($dggData));$innerData .= $header . $dggData;// write the bstoreContainerif ($bstoreContainer = $this->_object->getBstoreContainer()) {$writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer);$innerData .= $writer->close();}// write the record$recVer = 0xF;$recInstance = 0x0000;$recType = 0xF000;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header . $innerData;break;case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer':// this is a container record// initialize$innerData = '';// treat the inner dataif ($BSECollection = $this->_object->getBSECollection()) {foreach ($BSECollection as $BSE) {$writer = new PHPExcel_Writer_Excel5_Escher($BSE);$innerData .= $writer->close();}}// write the record$recVer = 0xF;$recInstance = count($this->_object->getBSECollection());$recType = 0xF001;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header . $innerData;break;case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE':// this is a semi-container record// initialize$innerData = '';// here we treat the inner dataif ($blip = $this->_object->getBlip()) {$writer = new PHPExcel_Writer_Excel5_Escher($blip);$innerData .= $writer->close();}// initialize$data = '';$btWin32 = $this->_object->getBlipType();$btMacOS = $this->_object->getBlipType();$data .= pack('CC', $btWin32, $btMacOS);$rgbUid = pack('VVVV', 0,0,0,0); // todo$data .= $rgbUid;$tag = 0;$size = strlen($innerData);$cRef = 1;$foDelay = 0; //todo$unused1 = 0x0;$cbName = 0x0;$unused2 = 0x0;$unused3 = 0x0;$data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3);$data .= $innerData;// write the record$recVer = 0x2;$recInstance = $this->_object->getBlipType();$recType = 0xF007;$length = strlen($data);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header;$this->_data .= $data;break;case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip':// this is an atom record// write the recordswitch ($this->_object->getParent()->getBlipType()) {case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG:// initialize$innerData = '';$rgbUid1 = pack('VVVV', 0,0,0,0); // todo$innerData .= $rgbUid1;$tag = 0xFF; // todo$innerData .= pack('C', $tag);$innerData .= $this->_object->getData();$recVer = 0x0;$recInstance = 0x46A;$recType = 0xF01D;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header;$this->_data .= $innerData;break;case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG:// initialize$innerData = '';$rgbUid1 = pack('VVVV', 0,0,0,0); // todo$innerData .= $rgbUid1;$tag = 0xFF; // todo$innerData .= pack('C', $tag);$innerData .= $this->_object->getData();$recVer = 0x0;$recInstance = 0x6E0;$recType = 0xF01E;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header;$this->_data .= $innerData;break;}break;case 'PHPExcel_Shared_Escher_DgContainer':// this is a container record// initialize$innerData = '';// write the dg$recVer = 0x0;$recInstance = $this->_object->getDgId();$recType = 0xF008;$length = 8;$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);// number of shapes in this drawing (including group shape)$countShapes = count($this->_object->getSpgrContainer()->getChildren());$innerData .= $header . pack('VV', $countShapes, $this->_object->getLastSpId());//$innerData .= $header . pack('VV', 0, 0);// write the spgrContainerif ($spgrContainer = $this->_object->getSpgrContainer()) {$writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer);$innerData .= $writer->close();// get the shape offsets relative to the spgrContainer record$spOffsets = $writer->getSpOffsets();$spTypes = $writer->getSpTypes();// save the shape offsets relative to dgContainerforeach ($spOffsets as & $spOffset) {$spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes)}$this->_spOffsets = $spOffsets;$this->_spTypes = $spTypes;}// write the record$recVer = 0xF;$recInstance = 0x0000;$recType = 0xF002;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header . $innerData;break;case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer':// this is a container record// initialize$innerData = '';// initialize spape offsets$totalSize = 8;$spOffsets = array();$spTypes = array();// treat the inner dataforeach ($this->_object->getChildren() as $spContainer) {$writer = new PHPExcel_Writer_Excel5_Escher($spContainer);$spData = $writer->close();$innerData .= $spData;// save the shape offsets (where new shape records begin)$totalSize += strlen($spData);$spOffsets[] = $totalSize;$spTypes = array_merge($spTypes, $writer->getSpTypes());}// write the record$recVer = 0xF;$recInstance = 0x0000;$recType = 0xF003;$length = strlen($innerData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header . $innerData;$this->_spOffsets = $spOffsets;$this->_spTypes = $spTypes;break;case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer':// initialize$data = '';// build the data// write group shape record, if necessary?if ($this->_object->getSpgr()) {$recVer = 0x1;$recInstance = 0x0000;$recType = 0xF009;$length = 0x00000010;$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$data .= $header . pack('VVVV', 0,0,0,0);}$this->_spTypes[] = ($this->_object->getSpType());// write the shape record$recVer = 0x2;$recInstance = $this->_object->getSpType(); // shape type$recType = 0xF00A;$length = 0x00000008;$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$data .= $header . pack('VV', $this->_object->getSpId(), $this->_object->getSpgr() ? 0x0005 : 0x0A00);// the optionsif ($this->_object->getOPTCollection()) {$optData = '';$recVer = 0x3;$recInstance = count($this->_object->getOPTCollection());$recType = 0xF00B;foreach ($this->_object->getOPTCollection() as $property => $value) {$optData .= pack('vV', $property, $value);}$length = strlen($optData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$data .= $header . $optData;}// the client anchorif ($this->_object->getStartCoordinates()) {$clientAnchorData = '';$recVer = 0x0;$recInstance = 0x0;$recType = 0xF010;// start coordinateslist($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());$c1 = PHPExcel_Cell::columnIndexFromString($column) - 1;$r1 = $row - 1;// start offsetX$startOffsetX = $this->_object->getStartOffsetX();// start offsetY$startOffsetY = $this->_object->getStartOffsetY();// end coordinateslist($column, $row) = PHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());$c2 = PHPExcel_Cell::columnIndexFromString($column) - 1;$r2 = $row - 1;// end offsetX$endOffsetX = $this->_object->getEndOffsetX();// end offsetY$endOffsetY = $this->_object->getEndOffsetY();$clientAnchorData = pack('vvvvvvvvv', $this->_object->getSpFlag(),$c1, $startOffsetX, $r1, $startOffsetY,$c2, $endOffsetX, $r2, $endOffsetY);$length = strlen($clientAnchorData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$data .= $header . $clientAnchorData;}// the client data, just empty for nowif (!$this->_object->getSpgr()) {$clientDataData = '';$recVer = 0x0;$recInstance = 0x0;$recType = 0xF011;$length = strlen($clientDataData);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$data .= $header . $clientDataData;}// write the record$recVer = 0xF;$recInstance = 0x0000;$recType = 0xF004;$length = strlen($data);$recVerInstance = $recVer;$recVerInstance |= $recInstance << 4;$header = pack('vvV', $recVerInstance, $recType, $length);$this->_data = $header . $data;break;}return $this->_data;}/*** Gets the shape offsets** @return array*/public function getSpOffsets(){return $this->_spOffsets;}/*** Gets the shape types** @return array*/public function getSpTypes(){return $this->_spTypes;}}