tag was used to create an area in which the rotation would take place.
ConvertTextVML(oNodeTextBox, pShape);
}
std::wstring sTextInset = oNodeTextBox.GetAttribute(L"inset");
std::wstring sTextInsetMode = oNodeTextBox.GetAttribute(L"o:insetmode");
sTextboxStyle = oNodeTextBox.GetAttribute(L"style");
//if (L"" != sTextInset && ((L"" == sTextInsetMode) || (L"custom" == sTextInsetMode)))
if (sTextInsetMode.empty() || L"custom" == sTextInsetMode)
{
if (!sTextInset.empty())
{
PPTX::CStringTrimmer oTrimmer;
oTrimmer.m_Separator = (wchar_t)',';
oTrimmer.LoadFromString(sTextInset);
double dTextMarginLeft = oTrimmer.GetParameter(0, 0.1);
double dTextMarginTop = oTrimmer.GetParameter(1, 0.05);
double dTextMarginRight = oTrimmer.GetParameter(2, 0.1);
double dTextMarginBottom = oTrimmer.GetParameter(3, 0.05);
pShape->oTextBoxBodyPr->lIns = (int)(12700 * dTextMarginLeft + 0.5);
pShape->oTextBoxBodyPr->tIns = (int)(12700 * dTextMarginTop + 0.5);
pShape->oTextBoxBodyPr->rIns = (int)(12700 * dTextMarginRight + 0.5);
pShape->oTextBoxBodyPr->bIns = (int)(12700 * dTextMarginBottom + 0.5);
}
else
{
if (pPPTShape->m_eType == PPTShapes::sptCTextBox ||
pPPTShape->m_eType == PPTShapes::sptCRect ||
pPPTShape->m_eType == PPTShapes::sptCRoundRect ||
pPPTShape->m_eType == PPTShapes::sptCEllipse ||
pPPTShape->m_eType == PPTShapes::sptCWedgeRectCallout ||
pPPTShape->m_eType == PPTShapes::sptCWedgeRoundRectCallout ||
pPPTShape->m_eType == PPTShapes::sptCWedgeEllipseCallout ||
pPPTShape->m_eType == PPTShapes::sptCCloudCallout ||
pPPTShape->m_eType == PPTShapes::sptCFlowChartConnector ||
pPPTShape->m_eType == PPTShapes::sptCFlowChartProcess)
{
pShape->oTextBoxBodyPr->lIns = 91440;
pShape->oTextBoxBodyPr->tIns = 45720;
pShape->oTextBoxBodyPr->rIns = 91440;
pShape->oTextBoxBodyPr->bIns = 45720;
}
else
{
pShape->oTextBoxBodyPr->lIns = 12700;
pShape->oTextBoxBodyPr->tIns = 12700;
pShape->oTextBoxBodyPr->rIns = 12700;
pShape->oTextBoxBodyPr->bIns = 12700;
}
}
}
if (!sTextboxStyle.empty())
{//todooo прописать все остальное
SimpleTypes::Vml::CCssStyle oCssStyle;
oCssStyle.FromString(sTextboxStyle);
if (false == oCssStyle.m_arrProperties.empty())
{
std::map
::iterator pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptLayoutFlow);
if (pFind != oCssStyle.m_mapProperties.end())
{
if (oCssStyle.m_arrProperties[pFind->second]->get_Value().eLayoutFlow == SimpleTypes::Vml::csslayoutflowVertical)
{
pShape->oTextBoxBodyPr->vert = new PPTX::Limit::TextVerticalType();
pShape->oTextBoxBodyPr->vert->set(L"vert");
}
}
pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptMsoLayoutFlowAlt);
if (pFind != oCssStyle.m_mapProperties.end())
{
if (oCssStyle.m_arrProperties[pFind->second]->get_Value().eLayoutFlowAlt == SimpleTypes::Vml::csslayoutflowaltBottomToTop)
{
if (pShape->oTextBoxBodyPr->vert.IsInit() == false)
pShape->oTextBoxBodyPr->vert = new PPTX::Limit::TextVerticalType();
pShape->oTextBoxBodyPr->vert->set(L"vert270");
}
}
if (pShape->oTextBoxBodyPr->vert.IsInit())
{
if (pShape->txBody.IsInit() == false)
pShape->txBody = new PPTX::Logic::TxBody();
if (!pShape->txBody->bodyPr.IsInit())
pShape->txBody->bodyPr = new PPTX::Logic::BodyPr();
pShape->txBody->bodyPr->vert = pShape->oTextBoxBodyPr->vert;
}
pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptMsoRotate);
if (pFind != oCssStyle.m_mapProperties.end())
{
try
{
double val = 0;
switch (oCssStyle.m_arrProperties[pFind->second]->get_Value().eRotate)
{
case SimpleTypes::Vml::cssmsorotate90: val = 90; break;
case SimpleTypes::Vml::cssmsorotate180: val = 180; break;
case SimpleTypes::Vml::cssmsorotate270: val = 270; break;
}
pShape->oTextBoxBodyPr->rot = val * 60000; //для docx, xlsx
if (pShape->txBody.IsInit() == false) //для pptx
pShape->txBody = new PPTX::Logic::TxBody();
if (!pShape->txBody->bodyPr.IsInit())
pShape->txBody->bodyPr = new PPTX::Logic::BodyPr();
pShape->txBody->bodyPr->rot = pShape->oTextBoxBodyPr->rot;
}catch(...){}
}
pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptMsoFitShapeToText);
if (pFind != oCssStyle.m_mapProperties.end())
{
if (oCssStyle.m_arrProperties[pFind->second]->get_Value().bValue)
{
if (pShape->txBody.IsInit() == false) //для pptx /// todooo схлопнуть
pShape->txBody = new PPTX::Logic::TxBody();
if (!pShape->txBody->bodyPr.IsInit())
pShape->txBody->bodyPr = new PPTX::Logic::BodyPr();
pShape->txBody->bodyPr->Fit.type = PPTX::Logic::TextFit::FitSpAuto;
pShape->oTextBoxBodyPr->Fit.type = PPTX::Logic::TextFit::FitSpAuto;
}
}
pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptMsoFitTextToShape);
if (pFind != oCssStyle.m_mapProperties.end())
{
if (oCssStyle.m_arrProperties[pFind->second]->get_Value().bValue)
{
if (pShape->txBody.IsInit() == false) //для pptx
pShape->txBody = new PPTX::Logic::TxBody();
if (!pShape->txBody->bodyPr.IsInit())
pShape->txBody->bodyPr = new PPTX::Logic::BodyPr();
pShape->txBody->bodyPr->Fit.type = PPTX::Logic::TextFit::FitNo;//?? todoooo
pShape->oTextBoxBodyPr->Fit.type = PPTX::Logic::TextFit::FitNo;//?? todoooo
}
}
pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptMsoTextScale);
if (pFind != oCssStyle.m_mapProperties.end())
{
try
{
if (oCssStyle.m_arrProperties[pFind->second]->get_Value().oValue.eType == SimpleTypes::Vml::cssunitstypeUnits)
{
pShape->oTextBoxBodyPr->Fit.fontScale = (int)(100 * oCssStyle.m_arrProperties[pFind->second]->get_Value().oValue.dValue); //для docx, xlsx
pShape->oTextBoxBodyPr->Fit.type = PPTX::Logic::TextFit::FitNormAuto;
if (pShape->txBody.IsInit() == false) //для pptx
pShape->txBody = new PPTX::Logic::TxBody();
if (!pShape->txBody->bodyPr.IsInit())
pShape->txBody->bodyPr = new PPTX::Logic::BodyPr();
pShape->txBody->bodyPr->Fit.fontScale = pShape->oTextBoxBodyPr->Fit.fontScale;
pShape->txBody->bodyPr->Fit.type = pShape->oTextBoxBodyPr->Fit.type;
}
}catch(...){}
}
}
}
}
XmlUtils::CXmlNode oNodeTextData;
if (oNodeShape.GetNode(L"p:textdata", oNodeTextData))
{
std::wstring sId = oNodeTextData.GetAttribute(L"id");
if (sId.length() > 0 && m_pBinaryWriter->GetRels().IsInit())
{
OOX::RId rId(sId);
smart_ptr pExt = m_pBinaryWriter->GetRels()->Get(rId);
if (pExt.IsInit())
{
if (pShape->txBody.IsInit() == false)
pShape->txBody = new PPTX::Logic::TxBody();
if (pShape->txBody.IsInit())
{
PPTX::Logic::Paragraph p;
PPTX::Logic::Run *r = new PPTX::Logic::Run();
r->SetText(pExt->m_Text);
if (pExt->m_arrRPr.size() > 0)
{
r->rPr = pExt->m_arrRPr[0];
}
PPTX::Logic::RunElem elm;
p.RunElems.push_back(elm);
if (pExt->m_arrPPr.size() > 0)
{
p.pPr = pExt->m_arrPPr[0];
}
p.RunElems.back().InitRun(r);
pShape->txBody->Paragrs.push_back(p);
}
}
}
}
if (bTextBox)
{
pShape->nvSpPr.cNvSpPr.txBox = true;
}
}
//-------------------------------------------------------------------------------------------------------------------
XmlUtils::CXmlNode oNodeG;
oNodeG.FromXmlString(strXmlPPTX);
pSpPr->Geometry = oNodeG;
std::wstring strStyle = oNodeShape.GetAttribute(L"style") + strStyleAdvenced;
PPTX::CCSS oCSSParser;
oCSSParser.LoadFromString2(strStyle);
if (bHidden && false == bIsTop)
{
pCNvPr->hidden = true;
}
CSpTreeElemProps oProps;
oProps.IsTop = bIsTop;
std::wstring strMainPos = GetDrawingMainProps(oNodeShape, oCSSParser, oProps);
//-------------------------------------------------------------------------------------------------------------------
if (pShape && oCSSParser.m_mapSettings.size() > 0)
{
std::map::iterator pFind = oCSSParser.m_mapSettings.find(L"v-text-anchor");
if (pFind != oCSSParser.m_mapSettings.end())
{
if (pFind->second == L"middle") pShape->oTextBoxBodyPr->anchor = L"ctr";
if (pFind->second == L"bottom") pShape->oTextBoxBodyPr->anchor = L"b";
if (pFind->second == L"top-center") pShape->oTextBoxBodyPr->anchor = L"t";
if (pFind->second == L"middle-center") pShape->oTextBoxBodyPr->anchor = L"ctr";
if (pFind->second == L"bottom-center") pShape->oTextBoxBodyPr->anchor = L"b";
if (pFind->second == L"top-baseline") pShape->oTextBoxBodyPr->anchor = L"t";
if (pFind->second == L"bottom-baseline") pShape->oTextBoxBodyPr->anchor = L"b";
if (pFind->second == L"top-center-baseline") pShape->oTextBoxBodyPr->anchor = L"t";
if (pFind->second == L"bottom-center-baseline") pShape->oTextBoxBodyPr->anchor = L"b";
}
pFind = oCSSParser.m_mapSettings.find(L"mso-wrap-style");
if (pFind != oCSSParser.m_mapSettings.end() )
{
if (pFind->second == L"none")
pShape->oTextBoxBodyPr->wrap = L"none";
else
pShape->oTextBoxBodyPr->wrap = L"wrap";
}
else if (!pPPTShape->IsWordArt())
pShape->oTextBoxBodyPr->wrap = L"wrap";
}
////////////////////////////////////////////////////////////////////////////////////
if (bIsTop)
{
SendMainProps(strMainPos, pMainProps);
if (m_oxfrm_override.IsInit())
{
pSpPr->xfrm = m_oxfrm_override;
}
else
{
pSpPr->xfrm = new PPTX::Logic::Xfrm();
if (*pMainProps)
{//oProps.X выставлять не надо, они учтены в pMainProps
pSpPr->xfrm->offX = 0;
pSpPr->xfrm->offY = 0;
}
else
{
pSpPr->xfrm->offX = oProps.X;
pSpPr->xfrm->offY = oProps.Y;
}
pSpPr->xfrm->extX = oProps.Width;
pSpPr->xfrm->extY = oProps.Height;
}
std::map::iterator pFind = oCSSParser.m_mapSettings.find(L"flip");
if (oCSSParser.m_mapSettings.end() != pFind)
{
if (pFind->second == L"x")
pSpPr->xfrm->flipH = true;
else if (pFind->second == L"y")
pSpPr->xfrm->flipV = true;
else if ((pFind->second == L"xy") || (pFind->second == L"yx") || (pFind->second == L"x y") || (pFind->second == L"y x")
|| (pFind->second == L"y,x") || (pFind->second == L"x,y"))
{
pSpPr->xfrm->flipH = true;
pSpPr->xfrm->flipV = true;
}
}
pFind = oCSSParser.m_mapSettings.find(L"rotation");
if (oCSSParser.m_mapSettings.end() != pFind)
{
pSpPr->xfrm->rot = NS_DWC_Common::getRotateAngle(pFind->second, pSpPr->xfrm->flipH, pSpPr->xfrm->flipV);
}
}
else
{
m_pBinaryWriter->m_dXCurShape = 0;
m_pBinaryWriter->m_dYCurShape = 0;
m_pBinaryWriter->m_dCxCurShape = 0;
m_pBinaryWriter->m_dCyCurShape = 0;
pSpPr->xfrm = new PPTX::Logic::Xfrm();
pSpPr->xfrm->offX = oProps.X;
pSpPr->xfrm->offY = oProps.Y;
pSpPr->xfrm->extX = oProps.Width;
pSpPr->xfrm->extY = oProps.Height;
std::map::iterator pFind = oCSSParser.m_mapSettings.find(L"flip");
if (oCSSParser.m_mapSettings.end() != pFind)
{
if (pFind->second == L"x")
pSpPr->xfrm->flipH = true;
else if (pFind->second == L"y")
pSpPr->xfrm->flipV = true;
else if ((pFind->second == L"xy") || (pFind->second == L"yx") || (pFind->second == L"x y") || (pFind->second == L"y x")
|| (pFind->second == L"y,x") || (pFind->second == L"x,y"))
{
pSpPr->xfrm->flipH = true;
pSpPr->xfrm->flipV = true;
}
}
pFind = oCSSParser.m_mapSettings.find(L"rotation");
if (oCSSParser.m_mapSettings.end() != pFind)
{
pSpPr->xfrm->rot = NS_DWC_Common::getRotateAngle(pFind->second, pSpPr->xfrm->flipH, pSpPr->xfrm->flipV);
}
}
if (!bIsTop)
{
pCNvPr->id = m_lNextId;
m_lNextId++;
}
else
{
pCNvPr->id = -1;
}
if (pShape)
{
pShape->signatureLine = pPPTShape->m_oSignatureLine;
}
if (bStroked)
{
CheckPenShape(elem, oNodeShape, pPPTShape);
}
CheckBrushShape(elem, oNodeShape, pPPTShape);
CheckBorderShape(elem, oNodeShape, pPPTShape);
CheckEffectShape(elem, oNodeShape, pPPTShape);
////test
//NSBinPptxRW::CXmlWriter oXml;
//elem->toXmlWriter(&oXml);
//std::wstring test = oXml.GetXmlString();
}
}
void CDrawingConverter::ConvertWordArtShape(PPTX::Logic::SpTreeElem* elem, XmlUtils::CXmlNode& oNodeShape, CPPTShape* pPPTShape)
{
if (!elem) return;
if (!pPPTShape) return;
PPTX::Logic::Shape* pShape = dynamic_cast(elem->GetElem().operator ->());
if (!pShape) return;
enum EFilltype
{
etBlipFill = 0,
etGradFill = 1,
etNoFill = 2,
etPattFill = 3,
etSolidFill = 4
};
PPTShapes::ShapeType eShapeType = pPPTShape->m_eType;
SimpleTypes::ETextShapeType eTextShapeType;
switch (eShapeType)
{
case PPTShapes::ShapeType::sptCTextPlain: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextPlain; break;
case PPTShapes::ShapeType::sptCTextArchUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextArchUp; break;
case PPTShapes::ShapeType::sptCTextArchDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextArchDown; break;
case PPTShapes::ShapeType::sptCTextButton: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextButton; break;
case PPTShapes::ShapeType::sptCTextCurveUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCurveUp; break;
case PPTShapes::ShapeType::sptCTextCurveDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCurveDown; break;
case PPTShapes::ShapeType::sptCTextCanUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCanUp; break;
case PPTShapes::ShapeType::sptCTextCanDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCanDown; break;
case PPTShapes::ShapeType::sptCTextWave1: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextWave1; break;
case PPTShapes::ShapeType::sptCTextWave2: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextWave2; break;
case PPTShapes::ShapeType::sptCTextWave3: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDoubleWave1; break;
case PPTShapes::ShapeType::sptCTextWave4: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextWave4; break;
case PPTShapes::ShapeType::sptCTextInflate: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextInflate; break;
case PPTShapes::ShapeType::sptCTextDeflate: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDeflate; break;
case PPTShapes::ShapeType::sptCTextInflateBottom: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextInflateBottom; break;
case PPTShapes::ShapeType::sptCTextDeflateBottom: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDeflateBottom; break;
case PPTShapes::ShapeType::sptCTextInflateTop: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextInflateTop; break;
case PPTShapes::ShapeType::sptCTextDeflateTop: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDeflateTop; break;
case PPTShapes::ShapeType::sptCTextDeflateInflate: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDeflateInflate; break;
case PPTShapes::ShapeType::sptCTextDeflateInflateDeflate: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextDeflateInflateDeflate; break;
case PPTShapes::ShapeType::sptCTextFadeRight: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextFadeRight; break;
case PPTShapes::ShapeType::sptCTextFadeLeft: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextFadeLeft; break;
case PPTShapes::ShapeType::sptCTextFadeUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextFadeUp; break;
case PPTShapes::ShapeType::sptCTextFadeDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextFadeDown; break;
case PPTShapes::ShapeType::sptCTextSlantUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextSlantUp; break;
case PPTShapes::ShapeType::sptCTextSlantDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextSlantDown; break;
case PPTShapes::ShapeType::sptCTextCascadeUp: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCascadeUp; break;
case PPTShapes::ShapeType::sptCTextCascadeDown: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCascadeDown; break;
case PPTShapes::ShapeType::sptCTextButtonPour: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextButtonPour; break;
case PPTShapes::ShapeType::sptCTextStop: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextStop; break;
case PPTShapes::ShapeType::sptCTextTriangle: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextTriangle; break;
case PPTShapes::ShapeType::sptCTextTriangleInverted: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextTriangleInverted; break;
case PPTShapes::ShapeType::sptCTextChevron: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextChevron; break;
case PPTShapes::ShapeType::sptCTextChevronInverted: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextChevronInverted; break;
case PPTShapes::ShapeType::sptCTextRingInside: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextRingInside; break;
case PPTShapes::ShapeType::sptCTextRingOutside: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextRingOutside; break;
case PPTShapes::ShapeType::sptCTextCirclePour: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextCirclePour; break;
case PPTShapes::ShapeType::sptCTextArchUpPour: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextArchUpPour; break;
case PPTShapes::ShapeType::sptCTextArchDownPour: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextArchDownPour; break;
default: eTextShapeType = SimpleTypes::ETextShapeType::textshapetypeTextNoShape; break;
}
SimpleTypes::CTextShapeType oTextShapeType;
oTextShapeType.SetValue(eTextShapeType);
std::wstring strPrstTxWarp = L"";
XmlUtils::CXmlNode oPrstTxWarpNode;
oPrstTxWarpNode.FromXmlString(strPrstTxWarp);
pShape->oTextBoxBodyPr->prstTxWarp = oPrstTxWarpNode;
std::vector oChilds;
if (oNodeShape.GetNodes(L"*", oChilds))
{
size_t lChildsCount = oChilds.size();
std::vector wordArtString;
EFilltype eFillType = etNoFill;;
std::wstring sTxbxContent = L"";
std::wstring sFont = L"Arial Black";
int nFontSize = 36;
bool bBold = false;
bool bItalic = false;
BYTE lAlpha;
bool bOpacity = false;
bool bOpacity2 = false;
double nFocus = 0;
int nAngle = 90;
bool bColors = false;
PPTX::Logic::ColorModifier oMod;
PPTX::Logic::ColorModifier oMod2;
std::vector arColors;
std::vector arColorsNew;
std::vector arPos;
std::vector arPosNew;
std::map arGradMap;
int R = 255, G = 255, B = 255;
nullable_string sFillColor;
XmlMacroReadAttributeBase(oNodeShape, L"fillcolor", sFillColor);
if (sFillColor.is_init())
{
eFillType = etSolidFill;
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(*sFillColor, color))
{
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(color.R, color.G, color.B);
arColors.push_back(&pSolid->Color);
arPos.push_back(0);
R = color.R;
G = color.G;
B = color.B;
}
}
if (eFillType == etNoFill)
{
// default color for vml = white
nullable_string sFilled;
XmlMacroReadAttributeBase(oNodeShape, L"filled", sFilled);
if (!sFilled.is_init() || (*sFilled != L"false") && *sFilled != L"f")
{
eFillType = etSolidFill;
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(R, G, B);
arColors.push_back(&pSolid->Color);
arPos.push_back(0);
}
}
for (LONG k = 0; k < lChildsCount; k++)
{
XmlUtils::CXmlNode & oNodeP = oChilds[k];
std::wstring strNameP = XmlUtils::GetNameNoNS(oNodeP.GetName());
if (L"textpath" == strNameP)
{
std::wstring tmpString = oNodeP.GetText(); //для обхода
пишется дубль в контент
if (tmpString.empty())
{
tmpString = oNodeP.GetAttribute(L"string");
CorrectXmlString(tmpString);
wordArtString.push_back(tmpString);
}
else
{
CorrectXmlString(tmpString);
int pos1 = 0, pos2 = 0;
while (pos1 < (int)tmpString.length() && pos2 < (int)tmpString.length())
{
pos2 = (int)tmpString.find(L"\n", pos1);
if (pos2 > 0)
{
wordArtString.push_back(tmpString.substr(pos1, pos2 - pos1));
pos1 = pos2 + 1;
}
else break;
}
wordArtString.push_back(tmpString.substr(pos1, tmpString.length() - pos1));
}
SimpleTypes::Vml::CCssStyle oCssStyle;
if (pPPTShape->m_textPath.sStyle)
{
oCssStyle.FromString(*pPPTShape->m_textPath.sStyle);
}
std::map::iterator pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptFontFamily);
if (pFind != oCssStyle.m_mapProperties.end())
{
sFont = oCssStyle.m_arrProperties[pFind->second]->get_Value().wsValue;
XmlUtils::replace_all(sFont, L"\"", L"");
}
pFind = pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptFontSize);
if (pFind != oCssStyle.m_mapProperties.end())
{
nFontSize = oCssStyle.m_arrProperties[pFind->second]->get_Value().oValue.dValue;
}
pFind = pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptFontStyle);
if (pFind != oCssStyle.m_mapProperties.end())
{
bItalic = (oCssStyle.m_arrProperties[pFind->second]->get_Value().eFontStyle == SimpleTypes::Vml::cssfontstyleItalic);
}
pFind = pFind = oCssStyle.m_mapProperties.find(SimpleTypes::Vml::cssptFontWeight);
if (pFind != oCssStyle.m_mapProperties.end())
{
bBold = (oCssStyle.m_arrProperties[pFind->second]->get_Value().eFontWeight >= SimpleTypes::Vml::cssfontweight400);
}
}
else if (L"shadow" == strNameP)
{
OOX::Vml::CShadow shadow; shadow.fromXML(oNodeP);
if (shadow.m_oOn.GetBool())
{
}
}
else if (L"fill" == strNameP)
{
nullable_string sOpacity;
nullable_string sOpacity2;
nullable_string sColor2;
nullable_string sColor;
nullable_string sType;
nullable_string sFocus;
nullable_string sFocusSize;
nullable_string sFocusPosition;
nullable_string sAngle;
nullable_string sColors;
XmlMacroReadAttributeBase(oNodeP, L"opacity", sOpacity);
XmlMacroReadAttributeBase(oNodeP, L"opacity2", sOpacity2);
XmlMacroReadAttributeBase(oNodeP, L"color", sColor);
XmlMacroReadAttributeBase(oNodeP, L"color2", sColor2);
XmlMacroReadAttributeBase(oNodeP, L"type", sType);
XmlMacroReadAttributeBase(oNodeP, L"focus", sFocus);
XmlMacroReadAttributeBase(oNodeP, L"focussize", sFocusSize);
XmlMacroReadAttributeBase(oNodeP, L"focusposition", sFocusPosition);
XmlMacroReadAttributeBase(oNodeP, L"angle", sAngle);
XmlMacroReadAttributeBase(oNodeP, L"colors", sColors);
if (sType.is_init())
{
if (*sType == L"gradient") eFillType = etGradFill;
else if (*sType == L"gradientradial") eFillType = etGradFill;
else if (*sType == L"pattern") eFillType = etPattFill;
else if (*sType == L"tile") eFillType = etBlipFill;
else if (*sType == L"frame") eFillType = etBlipFill;
}
else
{
if (sFocus.is_init() || sColors.is_init() || sAngle.is_init() || sFocusSize.is_init() || sFocusPosition.is_init())
eFillType = etGradFill;
}
if (sFocus.is_init())
{
nFocus = XmlUtils::GetInteger(*sFocus) / 100.0;
}
if (sOpacity.is_init())
{
bOpacity = true;
lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity);
oMod.name = L"alpha";
oMod.val = (int)((1 - lAlpha / 255.0) * 100000.0);
if (arColors.at(0)->is_init())
arColors.at(0)->Color->Modifiers.push_back(oMod);
}
if (sColor.is_init())
{
ODRAW::CColor color;
if (sColor->find(L"fill") != -1)
{
std::wstring sColorEffect = *sColor;
if (sColorEffect.length() > 5)
sColorEffect = sColorEffect.substr(5);
int resR, resG, resB;
GetColorWithEffect(sColorEffect, R, G, B, resR, resG, resB);
color.R = resR;
color.G = resG;
color.B = resB;
PPTX::Logic::UniColor *oColor = new PPTX::Logic::UniColor();
oColor->Color = new PPTX::Logic::SrgbClr();
oColor->Color->SetRGB(color.R, color.G, color.B);
if (bOpacity)
oColor->Color->Modifiers.push_back(oMod);
arColors[0] = oColor;
}
else
{
if (NS_DWC_Common::getColorFromString(*sColor, color))
{
PPTX::Logic::UniColor *oColor = new PPTX::Logic::UniColor();
oColor->Color = new PPTX::Logic::SrgbClr();
oColor->Color->SetRGB(color.R, color.G, color.B);
if (bOpacity)
oColor->Color->Modifiers.push_back(oMod);
arColors[0] = oColor;
}
}
}
if (sOpacity2.is_init())
{
bOpacity2 = true;
lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity2);
oMod.name = L"alpha";
oMod2.val = (int)((1 - lAlpha / 255.) * 100000.);
if (arColors.at(1)->is_init())
arColors.at(1)->Color->Modifiers.push_back(oMod2);
}
if (sColor2.is_init())
{
ODRAW::CColor color;
if (sColor2->find(L"fill") != -1)
{
std::wstring sColorEffect = *sColor2;
if (sColorEffect.length() > 5)
sColorEffect = sColorEffect.substr(5);
int resR, resG, resB;
GetColorWithEffect(sColorEffect, R, G, B, resR, resG, resB);
color.R = resR;
color.G = resG;
color.B = resB;
}
else
{
if (NS_DWC_Common::getColorFromString(*sColor2, color))
{
}
}
PPTX::Logic::UniColor *oColor = new PPTX::Logic::UniColor();
oColor->Color = new PPTX::Logic::SrgbClr();
oColor->Color->SetRGB(color.R, color.G, color.B);
if (bOpacity2)
oColor->Color->Modifiers.push_back(oMod2);
if (arColors.size() > 0)
arColors.push_back(oColor);
else
{
//дублирование
PPTX::Logic::UniColor *oColor1 = new PPTX::Logic::UniColor();
oColor1->Color = new PPTX::Logic::SrgbClr();
oColor1->Color->SetRGB(color.R, color.G, color.B);
arColors.push_back(oColor1);
arPos.push_back(0);
arColors.push_back(oColor);
}
arPos.push_back(100000);
}
if (sAngle.is_init())
{
nAngle = XmlUtils::GetInteger(*sAngle);
nAngle = (-1) * nAngle + 90;
}
if (sColors.is_init())
{
bColors = true;
std::wstring strColors = sColors.get();
arColors.clear();
arPos.clear();
std::vector arSplit;
boost::algorithm::split(arSplit, strColors, boost::algorithm::is_any_of(L";"), boost::algorithm::token_compress_on);
for (size_t i = 0; i < arSplit.size(); i++)
{
size_t p = arSplit[i].find(L" ");
if (p == std::wstring::npos)
continue;
std::wstring strPos = arSplit[i].substr(0, p);
std::wstring strColor = arSplit[i].substr(p + 1);
double pos = XmlUtils::GetDouble(strPos);
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(strColor, color))
{
PPTX::Logic::UniColor *oColor = new PPTX::Logic::UniColor();
oColor->Color = new PPTX::Logic::SrgbClr();
oColor->Color->SetRGB(color.R, color.G, color.B);
if (pos <= 1)
pos = 100000 * pos;
else
pos = pos / 65536 * 100000;
arColors.push_back(oColor);
arPos.push_back((int)pos);
arGradMap.insert(std::make_pair((int)pos, oColor));
}
}
}
}
/*else if (L"dashstyle") == strNameP)
{
nullable_string sStrokeDashStyle;
oNodeP.ReadAttributeBase(L"dashstyle", sStrokeDashStyle);
if (sStrokeDashStyle.is_init())
{
if (*sStrokeDashStyle == L"solid"))
sDashStyle = L"solid");
else if (*sStrokeDashStyle == L"shortdash"))
sDashStyle = L"sysDash");
else if (*sStrokeDashStyle == L"shortdot"))
sDashStyle = L"sysDot");
else if (*sStrokeDashStyle == L"shortdashdot"))
sDashStyle = L"sysDashDot");
else if (*sStrokeDashStyle == L"shortdashdotdot"))
sDashStyle = L"sysDashDotDot");
else if (*sStrokeDashStyle == L"dot"))
sDashStyle = L"dot");
else if (*sStrokeDashStyle == L"dash"))
sDashStyle = L"dash");
else if (*sStrokeDashStyle == L"longdash"))
sDashStyle = L"lgDash");
else if (*sStrokeDashStyle == L"dashdot"))
sDashStyle = L"dashDot");
else if (*sStrokeDashStyle == L"longdashdot"))
sDashStyle = L"lgDashDot");
else if (*sStrokeDashStyle == L"longdashdotdot"))
sDashStyle = L"lgDashDotDot");
else
sDashStyle = L"solid");
}
}*/
}
std::wstring strRPr, strPPr;
strPPr = L"";
if (bBold) strRPr += L"";
if (bItalic) strRPr += L"";
strRPr += L"";
strRPr += L"";
nullable_string sStrokeColor;
nullable oStrokeWeight;
nullable_string sStroked;
XmlMacroReadAttributeBase(oNodeShape, L"strokecolor", sStrokeColor);
XmlMacroReadAttributeBase(oNodeShape, L"strokeweight", oStrokeWeight);
XmlMacroReadAttributeBase(oNodeShape, L"stroked", sStroked);
XmlUtils::CXmlNode oNodeStroke = oNodeShape.ReadNode(L"v:stroke");
if (oNodeStroke.IsValid())
{
nullable_string sStrokeOn;
XmlMacroReadAttributeBase(oNodeStroke, L"on", sStrokeOn);
if (sStrokeOn.is_init())
{
sStroked.reset();
sStroked = sStrokeOn;
}
nullable_string sStrokeColor1;
XmlMacroReadAttributeBase(oNodeStroke, L"strokecolor", sStrokeColor1);
if (sStrokeColor1.is_init())
{
sStrokeColor1.reset();
sStrokeColor = sStrokeColor1;
}
}
//textFill
strRPr += L"";
if (eFillType == etSolidFill)
{
strRPr += L"";
strRPr += arColors.at(0)->toXML();
strRPr += L"";
}
else if (eFillType == etGradFill)
{
strRPr += L"";
int nSize = (int)arColors.size();
bool bRevert = false;
int nColorsLen = (int)arColors.size();
int nDiff = nSize - 1;
if (nFocus != 1 && nFocus != 0)
nSize = nSize + nDiff;
double nShift = 100000 / nSize;
double dNewZero = 100000 * nFocus;
//(0 < nFocus && nFocus < 1)
if (((nAngle == 90) && (-1 < nFocus && nFocus < 0)) || ((nAngle != 90) && (0 < nFocus && nFocus < 1)))
{
if (nAngle == 90)
dNewZero *= -1;
arColorsNew.push_back(arColors.at(nColorsLen - 1));
arPosNew.push_back(0);
for (int i = nColorsLen - 2; i > 0; i--)
{
arColorsNew.push_back(arColors.at(i));
double dPosNew = dNewZero * arPos.at(i) / 100000;
arPosNew.push_back((int)dPosNew);
}
for (int i = 0; i < nColorsLen; i++)
{
arColorsNew.push_back(arColors.at(i));
double dPosNew = dNewZero * arPos.at(i) / 100000 + dNewZero;
arPosNew.push_back((int)dPosNew);
}
}
//else if (-1 < nFocus && nFocus < 0)
else if (((nAngle != 90) && (-1 < nFocus && nFocus < 0)) || ((nAngle == 90) && (0 < nFocus && nFocus < 1)))
{
if (nAngle != 90)
dNewZero *= -1;
for (int i = 0; i < nColorsLen - 1; i++)
{
arColorsNew.push_back(arColors.at(i));
double dPosNew = dNewZero * arPos.at(i) / 100000;
arPosNew.push_back((int)dPosNew);
}
arColorsNew.push_back(arColors.at(nColorsLen - 1));
arPosNew.push_back((int)dNewZero);
for (int i = nColorsLen - 2; i >= 0; i--)
{
arColorsNew.push_back(arColors.at(i));
double n1 = 1 - (double)arPos.at(i) / 100000;
double dPosNew = dNewZero * n1 + dNewZero;
arPosNew.push_back((int)dPosNew);
}
}
//nFocus == 0
else if ((nAngle != 90 && nFocus == 0) || (nAngle == 90 && nFocus == 1))
{
for (int i = 0; i < nColorsLen; i++)
{
arColorsNew.push_back(arColors.at(i));
arPosNew.push_back(arPos.at(i));
}
}
//nFocus == 1
else if ((nAngle != 90 && nFocus == 1) || (nAngle == 90 && nFocus == 0))
{
for (int i = nColorsLen - 1; i >= 0; i--)
{
arColorsNew.push_back(arColors.at(i));
arPosNew.push_back(arPos.at(nColorsLen - i - 1));
}
}
for (size_t i = 0; i < arColorsNew.size(); i++)
{
int pos = arPosNew.at(i);
std::wstring color = arColorsNew.at(i)->toXML();
std::wstring strPos = std::to_wstring(pos);
strRPr += L"";
strRPr += color;
strRPr += L"";
}
std::wstring strAngle = std::to_wstring(nAngle * 60000);
strRPr += L"";
}
else if (eFillType == etNoFill)
{
strRPr += L"";
}
else
{
//не существует в природе
}
strRPr += L"";
//textOutline
double m_dValuePt = 1;
if (oStrokeWeight.is_init())
{
m_dValuePt = oStrokeWeight->GetValue();
}
std::wstring strStrokeW = std::to_wstring((int)Pt_To_Emu(m_dValuePt));
strRPr += L"";
smart_ptr pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
ODRAW::CColor color;
bool bStroked = true;
if (sStroked.is_init())
{
if (*sStroked == L"false" || *sStroked == L"f")
{
strRPr += L"";
bStroked = false;
}
}
if (sStrokeColor.is_init())
{
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(*sStrokeColor, color))
{
pSolid->Color.Color->SetRGB(color.R, color.G, color.B);
}
}
else
pSolid->Color.Color->SetRGB(0x00, 0x00, 0x00);
if (bStroked)
{
strRPr += pSolid->toXML();
pPPTShape->m_bIsStroked = false;
}
strRPr += L"";
for (size_t i = 0; i < wordArtString.size(); i++)
{
std::wstring sParaRun = L"" + strRPr + L"" + L"" + wordArtString[i] + L"";
sTxbxContent += L"" + strPPr + L"" + strRPr + L"" + sParaRun + L"";
}
sTxbxContent += L"";
pShape->strTextBoxShape = sTxbxContent;
if (sStroked.is_init() == false && wordArtString.empty() == false)
{
bStroked = false;
}
}
// у старого wordArt никаких отступов
pShape->oTextBoxBodyPr->lIns = 0;
pShape->oTextBoxBodyPr->tIns = 0;
pShape->oTextBoxBodyPr->rIns = 0;
pShape->oTextBoxBodyPr->bIns = 0;
if (pPPTShape->m_textPath.bFitShape || pPPTShape->m_textPath.bFitPath)
pShape->oTextBoxBodyPr->Fit.type = PPTX::Logic::TextFit::FitNormAuto;
pShape->oTextBoxBodyPr->wrap = new PPTX::Limit::TextWrap(1);
pShape->oTextBoxBodyPr->fromWordArt = true;
if (!pPPTShape->m_textPath.bTrim)
{
// нужно для данного размера шейпа выставить отступы сверху и снизу
// top: Ascent - CapHeight
// bottom: Descent
}
}
void CDrawingConverter::ConvertGroup(PPTX::Logic::SpTreeElem *result, XmlUtils::CXmlNode& oNode, std::wstring**& pMainProps, bool bIsTop)
{
if (!result) return;
PPTX::Logic::SpTree* pTree = new PPTX::Logic::SpTree(L"wp");
if (bIsTop) pTree->m_lGroupIndex = 0;
else pTree->m_lGroupIndex = 1;
std::vector oNodes;
//сначала shape type
if (oNode.GetNodes(L"*", oNodes))
{
size_t nCount = oNodes.size();
for (int i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode& oNodeT = oNodes[i];
std::wstring strNameP = XmlUtils::GetNameNoNS(oNodeT.GetName());
if (L"shapetype" == strNameP)
{
AddShapeType(oNodeT);
}
}
}
if (oNode.GetNodes(L"*", oNodes))
{
size_t nCount = oNodes.size();
for (int i = 0; i < nCount; ++i)
{
XmlUtils::CXmlNode & oNodeT = oNodes[i];
std::wstring strNameP = XmlUtils::GetNameNoNS(oNodeT.GetName());
if (L"shape" == strNameP ||
L"rect" == strNameP ||
L"oval" == strNameP ||
L"line" == strNameP ||
L"polyline" == strNameP ||
L"background" == strNameP ||
L"roundrect" == strNameP)
{
PPTX::Logic::SpTreeElem _el;
ConvertShape(&_el, oNodeT, pMainProps, false);
if (_el.is_init())
pTree->SpTreeElems.push_back(_el);
}
else if (L"binData" == strNameP)
{
AddBinData(oNodeT);
}
else if (L"group" == strNameP)
{
PPTX::Logic::SpTreeElem _el;
ConvertGroup(&_el, oNodeT, pMainProps, false);
if (_el.is_init())
pTree->SpTreeElems.push_back(_el);
}
else
continue;
}
}
std::wstring strStyle = oNode.GetAttribute(L"style");
PPTX::CCSS oCSSParser;
oCSSParser.LoadFromString2(strStyle);
CSpTreeElemProps oProps;
oProps.IsTop = bIsTop;
std::wstring strMainPos = GetDrawingMainProps(oNode, oCSSParser, oProps);
LONG lCoordOriginX = 0;
LONG lCoordOriginY = 0;
LONG lCoordSizeW = oProps.Width;
LONG lCoordSizeH = oProps.Height;
std::wstring strCoordSize = oNode.GetAttributeOrValue(L"coordsize");
if (strCoordSize != L"")
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordSize, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
lCoordSizeW = XmlUtils::GetInteger(oArray[0]);
lCoordSizeH = XmlUtils::GetInteger(oArray[1]);
}
}
std::wstring strCoordOrigin = oNode.GetAttributeOrValue(L"coordorigin");
if (strCoordOrigin != L"")
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordOrigin, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
lCoordOriginX = XmlUtils::GetInteger(oArray[0]);
lCoordOriginY = XmlUtils::GetInteger(oArray[1]);
}
}
if (bIsTop)
{
SendMainProps(strMainPos, pMainProps);
if (m_oxfrm_override.IsInit())
{
pTree->grpSpPr.xfrm = m_oxfrm_override;
pTree->grpSpPr.xfrm->chOffX = lCoordOriginX;
pTree->grpSpPr.xfrm->chOffY = lCoordOriginY;
pTree->grpSpPr.xfrm->chExtX = lCoordSizeW;
pTree->grpSpPr.xfrm->chExtY = lCoordSizeH;
}
else
{
pTree->grpSpPr.xfrm = new PPTX::Logic::Xfrm();
pTree->grpSpPr.xfrm->offX = 0;
pTree->grpSpPr.xfrm->offY = 0;
pTree->grpSpPr.xfrm->extX = oProps.Width;
pTree->grpSpPr.xfrm->extY = oProps.Height;
pTree->grpSpPr.xfrm->chOffX = lCoordOriginX;
pTree->grpSpPr.xfrm->chOffY = lCoordOriginY;
pTree->grpSpPr.xfrm->chExtX = lCoordSizeW;
pTree->grpSpPr.xfrm->chExtY = lCoordSizeH;
}
std::map::iterator pFind = oCSSParser.m_mapSettings.find(L"flip");
if (oCSSParser.m_mapSettings.end() != pFind)
{
if (pFind->second == L"x")
pTree->grpSpPr.xfrm->flipH = true;
else if (pFind->second == L"y")
pTree->grpSpPr.xfrm->flipV = true;
else if ((pFind->second == L"xy") || (pFind->second == L"yx") || (pFind->second == L"x y") || (pFind->second == L"y x")
|| (pFind->second == L"y,x") || (pFind->second == L"x,y"))
{
pTree->grpSpPr.xfrm->flipH = true;
pTree->grpSpPr.xfrm->flipV = true;
}
}
pFind = oCSSParser.m_mapSettings.find(L"rotation");
if (oCSSParser.m_mapSettings.end() != pFind)
{
pTree->grpSpPr.xfrm->rot = NS_DWC_Common::getRotateAngle(pFind->second, pTree->grpSpPr.xfrm->flipH, pTree->grpSpPr.xfrm->flipV);
}
}
else
{
if (m_oxfrm_override.IsInit())
{
pTree->grpSpPr.xfrm = m_oxfrm_override;
}
else
{
pTree->grpSpPr.xfrm = new PPTX::Logic::Xfrm();
pTree->grpSpPr.xfrm->offX = oProps.X;
pTree->grpSpPr.xfrm->offY = oProps.Y;
pTree->grpSpPr.xfrm->extX = oProps.Width;
pTree->grpSpPr.xfrm->extY = oProps.Height;
pTree->grpSpPr.xfrm->chOffX = lCoordOriginX;
pTree->grpSpPr.xfrm->chOffY = lCoordOriginY;
pTree->grpSpPr.xfrm->chExtX = lCoordSizeW;
pTree->grpSpPr.xfrm->chExtY = lCoordSizeH;
}
std::map::iterator pFind = oCSSParser.m_mapSettings.find(L"flip");
if (oCSSParser.m_mapSettings.end() != pFind)
{
if (pFind->second == L"x")
pTree->grpSpPr.xfrm->flipH = true;
else if (pFind->second == L"y")
pTree->grpSpPr.xfrm->flipV = true;
else if ((pFind->second == L"xy") || (pFind->second == L"yx") || (pFind->second == L"x y") || (pFind->second == L"y x")
|| (pFind->second == L"y,x") || (pFind->second == L"x,y"))
{
pTree->grpSpPr.xfrm->flipH = true;
pTree->grpSpPr.xfrm->flipV = true;
}
}
pFind = oCSSParser.m_mapSettings.find(L"rotation");
if (oCSSParser.m_mapSettings.end() != pFind)
{
pTree->grpSpPr.xfrm->rot = NS_DWC_Common::getRotateAngle(pFind->second, pTree->grpSpPr.xfrm->flipH, pTree->grpSpPr.xfrm->flipV);
}
}
if (!bIsTop)
{
pTree->nvGrpSpPr.cNvPr.id = m_lNextId;
m_lNextId++;
}
else
{
pTree->nvGrpSpPr.cNvPr.id = -1;
}
result->InitElem(pTree);
}
void CDrawingConverter::LoadCoordPos(XmlUtils::CXmlNode& oNode, CShapePtr pShape)
{
if (!pShape) return;
pShape->m_dXLogic = 0;
pShape->m_dYLogic = 0;
XmlUtils::CXmlNode oNodeTemplate;
if (oNode.GetNode(L"coordorigin", oNodeTemplate))
{
std::wstring strCoordSize = oNodeTemplate.GetAttributeOrValue(L"val");
if (!strCoordSize.empty())
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordSize, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
pShape->m_dXLogic = XmlUtils::GetInteger(oArray[0]);
pShape->m_dYLogic = XmlUtils::GetInteger(oArray[1]);
}
}
}
else
{
std::wstring strCoordSize = oNode.GetAttributeOrValue(L"coordorigin");
if (!strCoordSize.empty())
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordSize, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
pShape->m_dXLogic = XmlUtils::GetInteger(oArray[0]);
pShape->m_dYLogic = XmlUtils::GetInteger(oArray[1]);
}
}
}
pShape->getBaseShape()->m_oPath.SetCoordpos((LONG)pShape->m_dXLogic, (LONG)pShape->m_dYLogic);
}
void CDrawingConverter::LoadCoordSize(XmlUtils::CXmlNode& oNode, CShapePtr pShape)
{
if (!pShape) return;
pShape->m_dWidthLogic = ShapeSizeVML;
pShape->m_dHeightLogic = ShapeSizeVML;
XmlUtils::CXmlNode oNodeTemplate;
if (oNode.GetNode(L"coordsize", oNodeTemplate))
{
std::wstring strCoordSize = oNodeTemplate.GetAttributeOrValue(L"val");
if (!strCoordSize.empty())
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordSize, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
pShape->m_dWidthLogic = (std::max)(XmlUtils::GetInteger(oArray[0]), 1);
pShape->m_dHeightLogic = (std::max)(XmlUtils::GetInteger(oArray[1]), 1);
}
}
}
else
{
std::wstring strCoordSize = oNode.GetAttributeOrValue(L"coordsize");
if (!strCoordSize.empty())
{
std::vector oArray;
boost::algorithm::split(oArray, strCoordSize, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
if (oArray.size() >= 2)
{
pShape->m_dWidthLogic = (std::max)(XmlUtils::GetInteger(oArray[0]), 1);
pShape->m_dHeightLogic = (std::max)(XmlUtils::GetInteger(oArray[1]), 1);
}
}
}
pShape->getBaseShape()->m_oPath.SetCoordsize((LONG)pShape->m_dWidthLogic, (LONG)pShape->m_dHeightLogic);
}
std::wstring CDrawingConverter::GetDrawingMainProps(XmlUtils::CXmlNode& oNode, PPTX::CCSS& oCssStyles, CSpTreeElemProps& oProps)
{
std::map::iterator pFind;
bool bIsInline = false;
bool bIsMargin = false;
bool bZIndex = false;
if (oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.find(L"z-index"))
bZIndex = true;
if (oProps.IsTop == true)
{
if ((oCssStyles.m_mapSettings.end() == oCssStyles.m_mapSettings.find(L"left")) &&
(oCssStyles.m_mapSettings.end() == oCssStyles.m_mapSettings.find(L"margin-left")) &&
(oCssStyles.m_mapSettings.end() == oCssStyles.m_mapSettings.find(L"top")) &&
(oCssStyles.m_mapSettings.end() == oCssStyles.m_mapSettings.find(L"margin-top")))
{
bIsInline = true;
}
if (((oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.find(L"margin-left")) &&
(oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.find(L"margin-top")))
||
((oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.find(L"left")) &&
(oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.find(L"top"))))
{
bIsMargin = true;
}
pFind = oCssStyles.m_mapSettings.find(L"mso-position-horizontal-relative");
if (oCssStyles.m_mapSettings.end() != pFind && ((pFind->second == L"text" && !bIsMargin) || pFind->second == L"char"))
{
pFind = oCssStyles.m_mapSettings.find(L"mso-position-vertical-relative");
if (oCssStyles.m_mapSettings.end() != pFind && ((pFind->second == L"text" && !bIsMargin) || pFind->second == L"line"))
{
if (!bZIndex || !bIsMargin) //Liturgie Homberg 2017 mit Abendmahlsteil.docx
bIsInline = true;
}
}
if (!bIsInline)
{
pFind = oCssStyles.m_mapSettings.find(L"position");
if (oCssStyles.m_mapSettings.end() != pFind && pFind->second == L"static")
{
bIsInline = true;
}
}
}
SimpleTypes::CPoint parserPoint;
double dKoef = 25.4 * 36000 / 72.0;
double dKoefSize = oProps.IsTop ? dKoef : 1;
LONG left = 0;
LONG top = 0;
LONG width = 0;
LONG height = 0;
pFind = oCssStyles.m_mapSettings.find(L"polyline_correct");
bool bIsPolyCorrect = (oCssStyles.m_mapSettings.end() != pFind) ? true : false;
if (bIsPolyCorrect)
dKoefSize = 1;
if (!bIsInline)
{
pFind = oCssStyles.m_mapSettings.find(L"margin-left");
if (oCssStyles.m_mapSettings.end() == pFind)
pFind = oCssStyles.m_mapSettings.find(L"left");
if (oCssStyles.m_mapSettings.end() != pFind)
{
std::vector oArray1;
boost::algorithm::split(oArray1, pFind->second, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
for (size_t i = 0; i < oArray1.size(); i++)
{
left += (LONG)(dKoefSize * parserPoint.FromString(oArray1[i]) + 0.5);
}
}
pFind = oCssStyles.m_mapSettings.find(L"margin-top");
if (oCssStyles.m_mapSettings.end() == pFind)
pFind = oCssStyles.m_mapSettings.find(L"top");
if (oCssStyles.m_mapSettings.end() != pFind)
{
std::vector oArray1;
boost::algorithm::split(oArray1, pFind->second, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
for (size_t i = 0; i < oArray1.size(); i++)
{
top += (LONG)(dKoefSize * parserPoint.FromString(oArray1[i]) + 0.5);
}
}
}
pFind = oCssStyles.m_mapSettings.find(L"width");
if (oCssStyles.m_mapSettings.end() != pFind)
{
width = (LONG)(dKoefSize * parserPoint.FromString(pFind->second) + 0.5);
}
else
{
pFind = oCssStyles.m_mapSettings.find(L"margin-right");
if (oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.end())
width = (LONG)(dKoefSize * parserPoint.FromString(pFind->second) + 0.5) - left;
}
pFind = oCssStyles.m_mapSettings.find(L"height");
if (oCssStyles.m_mapSettings.end() != pFind)
{
height = (LONG)(dKoefSize * parserPoint.FromString(pFind->second) + 0.5);
}
else
{
pFind = oCssStyles.m_mapSettings.find(L"margin-bottom");
if (oCssStyles.m_mapSettings.end() != oCssStyles.m_mapSettings.end())
height = (LONG)(dKoefSize * parserPoint.FromString(pFind->second) + 0.5) - top;
}
unsigned long margL = (unsigned long)(9 * dKoef + 0.5);
unsigned long margT = 0;
unsigned long margR = (unsigned long)(9 * dKoef + 0.5);
unsigned long margB = 0;
pFind = oCssStyles.m_mapSettings.find(L"mso-wrap-distance-left");
if (oCssStyles.m_mapSettings.end() != pFind)
margL = (unsigned long)(dKoef * parserPoint.FromString(pFind->second) + 0.5);
pFind = oCssStyles.m_mapSettings.find(L"mso-wrap-distance-top");
if (oCssStyles.m_mapSettings.end() != pFind)
margT = (unsigned long)(dKoef * parserPoint.FromString(pFind->second) + 0.5);
pFind = oCssStyles.m_mapSettings.find(L"mso-wrap-distance-right");
if (oCssStyles.m_mapSettings.end() != pFind)
margR = (unsigned long)(dKoef * parserPoint.FromString(pFind->second) + 0.5);
pFind = oCssStyles.m_mapSettings.find(L"mso-wrap-distance-bottom");
if (oCssStyles.m_mapSettings.end() != pFind)
margB = (unsigned long)(dKoef * parserPoint.FromString(pFind->second) + 0.5);
nullable_double rel_width;
nullable_double rel_height;
nullable_double rel_top;
nullable_double rel_left;
pFind = oCssStyles.m_mapSettings.find(L"mso-width-percent");
if (oCssStyles.m_mapSettings.end() != pFind)
{
rel_width = parserPoint.FromString(pFind->second) / 1000.;
}
pFind = oCssStyles.m_mapSettings.find(L"mso-height-percent");
if (oCssStyles.m_mapSettings.end() != pFind)
{
rel_height = parserPoint.FromString(pFind->second) / 1000.;
}
pFind = oCssStyles.m_mapSettings.find(L"mso-top-percent");
if (oCssStyles.m_mapSettings.end() != pFind)
{
rel_top = parserPoint.FromString(pFind->second) / 1000.;
}
pFind = oCssStyles.m_mapSettings.find(L"mso-left-percent");
if (oCssStyles.m_mapSettings.end() != pFind)
{
rel_left = parserPoint.FromString(pFind->second) / 1000.;
}
oProps.X = left;
oProps.Y = top;
oProps.Width = width;
oProps.Height = height;
m_pBinaryWriter->m_dXCurShape = left;
m_pBinaryWriter->m_dYCurShape = top;
m_pBinaryWriter->m_dCxCurShape = width;
m_pBinaryWriter->m_dCyCurShape = height;
bool bExtendedSize = false;
XmlUtils::CXmlNode oNodeShadow = oNode.ReadNode(L"v:shadow");
std::wstring strShadow;
if (oNodeShadow.IsValid())
{
OOX::Vml::CShadow shadow; shadow.fromXML(oNodeShadow);
if (shadow.m_oOn.GetBool())
{
bExtendedSize = true;
}
}
std::wstring originalId = oNode.ReadAttribute(L"id");
if (bIsInline)
{
NSBinPptxRW::CXmlWriter oWriter;
oWriter.StartNode(L"wp:inline");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"xmlns:wp", L"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
oWriter.WriteAttribute(L"distT", margT);
oWriter.WriteAttribute(L"distB", margB);
oWriter.WriteAttribute(L"distL", margL);
oWriter.WriteAttribute(L"distR", margR);
oWriter.EndAttributes();
oWriter.StartNode(L"wp:extent");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"cx", width );
oWriter.WriteAttribute(L"cy", height );
oWriter.EndAttributes();
oWriter.EndNode(L"wp:extent");
oWriter.StartNode(L"wp:effectExtent");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"l", bExtendedSize ? 10795 : 0);
oWriter.WriteAttribute(L"t", bExtendedSize ? 5080 : 0);
oWriter.WriteAttribute(L"r", bExtendedSize ? 28575 : 0);
oWriter.WriteAttribute(L"b", bExtendedSize ? 26670 : 0);
oWriter.EndAttributes();
oWriter.EndNode(L"wp:effectExtent");
if (rel_width.is_init())
{
oWriter.StartNode(L"wp14:sizeRelH");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"relativeFrom", L"page");
oWriter.EndAttributes();
oWriter.StartNode(L"wp14:pctWidth");
oWriter.EndAttributes();
oWriter.WriteString(std::to_wstring((INT)(*rel_width * 100000)));
oWriter.EndNode(L"wp14:pctWidth");
oWriter.EndNode(L"wp14:sizeRelH");
}
if (rel_height.is_init())
{
oWriter.StartNode(L"wp14:sizeRelV");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"relativeFrom", L"page");
oWriter.EndAttributes();
oWriter.StartNode(L"wp14:pctHeight");
oWriter.EndAttributes();
oWriter.WriteString(std::to_wstring((INT)(*rel_height * 100000)));
oWriter.EndNode(L"wp14:pctHeight");
oWriter.EndNode(L"wp14:sizeRelV");
}
std::wstring strId = L"";
m_lNextId++;
oWriter.WriteString(strId);
oWriter.EndNode(L"wp:inline");
return oWriter.GetXmlString();
}
//------------------------------------------------------------------------------------
NSBinPptxRW::CXmlWriter oWriter;
oWriter.StartNode(L"wp:anchor");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"xmlns:wp", L"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing");
oWriter.WriteAttribute(L"distT", margT);
oWriter.WriteAttribute(L"distB", margB);
oWriter.WriteAttribute(L"distL", margL);
oWriter.WriteAttribute(L"distR", margR);
pFind = oCssStyles.m_mapSettings.find(L"z-index");
nullable_int64 zIndex;
if (oCssStyles.m_mapSettings.end() != pFind)
{
zIndex = (__int64)parserPoint.FromString(pFind->second);
_INT64 zIndex_ = *zIndex;// >= 0 ? *zIndex : -*zIndex;
if (m_nDrawingMaxZIndex == 0 && ((zIndex_ < 0xF000000 && zIndex_ > 0x80000) ||
(zIndex_ > -0xF000000 && zIndex_ < -0x80000)))
{
zIndex_ = 0xF000000 - 0x80000 + zIndex_;
}
else
{
zIndex_ = abs(zIndex_);
}
oWriter.WriteAttribute(L"relativeHeight", std::to_wstring(zIndex_));
}
XmlUtils::CXmlNode oNodeWrap = oNode.ReadNode(L"w10:wrap");
std::wstring strWrapType;
if (oNodeWrap.IsValid())
{
strWrapType = oNodeWrap.GetAttribute(L"type");
/*
nullable_string sAnchorX;
oNodeWrap.ReadAttributeBase(L"anchorx", sAnchorX);
nullable_string sAnchorY;
oNodeWrap.ReadAttributeBase(L"anchory", sAnchorY);
if (sAnchorX.is_init())
oCssStyles.m_mapSettings.insert(std::pair<>(L"mso-position-horizontal-relative"), *sAnchorX);
if (sAnchorY.is_init())
oCssStyles.m_mapSettings.insert(std::pair<>(L"mso-position-vertical-relative"), *sAnchorY);
*/
}
nullable_bool isAllowInCell;
nullable_string sAllowInCell;
XmlMacroReadAttributeBase(oNode, L"o:allowincell", sAllowInCell);
if (sAllowInCell.is_init())
{
if ((L"f" == *sAllowInCell) || (L"false"== *sAllowInCell))
isAllowInCell = false;
if ((L"t" == *sAllowInCell) || (L"true"== *sAllowInCell))
isAllowInCell = true;
}
nullable_bool isAllowOverlap;
nullable_string sAllowOverlap;
XmlMacroReadAttributeBase(oNode, L"o:allowoverlap", sAllowOverlap);
if (sAllowOverlap.is_init())
{
if ((L"f" == *sAllowOverlap) || (L"false"== *sAllowOverlap))
isAllowOverlap = false;
if ((L"t" == *sAllowOverlap) || (L"true"== *sAllowOverlap))
isAllowOverlap = true;
}
std::wstring strWrapPoints = oNode.GetAttribute(L"wrapcoords");
std::wstring strWrapPointsResult;
if (!strWrapPoints.empty())
{
std::vector arPoints;
boost::algorithm::split(arPoints, strWrapPoints, boost::algorithm::is_any_of(L","), boost::algorithm::token_compress_on);
int nCountP = (int)arPoints.size();
if (nCountP > 1 && ((nCountP % 2) == 0))
{
strWrapPointsResult = L"";
for (int i = 0; i < nCountP; i += 2)
{
if (i == 0)
{
strWrapPointsResult += (L"");
}
else
{
strWrapPointsResult += (L"");
}
}
strWrapPointsResult += L"";
}
}
if (zIndex.is_init())
{
if (*zIndex > 0)
{
oWriter.WriteAttribute(L"behindDoc", L"0");
}
else if (*zIndex < 0)
{
oWriter.WriteAttribute(L"behindDoc", L"1");
}
}
if (isAllowOverlap.is_init())
{
if (*isAllowOverlap)
oWriter.WriteAttribute(L"allowOverlap", L"1");
else
oWriter.WriteAttribute(L"allowOverlap", L"0");
}
if (isAllowInCell.is_init())
{
if (*isAllowInCell)
oWriter.WriteAttribute(L"layoutInCell", L"1");
else
oWriter.WriteAttribute(L"layoutInCell", L"0");
}
oWriter.EndAttributes();
oWriter.StartNode(L"wp:positionH");
oWriter.StartAttributes();
pFind = oCssStyles.m_mapSettings.find(L"mso-position-horizontal-relative");
nullable_string sHRelativeFrom;
nullable_string sVRelativeFrom;
if (pFind != oCssStyles.m_mapSettings.end())
{
if (L"char" == pFind->second) sHRelativeFrom = L"character";
else if (L"page" == pFind->second) sHRelativeFrom = L"page";
else if (L"margin" == pFind->second) sHRelativeFrom = L"margin";
else if (L"left-margin-area" == pFind->second) sHRelativeFrom = L"leftMargin";
else if (L"right-margin-area" == pFind->second) sHRelativeFrom = L"rightMargin";
else if (L"inner-margin-area" == pFind->second) sHRelativeFrom = L"insideMargin";
else if (L"outer-margin-area" == pFind->second) sHRelativeFrom = L"outsideMargin";
else
sHRelativeFrom = L"column";
}
else
{
sHRelativeFrom = L"column";
}
oWriter.WriteAttribute(L"relativeFrom", *sHRelativeFrom);
oWriter.EndAttributes();
std::wstring strPosH = L"absolute";
pFind = oCssStyles.m_mapSettings.find(L"mso-position-horizontal");
if (oCssStyles.m_mapSettings.end() != pFind)
strPosH = pFind->second;
if (strPosH == L"absolute")
{
if (rel_left.is_init())
{
oWriter.WriteString(L"");
oWriter.WriteLONG((INT)(*rel_left * 100000));
oWriter.WriteString(L"");
}
else
{
oWriter.WriteString(L"");
oWriter.WriteLONG(left);
oWriter.WriteString(L"");
}
}
else
{
oWriter.WriteString(L"");
oWriter.WriteString(strPosH);
oWriter.WriteString(L"");
}
oWriter.EndNode(L"wp:positionH");
oWriter.StartNode(L"wp:positionV");
oWriter.StartAttributes();
pFind = oCssStyles.m_mapSettings.find(L"mso-position-vertical-relative");
if (pFind != oCssStyles.m_mapSettings.end())
{
if (L"margin" == pFind->second) sVRelativeFrom = L"margin";
else if (L"text" == pFind->second) sVRelativeFrom = L"paragraph";
else if (L"page" == pFind->second) sVRelativeFrom = L"page";
else if (L"top-margin-area" == pFind->second) sVRelativeFrom = L"topMargin";
else if (L"bottom-margin-area" == pFind->second) sVRelativeFrom = L"bottomMargin";
else if (L"inner-margin-area" == pFind->second) sVRelativeFrom = L"insideMargin";
else if (L"outer-margin-area" == pFind->second) sVRelativeFrom = L"outsideMargin";
else
sVRelativeFrom = L"line";
}
else
{
sVRelativeFrom = L"paragraph";
}
oWriter.WriteAttribute(L"relativeFrom", *sVRelativeFrom);
oWriter.EndAttributes();
std::wstring strPosV = L"absolute";
pFind = oCssStyles.m_mapSettings.find(L"mso-position-vertical");
if (oCssStyles.m_mapSettings.end() != pFind)
strPosV = pFind->second;
if (strPosV == L"absolute")
{
if (rel_top.is_init())
{
oWriter.WriteString(L"");
oWriter.WriteLONG((INT)(*rel_top * 100000));
oWriter.WriteString(L"");
}
else
{
oWriter.WriteString(L"");
oWriter.WriteLONG(top);
oWriter.WriteString(L"");
}
}
else
{
oWriter.WriteString(L"");
oWriter.WriteString(strPosV);
oWriter.WriteString(L"");
}
oWriter.EndNode(L"wp:positionV");
oWriter.StartNode(L"wp:extent");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"cx", width );
oWriter.WriteAttribute(L"cy", height);
oWriter.EndAttributes();
oWriter.EndNode(L"wp:extent");
oWriter.StartNode(L"wp:effectExtent");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"l", bExtendedSize ? 10795 : 0);
oWriter.WriteAttribute(L"t", bExtendedSize ? 5080 : 0);
oWriter.WriteAttribute(L"r", bExtendedSize ? 28575 : 0);
oWriter.WriteAttribute(L"b", bExtendedSize ? 26670 : 0);
oWriter.EndAttributes();
oWriter.EndNode(L"wp:effectExtent");
if (oNodeWrap.IsValid())
{
if (strWrapType == L"none" || strWrapType == L"")
oWriter.WriteString(L"");
else if (strWrapType == L"square")
oWriter.WriteString(L"");
else if (strWrapType == L"topAndBottom")
oWriter.WriteString(L"");
else if (strWrapType == L"tight")
{
if (strWrapPointsResult.empty())
{
oWriter.WriteString(L"");
}
else
{
oWriter.WriteString(L"");
oWriter.WriteString(strWrapPointsResult);
oWriter.WriteString(L"");
}
}
else if (strWrapType == L"through")
{
if (strWrapPointsResult.empty())
{
oWriter.WriteString(L"");
}
else
{
oWriter.WriteString(L"");
oWriter.WriteString(strWrapPointsResult);
oWriter.WriteString(L"");
}
}
else
oWriter.WriteString(L"");
}
else
{
oWriter.WriteString(L"");
}
bool bHidden = false;
pFind = oCssStyles.m_mapSettings.find(L"visibility");
if (oCssStyles.m_mapSettings.end() != pFind)
{
if (L"hidden" == pFind->second)
bHidden = true;
}
if (rel_width.is_init())
{
oWriter.StartNode(L"wp14:sizeRelH");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"relativeFrom", *sHRelativeFrom);
oWriter.EndAttributes();
oWriter.StartNode(L"wp14:pctWidth");
oWriter.EndAttributes();
oWriter.WriteString(std::to_wstring((INT)(*rel_width * 100000)));
oWriter.EndNode(L"wp14:pctWidth");
oWriter.EndNode(L"wp14:sizeRelH");
}
if (rel_height.is_init())
{
oWriter.StartNode(L"wp14:sizeRelV");
oWriter.StartAttributes();
oWriter.WriteAttribute(L"relativeFrom", *sVRelativeFrom);
oWriter.EndAttributes();
oWriter.StartNode(L"wp14:pctHeight");
oWriter.EndAttributes();
oWriter.WriteString(std::to_wstring((INT)(*rel_height * 100000)));
oWriter.EndNode(L"wp14:pctHeight");
oWriter.EndNode(L"wp14:sizeRelV");
}
nullable_string alt_content;
XmlMacroReadAttributeBase(oNode, L"alt", alt_content);
std::wstring strId = L"";
m_lNextId++;
oWriter.WriteString(strId);
oWriter.EndNode(L"wp:anchor");
return oWriter.GetXmlString();
}
std::wstring CDrawingConverter::GetVMLShapeXml(PPTX::Logic::SpTreeElem& oElem)
{
CPPTXShape* pShapePPTX = NULL;
if (oElem.is())
{
const PPTX::Logic::Shape& lpOriginShape = oElem.as();
if (lpOriginShape.spPr.Geometry.is())
{
const PPTX::Logic::PrstGeom lpGeom = lpOriginShape.spPr.Geometry.as();
OOXMLShapes::ShapeType _lspt = PPTX2EditorAdvanced::GetShapeTypeFromStr(lpGeom.prst.get());
if(_lspt != OOXMLShapes::sptNil)
{
pShapePPTX = new CPPTXShape();
pShapePPTX->SetType(NSBaseShape::pptx, _lspt);
std::wstring strAdjustValues = lpGeom.GetODString();
pShapePPTX->LoadAdjustValuesList(strAdjustValues);
}
}
else if(lpOriginShape.spPr.Geometry.is())
{
const PPTX::Logic::CustGeom lpGeom = lpOriginShape.spPr.Geometry.as();
std::wstring strShape = lpGeom.GetODString();
pShapePPTX = new CPPTXShape();
pShapePPTX->LoadFromXML(strShape);
}
else
{
pShapePPTX = new CPPTXShape();
pShapePPTX->SetType(NSBaseShape::pptx, (int)OOXMLShapes::sptCRect);
}
}
if (NULL != pShapePPTX)
{
NSGuidesVML::CConverterPPTXPPT oConverterPPTX_2_PPT;
oConverterPPTX_2_PPT.Convert(pShapePPTX);
std::wstring sDumpXml = GetVMLShapeXml(oConverterPPTX_2_PPT.GetConvertedShape());
return sDumpXml;
}
return L"";
}
std::wstring CDrawingConverter::GetVMLShapeXml(CPPTShape* pPPTShape)
{
NSBinPptxRW::CXmlWriter oXmlWriter;
oXmlWriter.StartNode(L"v:shape");
oXmlWriter.StartAttributes();
std::wstring strCoordSize;
LONG lCoordW = 21600;
LONG lCoordH = 21600;
if (0 < pPPTShape->m_oPath.m_arParts.size())
{
lCoordW = pPPTShape->m_oPath.m_arParts[0].width;
lCoordH = pPPTShape->m_oPath.m_arParts[0].height;
}
strCoordSize = std::to_wstring(lCoordW) + L"," + std::to_wstring(lCoordH);
oXmlWriter.WriteAttribute(L"coordsize", strCoordSize);
int nAdjCount = (int)pPPTShape->m_arAdjustments.size();
if (nAdjCount > 0)
{
oXmlWriter.WriteString(L" adj=\"");
for (int i = 0; i < nAdjCount; ++i)
{
if (0 != i)
{
std::wstring s = L"," + std::to_wstring(pPPTShape->m_arAdjustments[i]);
oXmlWriter.WriteString(s);
}
else
{
oXmlWriter.WriteString(std::to_wstring(pPPTShape->m_arAdjustments[i]));
}
}
oXmlWriter.WriteString(L"\"");
}
oXmlWriter.WriteAttribute(L"path", pPPTShape->m_strPath);
oXmlWriter.EndAttributes();
std::vector& arGuides = pPPTShape->m_oManager.m_arFormulas;
int nGuides = (int)arGuides.size();
if (nGuides != 0)
{
oXmlWriter.StartNode(L"v:formulas");
oXmlWriter.StartAttributes();
oXmlWriter.EndAttributes();
for (int i = 0; i < nGuides; ++i)
{
CFormula& oGuide = arGuides[i];
if ((int)oGuide.m_eFormulaType >= VML_GUIDE_COUNT)
break;
oXmlWriter.WriteString(L" 0)
{
std::wstring str;
if (oGuide.m_eType1 == ptAdjust)
{
str = L" #";
}
else if (oGuide.m_eType1 == ptFormula)
{
str = L" @";
}
else
{
str = L" ";
}
str += std::to_wstring(oGuide.m_lParam1);
oXmlWriter.WriteString(str);
}
if (nParams > 1)
{
std::wstring str;
if (oGuide.m_eType2 == ptAdjust)
{
str = L" #";
}
else if (oGuide.m_eType2 == ptFormula)
{
str = L" @";
}
else
{
str = L" ";
}
str += std::to_wstring(oGuide.m_lParam2);
oXmlWriter.WriteString(str);
}
if (nParams > 2)
{
std::wstring str ;
if (oGuide.m_eType3 == ptAdjust)
{
str = L" #";
}
else if (oGuide.m_eType3 == ptFormula)
{
str = L" @";
}
else
{
str = L" ";
}
str += std::to_wstring(oGuide.m_lParam3);
oXmlWriter.WriteString(str);
}
oXmlWriter.WriteString(L"\"/>");
}
oXmlWriter.EndNode(L"v:formulas");
size_t nTextRectCount = pPPTShape->m_arStringTextRects.size();
if (0 < nTextRectCount)
{
oXmlWriter.WriteString(L"m_arStringTextRects[i]);
}
oXmlWriter.WriteString(L"\"/>");
}
int nHandles = (int)pPPTShape->m_arHandles.size();
if (0 < nHandles)
{
oXmlWriter.StartNode(L"v:handles");
oXmlWriter.StartAttributes();
oXmlWriter.EndAttributes();
for (int i = 0; i < nHandles; ++i)
{
oXmlWriter.StartNode(L"v:h");
CHandle_& oH = pPPTShape->m_arHandles[i];
if (oH.position != L"")
oXmlWriter.WriteAttribute(L"position", oH.position);
if (oH.xrange != L"")
oXmlWriter.WriteAttribute(L"xrange", oH.xrange);
if (oH.yrange != L"")
oXmlWriter.WriteAttribute(L"yrange", oH.yrange);
if (oH.polar != L"")
oXmlWriter.WriteAttribute(L"polar", oH.polar);
if (oH.radiusrange != L"")
oXmlWriter.WriteAttribute(L"radiusrange", oH.radiusrange);
if (oH.switchHandle != L"")
oXmlWriter.WriteAttribute(L"switch", oH.switchHandle);
oXmlWriter.WriteString(L"/>");
}
oXmlWriter.EndNode(L"v:handles");
}
}
oXmlWriter.EndNode(L"v:shape");
return oXmlWriter.GetXmlString();
}
void CDrawingConverter::SendMainProps(const std::wstring& strMainProps, std::wstring**& pMainProps)
{
if (((m_pBinaryWriter) && (m_pBinaryWriter->m_pMainDocument)) || !m_pBinaryWriter || m_bNeedMainProps)
{
*pMainProps = new std::wstring();
**pMainProps = strMainProps;
}
}
void CDrawingConverter::CheckEffectShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils::CXmlNode& oNode, CPPTShape* pPPTShape)
{
if (!oElem) return;
PPTX::Logic::Shape* pShape = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::Pic* pPicture = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::SpPr* pSpPr = NULL;
if (pShape) pSpPr = &pShape->spPr;
if (pPicture) pSpPr = &pPicture->spPr;
if (!pSpPr) return;
XmlUtils::CXmlNode oNodeShadow = oNode.ReadNode(L"v:shadow");
SimpleTypes::CTrueFalse bShadowEnabled = SimpleTypes::booleanFalse;
if (oNodeShadow.IsValid())
{
XmlMacroReadAttributeBase(oNodeShadow, L"on", bShadowEnabled);
}
if (bShadowEnabled.GetBool())
{
nullable oColor;
nullable oColor2;
nullable_string oId;
nullable oMatrix;
nullable oObscured;
nullable oOffset;
nullable oOffset2;
nullable oOpacity;
nullable oOrigin;
SimpleTypes::CShadowType oType;
XmlMacroReadAttributeBase(oNodeShadow, L"id", oId);
XmlMacroReadAttributeBase(oNodeShadow, L"type", oType);
XmlMacroReadAttributeBase(oNodeShadow, L"color", oColor);
XmlMacroReadAttributeBase(oNodeShadow, L"opacity", oOpacity);
XmlMacroReadAttributeBase(oNodeShadow, L"offset", oOffset);
XmlMacroReadAttributeBase(oNodeShadow, L"origin", oOrigin);
XmlMacroReadAttributeBase(oNodeShadow, L"obscured", oObscured);
XmlMacroReadAttributeBase(oNodeShadow, L"color2", oColor2);
XmlMacroReadAttributeBase(oNodeShadow, L"offset2", oOffset2);
XmlMacroReadAttributeBase(oNodeShadow, L"matrix", oMatrix);
if (false == pSpPr->EffectList.is_init())
pSpPr->EffectList.List = new PPTX::Logic::EffectLst();
PPTX::Logic::EffectLst* pEffectLst = dynamic_cast(pSpPr->EffectList.List.GetPointer());
pEffectLst->outerShdw.Init();
pEffectLst->outerShdw->Color.Color = new PPTX::Logic::SrgbClr();
if (oColor.IsInit())
pEffectLst->outerShdw->Color.Color->SetRGB(oColor->Get_R(), oColor->Get_G(), oColor->Get_B());
else
pEffectLst->outerShdw->Color.Color->SetRGB(0x80, 0x80, 0x80);
if (oOpacity.is_init())
{
BYTE lAlpha = oOpacity->GetValue() * 255;
PPTX::Logic::ColorModifier oMod;
oMod.name = L"alpha";
int nA = (int)(lAlpha * 100000.0 / 255.0);
oMod.val = nA;
pEffectLst->outerShdw->Color.Color->Modifiers.push_back(oMod);
}
if (oOffset.IsInit())
{
double offsetX = oOffset->IsXinPoints() ? oOffset->GetX() : 0;
double offsetY = oOffset->IsYinPoints() ? oOffset->GetY() : 0;
double dist = sqrt(offsetX * offsetX + offsetY * offsetY);
double dir = ((offsetX != 0) ? atan(offsetY / offsetX) : 1) * 180. / 3.1415926;
if (offsetX < 0) dir += 180;
if (dir < 0) dir += 360;
pEffectLst->outerShdw->dist = dist * (635 * 20);
pEffectLst->outerShdw->dir = (int)(dir * 60000);
}
pEffectLst->outerShdw->rotWithShape = false;
if (oMatrix.IsInit())
{
if (oMatrix->m_dSxx > 1.001 || oMatrix->m_dSxx < 0.999)
pEffectLst->outerShdw->sx = (int)(oMatrix->m_dSxx / 65535. * 100000);
if (oMatrix->m_dSyy > 1.001 || oMatrix->m_dSyy < 0.999)
pEffectLst->outerShdw->sy = (int)(oMatrix->m_dSyy / 65535. * 100000);
if (oMatrix->m_dSxy > 0.001 || oMatrix->m_dSxy < 0)
pEffectLst->outerShdw->ky = (int)(oMatrix->m_dSxy / 65535. * 100000);
if (oMatrix->m_dSyx > 0.001 || oMatrix->m_dSyx < 0)
pEffectLst->outerShdw->kx = (int)(oMatrix->m_dSyx / 65535. * 100000);
}
}
}
void CDrawingConverter::CheckBorderShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils::CXmlNode& oNode, CPPTShape* pPPTShape)
{
if (!oElem) return;
PPTX::Logic::Shape* pShape = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::Pic* pPicture = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::SpPr *pSpPr = NULL;
if (pShape) pSpPr = &pShape->spPr;
if (pPicture) pSpPr = &pPicture->spPr;
if (!pSpPr) return;
if ( (pSpPr->ln.IsInit()) && (pSpPr->ln->Fill.m_type != PPTX::Logic::UniFill::noFill) )
return; //дублирование обрамлением линией
nullable_string sColorBorder;
XmlMacroReadAttributeBase(oNode, L"o:borderleftcolor", sColorBorder);
XmlUtils::CXmlNode oNodeBorder = oNode.ReadNode(L"w10:borderleft");
if (oNodeBorder.IsValid())
{
nullable_string sTypeBorder;
XmlMacroReadAttributeBase(oNodeBorder, L"type", sTypeBorder);
SimpleTypes::CBorderType borderType;
if (sTypeBorder.IsInit())
{
borderType.FromString(sTypeBorder.get());
}
if (borderType.GetValue() != SimpleTypes::bordertypeNone)
{
pSpPr->ln.Init();
nullable_int nWidthBorder;
XmlMacroReadAttributeBase(oNodeBorder, L"width", nWidthBorder);
if (borderType.GetValue() > 0 &&
borderType.GetValue() < 6)
{
pSpPr->ln->prstDash.Init();
pSpPr->ln->prstDash->val = new PPTX::Limit::PrstDashVal();
switch(borderType.GetValue())
{
case SimpleTypes::bordertypeDash: pSpPr->ln->prstDash->val->SetBYTECode(3); break;
case SimpleTypes::bordertypeDashDotDot: pSpPr->ln->prstDash->val->SetBYTECode(5); break;
case SimpleTypes::bordertypeDashDotStroked: pSpPr->ln->prstDash->val->SetBYTECode(1); break;
case SimpleTypes::bordertypeDashedSmall: pSpPr->ln->prstDash->val->SetBYTECode(0); break;
case SimpleTypes::bordertypeDot: pSpPr->ln->prstDash->val->SetBYTECode(2); break;
case SimpleTypes::bordertypeDotDash: pSpPr->ln->prstDash->val->SetBYTECode(1); break;
}
}
if (nWidthBorder.IsInit())
{
pSpPr->ln->w = (int)(*nWidthBorder * g_emu_koef);//pt to emu
}
if (sColorBorder.IsInit())
{
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
if (std::wstring::npos != sColorBorder->find(L"#"))
{
pSolid->Color.Color->SetHexString(sColorBorder->substr(1));
}
else
{
//"red", L"black" , .. to color
}
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->ln->Fill.Fill = pSolid;
}
}
}
}
void CDrawingConverter::ConvertColor(PPTX::Logic::UniColor & uniColor, nullable_string & sColor, nullable_string& sOpacity)
{
int R = uniColor.is_init() ? uniColor.Color->red : 255;
int G = uniColor.is_init() ? uniColor.Color->green : 255;
int B = uniColor.is_init() ? uniColor.Color->blue : 255;
uniColor.Color = new PPTX::Logic::SrgbClr();
if (sColor.is_init())
{
ODRAW::CColor color;
if (sColor.is_init() && (std::wstring::npos != sColor->find(L"fill")))
{
std::wstring sColorEffect = *sColor;
if (sColorEffect.length() > 5)
sColorEffect = sColorEffect.substr(5);
int resR, resG, resB;
GetColorWithEffect(sColorEffect, R, G, B, resR, resG, resB);
R = resR;
G = resG;
B = resB;
}
else
{
if (NS_DWC_Common::getColorFromString(*sColor, color))
{
R = color.R;
G = color.G;
B = color.B;
}
}
}
uniColor.Color->SetRGB(R, G, B);
if (sOpacity.is_init())
{
BYTE lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity);
PPTX::Logic::ColorModifier oMod;
oMod.name = L"alpha";
int nA = (int)(lAlpha * 100000.0 / 255.0);
oMod.val = nA;
uniColor.Color->Modifiers.push_back(oMod);
}
}
void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils::CXmlNode& oNode, CPPTShape* pPPTShape)
{
if (!oElem) return;
PPTX::Logic::Shape* pShape = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::Pic* pPicture = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::SpPr* pSpPr = NULL;
if (pShape) pSpPr = &pShape->spPr;
if (pPicture) pSpPr = &pPicture->spPr;
if (!pSpPr) return;
int R = 255;
int G = 255;
int B = 255;
nullable_string sFillColor;
XmlMacroReadAttributeBase(oNode, L"fillcolor", sFillColor);
if (sFillColor.is_init() && !pPPTShape->IsWordArt())
{
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(*sFillColor, color))
{
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(color.R, color.G, color.B);
pSpPr->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->Fill.Fill = pSolid;
}
}
else if (!pPPTShape->IsWordArt())
{
// default fillcolor in vml = white
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(R, G, B);
pSpPr->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->Fill.Fill = pSolid;
}
nullable_string sFilled;
XmlMacroReadAttributeBase(oNode, L"filled", sFilled);
if (sFilled.is_init())
{
if (*sFilled == L"false" || *sFilled == L"f")
{
PPTX::Logic::NoFill* pNoFill = new PPTX::Logic::NoFill();
pNoFill->m_namespace = L"a";
pSpPr->Fill.m_type = PPTX::Logic::UniFill::noFill;
pSpPr->Fill.Fill = pNoFill;
pPPTShape->m_bIsFilled = false;
}
else
pPPTShape->m_bIsFilled = true; // change parent ShapeType
}
else if (!pPPTShape->m_bIsFilled) // from parent ShapeType
{
PPTX::Logic::NoFill* pNoFill = new PPTX::Logic::NoFill();
pNoFill->m_namespace = L"a";
pSpPr->Fill.m_type = PPTX::Logic::UniFill::noFill;
pSpPr->Fill.Fill = pNoFill;
}
nullable_string sColor = sFillColor;
nullable_string sOpacity;
XmlMacroReadAttributeBase(oNode, L"opacity", sOpacity);
if (sOpacity.is_init())
{
BYTE lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity);
if (pSpPr->Fill.is())
{
PPTX::Logic::ColorModifier oMod;
oMod.name = L"alpha";
int nA = (int)(lAlpha * 100000.0 / 255.0);
oMod.val = nA;
pSpPr->Fill.as().Color.Color->Modifiers.push_back(oMod);
}
}
XmlUtils::CXmlNode oNodeFill = oNode.ReadNode(L"v:fill");
if (pPPTShape->m_bIsFilled && oNodeFill.IsValid() && !pPPTShape->IsWordArt())
{
nullable_string sOpacity2;
nullable_string sColor2;
nullable < SimpleTypes::CFillType> oType;
nullable oFocus;
nullable oFocusSize;
nullable oFocusPosition;
nullable oAngle;
nullable_string sColors;
nullable_string sRotate;
XmlMacroReadAttributeBase(oNodeFill, L"rotate", sRotate);
XmlMacroReadAttributeBase(oNodeFill, L"opacity", sOpacity);
XmlMacroReadAttributeBase(oNodeFill, L"opacity2", sOpacity2);
XmlMacroReadAttributeBase(oNodeFill, L"color", sColor);
XmlMacroReadAttributeBase(oNodeFill, L"color2", sColor2);
XmlMacroReadAttributeBase(oNodeFill, L"type", oType);
XmlMacroReadAttributeBase(oNodeFill, L"focus", oFocus);
XmlMacroReadAttributeBase(oNodeFill, L"focussize", oFocusSize);
XmlMacroReadAttributeBase(oNodeFill, L"angle", oAngle);
XmlMacroReadAttributeBase(oNodeFill, L"colors", sColors);
XmlMacroReadAttributeBase(oNodeFill, L"focusposition", oFocusPosition);
if (sColor.IsInit() || sOpacity.IsInit())
{//reset exactly
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
ConvertColor(pSolid->Color, sColor, sOpacity);
pSpPr->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->Fill.Fill = pSolid;
if (!sFillColor.is_init())
sFillColor = sColor;
}
nullable_string sRid;
XmlMacroReadAttributeBase(oNodeFill, L"o:relid", sRid);
if (false == sRid.IsInit())
{
XmlMacroReadAttributeBase(oNodeFill, L"relationships:id", sRid);
}
if (false == sRid.IsInit())
{
XmlMacroReadAttributeBase(oNodeFill, L"o:relid", sRid);
}
if (sRid.is_init())
{
PPTX::Logic::BlipFill* pBlipFill = NULL;
if (pPicture)
{
pBlipFill = &pPicture->blipFill;
}
else
{
pBlipFill = new PPTX::Logic::BlipFill();
pSpPr->Fill.m_type = PPTX::Logic::UniFill::blipFill;
pSpPr->Fill.Fill = pBlipFill;
}
pBlipFill->m_namespace = L"a";
pBlipFill->blip = new PPTX::Logic::Blip();
pBlipFill->blip->embed = new OOX::RId(*sRid);
if (oType.is_init() && ((oType->GetValue() == SimpleTypes::filltypeTile) || (oType->GetValue() == SimpleTypes::filltypePattern)))
{
pBlipFill->tile = new PPTX::Logic::Tile();
if (oType->GetValue() == SimpleTypes::filltypePattern)
{
PPTX::Logic::Duotone* pDuotone = new PPTX::Logic::Duotone();
PPTX::Logic::UniColor bgClr;
ConvertColor(bgClr, sColor2, sOpacity2);
pDuotone->Colors.push_back(bgClr);
PPTX::Logic::UniColor fgClr;
ConvertColor(fgClr, sColor, sOpacity);
pDuotone->Colors.push_back(fgClr);
PPTX::Logic::UniEffect effect;
effect.InitPointer(pDuotone);
pBlipFill->blip->Effects.push_back(effect);
}
}
else
{
pBlipFill->stretch = new PPTX::Logic::Stretch();
}
}
if ((oType.is_init() && (oType->GetValue() == SimpleTypes::filltypeGradient ||
oType->GetValue() == SimpleTypes::filltypeGradientRadial ||
oType->GetValue() == SimpleTypes::filltypeGradientCenter)) ||
(oFocus.is_init() || sColors.is_init() || oAngle.is_init() || oFocusSize.is_init() || oFocusPosition.is_init()))
{
PPTX::Logic::GradFill* pGradFill = new PPTX::Logic::GradFill();
pGradFill->m_namespace = L"a";
pGradFill->rotWithShape = false;
int nAngle = oAngle.is_init() ? (oAngle->GetValue() < -90 ? oAngle->GetValue() + 180 : oAngle->GetValue() + 90) : 90;
if (sColors.is_init())
{
std::vector arSplit;
boost::algorithm::split(arSplit, sColors.get(), boost::algorithm::is_any_of(L";"), boost::algorithm::token_compress_on);
for (size_t i = 0; i < arSplit.size(); i++)
{
size_t p = arSplit[i].find(L" ");
if (p == std::wstring::npos)
continue;
std::wstring strPos = arSplit[i].substr(0, p);
std::wstring strColor = arSplit[i].substr(p + 1);
double pos = XmlUtils::GetDouble(strPos);
PPTX::Logic::Gs Gs_;
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(strColor, color))
{
Gs_.color.Color = new PPTX::Logic::SrgbClr();
Gs_.color.Color->SetRGB(color.R, color.G, color.B);
if (pos <= 1)
pos = 100000 * pos;
else
pos = pos / 65536 * 100000;
Gs_.pos = pos;
pGradFill->GsLst.push_back(Gs_);
}
}
}
else
{
PPTX::Logic::Gs Gs_1;
ConvertColor(Gs_1.color, sColor, sOpacity);
PPTX::Logic::Gs Gs_2 = Gs_1;
ConvertColor(Gs_2.color, sColor2, sOpacity2);
double focusPoint = oFocus.IsInit() ? abs(oFocus->GetValue()) : 0;
bool bColorsInvert = ((oFocus.IsInit() && oFocus->GetValue() > 0 && nAngle == 0) ||
((oFocus.IsInit() && oFocus->GetValue() < 0) && false == oAngle.is_init()));
if (focusPoint > 0 && focusPoint < 100)
{
PPTX::Logic::Gs Gs_3;
Gs_1.pos = 0;
Gs_3.pos = focusPoint * 1000;
Gs_2.pos = 100 * 1000;
if (bColorsInvert)
{
Gs_3.color = Gs_1.color;
Gs_1.color = Gs_2.color;
}
else
{
Gs_3.color = Gs_2.color;
Gs_2.color = Gs_1.color;
}
pGradFill->GsLst.push_back(Gs_3);
}
else
{
Gs_2.pos = focusPoint * 1000;
Gs_1.pos = (100 - focusPoint) * 1000;
}
pGradFill->GsLst.push_back(Gs_1);
pGradFill->GsLst.push_back(Gs_2);
}
//if (pGradFill->GsLst.size() == 1) //Sindicatum.docx
//{
// PPTX::Logic::Gs Gs_;
// Gs_.pos = pGradFill->GsLst[0].pos == 0 ? 100 * 1000 : 0;
// Gs_.color.Color = new PPTX::Logic::SrgbClr(); Gs_.color.Color->SetRGB(0xff, 0xff, 0xff);
//
// pGradFill->GsLst.push_back( Gs_ );
//}
//todooo method
if (oType.IsInit() && oType->GetValue() == SimpleTypes::filltypeGradientRadial)
{
double x = 0, y = 0;
if (oFocusPosition.is_init())
{
x = oFocusPosition->GetX();
y = oFocusPosition->GetY();
}
pGradFill->path.Init();
pGradFill->path->path = 2;
pGradFill->path->rect.Init();
pGradFill->path->rect->m_name = L"a:fillToRect";
pGradFill->path->rect->b = XmlUtils::ToString(100 - int(y * 100)) + L"%";
pGradFill->path->rect->r = XmlUtils::ToString(100 - int(x * 100)) + L"%";
pGradFill->path->rect->t = XmlUtils::ToString(int(y * 100)) + L"%";
pGradFill->path->rect->l = XmlUtils::ToString(int(x * 100)) + L"%";
pGradFill->tileRect.Init();
pGradFill->tileRect->m_name = L"a:tileRect";
}
else
{
pGradFill->lin = new PPTX::Logic::Lin();
pGradFill->lin->scaled = 1;
if (nAngle != 0)
{
pGradFill->lin->ang = (nAngle >= 0 ? nAngle : (360 + nAngle)) * 60000;
}
else if (sRotate.is_init())
{
pGradFill->lin = new PPTX::Logic::Lin();
pGradFill->lin->scaled = 1;
if (*sRotate == L"l") pGradFill->lin->ang = 0 * 60000;
if (*sRotate == L"t") pGradFill->lin->ang = 90 * 60000;
if (*sRotate == L"b") pGradFill->lin->ang = 270 * 60000;
if (*sRotate == L"r") pGradFill->lin->ang = 180 * 60000;
}
}
pSpPr->Fill.m_type = PPTX::Logic::UniFill::gradFill;
pSpPr->Fill.Fill = pGradFill;
}
if ((oType.IsInit() && oType->GetValue() == SimpleTypes::filltypePattern) && pSpPr->Fill.m_type != PPTX::Logic::UniFill::blipFill)
{
PPTX::Logic::PattFill* pPattFill = new PPTX::Logic::PattFill();
pPattFill->m_namespace = L"a";
ConvertColor(pPattFill->fgClr, sColor, sOpacity);
ConvertColor(pPattFill->bgClr, sColor2, sOpacity2);
pSpPr->Fill.m_type = PPTX::Logic::UniFill::pattFill;
pSpPr->Fill.Fill = pPattFill;
}
if (sOpacity.is_init() && pSpPr->Fill.is())
{
BYTE lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity);
PPTX::Logic::AlphaModFix* pAlphaMod = new PPTX::Logic::AlphaModFix();
int nA = (int)(lAlpha * 100000.0 / 255.0);
pAlphaMod->amt = nA;
PPTX::Logic::UniEffect oEff;
oEff.InitPointer(pAlphaMod);
pSpPr->Fill.as().blip->Effects.push_back(oEff);
}
}
if (pPPTShape->m_bIsFilled || pPPTShape->m_eType == PPTShapes::sptCFrame)
{
XmlUtils::CXmlNode oNodeFillID = oNode.ReadNode(L"v:imagedata");
if (oNodeFillID.IsValid())
{
nullable_string sSrc;
XmlMacroReadAttributeBase(oNodeFillID, L"src", sSrc);
if (sSrc.IsInit())
{
std::map>::iterator pFind = m_mapBinDatas.find(*sSrc);
if (pFind != m_mapBinDatas.end())
{
oElem->m_binaryData = pFind->second;
}
}
nullable_string sTitle;
XmlMacroReadAttributeBase(oNodeFillID, L"o:title", sTitle);
nullable_string sRid;
XmlMacroReadAttributeBase(oNodeFillID, L"r:id", sRid);
nullable_string sRelid;
XmlMacroReadAttributeBase(oNodeFillID, L"o:relid", sRelid);
nullable_string sPictId;
XmlMacroReadAttributeBase(oNodeFillID, L"r:pict", sPictId);
if (sRid.is_init() || sRelid.is_init() || sPictId.is_init() || oElem->m_binaryData.IsInit() || (sTitle.IsInit() && !sTitle->empty()))
{
nullable_string sType;
XmlMacroReadAttributeBase(oNodeFillID, L"type", sType);
PPTX::Logic::BlipFill* pBlipFill = NULL;
if (pPicture)
{
pPicture->nvPicPr.cNvPr.descr = sTitle;
pBlipFill = &pPicture->blipFill;
}
else
{
pBlipFill = new PPTX::Logic::BlipFill();
pSpPr->Fill.m_type = PPTX::Logic::UniFill::blipFill;
pSpPr->Fill.Fill = pBlipFill;
}
pBlipFill->m_namespace = L"a";
pBlipFill->blip = new PPTX::Logic::Blip();
if (oElem->m_binaryData.IsInit() && oElem->m_binaryData->m_sData.IsInit())
{
pBlipFill->blip->dataFilepathImageA = "data:base64," + *oElem->m_binaryData->m_sData;
}
else
{
std::wstring sId = sRid.IsInit() ? *sRid : (sRelid.IsInit() ? *sRelid : (sPictId.IsInit() ? *sPictId : L""));
pBlipFill->blip->embed = new OOX::RId(sId);
}
if (sType.is_init() && *sType == L"tile")
{
pBlipFill->tile = new PPTX::Logic::Tile();
}
else
{
//stretch ??? bug 28238
pBlipFill->stretch.Init();
pBlipFill->stretch->fillRect.Init();
}
std::wstring strCropT = oNodeFillID.GetAttribute(L"croptop");
std::wstring strCropL = oNodeFillID.GetAttribute(L"cropleft");
std::wstring strCropR = oNodeFillID.GetAttribute(L"cropright");
std::wstring strCropB = oNodeFillID.GetAttribute(L"cropbottom");
NS_DWC_Common::CorrentCropString(strCropL);
NS_DWC_Common::CorrentCropString(strCropT);
NS_DWC_Common::CorrentCropString(strCropR);
NS_DWC_Common::CorrentCropString(strCropB);
if (L"" != strCropL || L"" != strCropT || L"" != strCropR || L"" != strCropB)
{
pBlipFill->srcRect = new PPTX::Logic::Rect();
std::wstring str0 = L"0";
if (L"" != strCropL)
pBlipFill->srcRect->l = strCropL;
else
pBlipFill->srcRect->l = str0;
if (L"" != strCropT)
pBlipFill->srcRect->t = strCropT;
else
pBlipFill->srcRect->t = str0;
if (L"" != strCropR)
pBlipFill->srcRect->r = strCropR;
else
pBlipFill->srcRect->r = str0;
if (L"" != strCropB)
pBlipFill->srcRect->b = strCropB;
else
pBlipFill->srcRect->b = str0;
}
}
}
}
if (pPicture)
{
pSpPr->Fill.m_type = PPTX::Logic::UniFill::notInit;
if (false == pPicture->blipFill.blip.is_init())
{
oElem->InitElem(NULL); //MSF_Lec3-4.docx
}
}
else // Shape, ..
{
// default params for fill shape
if (!pSpPr->Fill.Fill.is_init())
{
if (pPPTShape->IsWordArt())
{
PPTX::Logic::NoFill* pNoFill = new PPTX::Logic::NoFill();
pNoFill->m_namespace = L"a";
pSpPr->Fill.m_type = PPTX::Logic::UniFill::noFill;
pSpPr->Fill.Fill = pNoFill;
}
else
{
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(0xFF, 0xFF, 0xFF);
pSpPr->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->Fill.Fill = pSolid;
if (sOpacity.is_init())
{
BYTE lAlpha = NS_DWC_Common::getOpacityFromString(*sOpacity);
PPTX::Logic::ColorModifier oMod;
oMod.name = L"alpha";
int nA = (int)(lAlpha * 100000.0 / 255.0);
oMod.val = nA;
pSolid->Color.Color->Modifiers.push_back(oMod);
}
}
}
}
}
void CDrawingConverter::CheckPenShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils::CXmlNode& oNode, CPPTShape* pPPTShape)
{
if (!oElem)return;
PPTX::Logic::Shape* pShape = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::Pic* pPicture = dynamic_cast (oElem->GetElem().operator ->());
PPTX::Logic::SpPr *pSpPr = NULL;
if (pShape) pSpPr = &pShape->spPr;
if (pPicture) pSpPr = &pPicture->spPr;
if (!pSpPr) return;
if (!pPPTShape->m_bIsStroked)
{
if (!pSpPr->ln.IsInit())
pSpPr->ln.Init();
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::noFill;
pSpPr->ln->Fill.Fill = new PPTX::Logic::NoFill();
}
if (pPPTShape->IsWordArt())
return;
nullable_string sStrokeColor, sStrokeOpacity;
XmlMacroReadAttributeBase(oNode, L"strokecolor", sStrokeColor);
if (sStrokeColor.is_init())
{
if (!pSpPr->ln.IsInit())
pSpPr->ln.Init();
pPPTShape->m_bIsStroked = true;
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
ConvertColor(pSolid->Color, sStrokeColor, sStrokeOpacity);
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->ln->Fill.Fill = pSolid;
}
nullable oStrokeWeight;
XmlMacroReadAttributeBase(oNode, L"strokeweight", oStrokeWeight);
if (oStrokeWeight.is_init())
{
pPPTShape->m_bIsStroked = true;
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
int size = oStrokeWeight->ToEmu();
pSpPr->ln->w = size;
pPPTShape->m_bIsStroked = true;
}
XmlUtils::CXmlNode oNodeStroke = oNode.ReadNode(L"v:stroke");
if (oNodeStroke.IsValid())
{
sStrokeColor.reset();
XmlMacroReadAttributeBase(oNodeStroke, L"strokecolor", sStrokeColor);
if (sStrokeColor.is_init())
{
pPPTShape->m_bIsStroked = true;
ODRAW::CColor color;
if (NS_DWC_Common::getColorFromString(*sStrokeColor, color))
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(color.R, color.G, color.B);
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->ln->Fill.Fill = pSolid;
}
}
nullable_string sStrokeDashStyle;
XmlMacroReadAttributeBase(oNodeStroke, L"dashstyle", sStrokeDashStyle);
if (sStrokeDashStyle.is_init())
{
pPPTShape->m_bIsStroked = true;
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
pSpPr->ln->prstDash = new PPTX::Logic::PrstDash();
if (*sStrokeDashStyle == L"solid") pSpPr->ln->prstDash->val = L"solid";
else if (*sStrokeDashStyle == L"shortdash") pSpPr->ln->prstDash->val = L"sysDash";
else if (*sStrokeDashStyle == L"shortdot") pSpPr->ln->prstDash->val = L"sysDot";
else if (*sStrokeDashStyle == L"shortdashdot") pSpPr->ln->prstDash->val = L"sysDashDot";
else if (*sStrokeDashStyle == L"shortdashdotdot")pSpPr->ln->prstDash->val = L"sysDashDotDot";
else if (*sStrokeDashStyle == L"dot") pSpPr->ln->prstDash->val = L"dot";
else if (*sStrokeDashStyle == L"dash") pSpPr->ln->prstDash->val = L"dash";
else if (*sStrokeDashStyle == L"longdash") pSpPr->ln->prstDash->val = L"lgDash";
else if (*sStrokeDashStyle == L"dashdot") pSpPr->ln->prstDash->val = L"dashDot";
else if (*sStrokeDashStyle == L"longdashdot") pSpPr->ln->prstDash->val = L"lgDashDot";
else if (*sStrokeDashStyle == L"longdashdotdot")pSpPr->ln->prstDash->val = L"lgDashDotDot";
else pSpPr->ln->prstDash->val = L"solid";
}
nullable_string sEndArraw;
XmlMacroReadAttributeBase(oNodeStroke, L"endarrow", sEndArraw);
if (sEndArraw.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
pSpPr->ln->tailEnd = new PPTX::Logic::LineEnd();
if (*sEndArraw == L"none") pSpPr->ln->tailEnd->type = L"none";
else if (*sEndArraw == L"block") pSpPr->ln->tailEnd->type = L"triangle";
else if (*sEndArraw == L"classic") pSpPr->ln->tailEnd->type = L"stealth";
else if (*sEndArraw == L"diamond") pSpPr->ln->tailEnd->type = L"diamond";
else if (*sEndArraw == L"oval") pSpPr->ln->tailEnd->type = L"oval";
else if (*sEndArraw == L"open") pSpPr->ln->tailEnd->type = L"arrow";
else pSpPr->ln->tailEnd->type = L"none";
}
nullable_string sEndArrawLen;
XmlMacroReadAttributeBase(oNodeStroke, L"endarrowlength", sEndArrawLen);
if (sEndArrawLen.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (!pSpPr->ln->tailEnd.is_init())
pSpPr->ln->tailEnd = new PPTX::Logic::LineEnd();
if (*sEndArrawLen == L"short") pSpPr->ln->tailEnd->len = L"sm";
else if (*sEndArrawLen == L"medium") pSpPr->ln->tailEnd->len = L"med";
else if (*sEndArrawLen == L"long") pSpPr->ln->tailEnd->len = L"lg";
else pSpPr->ln->tailEnd->len = L"med";
}
nullable_string sEndArrawWidth;
XmlMacroReadAttributeBase(oNodeStroke, L"endarrowwidth", sEndArrawWidth);
if (sEndArrawWidth.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (!pSpPr->ln->tailEnd.is_init())
pSpPr->ln->tailEnd = new PPTX::Logic::LineEnd();
if (*sEndArrawWidth == L"narrow") pSpPr->ln->tailEnd->w = L"sm";
else if (*sEndArrawWidth == L"medium") pSpPr->ln->tailEnd->w = L"med";
else if (*sEndArrawWidth == L"wide") pSpPr->ln->tailEnd->w = L"lg";
else pSpPr->ln->tailEnd->w = L"med";
}
nullable_string sStartArraw;
XmlMacroReadAttributeBase(oNodeStroke, L"startarrow", sStartArraw);
if (sStartArraw.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
pSpPr->ln->headEnd = new PPTX::Logic::LineEnd();
if (*sStartArraw == L"none") pSpPr->ln->headEnd->type = L"none";
else if (*sStartArraw == L"block") pSpPr->ln->headEnd->type = L"triangle";
else if (*sStartArraw == L"classic")pSpPr->ln->headEnd->type = L"stealth";
else if (*sStartArraw == L"diamond")pSpPr->ln->headEnd->type = L"diamond";
else if (*sStartArraw == L"oval") pSpPr->ln->headEnd->type = L"oval";
else if (*sStartArraw == L"open") pSpPr->ln->headEnd->type = L"arrow";
else pSpPr->ln->headEnd->type = L"none";
}
nullable_string sStartArrawLen;
XmlMacroReadAttributeBase(oNodeStroke, L"startarrowlength", sStartArrawLen);
if (sStartArrawLen.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (!pSpPr->ln->headEnd.is_init())
pSpPr->ln->headEnd = new PPTX::Logic::LineEnd();
if (*sStartArrawLen == L"short") pSpPr->ln->headEnd->len = L"sm";
else if (*sStartArrawLen == L"medium") pSpPr->ln->headEnd->len = L"med";
else if (*sStartArrawLen == L"long") pSpPr->ln->headEnd->len = L"lg";
else pSpPr->ln->headEnd->len = L"med";
}
nullable_string sStartArrawWidth;
XmlMacroReadAttributeBase(oNodeStroke, L"startarrowwidth", sStartArrawWidth);
if (sStartArrawWidth.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (!pSpPr->ln->headEnd.is_init())
pSpPr->ln->headEnd = new PPTX::Logic::LineEnd();
if (*sStartArrawWidth == L"narrow") pSpPr->ln->headEnd->w = L"sm";
else if (*sStartArrawWidth == L"medium") pSpPr->ln->headEnd->w = L"med";
else if (*sStartArrawWidth == L"wide") pSpPr->ln->headEnd->w = L"lg";
else pSpPr->ln->headEnd->w = L"med";
}
nullable_string sEndCap;
XmlMacroReadAttributeBase(oNodeStroke, L"endcap", sEndCap);
if (sEndCap.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (*sEndCap == L"flat") pSpPr->ln->cap = L"flat";
else if (*sEndCap == L"round") pSpPr->ln->cap = L"rnd";
else if (*sEndCap == L"square") pSpPr->ln->cap = L"sq";
}
nullable_string sLineJoin;
XmlMacroReadAttributeBase(oNodeStroke, L"joinstyle", sLineJoin);
if (sLineJoin.is_init())
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
pSpPr->ln->join.Init();
if (*sLineJoin == L"bevel") pSpPr->ln->join->type = PPTX::Logic::JoinBevel;
else if (*sLineJoin == L"miter") pSpPr->ln->join->type = PPTX::Logic::JoinMiter;
else if (*sLineJoin == L"round") pSpPr->ln->join->type = PPTX::Logic::JoinRound;
}
}
nullable_string sStroked;
XmlMacroReadAttributeBase(oNode, L"stroked", sStroked);
if (oNodeStroke.IsValid())
{
nullable_string sStrokeOn;
XmlMacroReadAttributeBase(oNodeStroke, L"on", sStrokeOn);
if (sStrokeOn.is_init())
{
sStroked.reset();
sStroked = sStrokeOn;
}
}
if (sStroked.is_init())
{
if (*sStroked == L"false" || *sStroked == L"f")
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::noFill;
pSpPr->ln->Fill.Fill = new PPTX::Logic::NoFill();
pPPTShape->m_bIsStroked = false;
}
}
// default params
if (pShape) // not Picture
{
if (!pSpPr->ln.is_init())
pSpPr->ln = new PPTX::Logic::Ln();
if (!pSpPr->ln->Fill.Fill.is_init())
{
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
pSolid->Color.Color = new PPTX::Logic::SrgbClr();
pSolid->Color.Color->SetRGB(0, 0, 0);
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->ln->Fill.Fill = pSolid;
}
}
else
{
nullable_string sStrokeColor, sStrokeOpacity;
XmlMacroReadAttributeBase(oNode, L"o:bordertopcolor", sStrokeColor);
XmlUtils::CXmlNode oNodeStroke = oNode.ReadNode(L"w10:bordertop");
if (oNodeStroke.IsValid() && sStrokeColor.is_init())
{
if (!pSpPr->ln.IsInit())
pSpPr->ln.Init();
pPPTShape->m_bIsStroked = true;
PPTX::Logic::SolidFill* pSolid = new PPTX::Logic::SolidFill();
pSolid->m_namespace = L"a";
ConvertColor(pSolid->Color, sStrokeColor, sStrokeOpacity);
pSpPr->ln->Fill.m_type = PPTX::Logic::UniFill::solidFill;
pSpPr->ln->Fill.Fill = pSolid;
}
}
}
HRESULT CDrawingConverter::LoadClrMap(const std::wstring& bsXml)
{
smart_ptr pClrMap = new PPTX::Logic::ClrMap();
std::wstring strXml = L"" + bsXml + L"";
XmlUtils::CXmlNode oNode;
oNode.FromXmlString(strXml);
if (oNode.IsValid())
{
XmlUtils::CXmlNode nodeMap = oNode.ReadNode(L"w:clrSchemeMapping");
pClrMap->fromXML(nodeMap);
}
*m_pClrMap = pClrMap;
return S_OK;
}
HRESULT CDrawingConverter::SaveObject(LONG lStart, LONG lLength, const std::wstring& bsMainProps, std::wstring & sXml)
{
bool bIsInline = false;
std::wstring strMainProps = bsMainProps;
std::wstring strMainPropsTail;
int nIndexF = (int)strMainProps.find(L"");
if (-1 != nIndexF)
{
bIsInline = true;
strMainProps = strMainProps.substr(0, nIndexF);
}
else
{
nIndexF = (int)strMainProps.find(L"");
strMainProps = strMainProps.substr(0, nIndexF);
}
if (-1 == nIndexF)
return S_FALSE;
int nIndexTail = (int)strMainProps.find(L""), m_pReader->GenerateNextId());
strMainProps += strId;
*/
//strMainProps += L"");
m_pReader->Seek(lStart);
++m_nCurrentIndexObject;
BYTE typeRec1 = m_pReader->GetUChar(); // must be 0;
LONG szRec1 = m_pReader->GetRecordSize();
LONG _e = m_pReader->GetPos() + szRec1 + 4;
if (typeRec1 == 0 && szRec1 > 0)
{
BYTE typeRec2 = m_pReader->GetUChar(); // must be 1;
LONG szRec2 = m_pReader->GetLong();
if (typeRec2 == 1 && szRec2 > 0)
{
PPTX::Logic::SpTreeElem oElem;
if (m_pReader->m_nDocumentType == 0)
m_pReader->m_nDocumentType = XMLWRITER_DOC_TYPE_DOCX;
oElem.fromPPTY(m_pReader);
bool bOle = false;
if (oElem.is())
{
PPTX::Logic::Pic& oPic = oElem.as();
if(oPic.oleObject.IsInit())
{
bOle = oPic.oleObject->isValid();
if (oPic.oleObject->m_oDxaOrig.IsInit() == false)
{
oPic.oleObject->m_oDxaOrig = 0;
}
if (oPic.oleObject->m_oDyaOrig.IsInit() == false)
{
oPic.oleObject->m_oDyaOrig = 0;
}
}
}
bool bSignatureLine = false;
if (oElem.is())
{
PPTX::Logic::Shape& oShape = oElem.as();
if(oShape.signatureLine.IsInit())
{
bSignatureLine = true;
}
}
NSBinPptxRW::CXmlWriter oXmlWriter(m_pReader->m_nDocumentType);
oXmlWriter.m_lObjectIdVML = m_pXmlWriter->m_lObjectIdVML;
oXmlWriter.m_lObjectIdOle = m_pXmlWriter->m_lObjectIdOle;
oXmlWriter.m_bIsUseOffice2007 = m_bIsUseConvertion2007;
oXmlWriter.m_bIsTop = (1 == m_nCurrentIndexObject) ? true : false;
if (NULL == m_pOOXToVMLRenderer)
m_pOOXToVMLRenderer = new COOXToVMLGeometry();
oXmlWriter.m_pOOXToVMLRenderer = m_pOOXToVMLRenderer;
if(bOle)
{
ConvertPicVML(oElem, bsMainProps, oXmlWriter);
}
else if(bSignatureLine)
{
oXmlWriter.WriteString(L"");
ConvertShapeVML(oElem, bsMainProps, oXmlWriter, true);
oXmlWriter.WriteString(L"");
}
else
{
bool bIsNeedConvert2007 = false;
if (m_bIsUseConvertion2007)
{
if (oElem.is() ||
oElem.is() ||
oElem.is())
{
oXmlWriter.WriteString(L"");
bIsNeedConvert2007 = true;
}
}
oXmlWriter.WriteString(L"");
oXmlWriter.WriteString(strMainProps);
bool bAddGraphicData = false;
if (oElem.is())
{
bAddGraphicData = true;
oXmlWriter.WriteString(L"\
");
}
else if (oElem.is())
{
bAddGraphicData = true;
oXmlWriter.WriteString(L"\
");
}
else if (oElem.is())
{
bAddGraphicData = true;
oXmlWriter.WriteString(L"\
");
}
else if (oElem.is())
{
bAddGraphicData = true;
oXmlWriter.WriteString(L"\
");
}
if (m_pReader->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX)
{
PPTX::Logic::Xfrm *pXfrm = NULL;
if (oElem.getType() == OOX::et_pic)
{
PPTX::Logic::Pic& s = oElem.as();
if (s.spPr.xfrm.IsInit() == false)
{
//s.spPr.xfrm.Init(); pXfrm = s.spPr.xfrm.GetPointer();
}
}
else if (oElem.getType() == OOX::et_graphicFrame)
{
PPTX::Logic::GraphicFrame& s = oElem.as();
if (s.xfrm.IsInit() == false)
{
s.xfrm.Init(); pXfrm = s.xfrm.GetPointer();
}
}
else if (oElem.getType() == OOX::et_p_ShapeTree)
{
PPTX::Logic::SpTree& s = oElem.as();
if (s.grpSpPr.xfrm.IsInit() == false)
{
s.grpSpPr.xfrm.Init(); pXfrm = s.grpSpPr.xfrm.GetPointer();
}
}
else if (oElem.getType() == OOX::et_a_Shape)
{
PPTX::Logic::Shape& s = oElem.as();
if (s.spPr.xfrm.IsInit() == false)
{
s.spPr.xfrm.Init(); pXfrm = s.spPr.xfrm.GetPointer();
}
}
else if (oElem.getType() == OOX::et_cxnSp)
{
PPTX::Logic::CxnSp& s = oElem.as();
if (s.spPr.xfrm.IsInit() == false)
{
s.spPr.xfrm.Init(); pXfrm = s.spPr.xfrm.GetPointer();
}
}
if (pXfrm)
{
pXfrm->extX = 0;
pXfrm->extY = 0;
pXfrm->offX = 0;
pXfrm->offY = 0;
}
}
oElem.toXmlWriter(&oXmlWriter);
if (bAddGraphicData)
oXmlWriter.WriteString(L"");
oXmlWriter.WriteString(strMainPropsTail);
oXmlWriter.WriteString(bIsInline ? L"" : L"");
oXmlWriter.WriteString(L"");
if (bIsNeedConvert2007)
{
oXmlWriter.WriteString(L"");
oXmlWriter.WriteString(L"");
if (oElem.is())
{
ConvertGroupVML(oElem, bsMainProps, oXmlWriter);
}
else if (oElem.is())
{
ConvertShapeVML(oElem, bsMainProps, oXmlWriter);
}
else if (oElem.is())
{
ConvertPicVML(oElem, bsMainProps, oXmlWriter);
}
oXmlWriter.WriteString(L"");
oXmlWriter.WriteString(L"");
}
}
--m_nCurrentIndexObject;
m_pXmlWriter->m_lObjectIdVML = oXmlWriter.m_lObjectIdVML;
m_pXmlWriter->m_lObjectIdOle = oXmlWriter.m_lObjectIdOle;
sXml = oXmlWriter.GetXmlString();
}
}
m_pReader->Seek(_e);
return S_OK;
}
void CDrawingConverter::SaveObjectExWriterInit(NSBinPptxRW::CXmlWriter& oXmlWriter, int nDocType)
{
oXmlWriter.m_lObjectIdVML = m_pXmlWriter->m_lObjectIdVML;
oXmlWriter.m_lObjectIdOle = m_pXmlWriter->m_lObjectIdOle;
oXmlWriter.m_lDocType = (BYTE)nDocType;
oXmlWriter.m_bIsUseOffice2007 = false;
oXmlWriter.m_bIsTop = (1 == m_nCurrentIndexObject) ;
if (NULL == m_pOOXToVMLRenderer)
m_pOOXToVMLRenderer = new COOXToVMLGeometry();
oXmlWriter.m_pOOXToVMLRenderer = m_pOOXToVMLRenderer;
}
void CDrawingConverter::SaveObjectExWriterRelease(NSBinPptxRW::CXmlWriter& oXmlWriter)
{
m_pXmlWriter->m_lObjectIdVML = oXmlWriter.m_lObjectIdVML;
m_pXmlWriter->m_lObjectIdOle = oXmlWriter.m_lObjectIdOle;
}
HRESULT CDrawingConverter::SaveObjectEx(LONG lStart, LONG lLength, const std::wstring& bsMainProps, int nDocType, std::wstring & sXml)
{
m_pImageManager->m_nDocumentType = nDocType;
if (XMLWRITER_DOC_TYPE_DOCX == nDocType ||
XMLWRITER_DOC_TYPE_DOCX_GLOSSARY == nDocType) //docx
{
m_pReader->m_nDocumentType = nDocType;
return SaveObject(lStart, lLength, bsMainProps, sXml);
}
else
{
PPTX::Logic::SpTreeElem oElem;
m_pReader->Seek(lStart);
m_pReader->m_nDocumentType = nDocType;
++m_nCurrentIndexObject;
BYTE typeRec1 = m_pReader->GetUChar(); // must be 0;
LONG _e = m_pReader->GetPos() + m_pReader->GetLong() + 4;
try
{
m_pReader->Skip(5); // type record (must be 1) + 4 byte - len record
oElem.fromPPTY(m_pReader);
}
catch(...)
{
//todooo
}
bool bOle = false;
if (oElem.is())
{
PPTX::Logic::Pic& oPic = oElem.as();
if(oPic.oleObject.IsInit())
{
bOle = oPic.oleObject->isValid();
}
}
m_pReader->m_nDocumentType = XMLWRITER_DOC_TYPE_PPTX;
NSBinPptxRW::CXmlWriter oXmlWriter;
SaveObjectExWriterInit(oXmlWriter, nDocType);
if(bOle)
{
ConvertPicVML(oElem, bsMainProps, oXmlWriter);
}
else
{
oElem.toXmlWriter(&oXmlWriter);
}
--m_nCurrentIndexObject;
SaveObjectExWriterRelease(oXmlWriter);
sXml = oXmlWriter.GetXmlString();
m_pReader->Seek(_e);
}
return S_OK;
}
std::wstring CDrawingConverter::SaveObjectBackground(LONG lStart, LONG lLength)
{
if (lLength < 1) return L"";
m_pReader->Seek(lStart);
++m_nCurrentIndexObject;
BYTE typeRec1 = m_pReader->GetUChar(); // must be 0;
LONG _e = m_pReader->GetPos() + m_pReader->GetRecordSize() + 4;
PPTX::Logic::SpTreeElem oElem;
try
{
m_pReader->Skip(5); // type record (must be 1) + 4 byte - len record
oElem.fromPPTY(m_pReader);
}
catch(...)
{
//todooo
}
NSBinPptxRW::CXmlWriter oXmlWriter;
SaveObjectExWriterInit(oXmlWriter, m_pReader->m_nDocumentType);
m_pReader->m_nDocumentType = XMLWRITER_DOC_TYPE_PPTX;
if (oElem.is())
{
oXmlWriter.m_bIsTop = true; // не забыть скинуть в самом шейпе
PPTX::Logic::Shape& oShape = oElem.as();
smart_ptr rels = GetRels();
oShape.toXmlWriterVMLBackground(&oXmlWriter, *m_pTheme, *m_pClrMap, rels);
}
--m_nCurrentIndexObject;
SaveObjectExWriterRelease(oXmlWriter);
m_pReader->Seek(_e);
return oXmlWriter.GetXmlString();
}
void CDrawingConverter::ConvertPicVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter)
{
ConvertMainPropsToVML(bsMainProps, oWriter, oElem);
oWriter.m_bIsTop = true; // не забыть скинуть в самом шейпе
PPTX::Logic::Pic& oPic = oElem.as();
oPic.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap);
}
void CDrawingConverter::ConvertShapeVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter, bool bSignature)
{
ConvertMainPropsToVML(bsMainProps, oWriter, oElem);
if (oElem.is())
{
oWriter.m_bIsTop = true; // не забыть скинуть в самом шейпе
PPTX::Logic::Shape& oShape = oElem.as();
smart_ptr rels = GetRels();
oShape.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap, rels, false, bSignature);
}
}
void CDrawingConverter::ConvertGroupVML(PPTX::Logic::SpTreeElem& oElem, const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& oWriter)
{
ConvertMainPropsToVML(bsMainProps, oWriter, oElem);
if (oElem.is())
{
oWriter.m_bIsTop = true; // не забыть скинуть в самом шейпе (вместе с остальными параметрами)
PPTX::Logic::SpTree& oGroup = oElem.as();
smart_ptr rels = GetRels();
oGroup.toXmlWriterVML(&oWriter, *m_pTheme, *m_pClrMap, rels);
}
}
void CDrawingConverter::ConvertParaVML(XmlUtils::CXmlNode& node, PPTX::Logic::Paragraph *p)
{
if (!p) return;
std::wstring strStyle = node.GetAttribute(L"style");
PPTX::CCSS oCSSParser;
oCSSParser.LoadFromString2(strStyle);
//todooo oCSSParser->pPr
std::vector nodesDiv1 = node.GetNodes(L"*");
for (auto node1 : nodesDiv1)
{
if (node1.IsValid())
{
PPTX::Logic::Run* run = new PPTX::Logic::Run();
std::wstring name = node1.GetName();
if (name == L"p" || name == L"div")
{
ConvertParaVML(node1, p);
}
else if (name == L"font")
{
run->rPr = new PPTX::Logic::RunProperties();
std::wstring text = node1.GetText();
if (true == text.empty())
{
std::vector nodesDiv2 = node1.GetNodes(L"*");
for (auto node2 : nodesDiv2)
{
name = node2.GetName();
std::wstring text2 = node2.GetText();
if (name == L"b")
run->rPr->b = true;
else if (name == L"i")
run->rPr->i = true;
if (false == text2.empty())
{
text += text2;
}
std::vector nodesDiv3 = node2.GetNodes(L"*");
for (auto node3 : nodesDiv3)
{
name = node3.GetName();
if (name == L"b")
run->rPr->b = true;
else if (name == L"i")
run->rPr->i = true;
text += node3.GetText();
}
}
}
run->SetText(text);
std::vector attNames, attValues;
node1.GetAllAttributes(attNames, attValues);
if (attNames.size() > 0)
{
for (size_t r = 0; r < attNames.size(); r++)
{
if (attNames[r] == L"color" && attValues[r].length() == 7)
{
XmlUtils::replace_all(attValues[r], L"#", L"");
PPTX::Logic::SolidFill* fill = new PPTX::Logic::SolidFill();
PPTX::Logic::SrgbClr* color = new PPTX::Logic::SrgbClr();
color->SetHexString(attValues[r]);
fill->Color.Color = color;
run->rPr->Fill.Fill = fill;
run->rPr->Fill.m_type = PPTX::Logic::UniFill::solidFill;
}
else if (attNames[r] == L"size")
{
run->rPr->sz = XmlUtils::GetInteger(attValues[r]) * 5;
}
else if (attNames[r] == L"face")
{
run->rPr->latin = new PPTX::Logic::TextFont();
run->rPr->latin->typeface = attValues[r];
run->rPr->latin->m_name = L"a:latin";
}
}
}
PPTX::Logic::RunElem elm;
p->RunElems.push_back(elm);
p->RunElems.back().InitRun(run);
}
}
}
}
void CDrawingConverter::ConvertTextVML(XmlUtils::CXmlNode &nodeTextBox, PPTX::Logic::Shape* pShape)
{
if (pShape->txBody.IsInit() == false)
pShape->txBody = new PPTX::Logic::TxBody();
if (pShape->txBody.IsInit() == false) return;
std::vector nodes = nodeTextBox.GetNodes(L"*");
for (size_t i = 0 ; i < nodes.size(); i++)
{
XmlUtils::CXmlNode & node = nodes[i];
if (node.IsValid())
{
std::wstring name = node.GetName();
if (name == L"div")
{
PPTX::Logic::Paragraph p;
ConvertParaVML(node, &p);
pShape->txBody->Paragrs.push_back(p);
}
}
}
}
void CDrawingConverter::ConvertMainPropsToVML(const std::wstring& bsMainProps, NSBinPptxRW::CXmlWriter& outWriter, PPTX::Logic::SpTreeElem& oElem)
{
if (bsMainProps.empty())
return;
XmlUtils::CXmlNode oNode;
if (!oNode.FromXmlString(bsMainProps))
return;
NSBinPptxRW::CXmlWriter oWriter;
nullable_int margT; XmlMacroReadAttributeBase(oNode, L"distT", margT);
nullable_int margB; XmlMacroReadAttributeBase(oNode, L"distB", margB);
nullable_int margL; XmlMacroReadAttributeBase(oNode, L"distL", margL);
nullable_int margR; XmlMacroReadAttributeBase(oNode, L"distR", margR);
double dKoef = 72.0 / (36000 * 25.4);
if (margL.is_init())
oWriter.WriteAttributeCSS_double1_pt(L"mso-wrap-distance-left", dKoef * (*margL));
if (margT.is_init())
oWriter.WriteAttributeCSS_double1_pt(L"mso-wrap-distance-top", dKoef * (*margT));
if (margR.is_init())
oWriter.WriteAttributeCSS_double1_pt(L"mso-wrap-distance-right", dKoef * (*margR));
if (margB.is_init())
oWriter.WriteAttributeCSS_double1_pt(L"mso-wrap-distance-bottom", dKoef * (*margB));
outWriter.m_strStyleWrap = oWriter.GetXmlString();
oWriter.ClearNoAttack();
if (L"wp:inline" == oNode.GetName())
{
XmlUtils::CXmlNode oNodeS;
if (oNode.GetNode(L"wp:extent", oNodeS))
{
int _width = oNodeS.ReadAttributeInt(L"cx");
int _height = oNodeS.ReadAttributeInt(L"cy");
oWriter.WriteAttributeCSS_double1_pt(L"width", dKoef * _width);
oWriter.WriteAttributeCSS_double1_pt(L"height", dKoef * _height);
}
}
else
{
oWriter.WriteAttributeCSS(L"position", L"absolute");
nullable_bool behindDoc; XmlMacroReadAttributeBase(oNode, L"behindDoc", behindDoc);
nullable_bool allowOverlap; XmlMacroReadAttributeBase(oNode, L"allowOverlap", allowOverlap);
nullable_bool layoutInCell; XmlMacroReadAttributeBase(oNode, L"layoutInCell", layoutInCell);
XmlMacroReadAttributeBase(oNode, L"relativeHeight", outWriter.m_zIndex);
if (outWriter.m_zIndex.is_init())
{
_INT64 z_index = *outWriter.m_zIndex;
if ((behindDoc.IsInit()) && (*behindDoc == true))
{
outWriter.m_zIndex = -z_index;
}
oWriter.WriteAttributeCSS(L"z-index", std::to_wstring(*outWriter.m_zIndex));
}
if (allowOverlap.is_init())
{
oWriter.WriteAttributeCSS(L"o:allowoverlap", *allowOverlap ? L"true" : L"false");
}
if (layoutInCell.is_init())
{
oWriter.WriteAttributeCSS(L"o:allowincell", *layoutInCell ? L"true" : L"false");
}
XmlUtils::CXmlNode oNodeHorP;
if (oNode.GetNode(L"wp:positionH", oNodeHorP))
{
std::wstring strWriteRelFrom = oNodeHorP.GetAttribute(L"relativeFrom", L"column");
if (strWriteRelFrom == L"character")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"char");
else if (strWriteRelFrom == L"page")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"page");
else if (strWriteRelFrom == L"margin")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"margin");
else if (strWriteRelFrom == L"leftMargin")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"left-margin-area");
else if (strWriteRelFrom == L"rightMargin")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"right-margin-area");
else if (strWriteRelFrom == L"insideMargin")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"inner-margin-area");
else if (strWriteRelFrom == L"outsideMargin")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"outer-margin-area");
else if (strWriteRelFrom == L"column")
oWriter.WriteAttributeCSS(L"mso-position-horizontal-relative", L"text");
XmlUtils::CXmlNode oNodeO;
if (oNodeHorP.GetNode(L"wp:posOffset", oNodeO))
{
int nPos = oNodeHorP.ReadValueInt(L"wp:posOffset");
outWriter.m_dX = dKoef * nPos;
oWriter.WriteAttributeCSS_double1_pt(L"margin-left", outWriter.m_dX);
oWriter.WriteAttributeCSS(L"mso-position-horizontal", L"absolute");
}
else
{
std::wstring sA = oNodeHorP.ReadValueString(L"wp:align");
if (L"" != sA)
{
oWriter.WriteAttributeCSS(L"mso-position-horizontal", sA);
}
}
}
XmlUtils::CXmlNode oNodeVerP;
if (oNode.GetNode(L"wp:positionV", oNodeVerP))
{
std::wstring strWriteRelFrom = oNodeVerP.GetAttribute(L"relativeFrom", L"paragraph");
if (strWriteRelFrom == L"margin")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"margin");
else if (strWriteRelFrom == L"paragraph")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"text");
else if (strWriteRelFrom == L"page")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"page");
else if (strWriteRelFrom == L"topMargin")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"top-margin-area");
else if (strWriteRelFrom == L"bottomMargin")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"bottom-margin-area");
else if (strWriteRelFrom == L"insideMargin")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"inner-margin-area");
else if (strWriteRelFrom == L"outsideMargin")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"outer-margin-area");
else if (strWriteRelFrom == L"line")
oWriter.WriteAttributeCSS(L"mso-position-vertical-relative", L"line");
XmlUtils::CXmlNode oNodeO;
if (oNodeVerP.GetNode(L"wp:posOffset", oNodeO))
{
int nPos = oNodeVerP.ReadValueInt(L"wp:posOffset");
outWriter.m_dY = dKoef * nPos;
oWriter.WriteAttributeCSS_double1_pt(L"margin-top", outWriter.m_dY);
oWriter.WriteAttributeCSS(L"mso-position-vertical", L"absolute");
}
else
{
std::wstring sA = oNodeVerP.ReadValueString(L"wp:align");
if (L"" != sA)
{
oWriter.WriteAttributeCSS(L"mso-position-vertical", sA);
}
}
}
XmlUtils::CXmlNode oNodeS;
if (oNode.GetNode(L"wp:extent", oNodeS))
{
int _width = oNodeS.ReadAttributeInt(L"cx");
int _height = oNodeS.ReadAttributeInt(L"cy");
outWriter.m_dWidth = dKoef * _width;
outWriter.m_dHeight = dKoef * _height;
oWriter.WriteAttributeCSS_double1_pt(L"width", outWriter.m_dWidth);
oWriter.WriteAttributeCSS_double1_pt(L"height", outWriter.m_dHeight);
}
XmlUtils::CXmlNode oNodeWrap = oNode.ReadNode(L"");
XmlUtils::CXmlNode oNodeWrapPoints;
if (oNodeWrap.IsValid())
{
// ok
}
else
{
oNodeWrap = oNode.ReadNode(L"wp:wrapSquare");
if (oNodeWrap.IsValid())
{
outWriter.m_strNodes += L"";
}
else
{
oNodeWrap = oNode.ReadNode(L"wp:wrapTopAndBottom");
if (oNodeWrap.IsValid())
{
outWriter.m_strNodes += L"";
}
else
{
oNodeWrap = oNode.ReadNode(L"wp:wrapTight");
if (oNodeWrap.IsValid())
{
outWriter.m_strNodes += L"";
oNodeWrap.GetNode(L"wp:wrapPolygon", oNodeWrapPoints);
}
else
{
oNodeWrap = oNode.ReadNode(L"wp:wrapThrough");
if (oNodeWrap.IsValid())
{
outWriter.m_strNodes += L"";
oNodeWrap.GetNode(L"wp:wrapPolygon", oNodeWrapPoints);
}
}
}
}
}
if (oNodeWrapPoints.IsValid())
{
double dKoefX = 100000.0 / 21600;
double dKoefY = dKoefX;
if (oElem.is())
{
PPTX::Logic::SpTree& oSpTr = oElem.as();
if (oSpTr.grpSpPr.xfrm.is_init())
{
int nW = oSpTr.grpSpPr.xfrm->chExtX.get_value_or(21600);
int nH = oSpTr.grpSpPr.xfrm->chExtY.get_value_or(21600);
//dKoefX = ((double)(nW)) / 21600.0;
//dKoefY = ((double)(nH)) / 21600.0;
dKoefX = 1.0;
dKoefY = 1.0;
}
}
std::wstring strAttr = L" wrapcoords=\"";
std::vector oNodesP;
if (oNodeWrapPoints.GetNodes(L"*", oNodesP))
{
size_t nCountP = oNodesP.size();
for (size_t i = 0; i < nCountP; ++i)
{
XmlUtils::CXmlNode & oNodeT = oNodesP[i];
int nX = oNodeT.ReadAttributeInt(L"x");
int nY = oNodeT.ReadAttributeInt(L"y");
nX = (int)(dKoefX * nX + 0.5);
nY = (int)(dKoefY * nY + 0.5);
std::wstring strFP = std::to_wstring(nX) + L" " + std::to_wstring(nY);
strAttr += strFP;
if (i < (nCountP - 1))
strAttr += L" ";
}
}
strAttr += L"\"";
outWriter.m_strAttributesMain += strAttr;
}
}
XmlUtils::CXmlNode oNodeDocPr;
if (oNode.GetNode(L"wp:docPr", oNodeDocPr))
{
std::wstring strName = oNodeDocPr.GetAttribute(L"name");
if (false == strName.empty())
{
std::wstring test = XmlUtils::GetLower(strName);
if (std::wstring::npos != test.find(L"watermark"))
outWriter.m_strId = strName;
}
}
outWriter.m_strStyleMain = oWriter.GetXmlString();
}
//HRESULT CDrawingConverter::GetTxBodyBinary(const std::wstring& bsXml)
//{
// XmlUtils::CXmlNode oNode;
// if (!oNode.FromXmlString((std::wstring)bsXml))
// return S_FALSE;
//
// PPTX::Logic::TxBody oTxBody(oNode);
//
// //m_pBinaryWriter->ClearNoAttack();
// //ULONG lOldPos = m_pBinaryWriter->GetPosition();
// m_pBinaryWriter->m_pCommon->CheckFontPicker();
// //m_pBinaryWriter->m_pCommon->m_pNativePicker->Init(m_strFontDirectory);
//
// m_pBinaryWriter->WriteRecord1(0, oTxBody);
//
// //m_pBinaryWriter->SetPosition(lOldPos);
//
// //m_pBinaryWriter->ClearNoAttack();
// return S_OK;
//}
//HRESULT CDrawingConverter::GetTxBodyXml(LONG lStart, std::wstring& sXml)
//{
// m_pReader->Seek(lStart);
//
// BYTE type = m_pReader->GetUChar();
// if (0 != type)
// return S_FALSE;
//
// PPTX::Logic::TxBody oTxBody;
// oTxBody.fromPPTY(m_pReader);
//
// NSBinPptxRW::CXmlWriter oWriter;
// oTxBody.toXmlWriterExcel(&oWriter);
//
// sXml = oWriter.GetXmlString();
//
// return S_OK;
//}
HRESULT CDrawingConverter::SetFontDir(const std::wstring& bsFontDir)
{
m_strFontDirectory = bsFontDir;
return S_OK;
}
HRESULT CDrawingConverter::GetRecordBinary(LONG lRecordType, const std::wstring& sXml)
{
if (sXml.empty())
return S_FALSE;
std::wstring strXml = L"";
strXml += sXml;
strXml += L"";
XmlUtils::CXmlNode oNodeMain;
if (!oNodeMain.FromXmlString(strXml))
return S_FALSE;
std::vector oNodes;
if (!oNodeMain.GetNodes(L"*", oNodes))
return S_FALSE;
if (1 != oNodes.size())
return S_FALSE;
XmlUtils::CXmlNode & oNode = oNodes[0];
PPTX::WrapperWritingElement* pWritingElem = NULL;
switch (lRecordType)
{
case XMLWRITER_RECORD_TYPE_SPPR:
{
PPTX::Logic::SpPr* pSpPr = new PPTX::Logic::SpPr();
*pSpPr = oNode;
pWritingElem = (PPTX::WrapperWritingElement*)pSpPr;
break;
}
case XMLWRITER_RECORD_TYPE_CLRMAPOVR:
{
PPTX::Logic::ClrMap* pClrMap = new PPTX::Logic::ClrMap();
*pClrMap = oNode;
pWritingElem = (PPTX::WrapperWritingElement*)pClrMap;
break;
}
case XMLWRITER_RECORD_TYPE_TEXT_OUTLINE:
{
PPTX::Logic::Ln* pLn = new PPTX::Logic::Ln();
*pLn = oNode;
pWritingElem = (PPTX::WrapperWritingElement*)pLn;
break;
}
case XMLWRITER_RECORD_TYPE_TEXT_FILL:
{
PPTX::Logic::UniFill* pUniFill = new PPTX::Logic::UniFill();
pUniFill->GetFillFrom(oNode);
pWritingElem = (PPTX::WrapperWritingElement*)pUniFill;
break;
}
default:
break;
}
if (NULL == pWritingElem)
return S_FALSE;
//m_pBinaryWriter->ClearNoAttack();
m_pBinaryWriter->m_pCommon->CheckFontPicker();
//ULONG lOldPos = m_pBinaryWriter->GetPosition();
m_pBinaryWriter->WriteRecord1(0, *pWritingElem);
RELEASEOBJECT(pWritingElem);
//m_pBinaryWriter->SetPosition(lOldPos);
return S_OK;
}
HRESULT CDrawingConverter::GetRecordXml(LONG lStart, LONG lLength, LONG lRecType, int nDocType, std::wstring & sXml)
{
if (NULL == m_pReader)
return S_FALSE;
m_pReader->m_pRels->m_pManager->m_nDocumentType = nDocType;
m_pReader->Seek(lStart);
BYTE typeRec1 = m_pReader->GetUChar();
PPTX::WrapperWritingElement* pWritingElem = NULL;
switch (lRecType)
{
case XMLWRITER_RECORD_TYPE_SPPR:
{
pWritingElem = (PPTX::WrapperWritingElement*)(new PPTX::Logic::SpPr());
pWritingElem->fromPPTY(m_pReader);
break;
}
case XMLWRITER_RECORD_TYPE_CLRMAPOVR:
{
PPTX::Logic::ClrMap* pClrMap = new PPTX::Logic::ClrMap();
pClrMap->m_name = L"a:clrMapOvr";
pWritingElem = (PPTX::WrapperWritingElement*)(pClrMap);
pWritingElem->fromPPTY(m_pReader);
break;
}
case XMLWRITER_RECORD_TYPE_TEXT_OUTLINE:
{
PPTX::Logic::Ln* pLn = new PPTX::Logic::Ln();
pWritingElem = (PPTX::WrapperWritingElement*)(pLn);
pWritingElem->fromPPTY(m_pReader);
break;
}
case XMLWRITER_RECORD_TYPE_TEXT_FILL:
{
PPTX::Logic::UniFill* pUniFill = new PPTX::Logic::UniFill();
pWritingElem = (PPTX::WrapperWritingElement*)(pUniFill);
pWritingElem->fromPPTY(m_pReader);
break;
}
default:
break;
}
if (NULL == pWritingElem)
return S_FALSE;
NSBinPptxRW::CXmlWriter oXmlWriter;
oXmlWriter.m_lDocType = (BYTE)nDocType;
oXmlWriter.m_bIsUseOffice2007 = false;
oXmlWriter.m_bIsTop = true;
pWritingElem->toXmlWriter(&oXmlWriter);
sXml = oXmlWriter.GetXmlString();
RELEASEOBJECT(pWritingElem);
return S_OK;
}
void CDrawingConverter::SetDstContentRels()
{
m_pReader->SetDstContentRels();
}
void CDrawingConverter::SaveDstContentRels(const std::wstring& bsRelsPath)
{
m_pReader->SaveDstContentRels(bsRelsPath);
}
void CDrawingConverter::WriteRels (const std::wstring& bsType, const std::wstring& bsTarget, const std::wstring& bsTargetMode, unsigned int* lId)
{
if (NULL == lId) return;
if (NULL == m_pReader) return;
if (NULL == m_pReader->m_pRels) return;
*lId = m_pReader->m_pRels->WriteRels(bsType, bsTarget, bsTargetMode);
}
void CDrawingConverter::Registration (const std::wstring& sType, const std::wstring& oDirectory, const std::wstring& oFilename)
{
if (!m_pImageManager) return;
if (!m_pImageManager->m_pContentTypes) return;
m_pImageManager->m_pContentTypes->Registration(sType, OOX::CPath(oDirectory), OOX::CPath(oFilename));
}
HRESULT CDrawingConverter::SetFontPicker(COfficeFontPicker* pFontPicker)
{
m_pBinaryWriter->m_pCommon->CreateFontPicker(pFontPicker);
return S_OK;
}
HRESULT CDrawingConverter::SetAdditionalParam(const std::wstring& ParamName, BYTE *pArray, size_t szCount)
{
std::wstring name = ParamName;
if (name == L"xfrm_override" && pArray)
{
PPTX::Logic::Xfrm *pXfrm = (PPTX::Logic::Xfrm*)pArray;
m_oxfrm_override = new PPTX::Logic::Xfrm(*pXfrm);
}
return S_OK;
}
HRESULT CDrawingConverter::GetAdditionalParam(const std::wstring& ParamName, BYTE **pArray, size_t& szCount)
{
//std::wstring name = ParamName;
//if (name == L"SerializeImageManager")
//{
// NSBinPptxRW::CBinaryFileWriter oWriter;
// return oWriter.Serialize(m_pBinaryWriter->m_pCommon->m_pImageManager, pArray, szCount) ? S_OK : S_FALSE;
//}
//else if (name == L"SerializeImageManager2")
//{
// NSBinPptxRW::CBinaryFileWriter oWriter;
// return oWriter.Serialize(m_pImageManager, pArray, szCount) ? S_OK : S_FALSE;
//}
return S_OK;
}
OOX::CContentTypes* CDrawingConverter::GetContentTypes()
{
return m_pImageManager->m_pContentTypes;
}
void CDrawingConverter::SetRels(smart_ptr container)
{
m_pBinaryWriter->SetRels(container);
}
void CDrawingConverter::SetRels(OOX::IFileContainer *container)
{
m_pBinaryWriter->SetRels(container);
}
smart_ptr CDrawingConverter::GetRels()
{
return m_pBinaryWriter->GetRels();
}
void CDrawingConverter::SetFontManager(NSFonts::IFontManager* pFontManager)
{
if(NULL != m_pBinaryWriter && NULL != m_pBinaryWriter->m_pCommon && NULL != m_pBinaryWriter->m_pCommon->m_pMediaManager)
{
m_pBinaryWriter->m_pCommon->m_pMediaManager->SetFontManager(pFontManager);
}
}
}