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

Documentation generated on Wed, 22 Apr 2009 08:57:36 +0200 by phpDocumentor 1.4.1