diff --git a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp index 093a6c8632..4099a2434f 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp @@ -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; diff --git a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp index 5953aaf328..3fe432b853 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp @@ -224,7 +224,7 @@ namespace SVG pObject = CObject::Create(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; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp index d7e673b6ef..d5ea746b17 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp @@ -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) diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h index 899effb559..3a363209c0 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h @@ -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;