PHPExcel_Writer_Excel5
[ class tree: PHPExcel_Writer_Excel5 ] [ index: PHPExcel_Writer_Excel5 ] [ all elements ]

Source for file Escher.php

Documentation is available at Escher.php

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

Documentation generated on Sun, 27 Feb 2011 16:30:39 -0800 by phpDocumentor 1.4.3