diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp
index 52fb291a10..fcfc62b0e3 100644
--- a/Common/3dParty/html/css/src/StyleProperties.cpp
+++ b/Common/3dParty/html/css/src/StyleProperties.cpp
@@ -702,6 +702,16 @@ namespace NSCSS
SetNone();
bResult = true;
}
+ else if (L"context-stroke" == wsNewValue)
+ {
+ Clear();
+ m_enType = ColorContextStroke;
+ }
+ else if (L"context-fill" == wsNewValue)
+ {
+ Clear();
+ m_enType = ColorContextFill;
+ }
else if (10 <= wsNewValue.length() && wsNewValue.substr(0, 3) == L"rgb")
{
size_t unEnd = wsNewValue.find(L')', 4);
diff --git a/Common/3dParty/html/css/src/StyleProperties.h b/Common/3dParty/html/css/src/StyleProperties.h
index b8a9e20d0a..91a9afb2f9 100644
--- a/Common/3dParty/html/css/src/StyleProperties.h
+++ b/Common/3dParty/html/css/src/StyleProperties.h
@@ -215,7 +215,9 @@ namespace NSCSS
ColorNone,
ColorRGB,
ColorHEX,
- ColorUrl
+ ColorUrl,
+ ColorContextStroke,
+ ColorContextFill
} ColorType;
class CColor : public CValue
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp
index 04aafda835..fdc7f15b45 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp
@@ -21,7 +21,7 @@ namespace SVG
SetFill(mAttributes, ushLevel, bHardMode);
}
- bool CCircle::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CCircle::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -37,17 +37,17 @@ namespace SVG
pRenderer->PathCommandMoveTo(dX + dR, dY);
pRenderer->PathCommandArcTo(dX - dR, dY - dR, dR * 2.0, dR * 2.0, 0, 360);
- EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject);
return true;
}
- void CCircle::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CCircle::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject))
nTypePath += c_nStroke;
- if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true))
+ if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject))
nTypePath += c_nWindingFillMode;
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h
index 5f4c2f8518..68fc95b9a4 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h
@@ -12,9 +12,9 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
TBounds GetBounds() const override;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp
index e029f8265c..f6126cd9c0 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp
@@ -51,7 +51,7 @@ namespace SVG
: CRenderedObject(oNode, pParent), m_oWindow{0, 0, dWidth, dHeight}
{}
- bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -59,9 +59,9 @@ namespace SVG
return false;
for (const CRenderedObject* pObject : m_arObjects)
- pObject->Draw(pRenderer, pFile, oMode, pOtherStyles);
+ pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject);
- EndPath(pRenderer, pFile, oOldTransform, CommandeModeDraw, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, CommandeModeDraw, pOtherStyles, pContexObject);
return true;
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h
index 3097507504..b1aed73810 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h
@@ -88,7 +88,7 @@ namespace SVG
void SetData(XmlUtils::CXmlNode& oNode);
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
TRect GetWindow() const;
TRect GetViewBox() const;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp
index 992e669a9d..ec40479098 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp
@@ -22,7 +22,7 @@ namespace SVG
SetFill(mAttributes, ushLevel, bHardMode);
}
- bool CEllipse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CEllipse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -42,17 +42,17 @@ namespace SVG
pRenderer->PathCommandMoveTo(dX + dRx, dY);
pRenderer->PathCommandArcTo(dX - dRx, dY - dRy, dRx * 2.0, dRy * 2.0, 0, 360);
- EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject);
return true;
}
- void CEllipse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CEllipse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject))
nTypePath += c_nStroke;
- if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true))
+ if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject))
nTypePath += c_nWindingFillMode;
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h
index 86f543fee8..a6f01a97cd 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h
@@ -13,9 +13,9 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
TBounds GetBounds() const override;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp
index 276a106b15..2b9b20ff2b 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp
@@ -52,7 +52,7 @@ namespace SVG
return false;
}
- bool CFont::Draw(const std::wstring &wsText, double dX, double dY, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles) const
+ bool CFont::Draw(const std::wstring &wsText, double dX, double dY, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer)
return false;
@@ -78,12 +78,12 @@ namespace SVG
if (NULL == m_pMissingGlyph)
continue;
- m_pMissingGlyph->Draw(pRenderer, pFile, oMode, pStyles);
+ m_pMissingGlyph->Draw(pRenderer, pFile, oMode, pStyles, pContexObject);
oMatrix.Translate(m_oHorizAdvX.ToDouble(NSCSS::Pixel), 0);
}
else
{
- itFound->second->Draw(pRenderer, pFile, oMode, pStyles);
+ itFound->second->Draw(pRenderer, pFile, oMode, pStyles, pContexObject);
if (!itFound->second->m_oHorizAdvX.Empty())
oMatrix.Translate(itFound->second->m_oHorizAdvX.ToDouble(NSCSS::Pixel), 0);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h
index bb1b1627ad..397c319aa1 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h
@@ -43,7 +43,7 @@ namespace SVG
void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override;
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
- bool Draw(const std::wstring& wsText, double dX, double dY, IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const;
+ bool Draw(const std::wstring& wsText, double dX, double dY, IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
private:
void ParseGlyphs(XmlUtils::CXmlNode& oNode);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp
index 465c40afdf..3c9908fc8f 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp
@@ -19,7 +19,7 @@ namespace SVG
m_wsHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href")); // TODO:: В дальнейшем возможно стоит реализовать отдельный класс CHref для всех типов ссылок
}
- bool CImage::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CImage::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -114,7 +114,7 @@ namespace SVG
pRenderer->PathCommandClose();
}
- EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject);
delete[] pBuffer;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h
index ab37eef19f..389ee46d0f 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h
@@ -10,7 +10,7 @@ namespace SVG
public:
CImage(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
private:
TBounds GetBounds() const override;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp
index e75d1d1396..c25329ede4 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp
@@ -27,9 +27,9 @@ namespace SVG
SetMarker(mAttributes, ushLevel, bHardMode);
}
- void CLine::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CLine::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true, pContexObject))
nTypePath += c_nStroke;
}
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h
index eb511e771e..a7b6678cd7 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h
@@ -12,7 +12,7 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
};
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp
index 548aa4a636..ded6a0c9a5 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp
@@ -6,7 +6,7 @@
namespace SVG
{
CMarker::CMarker(XmlUtils::CXmlNode &oNode)
- : CObject(oNode), m_oBounds{0., 0., 0., 0.}, m_pImage(NULL)
+ : CObject(oNode), m_oBounds{0., 0., 0., 0.}
{
m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"refX"));
m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"refY"));
@@ -30,16 +30,6 @@ namespace SVG
}
}
-// if (m_oWindow.m_oWidth.Empty() && !m_oViewBox.m_oWidth.Empty())
-// m_oWindow.m_oWidth = m_oViewBox.m_oWidth;
-// else if (!m_oWindow.m_oWidth.Empty() && m_oViewBox.m_oWidth.Empty())
-// m_oViewBox.m_oWidth = m_oWindow.m_oWidth;
-
-// if (m_oWindow.m_oHeight.Empty() && !m_oViewBox.m_oHeight.Empty())
-// m_oWindow.m_oHeight = m_oViewBox.m_oHeight;
-// else if (!m_oWindow.m_oHeight.Empty() && m_oViewBox.m_oHeight.Empty())
-// m_oViewBox.m_oHeight = m_oWindow.m_oHeight;
-
const std::wstring& wsUnits = oNode.GetAttribute(L"markerUnits");
if (L"userSpaceOnUse" == wsUnits)
@@ -50,8 +40,6 @@ namespace SVG
CMarker::~CMarker()
{
- if (NULL != m_pImage)
- delete m_pImage;
}
ObjectType CMarker::GetType() const
@@ -62,89 +50,33 @@ namespace SVG
void CMarker::SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode)
{}
- void CMarker::Update(const CSvgFile *pFile)
+ void CMarker::Draw(IRenderer *pRenderer, const CSvgFile* pFile, const std::vector &arPoints, double dStrokeWidth, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const
{
- if (NULL != m_pImage || (!m_oWindow.m_oWidth.Empty() && m_oWindow.m_oWidth.Zero()) || (!m_oWindow.m_oHeight.Empty() && m_oWindow.m_oHeight.Zero()) ||
- (!m_oViewBox.m_oWidth.Empty() && m_oViewBox.m_oWidth.Zero()) || (!m_oViewBox.m_oHeight.Empty() && m_oViewBox.m_oHeight.Zero()))
+ if (arPoints.empty() || Equals(0., dStrokeWidth) || m_arObjects.empty())
return;
- TBounds oTempBounds;
+ const double dMaxScale = ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel)));
- for (const CRenderedObject* pObject : m_arObjects)
- {
- oTempBounds = pObject->GetBounds();
- m_oBounds.m_dLeft = std::min(m_oBounds.m_dLeft, oTempBounds.m_dLeft);
- m_oBounds.m_dTop = std::min(m_oBounds.m_dTop, oTempBounds.m_dTop);
- m_oBounds.m_dRight = std::max(m_oBounds.m_dRight, oTempBounds.m_dRight);
- m_oBounds.m_dBottom = std::max(m_oBounds.m_dBottom, oTempBounds.m_dBottom);
- }
+ double dM11, dM12, dM21, dM22, dDx, dDy;
+ pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
- NSGraphics::IGraphicsRenderer* pGrRenderer = NSGraphics::Create();
+ Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy);
- const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel)));
- const double dMMtoPx = 96. / 25.4;
- const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * dMaxScale;
- const int nWidth = dWidth * dMMtoPx;
+ const double dSkipX = m_oWindow.m_oX.ToDouble(NSCSS::Pixel) * dMaxScale;
+ const double dSkipY = m_oWindow.m_oY.ToDouble(NSCSS::Pixel) * dMaxScale;
- if (0 == nWidth)
- return;
-
- BYTE* pBgraData = new(std::nothrow) BYTE[nWidth * nWidth * 4];
-
- if (!pBgraData)
- return;
-
- unsigned int alfa = 0xffffff;
- //дефолтный тон должен быть прозрачным, а не белым
- //memset(pBgraData, 0xff, nWidth * nHeight * 4);
- for (int i = 0; i < nWidth * nWidth; i++)
- ((unsigned int*)pBgraData)[i] = alfa;
-
- CBgraFrame oFrame;
- oFrame.put_Data(pBgraData);
- oFrame.put_Width(nWidth);
- oFrame.put_Height(nWidth);
- oFrame.put_Stride(-4 * nWidth);
-
- pGrRenderer->CreateFromBgraFrame(&oFrame);
- pGrRenderer->put_Width (dWidth);
- pGrRenderer->put_Height(dWidth);
-
- pGrRenderer->SetTransform(dMaxScale, 0, 0, dMaxScale, 0, 0);
- pGrRenderer->SetCoordTransformOffset(-((m_oBounds.m_dLeft) * dMaxScale * dMMtoPx), -(m_oBounds.m_dTop * dMaxScale * dMMtoPx));
-
- pGrRenderer->SetSwapRGB(false);
- pGrRenderer->BeginCommand(c_nImageType);
-
- for (const CRenderedObject* pObject : m_arObjects)
- pObject->Draw(pGrRenderer, pFile);
-
- pGrRenderer->EndCommand(c_nImageType);
- RELEASEINTERFACE(pGrRenderer);
-
- oFrame.put_Data(NULL);
-
- m_pImage = new Aggplus::CImage;
- m_pImage->Create(pBgraData, oFrame.get_Width(), oFrame.get_Height(), oFrame.get_Stride());
- }
-
- void CMarker::Draw(IRenderer *pRenderer, const std::vector &arPoints, double dStrokeWidth) const
- {
- if (NULL == m_pImage || arPoints.empty() || Equals(0., dStrokeWidth))
- return;
-
- const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel)));
- const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * dMaxScale;
-
- const double dSkipX = m_oBounds.m_dLeft * dStrokeWidth * dMaxScale;
- const double dSkipY = m_oBounds.m_dTop * dStrokeWidth * dMaxScale;
+ oTransform.Translate(-dSkipX, -dSkipY);
for (Point oPoint : arPoints)
{
- oPoint.dX += dSkipX;
- oPoint.dY += dSkipY;
+ oTransform.TransformPoint(oPoint.dX, oPoint.dY);
- pRenderer->DrawImage((IGrObject*)m_pImage, oPoint.dX, oPoint.dY, dWidth, dWidth);
+ pRenderer->SetTransform(dM11 * dMaxScale, dM12, dM21, dM22 * dMaxScale, oPoint.dX, oPoint.dY);
+
+ for (const CRenderedObject* pObject : m_arObjects)
+ pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject);
}
+
+ pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy);
}
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h
index 45a1a28671..1e8c7ab782 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h
@@ -21,9 +21,7 @@ namespace SVG
void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override;
- void Update(const CSvgFile *pFile);
-
- void Draw(IRenderer* pRenderer, const std::vector& arPoints, double dStrokeWidth) const;
+ void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const std::vector& arPoints, double dStrokeWidth, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
private:
MarkerUnits m_enUnits;
@@ -31,8 +29,6 @@ namespace SVG
TRect m_oViewBox;
TBounds m_oBounds;
-
- Aggplus::CImage *m_pImage;
};
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp
index e98fec10ae..651b3f9e67 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp
@@ -139,7 +139,7 @@ namespace SVG
return ApplyDef(pRenderer, pFile, pMask->ToWString(), oBounds);
}
-
+
bool CObject::ApplyDef(IRenderer *pRenderer, const CSvgFile *pFile, const std::wstring &wsUrl, const TBounds &oBounds) const
{
if (NULL == pRenderer || NULL == pFile || wsUrl.empty())
@@ -238,7 +238,7 @@ namespace SVG
m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter;
m_oStyles.m_oStroke.m_oMiterlimit = 4.;
-
+
m_oTransformation.m_oOpacity = 1.;
m_oTransformation.m_bDraw = true;
}
@@ -304,7 +304,7 @@ namespace SVG
return true;
}
- void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles) const
+ void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContextObject) const
{
if (CommandeModeClip == oMode)
{
@@ -320,12 +320,12 @@ namespace SVG
int nPathType = 0;
if (NULL == pOtherStyles)
- ApplyStyle(pRenderer, &m_oStyles, pFile, nPathType);
+ ApplyStyle(pRenderer, &m_oStyles, pFile, nPathType, pContextObject);
else
{
TSvgStyles oNewStyles(m_oStyles);
oNewStyles += *pOtherStyles;
- ApplyStyle(pRenderer, &oNewStyles, pFile, nPathType);
+ ApplyStyle(pRenderer, &oNewStyles, pFile, nPathType, pContextObject);
}
pRenderer->DrawPath(nPathType);
@@ -352,10 +352,10 @@ namespace SVG
oOldTransform.tx(), oOldTransform.ty());
}
- void CRenderedObject::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CRenderedObject::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContextObject) const
{}
- bool CRenderedObject::ApplyStroke(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault) const
+ bool CRenderedObject::ApplyStroke(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault, const CRenderedObject* pContextObject) const
{
if (NULL == pRenderer || NULL == pStroke || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType() || (!bUseDefault && ((pStroke->m_oWidth.Empty() || pStroke->m_oWidth.Zero()) && pStroke->m_oColor.Empty())))
{
@@ -368,10 +368,14 @@ namespace SVG
if (Equals(0., dStrokeWidth))
dStrokeWidth = 1.;
- int nColor = (pStroke->m_oColor.Empty() || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt();
+ if (NSCSS::NSProperties::ColorType::ColorContextFill == pStroke->m_oColor.GetType() && NULL != pContextObject)
+ pRenderer->put_PenColor(pContextObject->m_oStyles.m_oFill.ToInt());
+ else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pStroke->m_oColor.GetType() && NULL != pContextObject)
+ pRenderer->put_PenColor(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt());
+ else
+ pRenderer->put_PenColor((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())
@@ -394,7 +398,7 @@ namespace SVG
return true;
}
- bool CRenderedObject::ApplyFill(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CSvgFile *pFile, bool bUseDefault) const
+ bool CRenderedObject::ApplyFill(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CSvgFile *pFile, bool bUseDefault, const CRenderedObject* pContextObject) const
{
if (NULL == pRenderer || NULL == pFill || NSCSS::NSProperties::ColorType::ColorNone == pFill->GetType() || (!bUseDefault && pFill->Empty()))
{
@@ -420,6 +424,10 @@ namespace SVG
return false;
}
}
+ else if (NSCSS::NSProperties::ColorType::ColorContextFill == pFill->GetType() && NULL != pContextObject)
+ pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oFill.ToInt());
+ else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pFill->GetType() && NULL != pContextObject)
+ pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt());
else if (bUseDefault)
{
pRenderer->put_BrushColor1(0);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h
index 7b6d3c6d57..a31aafbaf4 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h
@@ -54,10 +54,9 @@ namespace SVG
void SetMask(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false);
void SetDisplay(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false);
void SetOpacity(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false);
-
+
std::wstring GetId() const;
virtual std::vector GetFullPath() const;
-
private:
bool ApplyTransform(IRenderer* pRenderer, const SvgTransform* pTransform, Aggplus::CMatrix& oOldMatrix) const;
bool ApplyClip(IRenderer* pRenderer, const TClip* pClip, const CSvgFile *pFile, const TBounds& oBounds) const;
@@ -107,7 +106,7 @@ namespace SVG
virtual void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- virtual bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const = 0;
+ virtual bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContextObject = NULL) const = 0;
virtual TBounds GetBounds() const = 0;
@@ -119,12 +118,12 @@ namespace SVG
void SetFill(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false);
bool StartPath(IRenderer* pRenderer, const CSvgFile *pFile, Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw) const;
- void EndPath(IRenderer* pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const;
+ void EndPath(IRenderer* pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContextObject = NULL) const;
- virtual void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const;
+ virtual void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContextObject = NULL) const;
- bool ApplyStroke(IRenderer* pRenderer, const TStroke* pStroke, bool bUseDefault = false) const;
- bool ApplyFill(IRenderer* pRenderer, const SvgColor* pFill, const CSvgFile *pFile, bool bUseDefault = false) const;
+ bool ApplyStroke(IRenderer* pRenderer, const TStroke* pStroke, bool bUseDefault = false, const CRenderedObject* pContextObject = NULL) const;
+ bool ApplyFill(IRenderer* pRenderer, const SvgColor* pFill, const CSvgFile *pFile, bool bUseDefault = false, const CRenderedObject* pContextObject = NULL) const;
bool ApplyOpacity(IRenderer* pRenderer, const SvgDigit* pOpacity) const;
friend class CUse;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp
index 429ceba098..8c9bbdb845 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp
@@ -306,7 +306,7 @@ namespace SVG
else
{
dEndAngle = copysign(ceil(std::abs(dStartAngle) / 90.), dStartAngle) * ((dSweep > 0. || dStartAngle < 0.) ? 90. : -90.);
-
+
if (dStartAngle < 0. && dSweep > 0.)
dEndAngle += 90.;
}
@@ -358,8 +358,8 @@ namespace SVG
return;
pRenderer->PathCommandCurveTo(m_arPoints[0].dX, m_arPoints[0].dY,
- m_arPoints[1].dX, m_arPoints[1].dY,
- m_arPoints[2].dX, m_arPoints[2].dY);
+ m_arPoints[1].dX, m_arPoints[1].dY,
+ m_arPoints[2].dX, m_arPoints[2].dY);
}
inline double ClampSinCos(const double& d)
@@ -469,7 +469,7 @@ namespace SVG
}
}
- bool CPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -479,7 +479,7 @@ namespace SVG
for (const IPathElement* oElement : m_arElements)
oElement->Draw(pRenderer);
- EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject);
DrawMarkers(pRenderer, pFile, oMode);
@@ -494,16 +494,16 @@ namespace SVG
return m_arElements[(nIndex >= 0) ? nIndex : m_arElements.size() + nIndex];
}
- void CPath::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CPath::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject))
nTypePath += c_nStroke;
- if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true))
+ if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject))
nTypePath += (m_bEvenOddRule) ? c_nEvenOddFillMode : c_nWindingFillMode;
}
- bool CPath::DrawMarkers(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode) const
+ bool CPath::DrawMarkers(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer || NULL == pFile || m_arElements.empty() || m_oStyles.m_oStroke.m_oWidth.Zero() ||
(m_oMarkers.m_oStart.Empty() && m_oMarkers.m_oMid.Empty() && m_oMarkers.m_oEnd.Empty()))
@@ -522,8 +522,9 @@ namespace SVG
if (NULL != pStartMarker)
{
- pStartMarker->Update(pFile);
- pStartMarker->Draw(pRenderer, {(*m_arElements.front())[0]}, dStrokeWidth);
+ const IPathElement* pFirstElement{FindFirstNotEmpty()};
+ if (NULL != pFirstElement)
+ pStartMarker->Draw(pRenderer, pFile, {(*pFirstElement)[0]}, dStrokeWidth, oMode, pOtherStyles, this);
}
}
@@ -534,27 +535,25 @@ namespace SVG
std::vector arPoints(m_arElements.size() - 2);
for (unsigned int unIndex = 1; unIndex < m_arElements.size() - 1; ++unIndex)
- arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1];
+ {
+ if (EPathElement::Close != m_arElements[unIndex]->GetType())
+ arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1];
+ }
if (NULL != pMidMarker)
- {
- pMidMarker->Update(pFile);
- pMidMarker->Draw(pRenderer, arPoints, dStrokeWidth);
- }
+ pMidMarker->Draw(pRenderer, pFile, arPoints, dStrokeWidth, oMode, pOtherStyles, this);
}
if (!m_oMarkers.m_oEnd.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oEnd.GetType())
{
CMarker *pEndMarker = dynamic_cast(pFile->GetMarkedObject(m_oMarkers.m_oEnd.ToWString()));
- if (NULL != pEndMarker)
- {
- pEndMarker->Update(pFile);
- pEndMarker->Draw(pRenderer, {(*m_arElements.back())[-1]}, dStrokeWidth);
- }
+ const IPathElement* pLastElement{FindFirstNotEmpty(true)};
+ if (NULL != pLastElement)
+ pEndMarker->Draw(pRenderer, pFile, {(*pLastElement)[-1]}, dStrokeWidth, oMode, pOtherStyles, this);
}
- EndPath(pRenderer, pFile, oOldMatrix, oMode);
+ EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject);
return true;
}
@@ -569,6 +568,13 @@ namespace SVG
if (mAttributes.end() != mAttributes.find(L"marker-end"))
m_oMarkers.m_oEnd.SetValue(mAttributes.at(L"marker-end"), ushLevel, bHardMode);
+
+ if (mAttributes.end() != mAttributes.find(L"marker"))
+ {
+ m_oMarkers.m_oStart.SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode);
+ m_oMarkers.m_oMid .SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode);
+ m_oMarkers.m_oEnd .SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode);
+ }
}
TBounds CPath::GetBounds() const
@@ -588,6 +594,24 @@ namespace SVG
return oBounds;
}
+ const IPathElement* CPath::FindFirstNotEmpty(bool bReverseSearch) const
+ {
+ if (!bReverseSearch)
+ {
+ std::vector::const_iterator itFound = std::find_if(m_arElements.cbegin(), m_arElements.cend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); });
+ if (m_arElements.cend() != itFound)
+ return *itFound;
+ }
+ else
+ {
+ std::vector::const_reverse_iterator itFound = std::find_if(m_arElements.crbegin(), m_arElements.crend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); });
+ if (m_arElements.crend() != itFound)
+ return *itFound;
+ }
+
+ return NULL;
+ }
+
void CPath::ReadFromString(const std::wstring &wsValue)
{
CMoveElement *pMoveElement = NULL;
@@ -608,7 +632,7 @@ namespace SVG
}
oSecondPos = std::find_if(oFirstPos + 1, wsValue.end(), [](wchar_t wChar){return ISPATHCOMMAND(wChar);});
-
+
std::vector arValues = StrUtils::ReadDoubleValues(oFirstPos, oSecondPos);
switch(*oFirstPos)
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h
index 4e66f9425f..16939e0c3a 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h
@@ -110,17 +110,19 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
IPathElement* operator[](int nIndex) const;
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override;
- bool DrawMarkers(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw) const;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
+ bool DrawMarkers(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
void SetMarker(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode);
TBounds GetBounds() const override;
+ const IPathElement* FindFirstNotEmpty(bool bReverseSearch = false) const;
+
void ReadFromString(const std::wstring& wsValue);
bool AddElement(IPathElement* pElement);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp
index 084c69b58e..1c95355c23 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp
@@ -33,7 +33,7 @@ namespace SVG
SetFill(mAttributes, ushLevel, bHardMode);
}
- bool CRect::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CRect::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
Aggplus::CMatrix oOldTransform;
@@ -80,17 +80,17 @@ namespace SVG
pRenderer->PathCommandClose();
}
- EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject);
return true;
}
- void CRect::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CRect::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject))
nTypePath += c_nStroke;
- if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true))
+ if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject))
nTypePath += c_nWindingFillMode;
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h
index 2be5e03655..525c62ce6a 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h
@@ -14,10 +14,10 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath) const override;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
TBounds GetBounds() const override;
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp
index 51e3c868cd..58c0b59223 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp
@@ -7,11 +7,11 @@ namespace SVG
{
}
- bool CSwitch::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles) const
+ bool CSwitch::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles, const CRenderedObject* pContexObject) const
{
for (const CRenderedObject* pObject : m_arObjects)
{
- if (NULL != pObject && pObject->Draw(pRenderer, pFile, oMode, pStyles))
+ if (NULL != pObject && pObject->Draw(pRenderer, pFile, oMode, pStyles, pContexObject))
return true;
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h
index ddde16083d..d15cf21732 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h
@@ -10,7 +10,7 @@ namespace SVG
public:
CSwitch(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
- bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
TBounds GetBounds() const override;
};
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp
index c030c3aa4c..2bc5a07ce4 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp
@@ -6,7 +6,7 @@ namespace SVG
: CGraphicsContainer(oNode)
{}
- bool CSymbol::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CSymbol::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer)
return false;
@@ -31,7 +31,7 @@ namespace SVG
pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty());
- CGraphicsContainer::Draw(pRenderer, pFile, oMode, pOtherStyles);
+ CGraphicsContainer::Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject);
pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h
index 7efe2b10fe..7ba0c3a8b1 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h
@@ -11,7 +11,7 @@ namespace SVG
public:
CSymbol(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager *pFontManager = NULL);
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
};
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp
index 7bc95654f9..ac93bd0e6c 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp
@@ -144,7 +144,7 @@ namespace SVG
}
}
- bool CTSpan::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CTSpan::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer || (m_wsText.empty() && m_arObjects.empty()))
return false;
@@ -166,10 +166,10 @@ namespace SVG
}
for (const CTSpan* pTSpan : m_arObjects)
- pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles);
+ pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject);
}
- EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles);
+ EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject);
return true;
}
@@ -195,12 +195,12 @@ namespace SVG
}
}
- void CTSpan::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const
+ void CTSpan::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const
{
- if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true))
+ if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true, pContexObject))
nTypePath += c_nStroke;
- if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true))
+ if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject))
nTypePath += c_nWindingFillMode;
}
@@ -303,7 +303,7 @@ namespace SVG
pRenderer->put_BrushAlpha1(255);
}
- bool CTSpan::UseExternalFont(const CSvgFile *pFile, double dX, double dY, IRenderer *pRenderer, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CTSpan::UseExternalFont(const CSvgFile *pFile, double dX, double dY, IRenderer *pRenderer, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
std::wstring wsFontFamily = DefaultFontFamily;
@@ -318,7 +318,7 @@ namespace SVG
if (NULL == pFont)
return false;
- pFont->Draw(m_wsText, dX, dY, pRenderer, pFile, oMode, pOtherStyles);
+ pFont->Draw(m_wsText, dX, dY, pRenderer, pFile, oMode, pOtherStyles, pContexObject);
return true;
}
@@ -496,12 +496,12 @@ namespace SVG
return new CText(oNode, pParent, pFontManager);
}
- bool CText::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CText::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer || NULL == pRenderer)
return false;
- CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles);
+ CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject);
return true;
}
@@ -529,7 +529,7 @@ namespace SVG
}
}
- bool CTextPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const
+ bool CTextPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer || CommandeModeClip == oMode || NULL == m_pPath)
return false;
@@ -539,7 +539,7 @@ namespace SVG
oMovingPath.Move(m_oX.ToDouble(NSCSS::Pixel));
for (CTSpan& oTSpan : Split())
- DrawGlyph(&oTSpan, oMovingPath, pRenderer, pFile, oMode);
+ DrawGlyph(&oTSpan, oMovingPath, pRenderer, pFile, oMode, pContexObject);
for (const CTSpan* pTSpan : m_arObjects)
{
@@ -549,7 +549,7 @@ namespace SVG
oMovingPath.Move(pTSpan->m_oX.ToDouble(NSCSS::Pixel));
}
for (CTSpan& oGlyphs : pTSpan->Split())
- DrawGlyph(&oGlyphs, oMovingPath, pRenderer, pFile, oMode);
+ DrawGlyph(&oGlyphs, oMovingPath, pRenderer, pFile, oMode, pContexObject);
}
return true;
@@ -566,7 +566,7 @@ namespace SVG
return new CTextPath(oNode, pTSpan, pFontManager, pFile);
}
- void CTextPath::DrawGlyph(CTSpan* pTSpan, CMovingPath &oMovingPath, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode) const
+ void CTextPath::DrawGlyph(CTSpan* pTSpan, CMovingPath &oMovingPath, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const CRenderedObject* pContexObject) const
{
if (NULL == pTSpan)
return;
@@ -583,7 +583,7 @@ namespace SVG
pTSpan->SetPosition(oPoint);
pTSpan->SetTransform({std::make_pair(L"transform", L"rotate(" + std::to_wstring(dAngle) + L',' + std::to_wstring(oPoint.dX) + L',' + std::to_wstring(oPoint.dY) + L')')}, 0, true);
- pTSpan->Draw(pRenderer, pFile, oMode);
+ pTSpan->Draw(pRenderer, pFile, oMode, NULL, pContexObject);
oMovingPath.Move(dWidthSpan / 2);
}
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h
index 4cc61f1559..5eb30892d6 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h
@@ -22,16 +22,16 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
bool AddObject(CTSpan* pObject) override;
void InheritStyles(const CTSpan* pTSpan);
private:
- void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath) const override;
+ void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
void ApplyFont(IRenderer* pRenderer, double& dX, double& dY) const;
- bool UseExternalFont(const CSvgFile* pFile, double dX, double dY, IRenderer* pRenderer, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const;
+ bool UseExternalFont(const CSvgFile* pFile, double dX, double dY, IRenderer* pRenderer, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
TBounds GetBounds() const override;
@@ -66,7 +66,7 @@ namespace SVG
static CText* Create(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL);
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
};
class CTextPath : public CText
@@ -74,11 +74,11 @@ namespace SVG
public:
CTextPath(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL);
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
static CTextPath* Create(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL);
private:
- void DrawGlyph(CTSpan* pTSpan, CMovingPath& oMovingPath, IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode) const;
+ void DrawGlyph(CTSpan* pTSpan, CMovingPath& oMovingPath, IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode, const CRenderedObject* pContexObject = NULL) const;
const CPath *m_pPath;
};
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp
index a92dbb14aa..a2ae8aa6aa 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp
@@ -25,7 +25,7 @@ namespace SVG
SetFill(mAttributes, ushLevel, bHardMode);
}
- bool CUse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles) const
+ bool CUse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const
{
if (NULL == pRenderer || !m_oTransformation.m_bDraw)
return false;
@@ -51,10 +51,10 @@ namespace SVG
{
TSvgStyles oNewStyles(m_oStyles);
oNewStyles += *pOtherStyles;
- pFoundObj->Draw(pRenderer, pFile, oMode, &oNewStyles);
+ pFoundObj->Draw(pRenderer, pFile, oMode, &oNewStyles, this);
}
else
- pFoundObj->Draw(pRenderer, pFile, oMode, &m_oStyles);
+ pFoundObj->Draw(pRenderer, pFile, oMode, &m_oStyles, this);
}
EndPath(pRenderer, pFile, oOldTransform);
diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h
index f4c5f24ae5..fcbfa02970 100644
--- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h
+++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h
@@ -14,7 +14,7 @@ namespace SVG
void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
- bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override;
+ bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
private:
TBounds GetBounds() const override;