From c5d85bc2b9ca787f71ae70bf4d6293ca3fbda0fb Mon Sep 17 00:00:00 2001 From: ivaz28 Date: Tue, 14 Sep 2021 16:23:34 +0300 Subject: [PATCH] Correct and rewrite roundTrip theme --- .../PPTFormatLib/PPTXWriter/Converter.cpp | 59 ++++++------------- .../Reader/PPTDocumentInfoOneUser.cpp | 46 +++++++++++---- .../Reader/PPTDocumentInfoOneUser.h | 4 ++ ASCOfficePPTXFile/Editor/Drawing/Document.h | 11 ---- ASCOfficePPTXFile/Editor/Drawing/Theme.h | 3 - 5 files changed, 56 insertions(+), 67 deletions(-) diff --git a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp index e6adb48dd1..72dd0170b2 100644 --- a/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/PPTXWriter/Converter.cpp @@ -608,9 +608,11 @@ void PPT_FORMAT::CPPTXWriter::WriteAll() void PPT_FORMAT::CPPTXWriter::WriteThemes() { int nStartLayout = 0, nIndexTheme = 0; - auto arrRT = m_pDocument->getArrRoundTripTheme(); + auto arrRT = m_pUserInfo->getRoundTripTheme(1); + auto arrRTNote = m_pUserInfo->getRoundTripTheme(2); + auto arrRTHandout = m_pUserInfo->getRoundTripTheme(3); -// if (arrRT.empty()) // - см баг 52046 + if (arrRT.empty()) // - см баг 52046 { for (size_t i = 0; i < m_pDocument->m_arThemes.size(); i++) { @@ -618,25 +620,26 @@ void PPT_FORMAT::CPPTXWriter::WriteThemes() WriteTheme(m_pDocument->m_arThemes[i], nIndexTheme, nStartLayout); m_pShapeWriter->m_pTheme = NULL; } - } -// else -// { -// WriteRoundTripThemes(arrRT, nIndexTheme, nStartLayout); -// } - WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout); - WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout); + WriteTheme(m_pDocument->m_pNotesMaster, nIndexTheme, nStartLayout); + WriteTheme(m_pDocument->m_pHandoutMaster, nIndexTheme, nStartLayout); + } + else + { + WriteRoundTripThemes(arrRT, nIndexTheme, nStartLayout); + WriteRoundTripThemes(arrRTNote, nIndexTheme, nStartLayout); + WriteRoundTripThemes(arrRTHandout, nIndexTheme, nStartLayout); + } } void CPPTXWriter::WriteRoundTripThemes(const std::vector& arrRTThemes, int& nIndexTheme, int & nStartLayout) { PPT_FORMAT::CRelsGenerator themeRels(&m_oManager); std::unordered_set writedFilesHash; - int i = 0; for (const auto* pRTT : arrRTThemes) { - if ((int)m_pDocument->m_arThemes.size() > i) - m_pShapeWriter->m_pTheme = m_pDocument->m_arThemes[i++].get(); + if ((int)m_pDocument->m_arThemes.size() >= nIndexTheme) + m_pShapeWriter->m_pTheme = m_pDocument->m_arThemes[nIndexTheme-1].get(); if (pRTT == nullptr) continue; @@ -700,35 +703,9 @@ void CPPTXWriter::WriteRoundTripThemes(const std::vectorm_arThemes[nIndexTheme-1], nIndexTheme, nStartLayout); - - // clear bytes - writedFilesHash.insert(strHash); - RELEASEOBJECT(utf8Data); - utf8DataSize = 0; - oFile.CloseFile(); - } - } - - // write themeOverride - UINT nIndexOverride = 0; - for (auto& strOverridePath : arrOverridePaths) - { - // read file bytes - NSFile::CFileBinary::ReadAllBytes(strOverridePath, &utf8Data, utf8DataSize); - - // compare hash - auto strHash = CFile::md5(utf8Data, utf8DataSize); - - // cp file with new name or write bytes - if (writedFilesHash.find(strHash) == writedFilesHash.end()) - { - std::wstring strThemeFile = L"themeOverride" + std::to_wstring(++nIndexOverride) + L".xml"; - strThemeFile = strPptDirectory + _T("theme") + FILE_SEPARATOR_STR + strThemeFile; - NSFile::CFileBinary oFile; - oFile.CreateFileW(strThemeFile); - oFile.WriteFile(utf8Data, utf8DataSize); - wasThemeWrite = true; + // need to rewrite layout. To add roundTripCompositeMasterId12Atom + if (nIndexTheme < (int)m_pDocument->m_arThemes.size()) + WriteLayoutAfterTheme(m_pDocument->m_arThemes[nIndexTheme-1], nIndexTheme, nStartLayout); // clear bytes writedFilesHash.insert(strHash); diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp index 810df439d8..48193b15c6 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.cpp @@ -1141,6 +1141,40 @@ void CPPTUserInfo::LoadGroupShapeContainer(CRecordGroupShapeContainer* pGroupCon m_current_elements = m_current_elements->front()->m_pParentElements; } } + +std::vector CPPTUserInfo::getRoundTripTheme(int type) const +{ + std::vector arrRTTheme; + switch (type) + { + case 1: + for (const auto& slideIter : m_mapMasters) + { + auto* slideContainer = slideIter.second; + if (!slideContainer) continue; + slideContainer->GetRecordsByType(&arrRTTheme, false); + } + break; + case 2: + for (const auto& slideIter : m_mapNotesMasters) + { + auto* slideContainer = slideIter.second; + if (!slideContainer) continue; + slideContainer->GetRecordsByType(&arrRTTheme, false); + } + break; + case 3: + for (const auto& slideIter : m_mapHandoutMasters) + { + auto* slideContainer = slideIter.second; + if (!slideContainer) continue; + slideContainer->GetRecordsByType(&arrRTTheme, false); + } + break; + } + return arrRTTheme; +} + CElementPtr CPPTUserInfo::AddLayoutSlidePlaceholder (CSlide *pSlide, int placeholderType, CLayout *pLayout, bool idx_only) { CElementPtr pElement; @@ -1633,18 +1667,6 @@ void CPPTUserInfo::LoadMainMaster(_UINT32 dwMasterID) } int lLayoutID = AddNewLayout(pTheme, pMaster, false, true); - - for (auto& oMaster : m_mapMasters) - if (oMaster.second != nullptr) - oMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); -// for (auto& oNoteMaster : m_mapNotesMasters) -// if (oNoteMaster.second != nullptr) -// oNoteMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); - -// for (auto& oHandoutMaster : m_mapHandoutMasters) -// if (oHandoutMaster.second != nullptr) -// oHandoutMaster.second->GetRecordsByType(&pTheme->m_arrZipXml, false); - if (lLayoutID >= 0 && false == pTheme->m_arLayouts.empty()) { CLayout *pLayout_ = pTheme->m_arLayouts.back().get(); diff --git a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h index b7c30a1b9f..8ba1a28e83 100644 --- a/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h +++ b/ASCOfficePPTFile/PPTFormatLib/Reader/PPTDocumentInfoOneUser.h @@ -363,4 +363,8 @@ public: void LoadGroupShapeContainer(CRecordGroupShapeContainer* pGroup, std::vector* pParentElements, CTheme* pTheme, CLayout* pLayout, CSlideInfo* pThemeWrapper, CSlideInfo* pSlideWrapper, CSlide* pSlide = NULL); + + // 1 - master, 2 - note, 3 - handout + std::vector getRoundTripTheme(int type = 1)const; + std::vector getRoundTripLayout(); }; diff --git a/ASCOfficePPTXFile/Editor/Drawing/Document.h b/ASCOfficePPTXFile/Editor/Drawing/Document.h index 21e606e528..635512f13a 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Document.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Document.h @@ -150,17 +150,6 @@ public: }; } } - std::vector getArrRoundTripTheme()const - { - std::vector arrRoundTripThemes; - for (const auto& theme : m_arThemes) - { - for (auto* pRoundTripAtom : theme->m_arrZipXml) - arrRoundTripThemes.push_back(pRoundTripAtom); - } - - return arrRoundTripThemes; - } void ResetAutoText(CElementPtr pElement, vector_string const (&placeholdersReplaceString)[3]) { diff --git a/ASCOfficePPTXFile/Editor/Drawing/Theme.h b/ASCOfficePPTXFile/Editor/Drawing/Theme.h index 4e0cf044f4..a551b08cfa 100644 --- a/ASCOfficePPTXFile/Editor/Drawing/Theme.h +++ b/ASCOfficePPTXFile/Editor/Drawing/Theme.h @@ -77,8 +77,6 @@ namespace PPT_FORMAT std::vector>m_arExtraColorScheme; - std::vector m_arrZipXml; - bool m_bHasDate; bool m_bHasSlideNumber; bool m_bHasFooter; @@ -104,7 +102,6 @@ namespace PPT_FORMAT m_mapTitleLayout.clear(); m_mapGeomToLayout.clear(); m_mapPlaceholders.clear(); - m_arrZipXml.clear(); m_sThemeName = L"Default";