PHPExcel_Reader_Excel5
[ class tree: PHPExcel_Reader_Excel5 ] [ index: PHPExcel_Reader_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_Reader_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.  * PHPExcel_Reader_Excel5_Escher
  30.  *
  31.  * @category   PHPExcel
  32.  * @package    PHPExcel_Reader_Excel5
  33.  * @copyright  Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel)
  34.  */
  35. {
  36.     const DGGCONTAINER        0xF000;
  37.     const BSTORECONTAINER    0xF001;
  38.     const DGCONTAINER        0xF002;
  39.     const SPGRCONTAINER        0xF003;
  40.     const SPCONTAINER        0xF004;
  41.     const DGG                0xF006;
  42.     const BSE                0xF007;
  43.     const DG                0xF008;
  44.     const SPGR                0xF009;
  45.     const SP                0xF00A;
  46.     const OPT                0xF00B;
  47.     const CLIENTTEXTBOX        0xF00D;
  48.     const CLIENTANCHOR        0xF010;
  49.     const CLIENTDATA        0xF011;
  50.     const BLIPJPEG            0xF01D;
  51.     const BLIPPNG            0xF01E;
  52.     const SPLITMENUCOLORS    0xF11E;
  53.     const TERTIARYOPT        0xF122;
  54.  
  55.     /**
  56.      * Escher stream data (binary)
  57.      *
  58.      * @var string 
  59.      */
  60.     private $_data;
  61.  
  62.     /**
  63.      * Size in bytes of the Escher stream data
  64.      *
  65.      * @var int 
  66.      */
  67.     private $_dataSize;
  68.  
  69.     /**
  70.      * Current position of stream pointer in Escher stream data
  71.      *
  72.      * @var int 
  73.      */
  74.     private $_pos;
  75.  
  76.     /**
  77.      * The object to be returned by the reader. Modified during load.
  78.      *
  79.      * @var mixed 
  80.      */
  81.     private $_object;
  82.  
  83.     /**
  84.      * Create a new PHPExcel_Reader_Excel5_Escher instance
  85.      *
  86.      * @param mixed $object 
  87.      */
  88.     public function __construct($object)
  89.     {
  90.         $this->_object $object;
  91.     }
  92.  
  93.     /**
  94.      * Load Escher stream data. May be a partial Escher stream.
  95.      *
  96.      * @param string $data 
  97.      */
  98.     public function load($data)
  99.     {
  100.         $this->_data $data;
  101.  
  102.         // total byte size of Excel data (workbook global substream + sheet substreams)
  103.         $this->_dataSize strlen($this->_data);
  104.  
  105.         $this->_pos 0;
  106.  
  107.         // Parse Escher stream
  108.         while ($this->_pos $this->_dataSize{
  109.  
  110.             // offset: 2; size: 2: Record Type
  111.             $fbt PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos 2);
  112.  
  113.             switch ($fbt{
  114.                 case self::DGGCONTAINER:    $this->_readDggContainer();        break;
  115.                 case self::DGG:                $this->_readDgg();                break;
  116.                 case self::BSTORECONTAINER:    $this->_readBstoreContainer();    break;
  117.                 case self::BSE:                $this->_readBSE();                break;
  118.                 case self::BLIPJPEG:        $this->_readBlipJPEG();            break;
  119.                 case self::BLIPPNG:            $this->_readBlipPNG();            break;
  120.                 case self::OPT:                $this->_readOPT();                break;
  121.                 case self::TERTIARYOPT:        $this->_readTertiaryOPT();        break;
  122.                 case self::SPLITMENUCOLORS:    $this->_readSplitMenuColors();    break;
  123.                 case self::DGCONTAINER:        $this->_readDgContainer();        break;
  124.                 case self::DG:                $this->_readDg();                break;
  125.                 case self::SPGRCONTAINER:    $this->_readSpgrContainer();    break;
  126.                 case self::SPCONTAINER:        $this->_readSpContainer();        break;
  127.                 case self::SPGR:            $this->_readSpgr();                break;
  128.                 case self::SP:                $this->_readSp();                break;
  129.                 case self::CLIENTTEXTBOX:    $this->_readClientTextbox();    break;
  130.                 case self::CLIENTANCHOR:    $this->_readClientAnchor();        break;
  131.                 case self::CLIENTDATA:        $this->_readClientData();        break;
  132.                 default:                    $this->_readDefault();            break;
  133.             }
  134.         }
  135.  
  136.         return $this->_object;
  137.     }
  138.  
  139.     /**
  140.      * Read a generic record
  141.      */
  142.     private function _readDefault()
  143.     {
  144.         // offset 0; size: 2; recVer and recInstance
  145.         $verInstance PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos);
  146.  
  147.         // offset: 2; size: 2: Record Type
  148.         $fbt PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos 2);
  149.  
  150.         // bit: 0-3; mask: 0x000F; recVer
  151.         $recVer (0x000F $verInstance>> 0;
  152.  
  153.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  154.         $recordData substr($this->_data$this->_pos 8$length);
  155.  
  156.         // move stream pointer to next record
  157.         $this->_pos += $length;
  158.     }
  159.  
  160.     /**
  161.      * Read DggContainer record (Drawing Group Container)
  162.      */
  163.     private function _readDggContainer()
  164.     {
  165.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  166.         $recordData substr($this->_data$this->_pos 8$length);
  167.  
  168.         // move stream pointer to next record
  169.         $this->_pos += $length;
  170.  
  171.         // record is a container, read contents
  172.         $dggContainer new PHPExcel_Shared_Escher_DggContainer();
  173.         $this->_object->setDggContainer($dggContainer);
  174.         $reader new PHPExcel_Reader_Excel5_Escher($dggContainer);
  175.         $reader->load($recordData);
  176.     }
  177.  
  178.     /**
  179.      * Read Dgg record (Drawing Group)
  180.      */
  181.     private function _readDgg()
  182.     {
  183.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  184.         $recordData substr($this->_data$this->_pos 8$length);
  185.  
  186.         // move stream pointer to next record
  187.         $this->_pos += $length;
  188.     }
  189.  
  190.     /**
  191.      * Read BstoreContainer record (Blip Store Container)
  192.      */
  193.     private function _readBstoreContainer()
  194.     {
  195.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  196.         $recordData substr($this->_data$this->_pos 8$length);
  197.  
  198.         // move stream pointer to next record
  199.         $this->_pos += $length;
  200.  
  201.         // record is a container, read contents
  202.         $bstoreContainer new PHPExcel_Shared_Escher_DggContainer_BstoreContainer();
  203.         $this->_object->setBstoreContainer($bstoreContainer);
  204.         $reader new PHPExcel_Reader_Excel5_Escher($bstoreContainer);
  205.         $reader->load($recordData);
  206.     }
  207.  
  208.     /**
  209.      * Read BSE record
  210.      */
  211.     private function _readBSE()
  212.     {
  213.         // offset: 0; size: 2; recVer and recInstance
  214.  
  215.         // bit: 4-15; mask: 0xFFF0; recInstance
  216.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  217.  
  218.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  219.         $recordData substr($this->_data$this->_pos 8$length);
  220.  
  221.         // move stream pointer to next record
  222.         $this->_pos += $length;
  223.  
  224.         // add BSE to BstoreContainer
  225.         $this->_object->addBSE($BSE);
  226.  
  227.         $BSE->setBLIPType($recInstance);
  228.  
  229.         // offset: 0; size: 1; btWin32 (MSOBLIPTYPE)
  230.         $btWin32 ord($recordData[0]);
  231.  
  232.         // offset: 1; size: 1; btWin32 (MSOBLIPTYPE)
  233.         $btMacOS ord($recordData[1]);
  234.  
  235.         // offset: 2; size: 16; MD4 digest
  236.         $rgbUid substr($recordData216);
  237.  
  238.         // offset: 18; size: 2; tag
  239.         $tag PHPExcel_Reader_Excel5::_GetInt2d($recordData18);
  240.  
  241.         // offset: 20; size: 4; size of BLIP in bytes
  242.         $size PHPExcel_Reader_Excel5::_GetInt4d($recordData20);
  243.  
  244.         // offset: 24; size: 4; number of references to this BLIP
  245.         $cRef PHPExcel_Reader_Excel5::_GetInt4d($recordData24);
  246.  
  247.         // offset: 28; size: 4; MSOFO file offset
  248.         $foDelay PHPExcel_Reader_Excel5::_GetInt4d($recordData28);
  249.  
  250.         // offset: 32; size: 1; unused1
  251.         $unused1 ord($recordData{32});
  252.  
  253.         // offset: 33; size: 1; size of nameData in bytes (including null terminator)
  254.         $cbName ord($recordData{33});
  255.  
  256.         // offset: 34; size: 1; unused2
  257.         $unused2 ord($recordData{34});
  258.  
  259.         // offset: 35; size: 1; unused3
  260.         $unused3 ord($recordData{35});
  261.  
  262.         // offset: 36; size: $cbName; nameData
  263.         $nameData substr($recordData36$cbName);
  264.  
  265.         // offset: 36 + $cbName, size: var; the BLIP data
  266.         $blipData substr($recordData36 $cbName);
  267.  
  268.         // record is a container, read contents
  269.         $reader new PHPExcel_Reader_Excel5_Escher($BSE);
  270.         $reader->load($blipData);
  271.     }
  272.  
  273.     /**
  274.      * Read BlipJPEG record. Holds raw JPEG image data
  275.      */
  276.     private function _readBlipJPEG()
  277.     {
  278.         // offset: 0; size: 2; recVer and recInstance
  279.  
  280.         // bit: 4-15; mask: 0xFFF0; recInstance
  281.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  282.  
  283.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  284.         $recordData substr($this->_data$this->_pos 8$length);
  285.  
  286.         // move stream pointer to next record
  287.         $this->_pos += $length;
  288.  
  289.         $pos 0;
  290.  
  291.         // offset: 0; size: 16; rgbUid1 (MD4 digest of)
  292.         $rgbUid1 substr($recordData016);
  293.         $pos += 16;
  294.  
  295.         // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3
  296.         if (in_array($recInstancearray(0x046B0x06E3))) {
  297.             $rgbUid2 substr($recordData1616);
  298.             $pos += 16;
  299.         }
  300.  
  301.         // offset: var; size: 1; tag
  302.         $tag ord($recordData{$pos});
  303.         $pos += 1;
  304.  
  305.         // offset: var; size: var; the raw image data
  306.         $data substr($recordData$pos);
  307.  
  308.         $blip->setData($data);
  309.  
  310.         $this->_object->setBlip($blip);
  311.     }
  312.  
  313.     /**
  314.      * Read BlipPNG record. Holds raw PNG image data
  315.      */
  316.     private function _readBlipPNG()
  317.     {
  318.         // offset: 0; size: 2; recVer and recInstance
  319.  
  320.         // bit: 4-15; mask: 0xFFF0; recInstance
  321.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  322.  
  323.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  324.         $recordData substr($this->_data$this->_pos 8$length);
  325.  
  326.         // move stream pointer to next record
  327.         $this->_pos += $length;
  328.  
  329.         $pos 0;
  330.  
  331.         // offset: 0; size: 16; rgbUid1 (MD4 digest of)
  332.         $rgbUid1 substr($recordData016);
  333.         $pos += 16;
  334.  
  335.         // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3
  336.         if ($recInstance == 0x06E1{
  337.             $rgbUid2 substr($recordData1616);
  338.             $pos += 16;
  339.         }
  340.  
  341.         // offset: var; size: 1; tag
  342.         $tag ord($recordData{$pos});
  343.         $pos += 1;
  344.  
  345.         // offset: var; size: var; the raw image data
  346.         $data substr($recordData$pos);
  347.  
  348.         $blip->setData($data);
  349.  
  350.         $this->_object->setBlip($blip);
  351.     }
  352.  
  353.     /**
  354.      * Read OPT record. This record may occur within DggContainer record or SpContainer
  355.      */
  356.     private function _readOPT()
  357.     {
  358.         // offset: 0; size: 2; recVer and recInstance
  359.  
  360.         // bit: 4-15; mask: 0xFFF0; recInstance
  361.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  362.  
  363.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  364.         $recordData substr($this->_data$this->_pos 8$length);
  365.  
  366.         // move stream pointer to next record
  367.         $this->_pos += $length;
  368.  
  369.         $this->_readOfficeArtRGFOPTE($recordData$recInstance);
  370.     }
  371.  
  372.     /**
  373.      * Read TertiaryOPT record
  374.      */
  375.     private function _readTertiaryOPT()
  376.     {
  377.         // offset: 0; size: 2; recVer and recInstance
  378.  
  379.         // bit: 4-15; mask: 0xFFF0; recInstance
  380.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  381.  
  382.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  383.         $recordData substr($this->_data$this->_pos 8$length);
  384.  
  385.         // move stream pointer to next record
  386.         $this->_pos += $length;
  387.     }
  388.  
  389.     /**
  390.      * Read SplitMenuColors record
  391.      */
  392.     private function _readSplitMenuColors()
  393.     {
  394.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  395.         $recordData substr($this->_data$this->_pos 8$length);
  396.  
  397.         // move stream pointer to next record
  398.         $this->_pos += $length;
  399.     }
  400.  
  401.     /**
  402.      * Read DgContainer record (Drawing Container)
  403.      */
  404.     private function _readDgContainer()
  405.     {
  406.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  407.         $recordData substr($this->_data$this->_pos 8$length);
  408.  
  409.         // move stream pointer to next record
  410.         $this->_pos += $length;
  411.  
  412.         // record is a container, read contents
  413.         $dgContainer new PHPExcel_Shared_Escher_DgContainer();
  414.         $this->_object->setDgContainer($dgContainer);
  415.         $reader new PHPExcel_Reader_Excel5_Escher($dgContainer);
  416.         $escher $reader->load($recordData);
  417.     }
  418.  
  419.     /**
  420.      * Read Dg record (Drawing)
  421.      */
  422.     private function _readDg()
  423.     {
  424.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  425.         $recordData substr($this->_data$this->_pos 8$length);
  426.  
  427.         // move stream pointer to next record
  428.         $this->_pos += $length;
  429.     }
  430.  
  431.     /**
  432.      * Read SpgrContainer record (Shape Group Container)
  433.      */
  434.     private function _readSpgrContainer()
  435.     {
  436.         // context is either context DgContainer or SpgrContainer
  437.  
  438.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  439.         $recordData substr($this->_data$this->_pos 8$length);
  440.  
  441.         // move stream pointer to next record
  442.         $this->_pos += $length;
  443.  
  444.         // record is a container, read contents
  445.         $spgrContainer new PHPExcel_Shared_Escher_DgContainer_SpgrContainer();
  446.  
  447.         if ($this->_object instanceof PHPExcel_Shared_Escher_DgContainer{
  448.             // DgContainer
  449.             $this->_object->setSpgrContainer($spgrContainer);
  450.         else {
  451.             // SpgrContainer
  452.             $this->_object->addChild($spgrContainer);
  453.         }
  454.  
  455.         $reader new PHPExcel_Reader_Excel5_Escher($spgrContainer);
  456.         $escher $reader->load($recordData);
  457.     }
  458.  
  459.     /**
  460.      * Read SpContainer record (Shape Container)
  461.      */
  462.     private function _readSpContainer()
  463.     {
  464.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  465.         $recordData substr($this->_data$this->_pos 8$length);
  466.  
  467.         // add spContainer to spgrContainer
  468.         $spContainer new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer();
  469.         $this->_object->addChild($spContainer);
  470.  
  471.         // move stream pointer to next record
  472.         $this->_pos += $length;
  473.  
  474.         // record is a container, read contents
  475.         $reader new PHPExcel_Reader_Excel5_Escher($spContainer);
  476.         $escher $reader->load($recordData);
  477.     }
  478.  
  479.     /**
  480.      * Read Spgr record (Shape Group)
  481.      */
  482.     private function _readSpgr()
  483.     {
  484.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  485.         $recordData substr($this->_data$this->_pos 8$length);
  486.  
  487.         // move stream pointer to next record
  488.         $this->_pos += $length;
  489.     }
  490.  
  491.     /**
  492.      * Read Sp record (Shape)
  493.      */
  494.     private function _readSp()
  495.     {
  496.         // offset: 0; size: 2; recVer and recInstance
  497.  
  498.         // bit: 4-15; mask: 0xFFF0; recInstance
  499.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  500.  
  501.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  502.         $recordData substr($this->_data$this->_pos 8$length);
  503.  
  504.         // move stream pointer to next record
  505.         $this->_pos += $length;
  506.     }
  507.  
  508.     /**
  509.      * Read ClientTextbox record
  510.      */
  511.     private function _readClientTextbox()
  512.     {
  513.         // offset: 0; size: 2; recVer and recInstance
  514.  
  515.         // bit: 4-15; mask: 0xFFF0; recInstance
  516.         $recInstance (0xFFF0 PHPExcel_Reader_Excel5::_GetInt2d($this->_data$this->_pos)) >> 4;
  517.  
  518.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  519.         $recordData substr($this->_data$this->_pos 8$length);
  520.  
  521.         // move stream pointer to next record
  522.         $this->_pos += $length;
  523.     }
  524.  
  525.     /**
  526.      * Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet
  527.      */
  528.     private function _readClientAnchor()
  529.     {
  530.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  531.         $recordData substr($this->_data$this->_pos 8$length);
  532.  
  533.         // move stream pointer to next record
  534.         $this->_pos += $length;
  535.  
  536.         // offset: 2; size: 2; upper-left corner column index (0-based)
  537.         $c1 PHPExcel_Reader_Excel5::_GetInt2d($recordData2);
  538.  
  539.         // offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width
  540.         $startOffsetX PHPExcel_Reader_Excel5::_GetInt2d($recordData4);
  541.  
  542.         // offset: 6; size: 2; upper-left corner row index (0-based)
  543.         $r1 PHPExcel_Reader_Excel5::_GetInt2d($recordData6);
  544.  
  545.         // offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height
  546.         $startOffsetY PHPExcel_Reader_Excel5::_GetInt2d($recordData8);
  547.  
  548.         // offset: 10; size: 2; bottom-right corner column index (0-based)
  549.         $c2 PHPExcel_Reader_Excel5::_GetInt2d($recordData10);
  550.  
  551.         // offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width
  552.         $endOffsetX PHPExcel_Reader_Excel5::_GetInt2d($recordData12);
  553.  
  554.         // offset: 14; size: 2; bottom-right corner row index (0-based)
  555.         $r2 PHPExcel_Reader_Excel5::_GetInt2d($recordData14);
  556.  
  557.         // offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height
  558.         $endOffsetY PHPExcel_Reader_Excel5::_GetInt2d($recordData16);
  559.  
  560.         // set the start coordinates
  561.         $this->_object->setStartCoordinates(PHPExcel_Cell::stringFromColumnIndex($c1($r1 1));
  562.  
  563.         // set the start offsetX
  564.         $this->_object->setStartOffsetX($startOffsetX);
  565.  
  566.         // set the start offsetY
  567.         $this->_object->setStartOffsetY($startOffsetY);
  568.  
  569.         // set the end coordinates
  570.         $this->_object->setEndCoordinates(PHPExcel_Cell::stringFromColumnIndex($c2($r2 1));
  571.  
  572.         // set the end offsetX
  573.         $this->_object->setEndOffsetX($endOffsetX);
  574.  
  575.         // set the end offsetY
  576.         $this->_object->setEndOffsetY($endOffsetY);
  577.     }
  578.  
  579.     /**
  580.      * Read ClientData record
  581.      */
  582.     private function _readClientData()
  583.     {
  584.         $length PHPExcel_Reader_Excel5::_GetInt4d($this->_data$this->_pos 4);
  585.         $recordData substr($this->_data$this->_pos 8$length);
  586.  
  587.         // move stream pointer to next record
  588.         $this->_pos += $length;
  589.     }
  590.  
  591.     /**
  592.      * Read OfficeArtRGFOPTE table of property-value pairs
  593.      *
  594.      * @param string $data Binary data
  595.      * @param int $n Number of properties
  596.      */
  597.     private function _readOfficeArtRGFOPTE($data$n{
  598.  
  599.         $splicedComplexData substr($data$n);
  600.  
  601.         // loop through property-value pairs
  602.         for ($i 0$i $n++$i{
  603.             // read 6 bytes at a time
  604.             $fopte substr($data$i6);
  605.  
  606.             // offset: 0; size: 2; opid
  607.             $opid PHPExcel_Reader_Excel5::_GetInt2d($fopte0);
  608.  
  609.             // bit: 0-13; mask: 0x3FFF; opid.opid
  610.             $opidOpid (0x3FFF $opid>> 0;
  611.  
  612.             // bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier
  613.             $opidFBid (0x4000 $opid>> 14;
  614.  
  615.             // bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data
  616.             $opidFComplex (0x8000 $opid>> 15;
  617.  
  618.             // offset: 2; size: 4; the value for this property
  619.             $op PHPExcel_Reader_Excel5::_GetInt4d($fopte2);
  620.  
  621.             if ($opidFComplex{
  622.                 $complexData substr($splicedComplexData0$op);
  623.                 $splicedComplexData substr($splicedComplexData$op);
  624.  
  625.                 // we store string value with complex data
  626.                 $value $complexData;
  627.             else {
  628.                 // we store integer value
  629.                 $value $op;
  630.             }
  631.  
  632.             $this->_object->setOPT($opidOpid$value);
  633.         }
  634.     }
  635.  
  636. }

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