From 2e2bdcdbf188877c70cceb2b3dbfdaed83c649f3 Mon Sep 17 00:00:00 2001 From: Kirill Poljakov Date: Mon, 9 Jan 2023 13:30:39 +0300 Subject: [PATCH] Working with SVG styles and transformation --- Common/3dParty/html/css/src/ConstValues.h | 60 ++++++------------- .../raster/Metafile/svg/CSvgFile.cpp | 7 ++- .../Metafile/svg/SvgObjects/CCircle.cpp | 4 +- .../Metafile/svg/SvgObjects/CEllipse.cpp | 6 +- .../Metafile/svg/SvgObjects/CHeader.cpp | 3 +- .../raster/Metafile/svg/SvgObjects/CLine.cpp | 5 +- .../Metafile/svg/SvgObjects/CObjectBase.h | 45 ++++++++------ .../raster/Metafile/svg/SvgObjects/CPath.cpp | 4 +- .../Metafile/svg/SvgObjects/CPolyline.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CRect.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CStyle.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CStyle.h | 2 +- .../raster/Metafile/svg/SvgObjects/CText.cpp | 10 +++- 13 files changed, 75 insertions(+), 83 deletions(-) diff --git a/Common/3dParty/html/css/src/ConstValues.h b/Common/3dParty/html/css/src/ConstValues.h index f58c724dbe..2b5da7b5e3 100644 --- a/Common/3dParty/html/css/src/ConstValues.h +++ b/Common/3dParty/html/css/src/ConstValues.h @@ -8,6 +8,8 @@ #include #include +#include "../../graphics/Matrix.h" + namespace NSCSS { #ifndef RGB @@ -3194,38 +3196,34 @@ namespace NSCSS class Transform { - double m_dM11; - double m_dM12; - double m_dM21; - double m_dM22; - double m_dDx; - double m_dDy; + Aggplus::CMatrix m_oMatrix; std::vector bImportants; std::vector arLevels; void Clear() { - m_dM11 = m_dM12 = m_dM21 = m_dM22 = m_dDx = m_dDy = 0; + m_oMatrix.Reset(); } public: - Transform() : m_dM11(0), m_dM12(0), m_dM21(0), m_dM22(0), m_dDx(0), m_dDy(0), bImportants({false}), arLevels({0}) {}; + Transform() : bImportants({false}), arLevels({0}) + { + }; void ClearImportants() { bImportants = {false}; } - bool Empty() const + bool IsIdentity() const { - return (0 == m_dM11 || 0 == m_dM22); + return m_oMatrix.IsIdentity(); } bool operator==(const Transform& oTransform) const { - return m_dM11 == oTransform.m_dM11 && m_dM12 == oTransform.m_dM12 && m_dM21 == oTransform.m_dM21 && - m_dM22 == oTransform.m_dM22 && m_dDx == oTransform.m_dDx && m_dDy == oTransform.m_dDy; + return m_oMatrix.IsEqual(&m_oMatrix, &oTransform.m_oMatrix); } void SetImportantAll(const bool &bImportant) @@ -3243,8 +3241,6 @@ namespace NSCSS if (arValues.empty() || (bImportants[0] && !bHardMode)) return; - Clear(); - switch (enType) { case TransformType::TransformMatrix: @@ -3252,12 +3248,9 @@ namespace NSCSS if (6 != arValues.size()) return; - m_dM11 = arValues[0]; - m_dM12 = arValues[1]; - m_dM21 = arValues[2]; - m_dM22 = arValues[3]; - m_dDx = arValues[4]; - m_dDy = arValues[5]; + Aggplus::CMatrix oNewMatrix(arValues[0], arValues[1], arValues[2], arValues[3], arValues[4], arValues[5]); + + m_oMatrix.Multiply(&oNewMatrix); break; } @@ -3266,10 +3259,7 @@ namespace NSCSS if (2 != arValues.size()) return; - m_dDx = arValues[0]; - m_dDx = arValues[1]; - - m_dM11 = m_dM22 = 1; + m_oMatrix.Shear(arValues[0], arValues[1]); break; } @@ -3278,32 +3268,16 @@ namespace NSCSS if (2 != arValues.size()) return; - m_dM11 = arValues[0]; - m_dM22 = arValues[1]; + m_oMatrix.Scale(arValues[0], arValues[1]); break; } } - - } - void GetTransform(double& dM11, double& dM12, double& dM21, double& dM22, double& dDx, double& dDy) const + Aggplus::CMatrix GetTransform() const { - if (Empty()) - { - dM11 = dM22 = 1; - dM12 = dM21 = dDx = dDy = 0; - } - else - { - dM11 = m_dM11; - dM12 = m_dM12; - dM21 = m_dM21; - dM22 = m_dM22; - dDx = m_dDx; - dDy = m_dDy; - } + return m_oMatrix; } static TransformType GetTransformType(const std::wstring& wsValue) diff --git a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp index cb0c0431d2..2ad4040f18 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgFile.cpp @@ -67,11 +67,14 @@ bool CSvgFile::Draw(IRenderer *pRenderer, double dX, double dY, double dWidth, d double oldTransform[6]; oldTransform[0] = oldTransform[3] = 1; oldTransform[1] = oldTransform[2] = oldTransform[4] = oldTransform[5] = 0; + pRenderer->GetTransform(&oldTransform[0], &oldTransform[1], &oldTransform[2], &oldTransform[3], &oldTransform[4], &oldTransform[5]); - pRenderer->SetTransform(dWidth / dFileWidth, 0, 0, dHeight / dFileHeight, dX, dY); + m_pStorage->AddStyle(L"svg{transform:matrix(" + std::to_wstring((dWidth) / dFileWidth) + L", 0, 0, " + + std::to_wstring((dHeight) / dFileHeight) +L", " + + std::to_wstring(dX) + L", " + std::to_wstring(dY) + L")};"); - bool bResult = m_pStorage->Draw(pRenderer); + bool bResult = m_pStorage->Draw(pRenderer); pRenderer->SetTransform(oldTransform[0], oldTransform[1], oldTransform[2], oldTransform[3], oldTransform[4], oldTransform[5]); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp index f18e97e92d..64fc866732 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp @@ -53,10 +53,10 @@ namespace SVG void CCircle::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { - if (NULL == pRenderer) + if (NULL == pRenderer || NULL == m_pStyle) return; - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp index cdb763191b..17130c0e58 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp @@ -22,7 +22,7 @@ namespace SVG bool CEllipse::Draw(IRenderer *pRenderer) { - if (NULL == pRenderer ||true) + if (NULL == pRenderer) return false; int nPathType = 0; @@ -47,10 +47,10 @@ namespace SVG void CEllipse::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { - if (NULL == pRenderer) + if (NULL == pRenderer || NULL == m_pStyle) return; - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CHeader.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CHeader.cpp index 49db2fca20..c0e297de4e 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CHeader.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CHeader.cpp @@ -18,8 +18,7 @@ namespace SVG m_dWidth = oNode.ReadAttributeDouble(L"width"); m_dHeight = oNode.ReadAttributeDouble(L"height"); - if (0 == m_dWidth || 0 == m_dHeight) - return false; + SaveNodeData(oNode); return true; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp index 4786d34c51..8b54df9c02 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp @@ -55,10 +55,7 @@ namespace SVG if (NULL == pRenderer || NULL == m_pStyle) return; - if (NULL == pRenderer) - return; - - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h index 83e7b436c2..cd19cca130 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h @@ -18,24 +18,36 @@ namespace SVG private: void SaveNodeData(XmlUtils::CXmlNode& oNode) { - if (NULL == m_pStyle) - return; - - NSCSS::CNode oXmlNode; - - m_oXmlNode.m_sName = oNode.GetName(); - m_oXmlNode.m_sClass = oNode.GetAttribute(L"class"); - m_oXmlNode.m_sId = oNode.GetAttribute(L"id"); - m_oXmlNode.m_sStyle = oNode.GetAttribute(L"style"); - std::vector arProperties, arValues; oNode.GetAllAttributes(arProperties, arValues); + NSCSS::CNode oXmlNode; + m_oXmlNode.m_sName = oNode.GetName(); + for (unsigned int unIndex = 0; unIndex < arProperties.size(); ++unIndex) - m_oXmlNode.m_mAttrs.insert({arProperties[unIndex], arValues[unIndex]}); + { + if (L"class" == arProperties[unIndex]) + m_oXmlNode.m_sClass = arValues[unIndex]; + else if (L"id" == arProperties[unIndex]) + m_oXmlNode.m_sId = arValues[unIndex]; + else if (L"style" == arProperties[unIndex]) + m_oXmlNode.m_sStyle = arValues[unIndex]; + else + m_oXmlNode.m_mAttrs.insert({arProperties[unIndex], arValues[unIndex]}); + } }; + std::vector GetFullPath() const + { + if (NULL == m_pParent) + return {m_oXmlNode}; + + std::vector arObjects = m_pParent->GetFullPath(); + arObjects.push_back({m_oXmlNode}); + return arObjects; + } + virtual void ApplyStyle(IRenderer* pRenderer, int& nTypePath) = 0; void ApplyDefaultStroke(IRenderer* pRenderer, int& nTypePath) @@ -87,26 +99,25 @@ namespace SVG { pRenderer->ResetTransform(); - double dM11, dM12, dM21, dM22, dDx, dDy; + Aggplus::CMatrix oMatrix = oStyle.GetTransform(); - oStyle.GetTransform(dM11, dM12, dM21, dM22, dDx, dDy); - - pRenderer->SetTransform(0.89 * dM11 * 25.4 / 96, dM12, dM21, 0.89 * dM22 * 25.4 / 96, dDx, dDy); + pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty()); } friend class CLine; friend class CRect; friend class CCircle; friend class CEllipse; + friend class CHeader; friend class CPath; friend class CText; friend class CTspan; friend class CPolyline; friend class CPolygon; - CObjectBase *m_pParent; + CObjectBase *m_pParent; const CGeneralStyle *m_pStyle; - NSCSS::CNode m_oXmlNode; + NSCSS::CNode m_oXmlNode; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp index b0f1a60c3f..93246ea8ac 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp @@ -53,10 +53,10 @@ namespace SVG void CPath::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { - if (NULL == pRenderer) + if (NULL == pRenderer || NULL == m_pStyle) return; - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp index 24398dcd9a..c977736695 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPolyline.cpp @@ -41,10 +41,10 @@ namespace SVG void CPolyline::ApplyStyle(IRenderer *pRenderer, int &nTypePath) { - if (NULL == pRenderer) + if (NULL == pRenderer || NULL == m_pStyle) return; - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath, true); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp index 50d6976085..4abfe76a38 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp @@ -88,10 +88,10 @@ namespace SVG void CRect::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { - if (NULL == pRenderer) + if (NULL == pRenderer || NULL == m_pStyle) return; - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle); ApplyStroke(pRenderer, oStyle, nTypePath); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.cpp index 49aa245044..b1e28a5d8b 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.cpp @@ -128,9 +128,9 @@ namespace SVG return m_pStroke.GetColorN(); } - void CStyle::GetTransform(double &dM11, double &dM12, double &dM21, double &dM22, double &dDx, double &dDy) const + Aggplus::CMatrix CStyle::GetTransform() const { - m_pTransform.GetTransform(dM11, dM12, dM21, dM22, dDx, dDy); + return m_pTransform.GetTransform(); } } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.h index 26f0ba3197..8e93d9b642 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CStyle.h @@ -45,7 +45,7 @@ namespace SVG int GetStrokeColorN() const; // Transform - void GetTransform(double& dM11, double& dM12, double& dM21, double& dM22, double& dDx, double& dDy) const; + Aggplus::CMatrix GetTransform() const; private: diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index 5a12e54712..eb0abfcb0e 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -79,6 +79,11 @@ namespace SVG void CText::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { + if (NULL == pRenderer || NULL == m_pStyle) + return; + + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); + //Временный данные для тестов pRenderer->put_FontName(L"Times New Roman"); pRenderer->put_FontSize(12 / 25.4 * 96); @@ -162,7 +167,10 @@ namespace SVG void CTspan::ApplyStyle(IRenderer *pRenderer, int& nTypePath) { - CStyle oStyle = m_pStyle->GetStyle({m_oXmlNode}); + if (NULL == pRenderer || NULL == m_pStyle) + return; + + CStyle oStyle = m_pStyle->GetStyle(GetFullPath()); ApplyTransform(pRenderer, oStyle);