private function readRecordOfficeArtSpContainer($stream, $pos)
{
$arrayReturn = array('length' => 0, 'shape' => null);
$data = $this->loadRecordHeader($stream, $pos);
if ($data['recVer'] == 0xf && $data['recInstance'] == 0x0 && $data['recType'] == 0xf004) {
// Record Header
$arrayReturn['length'] += 8;
// shapeGroup
$shapeGroup = $this->readRecordOfficeArtFSPGR($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shapeGroup['length'];
// shapeProp
$shapeProp = $this->readRecordOfficeArtFSP($stream, $pos + $arrayReturn['length']);
if ($shapeProp['length'] == 0) {
throw new \Exception('PowerPoint97 Reader : record OfficeArtFSP');
}
$arrayReturn['length'] += $shapeProp['length'];
if ($shapeProp['fDeleted'] == 0x1 && $shapeProp['fChild'] == 0x0) {
// deletedShape
$deletedShape = $this->readRecordOfficeArtFPSPL($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $deletedShape['length'];
}
// shapePrimaryOptions
$shpPrimaryOptions = $this->readRecordOfficeArtFOPT($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shpPrimaryOptions['length'];
// shapeSecondaryOptions1
$shpSecondaryOptions1 = $this->readRecordOfficeArtSecondaryFOPT($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shpSecondaryOptions1['length'];
// shapeTertiaryOptions1
$shpTertiaryOptions1 = $this->readRecordOfficeArtTertiaryFOPT($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shpTertiaryOptions1['length'];
// childAnchor
$childAnchor = $this->readRecordOfficeArtChildAnchor($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $childAnchor['length'];
// clientAnchor
$clientAnchor = $this->readRecordOfficeArtClientAnchor($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $clientAnchor['length'];
// clientData
$clientData = $this->readRecordOfficeArtClientData($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $clientData['length'];
// clientTextbox
$clientTextbox = $this->readRecordOfficeArtClientTextbox($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $clientTextbox['length'];
// shapeSecondaryOptions2
if ($shpSecondaryOptions1['length'] == 0) {
$shpSecondaryOptions2 = $this->readRecordOfficeArtSecondaryFOPT($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shpSecondaryOptions2['length'];
}
// shapeTertiaryOptions2
if ($shpTertiaryOptions1['length'] == 0) {
$shpTertiaryOptions2 = $this->readRecordOfficeArtTertiaryFOPT($stream, $pos + $arrayReturn['length']);
$arrayReturn['length'] += $shpTertiaryOptions2['length'];
}
// Core : Shape
// Informations about group are not defined
$arrayDimensions = array();
$bIsGroup = false;
if (is_object($this->oCurrentGroup)) {
if (!$this->bFirstShapeGroup) {
if ($clientAnchor['length'] > 0) {
// $this->oCurrentGroup->setOffsetX($clientAnchor['left']);
// $this->oCurrentGroup->setOffsetY($clientAnchor['top']);
// $this->oCurrentGroup->setHeight($clientAnchor['height']);
// $this->oCurrentGroup->setWidth($clientAnchor['width']);
}
$bIsGroup = true;
$this->bFirstShapeGroup = true;
} else {
if ($childAnchor['length'] > 0) {
$arrayDimensions = $childAnchor;
}
}
} else {
if ($clientAnchor['length'] > 0) {
$arrayDimensions = $clientAnchor;
}
}
if (!$bIsGroup) {
// *** Shape ***
if (isset($shpPrimaryOptions['pib'])) {
// isDrawing
$drawingPib = $shpPrimaryOptions['pib'];
if (isset($this->arrayPictures[$drawingPib - 1])) {
$gdImage = imagecreatefromstring($this->arrayPictures[$drawingPib - 1]);
$arrayReturn['shape'] = new Drawing\Gd();
$arrayReturn['shape']->setImageResource($gdImage);
}
} elseif (isset($shpPrimaryOptions['line']) && $shpPrimaryOptions['line']) {
// isLine
$arrayReturn['shape'] = new Line(0, 0, 0, 0);
} elseif ($clientTextbox['length'] > 0) {
$arrayReturn['shape'] = new RichText();
if (isset($clientTextbox['alignH'])) {
$arrayReturn['shape']->getActiveParagraph()->getAlignment()->setHorizontal($clientTextbox['alignH']);
}
$start = 0;
$lastLevel = -1;
$lastMarginLeft = 0;
for ($inc = 1; $inc <= $clientTextbox['numParts']; $inc++) {
if ($clientTextbox['numParts'] == $clientTextbox['numTexts'] && isset($clientTextbox['text' . $inc])) {
if (isset($clientTextbox['text' . $inc]['bulletChar'])) {
$arrayReturn['shape']->getActiveParagraph()->getBulletStyle()->setBulletType(Bullet::TYPE_BULLET);
$arrayReturn['shape']->getActiveParagraph()->getBulletStyle()->setBulletChar($clientTextbox['text' . $inc]['bulletChar']);
}
// Indent
$indent = 0;
if (isset($clientTextbox['text' . $inc]['indent'])) {
$indent = $clientTextbox['text' . $inc]['indent'];
}
if (isset($clientTextbox['text' . $inc]['leftMargin'])) {
if ($lastMarginLeft > $clientTextbox['text' . $inc]['leftMargin']) {
$lastLevel--;
}
if ($lastMarginLeft < $clientTextbox['text' . $inc]['leftMargin']) {
$lastLevel++;
}
$arrayReturn['shape']->getActiveParagraph()->getAlignment()->setLevel($lastLevel);
$lastMarginLeft = $clientTextbox['text' . $inc]['leftMargin'];
$arrayReturn['shape']->getActiveParagraph()->getAlignment()->setMarginLeft($clientTextbox['text' . $inc]['leftMargin']);
$arrayReturn['shape']->getActiveParagraph()->getAlignment()->setIndent($indent - $clientTextbox['text' . $inc]['leftMargin']);
}
}
// Texte
$sText = substr(isset($clientTextbox['text']) ? $clientTextbox['text'] : '', $start, $clientTextbox['part' . $inc]['partLength']);
$sHyperlinkURL = '';
if (empty($sText)) {
// Is there a hyperlink ?
if (isset($clientTextbox['hyperlink']) && is_array($clientTextbox['hyperlink']) && !empty($clientTextbox['hyperlink'])) {
foreach ($clientTextbox['hyperlink'] as $itmHyperlink) {
if ($itmHyperlink['start'] == $start && $itmHyperlink['end'] - $itmHyperlink['start'] == $clientTextbox['part' . $inc]['partLength']) {
$sText = $this->arrayHyperlinks[$itmHyperlink['id']]['text'];
$sHyperlinkURL = $this->arrayHyperlinks[$itmHyperlink['id']]['url'];
break;
}
}
}
}
// New paragraph
$bCreateParagraph = false;
if (strpos($sText, "\r") !== false) {
$bCreateParagraph = true;
$sText = str_replace("\r", '', $sText);
}
// TextRun
$txtRun = $arrayReturn['shape']->createTextRun($sText);
if (isset($clientTextbox['part' . $inc]['bold'])) {
$txtRun->getFont()->setBold($clientTextbox['part' . $inc]['bold']);
}
if (isset($clientTextbox['part' . $inc]['italic'])) {
$txtRun->getFont()->setItalic($clientTextbox['part' . $inc]['italic']);
}
if (isset($clientTextbox['part' . $inc]['underline'])) {
$txtRun->getFont()->setUnderline($clientTextbox['part' . $inc]['underline']);
}
if (isset($clientTextbox['part' . $inc]['fontName'])) {
$txtRun->getFont()->setName($clientTextbox['part' . $inc]['fontName']);
}
if (isset($clientTextbox['part' . $inc]['fontSize'])) {
$txtRun->getFont()->setSize($clientTextbox['part' . $inc]['fontSize']);
}
if (isset($clientTextbox['part' . $inc]['color'])) {
$txtRun->getFont()->setColor($clientTextbox['part' . $inc]['color']);
}
// Hyperlink
if (!empty($sHyperlinkURL)) {
$txtRun->setHyperlink(new Hyperlink($sHyperlinkURL));
}
$start += $clientTextbox['part' . $inc]['partLength'];
if ($bCreateParagraph) {
$arrayReturn['shape']->createParagraph();
}
}
}
// *** Properties ***
// Dimensions
if ($arrayReturn['shape'] instanceof AbstractShape) {
if (!empty($arrayDimensions)) {
$arrayReturn['shape']->setOffsetX($arrayDimensions['left']);
$arrayReturn['shape']->setOffsetY($arrayDimensions['top']);
$arrayReturn['shape']->setHeight($arrayDimensions['height']);
$arrayReturn['shape']->setWidth($arrayDimensions['width']);
}
// Rotation
if (isset($shpPrimaryOptions['rotation'])) {
$rotation = $shpPrimaryOptions['rotation'];
$arrayReturn['shape']->setRotation($rotation);
}
// Shadow
if (isset($shpPrimaryOptions['shadowOffsetX']) && isset($shpPrimaryOptions['shadowOffsetY'])) {
$shadowOffsetX = $shpPrimaryOptions['shadowOffsetX'];
$shadowOffsetY = $shpPrimaryOptions['shadowOffsetY'];
if ($shadowOffsetX != 0 && $shadowOffsetX != 0) {
$arrayReturn['shape']->getShadow()->setVisible(true);
if ($shadowOffsetX > 0 && $shadowOffsetX == $shadowOffsetY) {
$arrayReturn['shape']->getShadow()->setDistance($shadowOffsetX)->setDirection(45);
}
}
}
// Specific Line
if ($arrayReturn['shape'] instanceof Line) {
if (isset($shpPrimaryOptions['lineColor'])) {
$arrayReturn['shape']->getBorder()->getColor()->setARGB('FF' . $shpPrimaryOptions['lineColor']);
}
if (isset($shpPrimaryOptions['lineWidth'])) {
$arrayReturn['shape']->setHeight($shpPrimaryOptions['lineWidth']);
}
}
// Specific RichText
if ($arrayReturn['shape'] instanceof RichText) {
if (isset($shpPrimaryOptions['insetBottom'])) {
$arrayReturn['shape']->setInsetBottom($shpPrimaryOptions['insetBottom']);
}
if (isset($shpPrimaryOptions['insetLeft'])) {
$arrayReturn['shape']->setInsetLeft($shpPrimaryOptions['insetLeft']);
}
if (isset($shpPrimaryOptions['insetRight'])) {
$arrayReturn['shape']->setInsetRight($shpPrimaryOptions['insetRight']);
}
if (isset($shpPrimaryOptions['insetTop'])) {
$arrayReturn['shape']->setInsetTop($shpPrimaryOptions['insetTop']);
}
}
}
} else {
// Rotation
if (isset($shpPrimaryOptions['rotation'])) {
$rotation = $shpPrimaryOptions['rotation'];
$this->oCurrentGroup->setRotation($rotation);
}
}
}
return $arrayReturn;
}