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())
|
if (NULL == pObject || pObject->GetId().empty())
|
||||||
return false;
|
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;
|
m_mMarkedObjects[pObject->GetId()] = pObject;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -224,7 +224,7 @@ namespace SVG
|
|||||||
pObject = CObject::Create<CGraphicsContainer>(oReader, pFile, pParent);
|
pObject = CObject::Create<CGraphicsContainer>(oReader, pFile, pParent);
|
||||||
if (!ReadChildrens(oReader, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
|
if (!ReadChildrens(oReader, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
|
||||||
{
|
{
|
||||||
RELEASEOBJECT(pObject);
|
RELEASEINTERFACE(pObject);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -290,7 +290,7 @@ namespace SVG
|
|||||||
if (ReadChildrens(oReader, (CSymbol*)pObject, pFile))
|
if (ReadChildrens(oReader, (CSymbol*)pObject, pFile))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
RELEASEOBJECT(pObject);
|
RELEASEINTERFACE(pObject);
|
||||||
}
|
}
|
||||||
else if ("font" == sElementName)
|
else if ("font" == sElementName)
|
||||||
{
|
{
|
||||||
@ -300,11 +300,11 @@ namespace SVG
|
|||||||
if (NULL == pObject)
|
if (NULL == pObject)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((RendererObject == pObject->GetType() && AddObject((ObjectType*)pObject, pContainer)) ||
|
if ((RendererObject == pObject->GetType() && (AddObject((ObjectType*)pObject, pContainer) || pObject->Marked())) ||
|
||||||
AppliedObject == pObject->GetType())
|
AppliedObject == pObject->GetType())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
RELEASEOBJECT(pObject);
|
RELEASEINTERFACE(pObject);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -42,6 +42,18 @@ namespace SVG
|
|||||||
: m_oXmlNode(oObject.m_oXmlNode), m_oTransformation(oObject.m_oTransformation)
|
: 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)
|
void CObject::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||||
{
|
{
|
||||||
if ("class" == sName)
|
if ("class" == sName)
|
||||||
|
|||||||
@ -49,6 +49,9 @@ namespace SVG
|
|||||||
|
|
||||||
virtual ObjectType GetType() const = 0;
|
virtual ObjectType GetType() const = 0;
|
||||||
|
|
||||||
|
void Mark();
|
||||||
|
bool Marked() const;
|
||||||
|
|
||||||
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader);
|
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader);
|
||||||
|
|
||||||
void SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode = false);
|
void SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode = false);
|
||||||
@ -93,7 +96,8 @@ namespace SVG
|
|||||||
if (NULL == pSvgFile)
|
if (NULL == pSvgFile)
|
||||||
return pObject;
|
return pObject;
|
||||||
|
|
||||||
if (!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType())
|
if (DataObject != pObject->GetType() ||
|
||||||
|
(!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType()))
|
||||||
{
|
{
|
||||||
delete pObject;
|
delete pObject;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user