fix part of 59407 bug

This commit is contained in:
Ivan Morozov
2023-01-12 13:36:10 +03:00
parent 3941d51d1e
commit 05ffb10eaa
9 changed files with 131 additions and 78 deletions

View File

@ -35,44 +35,78 @@
namespace PPT
{
namespace Intermediate
{
CRecordPP10SlideBinaryTagExtension* getPP10SlideBinaryTagExtension(CRecordSlide *pSlide)
{
CRecordSlideProgTagsContainer* progTag = pSlide->m_pSlideProgTagsContainer;
return progTag ? progTag->getPP10SlideBinaryTagExtension() : nullptr;
}
std::vector<SOldAnimation> getOldSlideAnimation(CRecordSlide *pSlide)
{
std::vector<CRecordShapeContainer*> arrShapeCont;
pSlide->GetRecordsByType(&arrShapeCont, true);
std::vector<SOldAnimation> listOfRawAnimIC;
for (auto* pShapeCont : arrShapeCont)
{
std::vector<CRecordShape* > shape;
pShapeCont->GetRecordsByType(&shape, true);
std::vector<CRecordAnimationInfoContainer* > anim;
pShapeCont->GetRecordsByType(&anim, true);
SOldAnimation animIC;
if (!anim.empty() && !shape.empty())
{
animIC.shapeId = shape[0]->m_nID;
animIC.anim = anim[0];
listOfRawAnimIC.push_back(animIC);
}
}
return listOfRawAnimIC;
}
SlideAnimation ParseSlideAnimation(CRecordSlide *pSlide)
{
SlideAnimation slideAnim;
slideAnim.arrAnim_1995 = getOldSlideAnimation(pSlide);
slideAnim.pAnim_2010 = getPP10SlideBinaryTagExtension(pSlide);
return slideAnim;
}
}
namespace Intermediate
{
CRecordPP10SlideBinaryTagExtension* getPP10SlideBinaryTagExtension(CRecordSlide *pSlide)
{
CRecordSlideProgTagsContainer* progTag = pSlide->m_pSlideProgTagsContainer;
return progTag ? progTag->getPP10SlideBinaryTagExtension() : nullptr;
}
std::vector<SOldAnimation> getOldSlideAnimation(CRecordSlide *pSlide)
{
std::vector<CRecordShapeContainer*> arrShapeCont;
pSlide->GetRecordsByType(&arrShapeCont, true);
std::vector<SOldAnimation> listOfRawAnimIC;
for (auto* pShapeCont : arrShapeCont)
{
std::vector<CRecordShape* > shape;
pShapeCont->GetRecordsByType(&shape, true);
std::vector<CRecordAnimationInfoContainer* > anim;
pShapeCont->GetRecordsByType(&anim, true);
SOldAnimation animIC;
if (!anim.empty() && !shape.empty())
{
animIC.shapeId = shape[0]->m_nID;
animIC.anim = anim[0];
listOfRawAnimIC.push_back(animIC);
}
}
return listOfRawAnimIC;
}
void AddElementMetadataToSlideAnim(SlideAnimation& anim, CElementPtr element)
{
if (!element)
return;
auto id = element->m_lID;
anim.realShapesIds.insert(id);
auto type = element->m_etType;
if (type == PPT::etPicture || type == PPT::etAudio || type == PPT::etVideo)
anim.nonTextShapes.insert(id);
}
void ParseShapes(CSlide *pSlide, SlideAnimation& anim)
{
CGroupElement *pGroupElement = !pSlide->m_arElements.empty() ? dynamic_cast<CGroupElement *>(pSlide->m_arElements[0].get()) : NULL;
size_t start_index = 0;
if (pGroupElement)
{
for (size_t i = 0; i < pGroupElement->m_pChildElements.size(); ++i)
AddElementMetadataToSlideAnim(anim, pGroupElement->m_pChildElements[i]);
start_index = 1;
}
for (size_t i = start_index; i < pSlide->m_arElements.size(); ++i)
AddElementMetadataToSlideAnim(anim, pSlide->m_arElements[i]);
return;
}
SlideAnimation ParseSlideAnimation(CRecordSlide *pSlideRecord, CSlide *pCSlide)
{
SlideAnimation slideAnim;
slideAnim.arrAnim_1995 = getOldSlideAnimation(pSlideRecord);
slideAnim.pAnim_2010 = getPP10SlideBinaryTagExtension(pSlideRecord);
ParseShapes(pCSlide, slideAnim);
return slideAnim;
}
}
}