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;