mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Add theme writing
This commit is contained in:
@ -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
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -48,6 +48,7 @@ public:
|
||||
BaseObjectPtr clone();
|
||||
|
||||
virtual const bool loadContent(BinProcessor& proc);
|
||||
virtual const bool saveContent(BinProcessor& proc);
|
||||
|
||||
static const ElementType type = typeTHEME;
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user