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