This commit is contained in:
Kirill Polyakov
2025-10-28 18:13:02 +03:00
parent 1bdff9e7fe
commit 07bedd847e
4 changed files with 28 additions and 6 deletions

View File

@ -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;

View File

@ -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;
} }

View File

@ -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)

View File

@ -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;