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(// 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$recTypestrlen($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$rowPHPExcel_Cell::coordinateFromString($this->_object->getStartCoordinates());
  432.                 $c1 PHPExcel_Cell::columnIndexFromString($column1;
  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$rowPHPExcel_Cell::coordinateFromString($this->_object->getEndCoordinates());
  443.                 $c2 PHPExcel_Cell::columnIndexFromString($column1;
  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