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

Documentation generated on Tue, 01 Jun 2010 17:03:00 +0200 by phpDocumentor 1.4.3