Add theme writing

This commit is contained in:
Viktor Andreev
2025-06-23 15:33:42 +06:00
parent 48ec45c1dd
commit 4b3c4242f6
6 changed files with 63 additions and 5 deletions

View File

@ -108,4 +108,23 @@ global_info->sTheme = \
}
}
void Theme::writeFields(CFRecord& record)
{
frtHeader.rt = rt_Theme;
record << frtHeader << dwThemeVersion;
if(dwThemeVersion == 0)
{
const auto maxSize = 8208;
auto loadingSize = 0;
if(nThemeDataSize < maxSize)
loadingSize = nThemeDataSize;
else
loadingSize = maxSize;
for(auto i = 0; i < loadingSize; i++)
{
record << pThemeData[i];
}
}
}
} // namespace XLS

View File

@ -48,14 +48,15 @@ public:
BaseObjectPtr clone();
void readFields(CFRecord& record);
void writeFields(CFRecord& record);
static const ElementType type = typeTheme;
//-----------------------------
_UINT32 dwThemeVersion;
_UINT32 dwThemeVersion = 0;
FrtHeader frtHeader;
_UINT32 nThemeDataSize;
_UINT32 nThemeDataSize = 0;
boost::shared_array<BYTE> pThemeData;
};

View File

@ -48,6 +48,7 @@ public:
BaseObjectPtr clone();
virtual const bool loadContent(BinProcessor& proc);
virtual const bool saveContent(BinProcessor& proc);
static const ElementType type = typeTHEME;

View File

@ -68,5 +68,40 @@ const bool THEME::loadContent(BinProcessor& proc)
return true;
}
const bool THEME::saveContent(BinProcessor& proc)
{
if(m_Theme == nullptr)
return false;
proc.mandatory(*m_Theme);
const auto maxSize = 8208;
auto castedPtr = static_cast<Theme*>(m_Theme.get());
if(castedPtr->nThemeDataSize > maxSize)
{
auto currentPos = maxSize;
while(currentPos+1 < castedPtr->nThemeDataSize)
{
auto fragmentSize = 0;
ContinueFrt12 continueRecord;
if(currentPos + maxSize >= castedPtr->nThemeDataSize)
{
fragmentSize = castedPtr->nThemeDataSize - currentPos;
}
else
{
fragmentSize = maxSize;
}
continueRecord.rgb.reserve(fragmentSize);
memcpy(continueRecord.rgb.data(), (castedPtr->pThemeData.get() + currentPos), fragmentSize);
proc.mandatory(continueRecord);
if(currentPos + maxSize >= castedPtr->nThemeDataSize)
{
break;
}
currentPos += maxSize;
}
}
return true;
}
} // namespace XLS

View File

@ -423,9 +423,9 @@ const bool ChartSheetSubstream::saveContent(BinProcessor& proc)
proc.mandatory(*m_PAGESETUP);
if(m_PrintSize != nullptr)
proc.mandatory(*m_PrintSize);
for(auto i : m_arRECORD12)
if(i != nullptr)
proc.mandatory(*i);
if(!m_arRECORD12.empty())
if(m_arRECORD12[0] != nullptr)
proc.mandatory(*m_arRECORD12[0]);
if(m_BACKGROUND != nullptr)
proc.mandatory(*m_BACKGROUND);
for(auto i : m_arFbi)

View File

@ -732,6 +732,8 @@ const bool GlobalsSubstream::saveContent(BinProcessor& proc)
proc.mandatory(*m_ExtSST);
else
proc.mandatory<ExtSST>();
if(m_THEME != nullptr)
proc.mandatory(*m_THEME);
proc.mandatory<EOF_T>();
return true;
}