mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
Fix bug #77940
This commit is contained in:
@ -68,7 +68,13 @@ bool CSvgFile::MarkObject(SVG::CObject *pObject)
|
||||
if (NULL == pObject || pObject->GetId().empty())
|
||||
return false;
|
||||
|
||||
pObject->AddRef();
|
||||
pObject->Mark();
|
||||
|
||||
const MarkedMap::const_iterator itFound = m_mMarkedObjects.find(pObject->GetId());
|
||||
|
||||
if (m_mMarkedObjects.cend() != itFound)
|
||||
RELEASEINTERFACE(m_mMarkedObjects[pObject->GetId()])
|
||||
|
||||
m_mMarkedObjects[pObject->GetId()] = pObject;
|
||||
|
||||
return true;
|
||||
|
||||
@ -224,7 +224,7 @@ namespace SVG
|
||||
pObject = CObject::Create<CGraphicsContainer>(oReader, pFile, pParent);
|
||||
if (!ReadChildrens(oReader, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
|
||||
{
|
||||
RELEASEOBJECT(pObject);
|
||||
RELEASEINTERFACE(pObject);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -290,7 +290,7 @@ namespace SVG
|
||||
if (ReadChildrens(oReader, (CSymbol*)pObject, pFile))
|
||||
return true;
|
||||
else
|
||||
RELEASEOBJECT(pObject);
|
||||
RELEASEINTERFACE(pObject);
|
||||
}
|
||||
else if ("font" == sElementName)
|
||||
{
|
||||
@ -300,11 +300,11 @@ namespace SVG
|
||||
if (NULL == pObject)
|
||||
return false;
|
||||
|
||||
if ((RendererObject == pObject->GetType() && AddObject((ObjectType*)pObject, pContainer)) ||
|
||||
if ((RendererObject == pObject->GetType() && (AddObject((ObjectType*)pObject, pContainer) || pObject->Marked())) ||
|
||||
AppliedObject == pObject->GetType())
|
||||
return true;
|
||||
|
||||
RELEASEOBJECT(pObject);
|
||||
RELEASEINTERFACE(pObject);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -42,6 +42,18 @@ namespace SVG
|
||||
: m_oXmlNode(oObject.m_oXmlNode), m_oTransformation(oObject.m_oTransformation)
|
||||
{}
|
||||
|
||||
void CObject::Mark()
|
||||
{
|
||||
this->AddRef();
|
||||
}
|
||||
|
||||
bool CObject::Marked() const
|
||||
{
|
||||
//Так как по логике кода объект может храниться только в одном контейнере и в списке маркированных элементов,
|
||||
//то хватит и такой проверки
|
||||
return 1 != m_lRef;
|
||||
}
|
||||
|
||||
void CObject::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("class" == sName)
|
||||
|
||||
@ -49,6 +49,9 @@ namespace SVG
|
||||
|
||||
virtual ObjectType GetType() const = 0;
|
||||
|
||||
void Mark();
|
||||
bool Marked() const;
|
||||
|
||||
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader);
|
||||
|
||||
void SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode = false);
|
||||
@ -93,7 +96,8 @@ namespace SVG
|
||||
if (NULL == pSvgFile)
|
||||
return pObject;
|
||||
|
||||
if (!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType())
|
||||
if (DataObject != pObject->GetType() ||
|
||||
(!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType()))
|
||||
{
|
||||
delete pObject;
|
||||
return NULL;
|
||||
|
||||
Reference in New Issue
Block a user