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);