diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 7fb19165b0..f294b0eccb 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -838,6 +838,9 @@ namespace NSCSS } case TransformTranslate: { + if (0. == oMatrix.tx() && 0. == oMatrix.ty()) + return std::wstring(); + wsValue = L"translate("; wsValue += std::to_wstring(oMatrix.tx()) + L','; wsValue += std::to_wstring(oMatrix.ty()) + L')'; @@ -845,6 +848,9 @@ namespace NSCSS } case TransformScale: { + if (1. == oMatrix.sx() && 1. == oMatrix.sy()) + return std::wstring(); + wsValue = L"scale("; wsValue += std::to_wstring(oMatrix.sx()) + L','; wsValue += std::to_wstring(oMatrix.sy()) + L')'; diff --git a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp index 1fef012539..2d4551418d 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp @@ -85,16 +85,22 @@ void CSvgFile::AddDefs(XmlUtils::CXmlNode &oNode) const SVG::CSvgGraphicsObject *CSvgFile::GetMarkedObject(const std::wstring &wsId) const { - std::wstring wsLowerId = wsId; + if (wsId.empty() || m_mMarkedObjects.empty()) + return NULL; - std::transform(wsLowerId.begin(), wsLowerId.end(), wsLowerId.begin(), std::towlower); + std::wstring wsNewId = wsId; - MarkedMap::const_iterator oFound = m_mMarkedObjects.find(wsLowerId); + size_t unFound = wsNewId.find(L'#'); - if (oFound != m_mMarkedObjects.end()) - return oFound->second; + if (std::wstring::npos != unFound) + wsNewId.erase(0, unFound + 1); - return NULL; + MarkedMap::const_iterator oFound = std::find_if(m_mMarkedObjects.begin(), m_mMarkedObjects.end(), [&wsNewId](std::pair oPair){ if (wsNewId == oPair.second->GetId()) return true; else return false;}); + + if (m_mMarkedObjects.end() != oFound) + return oFound->second; + + return NULL; } bool CSvgFile::Draw(IRenderer *pRenderer, double dX, double dY, double dWidth, double dHeight) @@ -176,3 +182,8 @@ bool CSvgFile::Draw(IRenderer *pRenderer, double dX, double dY, double dWidth, d return bResult; } + +SVG::CDefs *CSvgFile::GetDefs() +{ + return &m_oDefs; +} diff --git a/DesktopEditor/raster/Metafile/svg/CSvgFile.h b/DesktopEditor/raster/Metafile/svg/CSvgFile.h index b9176b17cf..7c20bffb89 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgFile.h +++ b/DesktopEditor/raster/Metafile/svg/CSvgFile.h @@ -33,6 +33,8 @@ class GRAPHICS_DECL CSvgFile const SVG::CSvgGraphicsObject* GetMarkedObject(const std::wstring& wsId) const; bool Draw(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight); + + SVG::CDefs *GetDefs(); private: SVG::CSvgParser m_oParser; diff --git a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp index a387709117..a8a548b397 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp @@ -67,8 +67,7 @@ namespace SVG // а лишь потом запускать само чтение) // либо использовать SvgCalculator при отрисовке, а не при чтении // (но тогда скорость самой отрисовки падает) - ScanStyles(oXml, pFile); - ScanDefs (oXml, pFile); + ScanOther(oXml, pFile); return LoadFromXmlNode(oXml, pContainer, pFile); } @@ -103,16 +102,10 @@ namespace SVG { CGraphicsContainer *pNewContainer = new CGraphicsContainer(oElement, pParent); - if (NULL == pNewContainer) + if (!AddObject(pNewContainer, pContainer, pFile)) return false; - if (LoadFromXmlNode(oElement, pNewContainer, pFile)) - { - pContainer->AddObject(pNewContainer); - return true; - } - else - return false; + return ReadChildrens(oElement, pNewContainer, pFile, pNewContainer); } else if (L"line" == wsElementName) pObject = new CLine(oElement, pParent); @@ -128,7 +121,7 @@ namespace SVG { CTextPath *pTextPath = CTextPath::Create(oElement, pParent, m_pFontManager, pFile); - if (!AddObject(pTextPath, pContainer, pFile)) + if (!AddObject(pTextPath, pContainer, pFile)) return false; return ReadChildrens(oElement, pTextPath, pFile, pTextPath); @@ -137,7 +130,7 @@ namespace SVG { CText *pText = CText::Create(oElement, pParent, m_pFontManager); - if (!AddObject(pText, pContainer, pFile)) + if (!AddObject(pText, pContainer, pFile)) return false; return ReadChildrens(oElement, pText, pFile, pText); @@ -146,7 +139,7 @@ namespace SVG { CTSpan *pTSpan = CTSpan::Create(oElement, pParent, m_pFontManager); - if (!AddObject(pTSpan, pContainer, pFile)) + if (!AddObject(pTSpan, pContainer, pFile)) return false; return ReadChildrens(oElement, pTSpan, pFile, pTSpan); @@ -171,7 +164,12 @@ namespace SVG std::wstring wsElementName = oElement.GetName(); if (L"defs" == wsElementName) - return ReadChildrens(oElement, pDefs, pFile); + return ReadChildrens(oElement, (CGraphicsContainer*)pDefs, pFile); + else if (L"style" == wsElementName) + { + pFile->AddStyles(oElement.GetText()); + return true; + } CDefObject* pDefObject = NULL; @@ -189,56 +187,48 @@ namespace SVG return AddObject(pDefObject, pDefs, pFile); } - bool CSvgParser::ScanDefs(XmlUtils::CXmlNode &oElement, CSvgFile *pFile) const + bool CSvgParser::ScanOther(XmlUtils::CXmlNode &oElement, CSvgFile *pFile) const { if (NULL == pFile || !oElement.IsValid()) return false; - XmlUtils::CXmlNodes arChilds; + const std::wstring& wsName = oElement.GetName(); - oElement.GetChilds(arChilds); - - XmlUtils::CXmlNode oChild; - - for (unsigned int unChildrenIndex = 0; unChildrenIndex < arChilds.GetCount(); ++unChildrenIndex) + if (IsDefs(wsName)) { - if (!arChilds.GetAt(unChildrenIndex, oChild)) - break; + pFile->AddDefs(oElement); + return true; + } + else if (L"style" == wsName) + { + pFile->AddStyles(oElement.GetText()); + return true; + } + else if (L"svg" == wsName || L"g" == wsName) + { + XmlUtils::CXmlNodes arChilds; - if (L"defs" == oChild.GetName()) - pFile->AddDefs(oChild); + oElement.GetChilds(arChilds); - oChild.Clear(); + XmlUtils::CXmlNode oChild; + + for (unsigned int unChildrenIndex = 0; unChildrenIndex < arChilds.GetCount(); ++unChildrenIndex) + { + if (!arChilds.GetAt(unChildrenIndex, oChild)) + break; + + ScanOther(oChild, pFile); + + oChild.Clear(); + } } return true; } - bool CSvgParser::ScanStyles(XmlUtils::CXmlNode &oElement, CSvgFile *pFile) const + bool CSvgParser::IsDefs(const std::wstring &wsNodeName) const { - if (NULL == pFile || !oElement.IsValid()) - return false; - - XmlUtils::CXmlNodes arChilds; - - oElement.GetChilds(arChilds); - - XmlUtils::CXmlNode oChild; - - for (unsigned int unChildrenIndex = 0; unChildrenIndex < arChilds.GetCount(); ++unChildrenIndex) - { - if (!arChilds.GetAt(unChildrenIndex, oChild)) - break; - - if (L"style" == oChild.GetName()) - pFile->AddStyles(oChild.GetText()); - else if (L"defs" == oChild.GetName()) - ScanStyles(oChild, pFile); - - oChild.Clear(); - } - - return true; + return L"defs" == wsNodeName || L"pattern" == wsNodeName || L"clipPath" == wsNodeName || L"linearGradient" == wsNodeName || L"radialGradient" == wsNodeName; } template @@ -269,8 +259,8 @@ namespace SVG return true; } - template - bool CSvgParser::AddObject(TypeObject *pObject, CContainer *pContainer, CSvgFile *pFile) const + template + bool CSvgParser::AddObject(TypeObject *pObject, CContainer *pContainer, CSvgFile *pFile) const { if (NULL == pObject || NULL == pContainer) return false; diff --git a/DesktopEditor/raster/Metafile/svg/CSvgParser.h b/DesktopEditor/raster/Metafile/svg/CSvgParser.h index 5a82ebc87b..a4671acce6 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgParser.h +++ b/DesktopEditor/raster/Metafile/svg/CSvgParser.h @@ -32,13 +32,12 @@ namespace SVG template bool ReadChildrens(XmlUtils::CXmlNode& oElement, CContainer* pContainer, CSvgFile* pFile, CSvgGraphicsObject* pParent = NULL) const; - bool ScanDefs(XmlUtils::CXmlNode& oElement, CSvgFile* pFile) const; - bool ScanStyles(XmlUtils::CXmlNode& oElement, CSvgFile* pFile) const; + bool ScanOther(XmlUtils::CXmlNode& oElement, CSvgFile* pFile) const; bool IsDefs(const std::wstring& wsNodeName) const; - template - bool AddObject(TypeObject* pObject, CContainer* pContainer, CSvgFile* pFile) const; + template + bool AddObject(TypeObject* pObject, CContainer* pContainer, CSvgFile* pFile) const; template CDefObject* CreateAndReadChildrens(XmlUtils::CXmlNode &oElement, CSvgFile* pFile) const; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp index 13d38f38b5..779f3a84af 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp @@ -21,7 +21,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CCircle::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CCircle::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer) return false; @@ -37,24 +37,20 @@ namespace SVG pRenderer->PathCommandMoveTo(dX + dR, dY); pRenderer->PathCommandArcTo(dX - dR, dY - dR, dR * 2.0, dR * 2.0, 0, 360); - EndPath(pRenderer, pDefs, bIsClip); + EndPath(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } - CCircle *CCircle::Copy() const + void CCircle::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CCircle(*this); - } + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CCircle::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; + if (Apply(pRenderer, &pStyles->m_oStroke, true)) + nTypePath += c_nStroke; - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); - ApplyFill(pRenderer, pDefs, nTypePath, true); + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } TBounds CCircle::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h index 0d2d41fe88..d10193531d 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h @@ -12,11 +12,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CCircle* Copy() const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp index 97ec36adce..b75df03483 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp @@ -16,7 +16,7 @@ namespace SVG if (NULL == pRenderer || NULL == pDefs) return false; - ApplyClip(pRenderer, pDefs); + CGraphicsContainer::Apply(pRenderer, &m_oStyles.m_oClip, pDefs); for (const CSvgGraphicsObject* pGraphicsObject : m_arObjects) pGraphicsObject->Draw(pRenderer, pDefs, true); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp index f6379a906b..c247e6caaf 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp @@ -29,19 +29,19 @@ namespace SVG } CGraphicsContainer::CGraphicsContainer(double dWidth, double dHeight, XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent) - : CSvgGraphicsObject(oNode, pParent), m_oWindow{0, 0, dWidth, dHeight} + : CSvgGraphicsObject(oNode, pParent), m_oWindow{0, 0, dWidth, dHeight} {} void CGraphicsContainer::SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) {} - bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer) return false; for (const CSvgGraphicsObject* pObject : m_arObjects) - pObject->Draw(pRenderer, pDefs, bIsClip); + pObject->Draw(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } @@ -56,7 +56,7 @@ namespace SVG return m_oViewBox; } - void CGraphicsContainer::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const + void CGraphicsContainer::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const {} TBounds CGraphicsContainer::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h index 7fca9869d0..4e6dd94f0b 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h @@ -54,8 +54,6 @@ namespace SVG if (std::wstring::npos != unFound) wsNewId.erase(0, unFound + 1); - std::transform(wsNewId.begin(), wsNewId.end(), wsNewId.begin(), std::towlower); - std::vector::const_iterator oFound = std::find_if(m_arObjects.begin(), m_arObjects.end(), [&wsNewId](TypeObject* pObject){ if (wsNewId == pObject->GetId()) return true; else return false;}); if (m_arObjects.end() != oFound) @@ -81,15 +79,16 @@ namespace SVG public: CGraphicsContainer(XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL); CGraphicsContainer(double dWidth, double dHeight, XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL); + CGraphicsContainer(const CGraphicsContainer& oGraphicsContainer); void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; TRect GetWindow() const; TRect GetViewBox() const; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CDefs.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CDefs.h index 0fc3332579..10dd4f2851 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CDefs.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CDefs.h @@ -14,7 +14,6 @@ namespace SVG virtual bool Apply(IRenderer* pRenderer, const CDefs* pDefs, const TBounds &oObjectBounds); }; - class CDefs : public CContainer { public: diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp index d54771e92c..ab21aa5786 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp @@ -22,7 +22,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CEllipse::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CEllipse::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer) return false; @@ -42,24 +42,20 @@ namespace SVG pRenderer->PathCommandMoveTo(dX + dRx, dY); pRenderer->PathCommandArcTo(dX - dRx, dY - dRy, dRx * 2.0, dRy * 2.0, 0, 360); - EndPath(pRenderer, pDefs, bIsClip); + EndPath(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } - CEllipse *CEllipse::Copy() const + void CEllipse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CEllipse(*this); - } + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CEllipse::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; + if (Apply(pRenderer, &pStyles->m_oStroke, true)) + nTypePath += c_nStroke; - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); - ApplyFill(pRenderer, pDefs, nTypePath); + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } TBounds CEllipse::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h index 020f938a37..b98a5cf54a 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h @@ -13,11 +13,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CEllipse* Copy() const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp index bde705703c..b2967ce667 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp @@ -24,7 +24,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CImage::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CImage::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || m_wsHref.empty() || bIsClip) return false; @@ -79,17 +79,9 @@ namespace SVG return true; } - CImage *CImage::Copy() const + void CImage::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CImage(*this); - } - - void CImage::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const - { - if (NULL == pRenderer) - return; - - ApplyTransform(pRenderer, oOldMatrix); + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); } TBounds CImage::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h index 5ea18aaa25..1ccd9af256 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h @@ -12,11 +12,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CImage* Copy() const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp index e7740f37e5..7d2d258776 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp @@ -21,7 +21,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CLine::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CLine::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer) return false; @@ -41,23 +41,17 @@ namespace SVG pRenderer->PathCommandMoveTo(dX1, dY1); pRenderer->PathCommandLineTo(dX2, dY2); - EndPath(pRenderer, pDefs, bIsClip); + EndPath(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } - CLine *CLine::Copy() const + void CLine::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CLine(*this); - } + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CLine::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; - - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); + if (Apply(pRenderer, &pStyles->m_oStroke, true)) + nTypePath += c_nStroke; } TBounds CLine::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h index 503134939b..c6ed4d85cd 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h @@ -12,11 +12,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CLine* Copy() const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp index bc15da0d5b..c11d8d7e78 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp @@ -5,70 +5,65 @@ namespace SVG { CSvgGraphicsObject::CSvgGraphicsObject(XmlUtils::CXmlNode &oNode, CSvgGraphicsObject *pParent) - : CSvgObject(oNode, pParent) + : CSvgObject(oNode, pParent) { - m_oStroke.m_oLineCap.SetMapping({std::make_pair(L"butt", Aggplus::LineCapFlat), std::make_pair(L"round", Aggplus::LineCapRound), std::make_pair(L"square", Aggplus::LineCapSquare)}); - m_oStroke.m_oLineCap = Aggplus::LineCapFlat; + m_oStyles.m_oStroke.m_oLineCap.SetMapping({std::make_pair(L"butt", Aggplus::LineCapFlat), std::make_pair(L"round", Aggplus::LineCapRound), std::make_pair(L"square", Aggplus::LineCapSquare)}); + m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineCapFlat; - m_oStroke.m_oLineJoin.SetMapping({std::make_pair(L"arcs", Aggplus::LineJoinMiter), std::make_pair(L"bevel", Aggplus::LineJoinBevel), std::make_pair(L"miter", Aggplus::LineJoinMiter), std::make_pair(L"miter-clip", Aggplus::LineJoinMiterClipped), std::make_pair(L"round", Aggplus::LineJoinRound)}); - m_oStroke.m_oLineCap = Aggplus::LineJoinMiter; + m_oStyles.m_oStroke.m_oLineJoin.SetMapping({std::make_pair(L"arcs", Aggplus::LineJoinMiter), std::make_pair(L"bevel", Aggplus::LineJoinBevel), std::make_pair(L"miter", Aggplus::LineJoinMiter), std::make_pair(L"miter-clip", Aggplus::LineJoinMiterClipped), std::make_pair(L"round", Aggplus::LineJoinRound)}); + m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter; } CSvgGraphicsObject::~CSvgGraphicsObject() {} - CSvgGraphicsObject *CSvgGraphicsObject::Copy() const - { - return NULL; - } - void CSvgGraphicsObject::SetStroke(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"stroke")) - m_oStroke.m_oColor.SetValue(mAttributes.at(L"stroke"), ushLevel, bHardMode); + m_oStyles.m_oStroke.m_oColor.SetValue(mAttributes.at(L"stroke"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"stroke-width")) - m_oStroke.m_oWidth.SetValue(mAttributes.at(L"stroke-width"), ushLevel, bHardMode); + m_oStyles.m_oStroke.m_oWidth.SetValue(mAttributes.at(L"stroke-width"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"stroke-dasharray")) - m_oStroke.m_arDash = NSCSS::NS_STATIC_FUNCTIONS::ReadDoubleValues(mAttributes.at(L"stroke-dasharray")); + m_oStyles.m_oStroke.m_arDash = NSCSS::NS_STATIC_FUNCTIONS::ReadDoubleValues(mAttributes.at(L"stroke-dasharray")); if (mAttributes.end() != mAttributes.find(L"stroke-linecap")) - m_oStroke.m_oLineCap.SetValue(mAttributes.at(L"stroke-linecap"), ushLevel, bHardMode); + m_oStyles.m_oStroke.m_oLineCap.SetValue(mAttributes.at(L"stroke-linecap"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"stroke-linejoin")) - m_oStroke.m_oLineJoin.SetValue(mAttributes.at(L"stroke-linejoin"), ushLevel, bHardMode); + m_oStyles.m_oStroke.m_oLineJoin.SetValue(mAttributes.at(L"stroke-linejoin"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"stroke-opacity")) - m_oStroke.m_oColor.SetOpacity(mAttributes.at(L"stroke-opacity"), ushLevel, bHardMode); + m_oStyles.m_oStroke.m_oColor.SetOpacity(mAttributes.at(L"stroke-opacity"), ushLevel, bHardMode); } void CSvgGraphicsObject::SetFill(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"fill")) - m_oFill.SetValue(mAttributes.at(L"fill"), ushLevel, bHardMode); + m_oStyles.m_oFill.SetValue(mAttributes.at(L"fill"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"fill-opacity")) - m_oFill.SetOpacity(mAttributes.at(L"fill-opacity"), ushLevel, bHardMode); + m_oStyles.m_oFill.SetOpacity(mAttributes.at(L"fill-opacity"), ushLevel, bHardMode); } void CSvgGraphicsObject::SetTransform(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"transform")) - m_oTransform.SetMatrix(mAttributes.at(L"transform"), ushLevel, bHardMode); + m_oStyles.m_oTransform.SetMatrix(mAttributes.at(L"transform"), ushLevel, bHardMode); } void CSvgGraphicsObject::SetClip(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"clip-path")) - m_oClip.m_oHref.SetValue(mAttributes.at(L"clip-path"), ushLevel, bHardMode); + m_oStyles.m_oClip.m_oHref.SetValue(mAttributes.at(L"clip-path"), ushLevel, bHardMode); if (mAttributes.end() != mAttributes.find(L"clip-rule")) - m_oClip.m_oRule.SetValue(mAttributes.at(L"clip-rule"), std::vector{L"nonzero", L"evenodd"}, ushLevel, bHardMode); + m_oStyles.m_oClip.m_oRule.SetValue(mAttributes.at(L"clip-rule"), std::vector{L"nonzero", L"evenodd"}, ushLevel, bHardMode); } void CSvgGraphicsObject::StartPath(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const { - ApplyClip(pRenderer, pDefs); + Apply(pRenderer, &m_oStyles.m_oClip, pDefs); (bIsClip) ? StartClipPath(pRenderer) : StartStandardPath(pRenderer); } @@ -84,16 +79,24 @@ namespace SVG pRenderer->PathCommandStart(); } - void CSvgGraphicsObject::EndPath(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + void CSvgGraphicsObject::EndPath(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles* pOtherStyles) const { - (bIsClip) ? EndClipPath(pRenderer) : EndStandardPath(pRenderer, pDefs); + (bIsClip) ? EndClipPath(pRenderer) : EndStandardPath(pRenderer, pDefs, pOtherStyles); } - void CSvgGraphicsObject::EndStandardPath(IRenderer *pRenderer, const CDefs *pDefs) const + void CSvgGraphicsObject::EndStandardPath(IRenderer *pRenderer, const CDefs *pDefs, const TSvgStyles *pOtherStyles) const { int nPathType = 0; Aggplus::CMatrix oOldMatrix(1., 0., 0., 1., 0, 0); - ApplyStyle(pRenderer, pDefs, nPathType, oOldMatrix); + + if (NULL == pOtherStyles) + ApplyStyle(pRenderer, &m_oStyles, pDefs, nPathType, oOldMatrix); + else + { + TSvgStyles oNewStyles(m_oStyles); + oNewStyles += *pOtherStyles; + ApplyStyle(pRenderer, &oNewStyles, pDefs, nPathType, oOldMatrix); + } pRenderer->DrawPath(nPathType); pRenderer->EndCommand(c_nPathType); @@ -108,119 +111,122 @@ namespace SVG pRenderer->PathCommandEnd(); } - void CSvgGraphicsObject::ApplyDefaultStroke(IRenderer *pRenderer, int &nTypePath) const + bool CSvgGraphicsObject::Apply(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault) const { - nTypePath += c_nStroke; - pRenderer->put_PenSize(1); - pRenderer->put_PenColor(0); - pRenderer->put_PenAlpha(255); - pRenderer->put_PenDashStyle(Aggplus::DashStyleSolid); - } - - void CSvgGraphicsObject::ApplyStroke(IRenderer *pRenderer, int &nTypePath, bool bUseDedault) const - { - if (!m_oStroke.m_oColor.Empty()) + if (NULL == pRenderer || NULL == pStroke || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType() || (!bUseDefault && (pStroke->m_oWidth.Zero() && pStroke->m_oColor.Empty()))) { - if (NSCSS::NSProperties::ColorType::ColorNone == m_oStroke.m_oColor.GetType()) - return; - - nTypePath += c_nStroke; - pRenderer->put_PenColor(m_oStroke.m_oColor.ToInt()); - pRenderer->put_PenAlpha(255. * m_oStroke.m_oColor.GetOpacity()); - - double dStrokeWidth = m_oStroke.m_oWidth.ToDouble(NSCSS::Pixel); - - if (0 != dStrokeWidth) - pRenderer->put_PenSize(dStrokeWidth); - - if (!m_oStroke.m_arDash.empty()) - { - pRenderer->PenDashPattern((double*)m_oStroke.m_arDash.data(), m_oStroke.m_arDash.size()); - pRenderer->put_PenDashStyle(Aggplus::DashStyleCustom); - } - else - pRenderer->put_PenDashStyle(Aggplus::DashStyleSolid); - - if (!m_oStroke.m_oLineCap.Empty()) - { - pRenderer->put_PenLineStartCap(m_oStroke.m_oLineCap.ToInt()); - pRenderer->put_PenLineEndCap(m_oStroke.m_oLineCap.ToInt()); - } - - if (!m_oStroke.m_oLineJoin.Empty()) - pRenderer->put_PenLineJoin(m_oStroke.m_oLineJoin.ToInt()); + pRenderer->put_PenSize(0); + return false; } - else if (bUseDedault) - ApplyDefaultStroke(pRenderer, nTypePath); - } - void CSvgGraphicsObject::ApplyDefaultFill(IRenderer *pRenderer, int &nTypePath) const - { - nTypePath += c_nWindingFillMode; - pRenderer->put_BrushColor1(0); - pRenderer->put_BrushAlpha1(255); - pRenderer->put_BrushType(c_BrushTypeSolid); - } + double dStrokeWidth = pStroke->m_oWidth.ToDouble(NSCSS::Pixel); - void CSvgGraphicsObject::ApplyFill(IRenderer *pRenderer, const CDefs *pDefs, int &nTypePath, bool bUseDedault) const - { - if (NSCSS::NSProperties::ColorType::ColorNone == m_oFill.GetType()) - return; - else if (NSCSS::NSProperties::ColorType::ColorHEX == m_oFill.GetType() || - NSCSS::NSProperties::ColorType::ColorRGB == m_oFill.GetType()) + if (0. == dStrokeWidth) + dStrokeWidth = 1.; + + int nColor = (pStroke->m_oColor.Empty() || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt(); + + pRenderer->put_PenSize(dStrokeWidth); + pRenderer->put_PenColor(nColor); + pRenderer->put_PenAlpha(255. * pStroke->m_oColor.GetOpacity()); + + if (!pStroke->m_arDash.empty()) { - nTypePath += c_nWindingFillMode; - pRenderer->put_BrushColor1(m_oFill.ToInt()); - pRenderer->put_BrushAlpha1(255. * m_oFill.GetOpacity()); + pRenderer->PenDashPattern((double*)pStroke->m_arDash.data(), pStroke->m_arDash.size()); + pRenderer->put_PenDashStyle(Aggplus::DashStyleCustom); + } + else + pRenderer->put_PenDashStyle(Aggplus::DashStyleSolid); + + if (!pStroke->m_oLineCap.Empty()) + { + pRenderer->put_PenLineStartCap(pStroke->m_oLineCap.ToInt()); + pRenderer->put_PenLineEndCap(pStroke->m_oLineCap.ToInt()); + } + + if (!pStroke->m_oLineJoin.Empty()) + pRenderer->put_PenLineJoin(pStroke->m_oLineJoin.ToInt()); + + return true; + } + + bool CSvgGraphicsObject::Apply(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CDefs *pDefs, bool bUseDefault) const + { + if (NULL == pRenderer || NULL == pFill || NSCSS::NSProperties::ColorType::ColorNone == pFill->GetType() || (!bUseDefault && pFill->Empty())) + { + pRenderer->put_BrushType(c_BrushTypeNoFill); + return false; + } + else if (NSCSS::NSProperties::ColorType::ColorHEX == pFill->GetType() || + NSCSS::NSProperties::ColorType::ColorRGB == pFill->GetType()) + { + pRenderer->put_BrushColor1((pFill->Empty() && bUseDefault) ? 0 : pFill->ToInt()); pRenderer->put_BrushType(c_BrushTypeSolid); } - else if (NSCSS::NSProperties::ColorType::ColorUrl == m_oFill.GetType() && NULL != pDefs) + else if (NSCSS::NSProperties::ColorType::ColorUrl == pFill->GetType()) { - if (ApplyDef(pRenderer, pDefs, m_oFill.ToWString())) + if (!ApplyDef(pRenderer, pDefs, pFill->ToWString())) { - nTypePath += c_nWindingFillMode; - pRenderer->put_BrushAlpha1(255. * m_oFill.GetOpacity()); + if (bUseDefault) + { + pRenderer->put_BrushColor1(0); + pRenderer->put_BrushType(c_BrushTypeSolid); + } + else + return false; } } - else if (bUseDedault) - ApplyDefaultFill(pRenderer, nTypePath); + else if (bUseDefault) + { + pRenderer->put_BrushColor1(0); + pRenderer->put_BrushType(c_BrushTypeSolid); + } + + pRenderer->put_BrushAlpha1(255. * pFill->GetOpacity()); + + return true; } - void CSvgGraphicsObject::ApplyClip(IRenderer *pRenderer, const CDefs *pDefs) const + bool CSvgGraphicsObject::Apply(IRenderer *pRenderer, const NSCSS::NSProperties::CTransform *pTransform, Aggplus::CMatrix& oOldMatrix) const { - if (NULL == pRenderer || NULL == pDefs) - return; + if (NULL == pRenderer || NULL == pTransform) + return false; - pRenderer->BeginCommand(c_nResetClipType); - pRenderer->EndCommand(c_nResetClipType); - - if (m_oClip.m_oRule == L"evenodd") - pRenderer->put_ClipMode(c_nClipRegionTypeEvenOdd); - else - pRenderer->put_ClipMode(c_nClipRegionTypeWinding); - - if (m_oClip.m_oHref.Empty() || NSCSS::NSProperties::ColorType::ColorUrl != m_oClip.m_oHref.GetType()) - return; - - CDefObject *pClipObject = pDefs->GetDef(m_oClip.m_oHref.ToWString()); - - if (NULL == pClipObject) - return; - - pClipObject->Apply(pRenderer, pDefs, GetBounds()); - } - - void CSvgGraphicsObject::ApplyTransform(IRenderer *pRenderer, Aggplus::CMatrix& oOldMatrix) const - { double dM11, dM12, dM21, dM22, dRx, dRy; pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dRx, &dRy); oOldMatrix.SetElements(dM11, dM12, dM21, dM22, dRx, dRy); - Aggplus::CMatrix oMatrix = m_oTransform.GetMatrix().GetFinalValue(&oOldMatrix); + Aggplus::CMatrix oMatrix = pTransform->GetMatrix().GetFinalValue(&oOldMatrix); pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty()); + + return true; + } + + bool CSvgGraphicsObject::Apply(IRenderer *pRenderer, const TSvgStyles::TSvgClip *pClip, const CDefs *pDefs) const + { + if (NULL == pRenderer || NULL == pClip || NULL == pDefs) + return false; + + pRenderer->BeginCommand(c_nResetClipType); + pRenderer->EndCommand(c_nResetClipType); + + if (pClip->m_oRule == L"evenodd") + pRenderer->put_ClipMode(c_nClipRegionTypeEvenOdd); + else + pRenderer->put_ClipMode(c_nClipRegionTypeWinding); + + if (pClip->m_oHref.Empty() || NSCSS::NSProperties::ColorType::ColorUrl != pClip->m_oHref.GetType()) + return true; + + CDefObject *pClipObject = pDefs->GetDef(pClip->m_oHref.ToWString()); + + if (NULL == pClipObject) + return false; + + return pClipObject->Apply(pRenderer, pDefs, GetBounds()); } bool CSvgGraphicsObject::ApplyDef(IRenderer *pRenderer, const CDefs *pDefs, const std::wstring &wsUrl) const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h index 7abc28047e..e35f526fe8 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h @@ -11,6 +11,46 @@ namespace SVG { class CDefs; + struct TSvgStyles + { + SvgColor m_oFill; + TStroke m_oStroke; + SvgTransform m_oTransform; + struct TSvgClip + { + SvgColor m_oHref; + SvgString m_oRule; + } m_oClip; + + TSvgStyles& operator+=(const TSvgStyles& oSvgStyles) + { + m_oTransform.SetMatrix(oSvgStyles.m_oTransform.GetMatrix().ToWString(), 0, false); + + m_oFill.SetValue(L'#' + oSvgStyles.m_oFill.ToWString(), 0, false); + m_oFill.SetOpacity(std::to_wstring(oSvgStyles.m_oFill.GetOpacity()), 0, false); + + m_oStroke.m_oColor.SetValue(L'#' + oSvgStyles.m_oStroke.m_oColor.ToWString(), 0, false); + m_oStroke.m_oWidth.SetValue(oSvgStyles.m_oStroke.m_oWidth.ToWString(), 0, false); + + if (m_oStroke.m_arDash.empty() && !oSvgStyles.m_oStroke.m_arDash.empty()) + m_oStroke.m_arDash = oSvgStyles.m_oStroke.m_arDash; + + if (m_oStroke.m_oLineCap.Empty() && !oSvgStyles.m_oStroke.m_oLineCap.Empty()) + m_oStroke.m_oLineCap = oSvgStyles.m_oStroke.m_oLineCap; + + if (m_oStroke.m_oLineJoin.Empty() && !oSvgStyles.m_oStroke.m_oLineJoin.Empty()) + m_oStroke.m_oLineJoin = oSvgStyles.m_oStroke.m_oLineJoin; + + if (m_oClip.m_oHref.Empty() && !oSvgStyles.m_oClip.m_oHref.Empty()) + m_oClip.m_oHref = oSvgStyles.m_oClip.m_oHref; + + if (m_oClip.m_oRule.Empty() && !oSvgStyles.m_oClip.m_oRule.Empty()) + m_oClip.m_oRule = oSvgStyles.m_oClip.m_oRule; + + return *this; + } + }; + template class CSvgObject { @@ -130,11 +170,9 @@ namespace SVG CSvgGraphicsObject(XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL); virtual ~CSvgGraphicsObject(); - virtual bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const = 0; + virtual bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pStyles = NULL) const = 0; virtual TBounds GetBounds() const = 0; - - virtual CSvgGraphicsObject* Copy() const; private: void SetStroke(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); void SetFill(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); @@ -144,18 +182,16 @@ namespace SVG void StartPath(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip) const; void StartStandardPath(IRenderer* pRenderer) const; void StartClipPath(IRenderer* pRenderer) const; - void EndPath(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip) const; - void EndStandardPath(IRenderer* pRenderer, const CDefs *pDefs) const; + void EndPath(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles* pOtherStyles = NULL) const; + void EndStandardPath(IRenderer* pRenderer, const CDefs *pDefs, const TSvgStyles* pOtherStyles) const; void EndClipPath(IRenderer* pRenderer) const; - virtual void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const = 0; + virtual void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const = 0; - void ApplyDefaultStroke(IRenderer* pRenderer, int& nTypePath) const; - void ApplyStroke(IRenderer* pRenderer, int& nTypePath, bool bUseDedault = false) const; - void ApplyDefaultFill(IRenderer* pRenderer, int& nTypePath) const; - void ApplyFill(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, bool bUseDedault = false) const; - void ApplyClip(IRenderer* pRenderer, const CDefs *pDefs) const; - void ApplyTransform(IRenderer* pRenderer, Aggplus::CMatrix& oOldMatrix) const; + bool Apply(IRenderer* pRenderer, const TStroke* pStroke, bool bUseDefault = false) const; + bool Apply(IRenderer* pRenderer, const SvgColor* pFill, const CDefs *pDefs, bool bUseDefault = false) const; + bool Apply(IRenderer* pRenderer, const SvgTransform* pTransform, Aggplus::CMatrix& oOldMatrix) const; + bool Apply(IRenderer* pRenderer, const TSvgStyles::TSvgClip* pClip, const CDefs *pDefs) const; bool ApplyDef(IRenderer* pRenderer, const CDefs *pDefs, const std::wstring& wsUrl) const; @@ -171,16 +207,9 @@ namespace SVG friend class CPolyline; friend class CTextPath; friend class CClipPath; + friend class CGraphicsContainer; - //Styles - SvgColor m_oFill; - TStroke m_oStroke; - SvgTransform m_oTransform; - struct - { - SvgColor m_oHref; - SvgString m_oRule; - } m_oClip; + TSvgStyles m_oStyles; }; // class CObjectBase diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp index 464db2fc70..32539544bf 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp @@ -32,7 +32,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CPath::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CPath::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || m_arElements.empty()) return false; @@ -42,22 +42,11 @@ namespace SVG for (const IPathElement* oElement : m_arElements) oElement->Draw(pRenderer); - EndPath(pRenderer, pDefs, bIsClip); + EndPath(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } - CPath *CPath::Copy() const - { - CPath* pNew = new CPath(*this); - pNew->m_arElements.clear(); - - for(const IPathElement* oElement : m_arElements) - pNew->m_arElements.push_back(oElement->Copy()); - - return pNew; - } - IPathElement *CPath::operator[](int nIndex) const { if (m_arElements.empty() || (nIndex > 0 && nIndex >= m_arElements.size()) || (nIndex < 0 && -nIndex > m_arElements.size())) @@ -66,15 +55,17 @@ namespace SVG return m_arElements[(nIndex >= 0) ? nIndex : m_arElements.size() + nIndex]; } - void CPath::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const + void CPath::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - if (NULL == pRenderer) - return; + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); - ApplyFill(pRenderer, pDefs, nTypePath, true); + if (Apply(pRenderer, &pStyles->m_oStroke)) + nTypePath += c_nStroke; + + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } + TBounds CPath::GetBounds() const { TBounds oBounds{0., 0., 0., 0.}, oTempBounds; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h index 3c1f4089da..e1b33a98fb 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h @@ -608,13 +608,11 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CPath* Copy() const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; IPathElement* operator[](int nIndex) const; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp index af74bc44f9..6f590490b4 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp @@ -16,7 +16,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CPolyline::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CPolyline::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || m_arValues.size() < 4) return false; @@ -28,19 +28,15 @@ namespace SVG return true; } - CPolyline *CPolyline::Copy() const + void CPolyline::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CPolyline(*this); - } + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CPolyline::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; + if (Apply(pRenderer, &pStyles->m_oStroke)) + nTypePath += c_nStroke; - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); - ApplyFill(pRenderer, pDefs, nTypePath, true); + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } TBounds CPolyline::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.h index ab65ca6c5c..e253f6ed4c 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.h @@ -12,11 +12,10 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; - CPolyline* Copy() const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp index b24c866088..c058f3f36b 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp @@ -25,7 +25,7 @@ namespace SVG SetClip(mAttributes, ushLevel, bHardMode); } - bool CRect::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CRect::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer) return false; @@ -77,19 +77,15 @@ namespace SVG return true; } - CRect *CRect::Copy() const + void CRect::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CRect(*this); - } + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CRect::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; + if (Apply(pRenderer, &pStyles->m_oStroke)) + nTypePath += c_nStroke; - ApplyTransform(pRenderer, oOldMatrix); - ApplyStroke(pRenderer, nTypePath); - ApplyFill(pRenderer, pDefs, nTypePath, true); + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } TBounds CRect::GetBounds() const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h index 7ec234749a..af536e2b49 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h @@ -12,11 +12,10 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; - CRect* Copy() const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index dfeb21f38c..dd659eb916 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -124,7 +124,7 @@ namespace SVG m_oText.SetDecoration(mAttributes.at(L"text-decoration"), ushLevel, bHardMode); } - bool CTSpan::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CTSpan::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || (m_wsText.empty() && m_arObjects.empty()) || bIsClip) return false; @@ -136,14 +136,22 @@ namespace SVG int nPathType = 0; Aggplus::CMatrix oOldMatrix(1., 0., 0., 1., 0, 0); - ApplyStyle(pRenderer, pDefs, nPathType, oOldMatrix); + + if (NULL != pOtherStyles) + { + TSvgStyles oNewStyles(m_oStyles); + oNewStyles += *pOtherStyles; + ApplyStyle(pRenderer, &oNewStyles, pDefs, nPathType, oOldMatrix); + } + else + ApplyStyle(pRenderer, &m_oStyles, pDefs, nPathType, oOldMatrix); ApplyFont(pRenderer, dX, dY); pRenderer->CommandDrawText(m_wsText, dX, dY, 0, 0); for (const CSvgGraphicsObject* pTSpan : m_arObjects) - pTSpan->Draw(pRenderer, pDefs, bIsClip); + pTSpan->Draw(pRenderer, pDefs, bIsClip, pOtherStyles); pRenderer->SetTransform(oOldMatrix.sx(), oOldMatrix.shy(), oOldMatrix.shx(), oOldMatrix.sy(), oOldMatrix.tx(), oOldMatrix.ty()); @@ -164,30 +172,23 @@ namespace SVG { if (NULL != pTSpan) { - m_oFill = pTSpan->m_oFill; - m_oStroke = pTSpan->m_oStroke; - m_oTransform = pTSpan->m_oTransform; - m_oClip = pTSpan->m_oClip; + m_oStyles = pTSpan->m_oStyles; m_oFont = pTSpan->m_oFont; m_oText = pTSpan->m_oText; } } - CTSpan *CTSpan::Copy() const + void CTSpan::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const { - return new CTSpan(*this); - } + Apply(pRenderer, &pStyles->m_oClip, pDefs); + Apply(pRenderer, &pStyles->m_oTransform, oOldMatrix); - void CTSpan::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const - { - if (NULL == pRenderer) - return; + if (Apply(pRenderer, &pStyles->m_oStroke, true)) + nTypePath += c_nStroke; - ApplyTransform(pRenderer, oOldMatrix); - ApplyFill(pRenderer, pDefs, nTypePath, true); - ApplyStroke(pRenderer, nTypePath, true); - ApplyClip(pRenderer, pDefs); + if (Apply(pRenderer, &pStyles->m_oFill, pDefs, true)) + nTypePath += c_nWindingFillMode; } void CTSpan::ApplyFont(IRenderer* pRenderer, double& dX, double& dY) const @@ -256,7 +257,7 @@ namespace SVG if (m_oText.Underline() || m_oText.LineThrough() || m_oText.Overline()) { pRenderer->put_PenSize((double)fUndSize); - pRenderer->put_PenColor(m_oStroke.m_oColor.ToInt()); + pRenderer->put_PenColor(m_oStyles.m_oStroke.m_oColor.ToInt()); pRenderer->put_PenLineEndCap(0); pRenderer->put_PenLineStartCap(0); @@ -288,7 +289,7 @@ namespace SVG pRenderer->put_FontStyle(nStyle); pRenderer->put_BrushType(c_BrushTypeSolid); - pRenderer->put_BrushColor1(m_oFill.ToInt()); + pRenderer->put_BrushColor1(m_oStyles.m_oFill.ToInt()); pRenderer->put_BrushAlpha1(255); } @@ -361,7 +362,7 @@ namespace SVG if (NULL == pRenderer) return; - Aggplus::CMatrix oCurrentMatrix(m_oTransform.GetMatrix().GetFinalValue(NULL, NSCSS::NSProperties::TransformRotate)); + Aggplus::CMatrix oCurrentMatrix(m_oStyles.m_oTransform.GetMatrix().GetFinalValue(NULL, NSCSS::NSProperties::TransformRotate)); double dXScale = 1., dYScale = 1.; @@ -427,15 +428,15 @@ namespace SVG return new CText(oNode, pParent, pFontManager); } - bool CText::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CText::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || NULL == pRenderer) return false; - CTSpan::Draw(pRenderer, pDefs, bIsClip); + CTSpan::Draw(pRenderer, pDefs, bIsClip, pOtherStyles); for (const CSvgGraphicsObject* pTSpan : m_arObjects) - pTSpan->Draw(pRenderer, pDefs, bIsClip); + pTSpan->Draw(pRenderer, pDefs, bIsClip, pOtherStyles); return true; } @@ -463,7 +464,7 @@ namespace SVG } } - bool CTextPath::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CTextPath::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles *pOtherStyles) const { if (NULL == pRenderer || bIsClip || NULL == m_pPath) return false; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h index 6bf93e7ba3..869d175042 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h @@ -21,16 +21,13 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; bool AddObject(CTSpan* pObject) override; void InheritStyles(const CTSpan* pTSpan); - - CTSpan* Copy() const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; - + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; void ApplyFont(IRenderer* pRenderer, double& dX, double& dY) const; TBounds GetBounds() const override; @@ -65,7 +62,7 @@ namespace SVG static CText* Create(XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL); - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; }; class CTextPath : public CText @@ -73,7 +70,7 @@ namespace SVG public: CTextPath(XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL); - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; static CTextPath* Create(XmlUtils::CXmlNode& oNode, CSvgGraphicsObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL); private: diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp index 779dbaddbe..023e7d3cf6 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp @@ -4,16 +4,9 @@ namespace SVG { CUse::CUse(XmlUtils::CXmlNode &oNode, CSvgGraphicsObject *pParent, const CSvgFile* pFile) - : CSvgGraphicsObject(oNode, pParent), m_pUsedObject(NULL) + : CSvgGraphicsObject(oNode, pParent), m_pFile(pFile) { - if (NULL != pFile) - { - std::wstring wsHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href")); - - const CSvgGraphicsObject *pFoundObj = pFile->GetMarkedObject(wsHref); - if (NULL != pFoundObj) - m_pUsedObject = pFoundObj->Copy(); - } + m_wsHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href")); m_oX .SetValue(oNode.GetAttribute(L"x")); m_oY .SetValue(oNode.GetAttribute(L"y")); @@ -22,40 +15,43 @@ namespace SVG } CUse::~CUse() - { - if (NULL != m_pUsedObject) - delete m_pUsedObject; - } + {} void CUse::SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { - if (NULL != m_pUsedObject) - m_pUsedObject->SetData(mAttributes, 0, false); + SetTransform(mAttributes, ushLevel, bHardMode); + SetStroke(mAttributes, ushLevel, bHardMode); + SetFill(mAttributes, ushLevel, bHardMode); + SetClip(mAttributes, ushLevel, bHardMode); } - bool CUse::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip) const + bool CUse::Draw(IRenderer *pRenderer, const CDefs *pDefs, bool bIsClip, const TSvgStyles* pOtherStyles) const { double dM11, dM12, dM21, dM22, dRx, dRy; pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dRx, &dRy); pRenderer->SetTransform(dM11, dM12, dM21, dM22, dRx + m_oX.ToDouble(NSCSS::Pixel) * dM11, dRy + m_oY.ToDouble(NSCSS::Pixel) * dM22); - if (NULL != m_pUsedObject) - m_pUsedObject->Draw(pRenderer, pDefs, bIsClip); + const CSvgGraphicsObject *pFoundObj = m_pFile->GetMarkedObject(m_wsHref); + if (NULL != pFoundObj) + { + if (NULL != pOtherStyles) + { + TSvgStyles oNewStyles(m_oStyles); + oNewStyles += *pOtherStyles; + pFoundObj->Draw(pRenderer, pDefs, bIsClip, &oNewStyles); + } + else + pFoundObj->Draw(pRenderer, pDefs, bIsClip, &m_oStyles); + } pRenderer->SetTransform(dM11, dM12, dM21, dM22, dRx, dRy); return true; } - CSvgGraphicsObject *CUse::Copy() const - { - return new CUse(*this); - } - - void CUse::ApplyStyle(IRenderer *pRenderer, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const - { - } + void CUse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CDefs *pDefs, int &nTypePath, Aggplus::CMatrix &oOldMatrix) const + {} TBounds CUse::GetBounds() const { diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h index 59ab809862..0174b28637 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h @@ -14,11 +14,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false) const override; - - CSvgGraphicsObject* Copy() const; + bool Draw(IRenderer* pRenderer, const CDefs *pDefs, bool bIsClip = false, const TSvgStyles* pOtherStyles = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CDefs *pDefs, int& nTypePath, Aggplus::CMatrix& oOldMatrix) const override; TBounds GetBounds() const override; @@ -28,6 +26,9 @@ namespace SVG SvgDigit m_oY; SvgDigit m_oWidth; SvgDigit m_oHeight; + + std::wstring m_wsHref; + const CSvgFile *m_pFile; }; } #endif // CUSE_H