private function readRecordOfficeArtFOPT($stream, $pos)
{
$arrayReturn = array('length' => 0);
$data = $this->loadRecordHeader($stream, $pos);
if ($data['recVer'] == 0x3 && $data['recType'] == 0xf00b) {
// Record Header
$arrayReturn['length'] += 8;
//@link : http://msdn.microsoft.com/en-us/library/dd906086(v=office.12).aspx
$officeArtFOPTE = array();
for ($inc = 0; $inc < $data['recInstance']; $inc++) {
$opid = self::getInt2d($this->streamPowerpointDocument, $pos + $arrayReturn['length']);
$arrayReturn['length'] += 2;
$data['recLen'] -= 2;
$optOp = self::getInt4d($this->streamPowerpointDocument, $pos + $arrayReturn['length']);
$arrayReturn['length'] += 4;
$data['recLen'] -= 4;
$officeArtFOPTE[] = array('opid' => $opid >> 0 & bindec('11111111111111'), 'fBid' => $opid >> 14 & bindec('1'), 'fComplex' => $opid >> 15 & bindec('1'), 'op' => $optOp);
}
//@link : http://code.metager.de/source/xref/kde/calligra/filters/libmso/OPID
foreach ($officeArtFOPTE as $opt) {
// echo $opt['opid'].'-0x'.dechex($opt['opid']).EOL;
switch ($opt['opid']) {
case 0x4:
// Transform : rotation
//@link : https://msdn.microsoft.com/en-us/library/dd949750(v=office.12).aspx
$arrayReturn['rotation'] = $opt['op'];
break;
case 0x7f:
// Transform : Protection Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd909131(v=office.12).aspx
break;
case 0x80:
// Text : ltxid
//@link : http://msdn.microsoft.com/en-us/library/dd947446(v=office.12).aspx
break;
case 0x81:
// Text : dxTextLeft
//@link : http://msdn.microsoft.com/en-us/library/dd953234(v=office.12).aspx
$arrayReturn['insetLeft'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x82:
// Text : dyTextTop
//@link : http://msdn.microsoft.com/en-us/library/dd925068(v=office.12).aspx
$arrayReturn['insetTop'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x83:
// Text : dxTextRight
//@link : http://msdn.microsoft.com/en-us/library/dd906782(v=office.12).aspx
$arrayReturn['insetRight'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x84:
// Text : dyTextBottom
//@link : http://msdn.microsoft.com/en-us/library/dd772858(v=office.12).aspx
$arrayReturn['insetBottom'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x85:
// Text : WrapText
//@link : http://msdn.microsoft.com/en-us/library/dd924770(v=office.12).aspx
break;
case 0x87:
// Text : anchorText
//@link : http://msdn.microsoft.com/en-us/library/dd948575(v=office.12).aspx
break;
case 0xbf:
// Text : Text Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd950905(v=office.12).aspx
break;
case 0x104:
// Blip : pib
//@link : http://msdn.microsoft.com/en-us/library/dd772837(v=office.12).aspx
if ($opt['fComplex'] == 0) {
$arrayReturn['pib'] = $opt['op'];
$data['recLen'] -= $opt['op'];
} else {
// pib Complex
}
break;
case 0x13f:
// Blip Boolean Properties
//@link : https://msdn.microsoft.com/en-us/library/dd944215(v=office.12).aspx
break;
case 0x140:
// Geometry : geoLeft
//@link : http://msdn.microsoft.com/en-us/library/dd947489(v=office.12).aspx
// print_r('geoLeft : '.$opt['op'].EOL);
break;
case 0x141:
// Geometry : geoTop
//@link : http://msdn.microsoft.com/en-us/library/dd949459(v=office.12).aspx
// print_r('geoTop : '.$opt['op'].EOL);
break;
case 0x142:
// Geometry : geoRight
//@link : http://msdn.microsoft.com/en-us/library/dd947117(v=office.12).aspx
// print_r('geoRight : '.$opt['op'].EOL);
break;
case 0x143:
// Geometry : geoBottom
//@link : http://msdn.microsoft.com/en-us/library/dd948602(v=office.12).aspx
// print_r('geoBottom : '.$opt['op'].EOL);
break;
case 0x144:
// Geometry : shapePath
//@link : http://msdn.microsoft.com/en-us/library/dd945249(v=office.12).aspx
$arrayReturn['line'] = true;
break;
case 0x145:
// Geometry : pVertices
//@link : http://msdn.microsoft.com/en-us/library/dd949814(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x146:
// Geometry : pSegmentInfo
//@link : http://msdn.microsoft.com/en-us/library/dd905742(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x155:
// Geometry : pAdjustHandles
//@link : http://msdn.microsoft.com/en-us/library/dd905890(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x156:
// Geometry : pGuides
//@link : http://msdn.microsoft.com/en-us/library/dd910801(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x157:
// Geometry : pInscribe
//@link : http://msdn.microsoft.com/en-us/library/dd904889(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x17f:
// Geometry Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd944968(v=office.12).aspx
break;
case 0x180:
// Fill : fillType
//@link : http://msdn.microsoft.com/en-us/library/dd947909(v=office.12).aspx
break;
case 0x181:
// Fill : fillColor
//@link : http://msdn.microsoft.com/en-us/library/dd921332(v=office.12).aspx
$strColor = str_pad(dechex($opt['op'] >> 0 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 8 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 16 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
// echo 'fillColor : '.$strColor.EOL;
break;
case 0x183:
// Fill : fillBackColor
//@link : http://msdn.microsoft.com/en-us/library/dd950634(v=office.12).aspx
$strColor = str_pad(dechex($opt['op'] >> 0 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 8 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 16 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
// echo 'fillBackColor : '.$strColor.EOL;
break;
case 0x193:
// Fill : fillRectRight
//@link : http://msdn.microsoft.com/en-us/library/dd951294(v=office.12).aspx
// echo 'fillRectRight : '.\PhpOffice\Common\Drawing::emuToPixels($opt['op']).EOL;
break;
case 0x194:
// Fill : fillRectBottom
//@link : http://msdn.microsoft.com/en-us/library/dd910194(v=office.12).aspx
// echo 'fillRectBottom : '.\PhpOffice\Common\Drawing::emuToPixels($opt['op']).EOL;
break;
case 0x1bf:
// Fill : Fill Style Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd909380(v=office.12).aspx
break;
case 0x1c0:
// Line Style : lineColor
//@link : http://msdn.microsoft.com/en-us/library/dd920397(v=office.12).aspx
$strColor = str_pad(dechex($opt['op'] >> 0 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 8 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$strColor .= str_pad(dechex($opt['op'] >> 16 & bindec('11111111')), 2, STR_PAD_LEFT, '0');
$arrayReturn['lineColor'] = $strColor;
break;
case 0x1c1:
// Line Style : lineOpacity
//@link : http://msdn.microsoft.com/en-us/library/dd923433(v=office.12).aspx
// echo 'lineOpacity : '.dechex($opt['op']).EOL;
break;
case 0x1c2:
// Line Style : lineBackColor
//@link : http://msdn.microsoft.com/en-us/library/dd947669(v=office.12).aspx
break;
case 0x1cb:
// Line Style : lineWidth
//@link : http://msdn.microsoft.com/en-us/library/dd926964(v=office.12).aspx
$arrayReturn['lineWidth'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x1d6:
// Line Style : lineJoinStyle
//@link : http://msdn.microsoft.com/en-us/library/dd909643(v=office.12).aspx
break;
case 0x1d7:
// Line Style : lineEndCapStyle
//@link : http://msdn.microsoft.com/en-us/library/dd925071(v=office.12).aspx
break;
case 0x1ff:
// Line Style : Line Style Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd951605(v=office.12).aspx
break;
case 0x201:
// Shadow Style : shadowColor
//@link : http://msdn.microsoft.com/en-us/library/dd923454(v=office.12).aspx
break;
case 0x204:
// Shadow Style : shadowOpacity
//@link : http://msdn.microsoft.com/en-us/library/dd920720(v=office.12).aspx
break;
case 0x205:
// Shadow Style : shadowOffsetX
//@link : http://msdn.microsoft.com/en-us/library/dd945280(v=office.12).aspx
$arrayReturn['shadowOffsetX'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x206:
// Shadow Style : shadowOffsetY
//@link : http://msdn.microsoft.com/en-us/library/dd907855(v=office.12).aspx
$arrayReturn['shadowOffsetY'] = \PhpOffice\Common\Drawing::emuToPixels($opt['op']);
break;
case 0x23f:
// Shadow Style : Shadow Style Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd947887(v=office.12).aspx
break;
case 0x304:
// Shape : bWMode
//@link : http://msdn.microsoft.com/en-us/library/dd947659(v=office.12).aspx
break;
case 0x33f:
// Shape Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd951345(v=office.12).aspx
break;
case 0x380:
// Group Shape Property Set : wzName
//@link : http://msdn.microsoft.com/en-us/library/dd950681(v=office.12).aspx
if ($opt['fComplex'] == 1) {
$arrayReturn['length'] += $opt['op'];
$data['recLen'] -= $opt['op'];
}
break;
case 0x3bf:
// Group Shape Property Set : Group Shape Boolean Properties
//@link : http://msdn.microsoft.com/en-us/library/dd949807(v=office.12).aspx
break;
default:
throw new \Exception('Feature not implemented (l.' . __LINE__ . ' : 0x' . dechex($opt['opid']) . ')');
}
}
if ($data['recLen'] > 0) {
$arrayReturn['length'] += $data['recLen'];
}
}
return $arrayReturn;
}