mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-03-24 02:31:43 +08:00
Compare commits
179 Commits
fix/bug-77
...
fix/bug742
| Author | SHA1 | Date | |
|---|---|---|---|
| c9100737e0 | |||
| bcdcfa8bf7 | |||
| f11beb659f | |||
| 9a9182a1e9 | |||
| c7cce459bc | |||
| 05660e8c31 | |||
| b9ff6ba943 | |||
| d603e4f5dd | |||
| 207dd32a5d | |||
| f2d0d7ac4c | |||
| 7b995bb45f | |||
| 08502f0b24 | |||
| aeca319710 | |||
| 7425d53eb3 | |||
| bd76b2add0 | |||
| 0436e39722 | |||
| 07be806ae3 | |||
| 94f06bf997 | |||
| 230316aefa | |||
| 50c7e106fb | |||
| 6b5ee390a2 | |||
| 9049e2e6a8 | |||
| 67c6707072 | |||
| 0c29a5d436 | |||
| 02d492ff90 | |||
| a7026ccb8d | |||
| ae8fb19147 | |||
| 12083905dc | |||
| e653442b8c | |||
| 511cfb6158 | |||
| 6b80b39d4d | |||
| cbf138b1eb | |||
| 897f8fa9f2 | |||
| 8feb44225d | |||
| 517e337049 | |||
| c05231cf58 | |||
| 66b1007ab4 | |||
| 62413b8df5 | |||
| f93c259977 | |||
| 910ff6a6dd | |||
| 22e5bcbde3 | |||
| a77cbf903b | |||
| 9b4416952f | |||
| a320b5bd5a | |||
| 34a1f117c9 | |||
| ec4700ac38 | |||
| 85047874b7 | |||
| 52bf1a6988 | |||
| 27746f5c2b | |||
| d3710a755e | |||
| 5c8dcd7ed2 | |||
| 5c0b3744ee | |||
| 1f3467d75f | |||
| a1d8597b4f | |||
| 15dc718211 | |||
| 1db12e66c6 | |||
| 5de19652f2 | |||
| 76b5bd594d | |||
| 61b55c9230 | |||
| 22aecb56ec | |||
| 3586a010a8 | |||
| 146fc90746 | |||
| 4452d7bf3d | |||
| 673678e80a | |||
| b51960e925 | |||
| 0477002e85 | |||
| 68f1c6f97d | |||
| 6f85ce7116 | |||
| d920492afe | |||
| d69a54de38 | |||
| cbb1df1522 | |||
| 3b0e98fc4a | |||
| a29eb52e1a | |||
| 16eb1b51e7 | |||
| 527ff672d9 | |||
| aa24268a2e | |||
| 39e4c3a09c | |||
| 8158ace0eb | |||
| f38ce7b61b | |||
| 95a1b39fb1 | |||
| f58be7754a | |||
| a31c3ee00a | |||
| 23e9187f5a | |||
| 0e991719bf | |||
| ca2504edb6 | |||
| 07bedd847e | |||
| 506a805654 | |||
| 1bdff9e7fe | |||
| 8fab1802df | |||
| bfffcda0c5 | |||
| e96ceab1e3 | |||
| 5046c1b326 | |||
| 4bc78e7bb4 | |||
| 6616a11e7c | |||
| 45e97b76f0 | |||
| d3017c2777 | |||
| 41c4032fe8 | |||
| df49a4fbde | |||
| 3d586a4bb6 | |||
| 6d76fd71cc | |||
| 170cada6e6 | |||
| e4825294ed | |||
| 17c336d57c | |||
| 4e7af40367 | |||
| b7230d16fc | |||
| 22a7e6bb05 | |||
| a4ed2dea41 | |||
| ab2eabdd23 | |||
| ab052c7c59 | |||
| 2b209ed5e4 | |||
| 04bce828be | |||
| 4c5259494d | |||
| 289a77a978 | |||
| a22cc4e410 | |||
| 091af38e0d | |||
| 2b214ab07d | |||
| c8b34959d7 | |||
| 2bf44900de | |||
| c235a4c646 | |||
| 3bdd0e2053 | |||
| 339820e5df | |||
| 475cbb6f8a | |||
| ee784a7189 | |||
| 650fb84b6d | |||
| 4a2d0b5e1f | |||
| 54ce32cfaf | |||
| 1d58d8fc7f | |||
| 1624a2dda2 | |||
| b0a850745d | |||
| a0a9d899a8 | |||
| 7156669830 | |||
| 3b85841ea6 | |||
| 4899ed4e7f | |||
| f335a5b024 | |||
| 6eeae2e804 | |||
| 82e281cf6b | |||
| b4395efa91 | |||
| 32f683137a | |||
| d59573c3b3 | |||
| abb884c714 | |||
| befeed6233 | |||
| 54e329915c | |||
| f27d78ef48 | |||
| 58ee2582d6 | |||
| 4c3af930a5 | |||
| db86830824 | |||
| 77496c6df7 | |||
| dd73d05dd1 | |||
| cabd994f5f | |||
| 2a3f90ab93 | |||
| 1849f7a69f | |||
| e898a9bb99 | |||
| bed0f29ac6 | |||
| 320d000030 | |||
| 1fb9ef4713 | |||
| 264edeb9b6 | |||
| 4e48821faf | |||
| fd5d6f41dc | |||
| 29b9cf515a | |||
| e126ceef3c | |||
| df22ad3855 | |||
| 9a17338be7 | |||
| e344c4ca0d | |||
| 1212a78d58 | |||
| 869bbf6cc9 | |||
| 6de079a487 | |||
| 78085554b5 | |||
| 7310eb49a9 | |||
| 66d94cf00c | |||
| d0f1691a5e | |||
| 26b598784e | |||
| 8795539c20 | |||
| 0ccff9944d | |||
| c6d1f5e502 | |||
| 5b5a1d461c | |||
| 992f6616e0 | |||
| a220822b7b | |||
| 21a637594a | |||
| a517cef437 |
@ -514,6 +514,9 @@ namespace NSCSS
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!arSelectors.back().m_pCompiledStyle->Empty())
|
||||
return true;
|
||||
|
||||
arSelectors.back().m_pCompiledStyle->SetDpi(m_nDpi);
|
||||
unsigned int unStart = 0;
|
||||
|
||||
@ -522,8 +525,8 @@ namespace NSCSS
|
||||
if (itFound != arSelectors.crend())
|
||||
unStart = itFound.base() - arSelectors.cbegin();
|
||||
|
||||
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, unStart);
|
||||
std::vector<std::wstring> arPrevNodes;
|
||||
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, unStart, arSelectors.size());
|
||||
std::vector<std::wstring> arPrevNodes = CalculateAllNodes(arSelectors, 0, unStart);
|
||||
bool bInTable = false;
|
||||
|
||||
for (size_t i = 0; i < unStart; ++i)
|
||||
@ -548,6 +551,7 @@ namespace NSCSS
|
||||
{
|
||||
arSelectors[i].m_pCompiledStyle->m_oBackground.Clear();
|
||||
arSelectors[i].m_pCompiledStyle->m_oBorder.Clear();
|
||||
arSelectors[i].m_pCompiledStyle->m_oDisplay.Clear();
|
||||
}
|
||||
|
||||
arSelectors[i].m_pCompiledStyle->AddStyle(arSelectors[i].m_mAttributes, i + 1);
|
||||
@ -592,11 +596,14 @@ namespace NSCSS
|
||||
}
|
||||
#endif
|
||||
|
||||
std::vector<std::wstring> CCssCalculator_Private::CalculateAllNodes(const std::vector<CNode> &arSelectors, unsigned int unStart)
|
||||
std::vector<std::wstring> CCssCalculator_Private::CalculateAllNodes(const std::vector<CNode> &arSelectors, unsigned int unStart, unsigned int unEnd)
|
||||
{
|
||||
if ((0 != unEnd && (unEnd < unStart || unEnd > arSelectors.size())) || (unStart == unEnd))
|
||||
return std::vector<std::wstring>();
|
||||
|
||||
std::vector<std::wstring> arNodes;
|
||||
|
||||
for (std::vector<CNode>::const_reverse_iterator oNode = arSelectors.rbegin(); oNode != arSelectors.rend() - unStart; ++oNode)
|
||||
|
||||
for (std::vector<CNode>::const_reverse_iterator oNode = arSelectors.rbegin() + ((0 != unEnd) ? (arSelectors.size() - unEnd) : 0); oNode != arSelectors.rend() - unStart; ++oNode)
|
||||
{
|
||||
if (!oNode->m_wsName.empty())
|
||||
arNodes.push_back(oNode->m_wsName);
|
||||
@ -627,7 +634,7 @@ namespace NSCSS
|
||||
if (arNextNodes.empty())
|
||||
return;
|
||||
|
||||
const std::vector<CElement*> arTempPrev = pElement->GetPrevElements(arNextNodes.crbegin() + 1, arNextNodes.crend());
|
||||
const std::vector<CElement*> arTempPrev = pElement->GetPrevElements(arNextNodes.cbegin(), arNextNodes.cend());
|
||||
const std::vector<CElement*> arTempKins = pElement->GetNextOfKin(wsName, arClasses);
|
||||
|
||||
if (!arTempPrev.empty())
|
||||
@ -644,20 +651,19 @@ namespace NSCSS
|
||||
|
||||
std::vector<const CElement*> arFindedElements;
|
||||
|
||||
std::wstring wsName, wsId;
|
||||
std::wstring wsName, wsClasses, wsId;
|
||||
std::vector<std::wstring> arClasses;
|
||||
|
||||
if (!arNodes.empty() && arNodes.back()[0] == L'#')
|
||||
{
|
||||
wsId = arNodes.back();
|
||||
arNodes.pop_back();
|
||||
arNextNodes.push_back(wsId);
|
||||
}
|
||||
|
||||
if (!arNodes.empty() && arNodes.back()[0] == L'.')
|
||||
{
|
||||
arClasses = NS_STATIC_FUNCTIONS::GetWordsW(arNodes.back(), false, L" ");
|
||||
arNextNodes.push_back(arNodes.back());
|
||||
wsClasses = arNodes.back();
|
||||
arClasses = NS_STATIC_FUNCTIONS::GetWordsW(wsClasses, false, L" ");
|
||||
arNodes.pop_back();
|
||||
}
|
||||
|
||||
@ -665,7 +671,6 @@ namespace NSCSS
|
||||
{
|
||||
wsName = arNodes.back();
|
||||
arNodes.pop_back();
|
||||
arNextNodes.push_back(wsName);
|
||||
}
|
||||
|
||||
if (!wsId.empty())
|
||||
@ -724,6 +729,14 @@ namespace NSCSS
|
||||
{ return oFirstElement->GetWeight() > oSecondElement->GetWeight(); });
|
||||
}
|
||||
|
||||
if (!wsId.empty())
|
||||
arNextNodes.push_back(wsId);
|
||||
|
||||
if (!wsClasses.empty())
|
||||
arNextNodes.push_back(wsClasses);
|
||||
|
||||
arNextNodes.push_back(wsName);
|
||||
|
||||
return arFindedElements;
|
||||
}
|
||||
|
||||
@ -738,7 +751,7 @@ namespace NSCSS
|
||||
if (arSelectors.empty())
|
||||
return false;
|
||||
|
||||
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors);
|
||||
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, 0, arSelectors.size());
|
||||
std::vector<std::wstring> arNextNodes;
|
||||
|
||||
for (size_t i = 0; i < arSelectors.size(); ++i)
|
||||
|
||||
@ -110,7 +110,7 @@ namespace NSCSS
|
||||
void ClearPageData();
|
||||
#endif
|
||||
|
||||
std::vector<std::wstring> CalculateAllNodes(const std::vector<CNode>& arSelectors, unsigned int unStart = 0);
|
||||
std::vector<std::wstring> CalculateAllNodes(const std::vector<CNode>& arSelectors, unsigned int unStart, unsigned int unEnd);
|
||||
std::vector<const CElement*> FindElements(std::vector<std::wstring>& arNodes, std::vector<std::wstring>& arNextNodes);
|
||||
|
||||
void AddStyles(const std::string& sStyle);
|
||||
|
||||
@ -176,14 +176,14 @@ namespace NSCSS
|
||||
return arElements;
|
||||
}
|
||||
|
||||
std::vector<CElement *> CElement::GetPrevElements(const std::vector<std::wstring>::const_reverse_iterator& oNodesRBegin, const std::vector<std::wstring>::const_reverse_iterator& oNodesREnd) const
|
||||
std::vector<CElement *> CElement::GetPrevElements(const std::vector<std::wstring>::const_iterator& oNodesBegin, const std::vector<std::wstring>::const_iterator& oNodesEnd) const
|
||||
{
|
||||
if (oNodesRBegin >= oNodesREnd || m_arPrevElements.empty())
|
||||
if (oNodesBegin >= oNodesEnd || m_arPrevElements.empty())
|
||||
return std::vector<CElement*>();
|
||||
|
||||
std::vector<CElement*> arElements;
|
||||
|
||||
for (std::vector<std::wstring>::const_reverse_iterator iWord = oNodesRBegin; iWord != oNodesREnd; ++iWord)
|
||||
for (std::vector<std::wstring>::const_iterator iWord = oNodesBegin; iWord != oNodesEnd; ++iWord)
|
||||
{
|
||||
if ((*iWord)[0] == L'.' && ((*iWord).find(L" ") != std::wstring::npos))
|
||||
{
|
||||
@ -195,7 +195,7 @@ namespace NSCSS
|
||||
if (oPrevElement->m_sSelector == wsClass)
|
||||
{
|
||||
arElements.push_back(oPrevElement);
|
||||
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesREnd);
|
||||
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesEnd);
|
||||
arElements.insert(arElements.end(), arTempElements.begin(), arTempElements.end());
|
||||
}
|
||||
}
|
||||
@ -208,9 +208,8 @@ namespace NSCSS
|
||||
if (oPrevElement->m_sSelector == *iWord)
|
||||
{
|
||||
arElements.push_back(oPrevElement);
|
||||
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesREnd);
|
||||
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesEnd);
|
||||
arElements.insert(arElements.end(), arTempElements.begin(), arTempElements.end());
|
||||
// return arElements;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ namespace NSCSS
|
||||
std::map<std::wstring, std::wstring> GetFullStyle(const std::vector<CNode>& arSelectors) const;
|
||||
std::map<std::wstring, std::wstring> GetFullStyle(const std::vector<std::wstring>& arNodes) const;
|
||||
std::vector<CElement *> GetNextOfKin(const std::wstring& sName, const std::vector<std::wstring>& arClasses = {}) const;
|
||||
std::vector<CElement *> GetPrevElements(const std::vector<std::wstring>::const_reverse_iterator& oNodesRBegin, const std::vector<std::wstring>::const_reverse_iterator& oNodesREnd) const;
|
||||
std::vector<CElement *> GetPrevElements(const std::vector<std::wstring>::const_iterator& oNodesBegin, const std::vector<std::wstring>::const_iterator& oNodesEnd) const;
|
||||
std::map<std::wstring, std::wstring> GetConvertStyle(const std::vector<CNode>& arNodes) const;
|
||||
|
||||
CElement *FindPrevElement(const std::wstring& sSelector) const;
|
||||
|
||||
@ -18,6 +18,7 @@ namespace NSCSS
|
||||
std::wstring m_wsId; // Id тэга
|
||||
std::wstring m_wsStyle; // Стиль тэга
|
||||
std::map<std::wstring, std::wstring> m_mAttributes; // Остальные аттрибуты тэга
|
||||
//TODO:: возможно использование std::wstring излишне
|
||||
|
||||
#ifdef CSS_CALCULATOR_WITH_XHTML
|
||||
CCompiledStyle *m_pCompiledStyle;
|
||||
|
||||
@ -149,7 +149,7 @@ namespace NSCSS
|
||||
case NSCSS::Millimeter:
|
||||
return dValue * 0.01764;
|
||||
case NSCSS::Inch:
|
||||
return dValue * 1440.;
|
||||
return dValue / 1440.;
|
||||
case NSCSS::Peak:
|
||||
return dValue * 0.004167; // 0.004167 = 6 / 1440
|
||||
default:
|
||||
|
||||
@ -69,7 +69,8 @@ namespace NSCSS
|
||||
R_Highlight,
|
||||
R_Shd,
|
||||
R_SmallCaps,
|
||||
R_Kern
|
||||
R_Kern,
|
||||
R_Vanish
|
||||
} RunnerProperties;
|
||||
|
||||
typedef enum
|
||||
|
||||
@ -436,12 +436,13 @@ namespace NSCSS
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDigit::SetValue(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CDigit::SetValue(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
if (CHECK_CONDITIONS && !bHardMode)
|
||||
return false;
|
||||
|
||||
m_oValue = dValue;
|
||||
m_enUnitMeasure = enUnitMeasure;
|
||||
m_oValue = dValue;
|
||||
|
||||
if (UINT_MAX == unLevel)
|
||||
m_unLevel++;
|
||||
@ -1326,6 +1327,23 @@ namespace NSCSS
|
||||
return true;
|
||||
}
|
||||
|
||||
CMatrix& CMatrix::operator+=(const CMatrix& oMatrix)
|
||||
{
|
||||
m_oValue.insert(m_oValue.end(), oMatrix.m_oValue.begin(), oMatrix.m_oValue.end());
|
||||
return *this;
|
||||
}
|
||||
|
||||
CMatrix& CMatrix::operator-=(const CMatrix& oMatrix)
|
||||
{
|
||||
for (MatrixValues::const_reverse_iterator itElement = oMatrix.m_oValue.crbegin(); itElement < oMatrix.m_oValue.crend(); ++itElement)
|
||||
{
|
||||
if (!m_oValue.empty() && m_oValue.back() == *itElement)
|
||||
m_oValue.pop_back();
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// DISPLAY
|
||||
CDisplay::CDisplay()
|
||||
{
|
||||
@ -1465,6 +1483,21 @@ namespace NSCSS
|
||||
(m_eWhiteSpace.Empty() || m_eWhiteSpace == EWhiteSpace::Normal);
|
||||
}
|
||||
|
||||
void CDisplay::Clear()
|
||||
{
|
||||
m_oX.Clear();
|
||||
m_oY.Clear();
|
||||
m_oWidth.Clear();
|
||||
m_oHeight.Clear();
|
||||
|
||||
m_oHAlign.Clear();
|
||||
m_oVAlign.Clear();
|
||||
|
||||
m_oDisplay.Clear();
|
||||
|
||||
m_eWhiteSpace.Clear();
|
||||
}
|
||||
|
||||
CDisplay &CDisplay::operator+=(const CDisplay &oDisplay)
|
||||
{
|
||||
m_oX += oDisplay.m_oX;
|
||||
@ -1743,9 +1776,9 @@ namespace NSCSS
|
||||
return m_oWidth.SetValue(wsNewValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorderSide::SetWidth(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorderSide::SetWidth(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oWidth.SetValue(dValue, unLevel, bHardMode);
|
||||
return m_oWidth.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorderSide::SetStyle(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -1921,14 +1954,14 @@ namespace NSCSS
|
||||
return bResult;
|
||||
}
|
||||
|
||||
bool CBorder::SetWidth(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorder::SetWidth(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
bool bResult = false;
|
||||
|
||||
if (m_oLeft .SetWidth(dValue, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oTop .SetWidth(dValue, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oRight .SetWidth(dValue, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oBottom.SetWidth(dValue, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oLeft .SetWidth(dValue, enUnitMeasure, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oTop .SetWidth(dValue, enUnitMeasure, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oRight .SetWidth(dValue, enUnitMeasure, unLevel, bHardMode)) bResult = true;
|
||||
if (m_oBottom.SetWidth(dValue, enUnitMeasure, unLevel, bHardMode)) bResult = true;
|
||||
|
||||
return bResult;
|
||||
}
|
||||
@ -1972,9 +2005,9 @@ namespace NSCSS
|
||||
return m_oLeft.SetWidth(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetWidthLeftSide(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorder::SetWidthLeftSide(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oLeft.SetWidth(dValue, unLevel, bHardMode);
|
||||
return m_oLeft.SetWidth(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetStyleLeftSide(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -1997,9 +2030,9 @@ namespace NSCSS
|
||||
return m_oTop.SetWidth(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetWidthTopSide(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorder::SetWidthTopSide(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oTop.SetWidth(dValue, unLevel, bHardMode);
|
||||
return m_oTop.SetWidth(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetStyleTopSide(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -2022,9 +2055,9 @@ namespace NSCSS
|
||||
return m_oRight.SetWidth(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetWidthRightSide(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorder::SetWidthRightSide(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oRight.SetWidth(dValue, unLevel, bHardMode);
|
||||
return m_oRight.SetWidth(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetStyleRightSide(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -2047,9 +2080,9 @@ namespace NSCSS
|
||||
return m_oBottom.SetWidth(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetWidthBottomSide(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CBorder::SetWidthBottomSide(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oBottom.SetWidth(dValue, unLevel, bHardMode);
|
||||
return m_oBottom.SetWidth(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CBorder::SetStyleBottomSide(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -2348,39 +2381,49 @@ namespace NSCSS
|
||||
return m_oTop.SetValue(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetTop(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oTop.SetValue(dValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetRight(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oRight.SetValue(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetRight(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oRight.SetValue(dValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetBottom(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oBottom.SetValue(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetBottom(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oBottom.SetValue(dValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetLeft(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oLeft.SetValue(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetLeft(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CIndent::SetValues(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oLeft.SetValue(dValue, unLevel, bHardMode);
|
||||
const bool bTopResult = SetTop (dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
const bool bRightResult = SetRight (dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
const bool bBottomResult = SetBottom (dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
const bool bLeftResult = SetLeft (dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
|
||||
return bTopResult || bRightResult || bBottomResult || bLeftResult;
|
||||
}
|
||||
|
||||
bool CIndent::SetTop(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oTop.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetRight(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oRight.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetBottom(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oBottom.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CIndent::SetLeft(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oLeft.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
void CIndent::UpdateAll(const double& dParentFontSize, const double& dCoreFontSize)
|
||||
@ -2672,9 +2715,9 @@ namespace NSCSS
|
||||
return m_oSize.SetValue(wsNewValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CFont:: SetSize(const double& dValue, unsigned int unLevel, bool bHardMode)
|
||||
bool CFont:: SetSize(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oSize.SetValue(dValue, unLevel, bHardMode);
|
||||
return m_oSize.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CFont::SetLineHeight(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode)
|
||||
@ -2999,6 +3042,31 @@ namespace NSCSS
|
||||
return m_oHeader.SetValue(wsValue, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CPage::SetWidth(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oWidth.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CPage::SetHeight(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oHeight.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CPage::SetMargin(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oMargin.SetValues(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CPage::SetFooter(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oFooter.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
bool CPage::SetHeader(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode)
|
||||
{
|
||||
return m_oHeader.SetValue(dValue, enUnitMeasure, unLevel, bHardMode);
|
||||
}
|
||||
|
||||
const CDigit &CPage::GetWidth() const
|
||||
{
|
||||
return m_oWidth;
|
||||
|
||||
@ -138,7 +138,7 @@ namespace NSCSS
|
||||
|
||||
bool SetValue(const std::wstring& wsValue, unsigned int unLevel = 0, bool bHardMode = true) override;
|
||||
bool SetValue(const CDigit& oValue);
|
||||
bool SetValue(const double& dValue, unsigned int unLevel, bool bHardMode);
|
||||
bool SetValue(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel = 0, bool bHardMode = true);
|
||||
|
||||
bool Empty() const override;
|
||||
bool Zero() const;
|
||||
@ -302,6 +302,8 @@ namespace NSCSS
|
||||
void ApplyTranform(Aggplus::CMatrix& oMatrix, Aggplus::MatrixOrder order = Aggplus::MatrixOrderPrepend) const;
|
||||
|
||||
bool operator==(const CMatrix& oMatrix) const;
|
||||
CMatrix& operator+=(const CMatrix& oMatrix);
|
||||
CMatrix& operator-=(const CMatrix& oMatrix);
|
||||
};
|
||||
|
||||
class CEnum : public CValue<int>
|
||||
@ -371,6 +373,7 @@ namespace NSCSS
|
||||
const CEnum& GetWhiteSpace() const;
|
||||
|
||||
bool Empty() const;
|
||||
void Clear();
|
||||
|
||||
CDisplay& operator+=(const CDisplay& oDisplay);
|
||||
bool operator==(const CDisplay& oDisplay) const;
|
||||
@ -472,7 +475,7 @@ namespace NSCSS
|
||||
|
||||
bool SetValue(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyle(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColor(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
@ -524,7 +527,7 @@ namespace NSCSS
|
||||
|
||||
bool SetSides(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidth(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyle(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColor(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetCollapse(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
@ -532,28 +535,28 @@ namespace NSCSS
|
||||
//Left Side
|
||||
bool SetLeftSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthLeftSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthLeftSide (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthLeftSide (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyleLeftSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColorLeftSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
//Top Side
|
||||
bool SetTopSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthTopSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthTopSide (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthTopSide (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyleTopSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColorTopSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
//Right Side
|
||||
bool SetRightSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthRightSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthRightSide (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthRightSide (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyleRightSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColorRightSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
//Bottom Side
|
||||
bool SetBottomSide (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthBottomSide(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthBottomSide(const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetWidthBottomSide(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStyleBottomSide(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetColorBottomSide(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
@ -666,13 +669,15 @@ namespace NSCSS
|
||||
|
||||
bool SetValues (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetTop (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetTop (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetRight (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetRight (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetBottom (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetBottom (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetLeft (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetLeft (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
bool SetValues (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetTop (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetRight (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetBottom (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetLeft (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
void UpdateAll (const double& dParentFontSize, const double& dCoreFontSize);
|
||||
void UpdateTop (const double& dParentFontSize, const double& dCoreFontSize);
|
||||
@ -685,6 +690,9 @@ namespace NSCSS
|
||||
const CDigit& GetBottom() const;
|
||||
const CDigit& GetLeft () const;
|
||||
|
||||
bool GetAfterAutospacing () const;
|
||||
bool GetBeforeAutospacing() const;
|
||||
|
||||
bool Empty() const;
|
||||
bool Zero() const;
|
||||
|
||||
@ -712,7 +720,7 @@ namespace NSCSS
|
||||
|
||||
bool SetValue (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetSize (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetSize (const double& dValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetSize (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetLineHeight (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetFamily (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetStretch (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
@ -762,6 +770,12 @@ namespace NSCSS
|
||||
bool SetFooter (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetHeader (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
bool SetWidth (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetHeight (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetMargin (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetFooter (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
bool SetHeader (const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel, bool bHardMode = false);
|
||||
|
||||
const CDigit& GetWidth() const;
|
||||
const CDigit& GetHeight() const;
|
||||
const CIndent& GetMargin() const;
|
||||
|
||||
@ -341,14 +341,14 @@ namespace NSCSS
|
||||
sSpacingValue.reserve(128);
|
||||
|
||||
if (!oStyle.m_oMargin.GetTop().Empty() && !oStyle.m_oMargin.GetTop().Zero())
|
||||
sSpacingValue += L"w:before=\"" + std::to_wstring(VALUE_TO_INT(oStyle.m_oMargin.GetTop(), NSCSS::Twips)) + L"\" w:beforeAutospacing=\"0\"";
|
||||
sSpacingValue += L"w:before=\"" + std::to_wstring(VALUE_TO_INT(oStyle.m_oMargin.GetTop(), NSCSS::Twips)) + L"\" w:beforeAutospacing=\"1\"";
|
||||
else if (oStyle.m_oMargin.GetBottom().Zero() || bInTable)
|
||||
sSpacingValue += L"w:before=\"0\" w:beforeAutospacing=\"0\"";
|
||||
sSpacingValue += L"w:before=\"0\" w:beforeAutospacing=\"1\"";
|
||||
|
||||
if (!oStyle.m_oMargin.GetBottom().Empty() && !oStyle.m_oMargin.GetBottom().Zero())
|
||||
sSpacingValue += L" w:after=\"" + std::to_wstring(VALUE_TO_INT(oStyle.m_oMargin.GetBottom(), NSCSS::Twips)) + L"\" w:afterAutospacing=\"0\"";
|
||||
sSpacingValue += L" w:after=\"" + std::to_wstring(VALUE_TO_INT(oStyle.m_oMargin.GetBottom(), NSCSS::Twips)) + L"\" w:afterAutospacing=\"1\"";
|
||||
else if (oStyle.m_oMargin.GetBottom().Zero() || bInTable)
|
||||
sSpacingValue += L" w:after=\"0\" w:afterAutospacing=\"0\"";
|
||||
sSpacingValue += L" w:after=\"0\" w:afterAutospacing=\"1\"";
|
||||
|
||||
if (!oStyle.m_oFont.GetLineHeight().Empty() && !oStyle.m_oFont.GetLineHeight().Zero())
|
||||
{
|
||||
@ -509,6 +509,9 @@ namespace NSCSS
|
||||
else if (L"serif" == wsFontFamily)
|
||||
wsFontFamily = L"Times New Roman";
|
||||
|
||||
if (oStyle.m_oDisplay.GetDisplay() == L"none")
|
||||
oXmlElement.AddPropertiesInR(RProperties::R_Vanish, L"true");
|
||||
|
||||
oXmlElement.AddPropertiesInR(RProperties::R_RFonts, oStyle.m_oFont.GetFamily().ToWString());
|
||||
oXmlElement.AddPropertiesInR(RProperties::R_I, oStyle.m_oFont.GetStyle().ToWString());
|
||||
oXmlElement.AddPropertiesInR(RProperties::R_B, oStyle.m_oFont.GetWeight().ToWString());
|
||||
|
||||
@ -473,6 +473,12 @@ std::wstring CXmlElement::ConvertRStyle(bool bIsLite) const
|
||||
sRStyle += L"<w:kern w:val=\"" + oItem.second + L"\"/>";
|
||||
break;
|
||||
}
|
||||
case CSSProperties::RunnerProperties::R_Vanish:
|
||||
{
|
||||
if (oItem.second == L"true")
|
||||
sRStyle += L"<w:vanish/>";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -5,6 +5,9 @@
|
||||
|
||||
namespace Md
|
||||
{
|
||||
#define MD_PARSER_FLAGS MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM | MD_FLAG_HARD_SOFT_BREAKS | MD_HTML_FLAG_XHTML
|
||||
#define MD_RENDERER_FLAGS MD_HTML_FLAG_XHTML
|
||||
|
||||
void ToHtml(const MD_CHAR* pValue, MD_SIZE uSize, void* pData)
|
||||
{
|
||||
if (NULL != pData)
|
||||
@ -14,7 +17,7 @@ void ToHtml(const MD_CHAR* pValue, MD_SIZE uSize, void* pData)
|
||||
std::string ConvertMdStringToHtml(const std::string& sMdString)
|
||||
{
|
||||
std::string sData;
|
||||
md_html(sMdString.c_str(), sMdString.length(), ToHtml, &sData, 0, 0);
|
||||
md_html(sMdString.c_str(), sMdString.length(), ToHtml, &sData, MD_PARSER_FLAGS, MD_RENDERER_FLAGS);
|
||||
return sData;
|
||||
}
|
||||
|
||||
@ -36,22 +39,21 @@ void WriteBaseHtmlStyles(NSFile::CFileBinary& oFile)
|
||||
oFile.WriteStringUTF8(L"img { vertical-align: middle; }");
|
||||
|
||||
// Styles for tables
|
||||
oFile.WriteStringUTF8(L"table { margin-bottom: 20px; width: 100%; max-width: 100%; border-spacing:0; border-collapse: collapse; border-color: gray;}");
|
||||
oFile.WriteStringUTF8(L"thead { display: table-header-group; vertical-align: middle; }");
|
||||
oFile.WriteStringUTF8(L"table { margin-bottom: 20px; width: 100%; max-width: 100%; border-spacing:0; border-collapse: collapse; border-color: gray; vertical-align:middle;}");
|
||||
oFile.WriteStringUTF8(L"thead { display: table-header-group;}");
|
||||
oFile.WriteStringUTF8(L"tr { display: table-row; }");
|
||||
oFile.WriteStringUTF8(L"th { text-align: left; display: table-cell; font-weight: bold; }");
|
||||
oFile.WriteStringUTF8(L"th { text-align: center; display: table-cell; font-weight: bold; }");
|
||||
|
||||
oFile.WriteStringUTF8(L"table thead tr th { vertical-align: bottom; border-bottom: 2px solid #ddd; }");
|
||||
oFile.WriteStringUTF8(L"table thead tr th, table tbody tr th, table thead tr td, table tbody tr td { padding 8px; line-height: 1.4; vertical-align: top; border-top: 1px solid #ddd; }");
|
||||
oFile.WriteStringUTF8(L"table > caption + thead > tr > th, table > colgroup + thead > tr > th, table > thead > tr > th, table > caption + thead > tr > td, table > colgroup + thead > tr > td, table > thead > tr > td { border-top: 0; }");
|
||||
oFile.WriteStringUTF8(L"table thead tr th, table thead tr td { border-bottom: 2px solid #ddd; border-top: none; }");
|
||||
oFile.WriteStringUTF8(L"table tbody tr th, table tbody tr td { padding 8px; line-height: 1.4; border-top: 1px solid #ddd; }");
|
||||
|
||||
// Styles for blockquote
|
||||
oFile.WriteStringUTF8(L"blockquote { border-left: 3px solid #e9e9e9; margin: 1.5em 0; padding: 0.5em 10px 0.5em 24px; font-size: 1.25rem; display: block; margin-top: 8pt; font-style: italic; color: #404040; }");
|
||||
|
||||
// Styles for code
|
||||
oFile.WriteStringUTF8(L"code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 4px; }");
|
||||
oFile.WriteStringUTF8(L"pre code { padding: 0px; white-space: pre-wrap; border-radius: 0; background-color: #f5f5f5; color:black; }");
|
||||
oFile.WriteStringUTF8(L"pre { display: block; padding: 9.5px; margin: 0 0 10px; line-height: 1.4; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 4px; font-size: 1em; }");
|
||||
oFile.WriteStringUTF8(L"code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; }");
|
||||
oFile.WriteStringUTF8(L"pre code { padding: 0px; white-space: pre-wrap; border-radius: 0; background-color: #f8f8f8; color:black; }");
|
||||
oFile.WriteStringUTF8(L"pre { display: block; padding: 9.5px; margin: 0 0 10px; line-height: 1.4; word-break: break-all; word-wrap: break-word; background-color: #f8f8f8; border: none; font-size: 1em; }");
|
||||
oFile.WriteStringUTF8(L"code, pre { font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace; }");
|
||||
|
||||
// Styles for headings
|
||||
@ -87,9 +89,7 @@ bool ConvertMdFileToHtml(const std::wstring& wsPathToMdFile, const std::wstring&
|
||||
|
||||
bool bResult = true;
|
||||
|
||||
if (0 != md_html(sMdData.c_str(), sMdData.length(), ToHtmlFile, &oFile,
|
||||
MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM,
|
||||
0))
|
||||
if (0 != md_html(sMdData.c_str(), sMdData.length(), ToHtmlFile, &oFile, MD_PARSER_FLAGS, MD_RENDERER_FLAGS))
|
||||
bResult = false;
|
||||
|
||||
oFile.WriteStringUTF8(L"</body></html>");
|
||||
|
||||
1
Common/3dParty/socketio/.gitignore
vendored
1
Common/3dParty/socketio/.gitignore
vendored
@ -1 +1,2 @@
|
||||
socket.io-client-cpp/
|
||||
socketio.data
|
||||
@ -0,0 +1,5 @@
|
||||
<<<<<<<
|
||||
if((c >= 'a' && c <= 'z') || (c>= 'A' && c<= 'Z') || (c >= '0' && c<= '9')){
|
||||
=======
|
||||
if((c >= 'a' && c <= 'z') || (c>= 'A' && c<= 'Z') || (c >= '0' && c<= '9') || ('-' == c) || ('_' == c) || ('.' == c) || ('~' == c)){
|
||||
>>>>>>>
|
||||
2
Common/3dParty/webp/.gitignore
vendored
2
Common/3dParty/webp/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
build
|
||||
libwebp
|
||||
@ -1,26 +0,0 @@
|
||||
WEBP_BUILDS_PLATFORM_PREFIX = $$CORE_BUILDS_PLATFORM_PREFIX
|
||||
core_ios : xcframework_platform_ios_simulator {
|
||||
WEBP_BUILDS_PLATFORM_PREFIX = ios_simulator
|
||||
}
|
||||
|
||||
WEBP_BUILD_PATH = $$PWD/build/$$WEBP_BUILDS_PLATFORM_PREFIX
|
||||
|
||||
core_windows {
|
||||
core_win_32 {
|
||||
BUILD_PLATFORM = x86
|
||||
} else {
|
||||
BUILD_PLATFORM = x64
|
||||
}
|
||||
|
||||
core_debug {
|
||||
LIBS += -L$$WEBP_BUILD_PATH/debug-static/$$BUILD_PLATFORM/lib -llibwebp_debug
|
||||
} else {
|
||||
LIBS += -L$$WEBP_BUILD_PATH/release-static/$$BUILD_PLATFORM/lib -llibwebp
|
||||
}
|
||||
}
|
||||
|
||||
core_linux | core_android | core_mac | core_ios {
|
||||
LIBS += \
|
||||
-L$$WEBP_BUILD_PATH/$$CORE_BUILDS_CONFIGURATION_PREFIX/src/.libs -lwebp \
|
||||
-L$$WEBP_BUILD_PATH/$$CORE_BUILDS_CONFIGURATION_PREFIX/sharpyuv/.libs -lsharpyuv
|
||||
}
|
||||
@ -74,7 +74,6 @@ public:
|
||||
bool isDocFormatFile(const std::wstring& fileName);
|
||||
bool isXlsFormatFile(const std::wstring& fileName);
|
||||
|
||||
bool isCompoundFile (POLE::Storage* storage);
|
||||
bool isOleObjectFile(POLE::Storage* storage);
|
||||
bool isDocFormatFile(POLE::Storage* storage);
|
||||
bool isXlsFormatFile(POLE::Storage* storage);
|
||||
|
||||
@ -552,15 +552,6 @@ bool COfficeFileFormatChecker::isPptFormatFile(POLE::Storage *storage)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool COfficeFileFormatChecker::isCompoundFile(POLE::Storage* storage)
|
||||
{
|
||||
if (storage == NULL) return false;
|
||||
|
||||
if (storage->GetAllStreams(L"/").size() == 1) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::wstring COfficeFileFormatChecker::getDocumentID(const std::wstring &_fileName)
|
||||
{
|
||||
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(_WIN64)
|
||||
@ -758,11 +749,6 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
|
||||
nFileType = AVS_OFFICESTUDIO_FILE_OTHER_MS_VBAPROJECT;
|
||||
return true;
|
||||
}
|
||||
else if (isCompoundFile(&storage))
|
||||
{
|
||||
nFileType = AVS_OFFICESTUDIO_FILE_OTHER_COMPOUND;
|
||||
return true;
|
||||
}
|
||||
else if (isHwpFile(&storage))
|
||||
{
|
||||
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_HWP;
|
||||
|
||||
@ -136,7 +136,6 @@
|
||||
#define AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO AVS_OFFICESTUDIO_FILE_OTHER + 0x000b
|
||||
#define AVS_OFFICESTUDIO_FILE_OTHER_MS_VBAPROJECT AVS_OFFICESTUDIO_FILE_OTHER + 0x000c
|
||||
#define AVS_OFFICESTUDIO_FILE_OTHER_PACKAGE_IN_OLE AVS_OFFICESTUDIO_FILE_OTHER + 0x000d
|
||||
#define AVS_OFFICESTUDIO_FILE_OTHER_COMPOUND AVS_OFFICESTUDIO_FILE_OTHER + 0x000e
|
||||
|
||||
#define AVS_OFFICESTUDIO_FILE_TEAMLAB 0x1000
|
||||
#define AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY AVS_OFFICESTUDIO_FILE_TEAMLAB + 0x0001
|
||||
|
||||
@ -45,6 +45,7 @@ win32 {
|
||||
}
|
||||
|
||||
DEFINES += COPYRIGHT_YEAR=$${CURRENT_YEAR}
|
||||
#DEFINES += _LOGOUT_ALWAYS
|
||||
|
||||
QMAKE_TARGET_COMPANY = $$PUBLISHER_NAME
|
||||
QMAKE_TARGET_COPYRIGHT = © $${PUBLISHER_NAME} $${CURRENT_YEAR}. All rights reserved.
|
||||
@ -202,12 +203,12 @@ core_win_64 {
|
||||
core_linux {
|
||||
DEFINES += LINUX _LINUX
|
||||
|
||||
QMAKE_CUSTOM_SYSROOT = $$(QMAKE_CUSTOM_SYSROOT)
|
||||
QMAKE_CUSTOM_SYSROOT = $$(QMAKE_CUSTOM_SYSROOT)
|
||||
QMAKE_CUSTOM_SYSROOT_BIN = $$(QMAKE_CUSTOM_SYSROOT)/usr/bin/
|
||||
|
||||
core_linux_64 {
|
||||
!linux_arm64 { # x86_64
|
||||
QMAKE_CUSTOM_SYSROOT_LIB = $$(QMAKE_CUSTOM_SYSROOT)/usr/lib/x86_64-linux-gnu
|
||||
core_linux_64 {
|
||||
!linux_arm64 { # x86_64
|
||||
QMAKE_CUSTOM_SYSROOT_LIB = $$(QMAKE_CUSTOM_SYSROOT)/usr/lib/x86_64-linux-gnu
|
||||
!isEmpty(QMAKE_CUSTOM_SYSROOT) {
|
||||
message("using custom sysroot $$QMAKE_CUSTOM_SYSROOT")
|
||||
QMAKE_CC = $$join(QMAKE_CUSTOM_SYSROOT_BIN, , , "gcc")
|
||||
@ -216,7 +217,7 @@ core_linux {
|
||||
QMAKE_LINK_SHLIB = $$join(QMAKE_CUSTOM_SYSROOT_BIN, , , "g++")
|
||||
|
||||
QMAKE_CFLAGS += --sysroot $$QMAKE_CUSTOM_SYSROOT
|
||||
QMAKE_CXXFLAGS += --sysroot $$QMAKE_CUSTOM_SYSROOT
|
||||
QMAKE_CXXFLAGS += --sysroot $$QMAKE_CUSTOM_SYSROOT -std=gnu++1y
|
||||
QMAKE_LFLAGS += --sysroot $$QMAKE_CUSTOM_SYSROOT
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,6 +45,10 @@
|
||||
#undef DeleteFile
|
||||
#endif
|
||||
|
||||
#if defined(GetSystemDirectory)
|
||||
#undef GetSystemDirectory
|
||||
#endif
|
||||
|
||||
#ifndef _BUILD_FILE_CROSSPLATFORM_H_
|
||||
#define _BUILD_FILE_CROSSPLATFORM_H_
|
||||
|
||||
|
||||
@ -246,6 +246,11 @@ namespace NSSystemPath
|
||||
|
||||
wsNewPath.pop_back();
|
||||
|
||||
#if !defined(_WIN32) && !defined(_WIN64)
|
||||
if (L'/' == strPath[0] || L'\\' == strPath[0])
|
||||
return L'/' + wsNewPath;
|
||||
#endif
|
||||
|
||||
return wsNewPath;
|
||||
}
|
||||
|
||||
|
||||
@ -29,11 +29,11 @@
|
||||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
*
|
||||
*/
|
||||
#ifndef _SYSTEMUTILS_H
|
||||
#define _SYSTEMUTILS_H
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include "../../Common/kernel_config.h"
|
||||
#include "../../OdfFile/Common/logging.h"
|
||||
|
||||
#define VALUE_STRINGIFY(d) L##d
|
||||
#define VALUE_TO_STR(v) VALUE_STRINGIFY(v)
|
||||
@ -59,7 +59,7 @@ namespace NSSystemUtils
|
||||
static const wchar_t* gc_EnvLastModifiedBy = L"LAST_MODIFIED_BY";
|
||||
static const wchar_t* gc_EnvModified = L"MODIFIED";
|
||||
static const wchar_t* gc_EnvMemoryLimit = L"X2T_MEMORY_LIMIT";
|
||||
static const wchar_t* gc_EnvMemoryLimitDefault = L"3GiB";
|
||||
static const wchar_t* gc_EnvMemoryLimitDefault = L"4GiB";
|
||||
|
||||
KERNEL_DECL std::string GetEnvVariableA(const std::wstring& strName);
|
||||
KERNEL_DECL std::wstring GetEnvVariable(const std::wstring& strName);
|
||||
@ -76,4 +76,3 @@ namespace NSSystemUtils
|
||||
};
|
||||
KERNEL_DECL std::wstring GetSystemDirectory(const SystemDirectoryType& type);
|
||||
}
|
||||
#endif // _SYSTEMUTILS_H
|
||||
|
||||
@ -51,16 +51,10 @@
|
||||
#else
|
||||
#define CXIMAGE_SUPPORT_HEIF 0
|
||||
#endif
|
||||
#ifdef SUPPORT_LIB_WEBP_SOURCES
|
||||
#define CXIMAGE_SUPPORT_WEBP 1
|
||||
#else
|
||||
#define CXIMAGE_SUPPORT_WEBP 0
|
||||
#endif
|
||||
#define CXIMAGE_SUPPORT_RAW 1
|
||||
#else
|
||||
#define CXIMAGE_SUPPORT_HEIF 0
|
||||
#define CXIMAGE_SUPPORT_RAW 0
|
||||
#define CXIMAGE_SUPPORT_WEBP 0
|
||||
#endif
|
||||
|
||||
#ifdef CXIMAGE_DISABLE_SUPPORT_MNG
|
||||
|
||||
@ -136,9 +136,6 @@ CXIMAGE_FORMAR_PIC = 25,
|
||||
#if CXIMAGE_SUPPORT_HEIF
|
||||
CXIMAGE_FORMAT_HEIF = 26,
|
||||
#endif
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
CXIMAGE_FORMAT_WEBP = 27,
|
||||
#endif
|
||||
CMAX_IMAGE_FORMATS = CXIMAGE_SUPPORT_BMP + CXIMAGE_SUPPORT_GIF + CXIMAGE_SUPPORT_JPG +
|
||||
CXIMAGE_SUPPORT_PNG + CXIMAGE_SUPPORT_MNG + CXIMAGE_SUPPORT_ICO +
|
||||
CXIMAGE_SUPPORT_TIF + CXIMAGE_SUPPORT_TGA + CXIMAGE_SUPPORT_PCX +
|
||||
@ -146,7 +143,7 @@ CMAX_IMAGE_FORMATS = CXIMAGE_SUPPORT_BMP + CXIMAGE_SUPPORT_GIF + CXIMAGE_SUPPORT
|
||||
CXIMAGE_SUPPORT_JBG + CXIMAGE_SUPPORT_JP2 + CXIMAGE_SUPPORT_JPC +
|
||||
CXIMAGE_SUPPORT_PGX + CXIMAGE_SUPPORT_PNM + CXIMAGE_SUPPORT_RAS +
|
||||
CXIMAGE_SUPPORT_SKA + CXIMAGE_SUPPORT_RAW + CXIMAGE_SUPPORT_PSD +
|
||||
CXIMAGE_SUPPORT_HEIF + CXIMAGE_SUPPORT_WEBP + 1
|
||||
CXIMAGE_SUPPORT_HEIF + 1
|
||||
};
|
||||
|
||||
#if CXIMAGE_SUPPORT_EXIF
|
||||
|
||||
@ -226,7 +226,7 @@ JSSmart<CJSValue> CDrawingFileEmbed::RedactPage(JSSmart<CJSValue> nPageIndex, JS
|
||||
JSSmart<CJSTypedArray> dataPtr = dataFiller->toTypedArray();
|
||||
CJSDataBuffer buffer = dataPtr->getData();
|
||||
|
||||
result = m_pFile->RedactPage(pageIndex, pBox, nCountBox / 4, buffer.Data, (int)buffer.Len);
|
||||
result = m_pFile->RedactPage(pageIndex, pBox, nCountBox / 8, buffer.Data, (int)buffer.Len, true);
|
||||
|
||||
if (pBox)
|
||||
delete[] pBox;
|
||||
|
||||
@ -837,53 +837,63 @@ public:
|
||||
CSymbolSimpleChecker2 oAllChecker(arSymbolsAll, nMaxSymbol);
|
||||
|
||||
std::map<std::wstring, int> mapFontsPriorityStandard;
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"ASCW3", 1));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Arial", 2));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Times New Roman", 3));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Tahoma", 4));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Cambria", 5));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Calibri", 6));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Verdana", 7));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Georgia", 8));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Open Sans", 9));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Liberation Sans", 10));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Helvetica", 11));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Nimbus Sans L", 12));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"DejaVu Sans", 13));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Liberation Serif", 14));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Trebuchet MS", 15));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Courier New", 16));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Carlito", 17));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Segoe UI", 18));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"SimSun", 19));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"MS Gothic", 20));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Nirmala UI", 21));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Batang", 22));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"MS Mincho", 23));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Wingdings", 24));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Microsoft JhengHei", 25));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Microsoft JhengHei UI", 26));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Microsoft YaHei", 27));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"PMingLiU", 28));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"MingLiU", 29));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"DFKai-SB", 30));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"FangSong", 31));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"KaiTi", 32));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"SimKai", 33));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"SimHei", 34));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Meiryo", 35));
|
||||
int nCurrentPriority = 1;
|
||||
|
||||
#define SET_FONT_PRIORITY(fontName) mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(fontName, nCurrentPriority++))
|
||||
|
||||
SET_FONT_PRIORITY(L"ASCW3");
|
||||
SET_FONT_PRIORITY(L"Arial");
|
||||
SET_FONT_PRIORITY(L"Times New Roman");
|
||||
SET_FONT_PRIORITY(L"Tahoma");
|
||||
SET_FONT_PRIORITY(L"Cambria");
|
||||
SET_FONT_PRIORITY(L"Calibri");
|
||||
SET_FONT_PRIORITY(L"Verdana");
|
||||
SET_FONT_PRIORITY(L"Georgia");
|
||||
SET_FONT_PRIORITY(L"Open Sans");
|
||||
SET_FONT_PRIORITY(L"Liberation Sans");
|
||||
SET_FONT_PRIORITY(L"Helvetica");
|
||||
SET_FONT_PRIORITY(L"Nimbus Sans L");
|
||||
SET_FONT_PRIORITY(L"DejaVu Sans");
|
||||
SET_FONT_PRIORITY(L"Liberation Serif");
|
||||
SET_FONT_PRIORITY(L"Trebuchet MS");
|
||||
SET_FONT_PRIORITY(L"Courier New");
|
||||
SET_FONT_PRIORITY(L"Carlito");
|
||||
SET_FONT_PRIORITY(L"Segoe UI");
|
||||
SET_FONT_PRIORITY(L"SimSun");
|
||||
SET_FONT_PRIORITY(L"MS Gothic");
|
||||
SET_FONT_PRIORITY(L"Nirmala UI");
|
||||
SET_FONT_PRIORITY(L"Batang");
|
||||
SET_FONT_PRIORITY(L"MS Mincho");
|
||||
SET_FONT_PRIORITY(L"Wingdings");
|
||||
SET_FONT_PRIORITY(L"Microsoft JhengHei");
|
||||
SET_FONT_PRIORITY(L"Microsoft JhengHei UI");
|
||||
SET_FONT_PRIORITY(L"Microsoft YaHei");
|
||||
SET_FONT_PRIORITY(L"PMingLiU");
|
||||
SET_FONT_PRIORITY(L"MingLiU");
|
||||
SET_FONT_PRIORITY(L"DFKai-SB");
|
||||
SET_FONT_PRIORITY(L"FangSong");
|
||||
SET_FONT_PRIORITY(L"KaiTi");
|
||||
SET_FONT_PRIORITY(L"SimKai");
|
||||
SET_FONT_PRIORITY(L"SimHei");
|
||||
SET_FONT_PRIORITY(L"Meiryo");
|
||||
|
||||
#ifdef _MAC
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"PingFang SC", 36));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"PingFang TC", 37));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"PingFang HK", 38));
|
||||
SET_FONT_PRIORITY(L"PingFang SC");
|
||||
SET_FONT_PRIORITY(L"PingFang TC");
|
||||
SET_FONT_PRIORITY(L"PingFang HK");
|
||||
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Heiti SC", 39));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Heiti TC", 40));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Songti SC", 41));
|
||||
mapFontsPriorityStandard.insert(std::pair<std::wstring, int>(L"Songti TC", 42));
|
||||
SET_FONT_PRIORITY(L"Heiti SC");
|
||||
SET_FONT_PRIORITY(L"Heiti TC");
|
||||
SET_FONT_PRIORITY(L"Songti SC");
|
||||
SET_FONT_PRIORITY(L"Songti TC");
|
||||
#endif
|
||||
|
||||
SET_FONT_PRIORITY(L"Malgun Gothic");
|
||||
SET_FONT_PRIORITY(L"Nanum Gothic");
|
||||
SET_FONT_PRIORITY(L"NanumGothic");
|
||||
SET_FONT_PRIORITY(L"Noto Sans KR");
|
||||
SET_FONT_PRIORITY(L"TakaoGothic");
|
||||
|
||||
NSFonts::CApplicationFontsSymbols oApplicationChecker;
|
||||
|
||||
// приоритеты шрифтов. по имени (все стили)
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
#include <vector>
|
||||
#include "../graphics/pro/Fonts.h"
|
||||
|
||||
#define ONLYOFFICE_FONTS_VERSION 14
|
||||
#define ONLYOFFICE_FONTS_VERSION 15
|
||||
#define ONLYOFFICE_ALL_FONTS_VERSION 2
|
||||
|
||||
class CApplicationFontsWorkerBreaker
|
||||
|
||||
@ -768,7 +768,17 @@ bool CBooleanOperations::IsSelfInters(const CGraphicsPath& p)
|
||||
|
||||
GetIntersection();
|
||||
|
||||
return !Locations.empty();
|
||||
if (Locations.empty())
|
||||
return false;
|
||||
else
|
||||
{
|
||||
for (const auto& l : Locations)
|
||||
{
|
||||
if (!isZero(l->Time) && !isZero(l->Time - 1.0) && l->C.Segment2.Index != l->Inters->C.Segment1.Index)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CBooleanOperations::TraceBoolean()
|
||||
@ -2338,17 +2348,19 @@ CGraphicsPath CalcBooleanOperation(const CGraphicsPath& path1,
|
||||
std::vector<CGraphicsPath> paths1 = path1.GetSubPaths(),
|
||||
paths2 = path2.GetSubPaths(),
|
||||
paths;
|
||||
|
||||
int skip_end1 = -1;
|
||||
for (size_t i = 0; i < paths2.size(); i++)
|
||||
{
|
||||
int skip_end2 = -1;
|
||||
CBooleanOperations o;
|
||||
if (o.IsSelfInters(paths2[i]))
|
||||
if (i > skip_end2 && o.IsSelfInters(paths2[i]))
|
||||
{
|
||||
CBooleanOperations operation(paths2[i], paths2[i], Intersection, fillType, isLuminosity);
|
||||
CGraphicsPath p = std::move(operation.GetResult());
|
||||
|
||||
std::vector<CGraphicsPath> tmp_paths = p.GetSubPaths();
|
||||
paths2[i] = tmp_paths[0];
|
||||
skip_end2 = i + tmp_paths.size() - 1;
|
||||
for (size_t k = 1; k < tmp_paths.size(); k++)
|
||||
paths2.insert(paths2.begin() + i + k, tmp_paths[k]);
|
||||
}
|
||||
@ -2356,13 +2368,14 @@ CGraphicsPath CalcBooleanOperation(const CGraphicsPath& path1,
|
||||
for (size_t j = 0; j < paths1.size(); j++)
|
||||
{
|
||||
CBooleanOperations o2;
|
||||
if (o2.IsSelfInters(paths1[j]))
|
||||
if (j > skip_end1 && o2.IsSelfInters(paths1[j]))
|
||||
{
|
||||
CBooleanOperations operation(paths1[j], paths1[j], Intersection, fillType, isLuminosity);
|
||||
CGraphicsPath p = std::move(operation.GetResult());
|
||||
|
||||
std::vector<CGraphicsPath> tmp_paths = p.GetSubPaths();
|
||||
paths1[j] = tmp_paths[0];
|
||||
skip_end1 = j + tmp_paths.size() - 1;
|
||||
for (size_t k = 1; k < tmp_paths.size(); k++)
|
||||
paths1.insert(paths1.begin() + i + k, tmp_paths[k]);
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@
|
||||
},
|
||||
{
|
||||
"folder": "../../../common/",
|
||||
"files": ["File.cpp", "Directory.cpp", "ByteBuilder.cpp", "Base64.cpp", "StringExt.cpp", "Path.cpp", "SystemUtils.cpp"]
|
||||
"files": ["File.cpp", "Directory.cpp", "ByteBuilder.cpp", "Base64.cpp", "StringExt.cpp", "Path.cpp", "SystemUtils.cpp", "StringUTF32.cpp", "StringBuilder.cpp"]
|
||||
},
|
||||
{
|
||||
"folder": "../../../../Common/3dParty/icu/icu/source/common/",
|
||||
@ -252,8 +252,8 @@
|
||||
"files": ["BaseItem.cpp", "ContText.cpp", "Paragraph.cpp", "Shape.cpp", "TextLine.cpp", "Table.cpp"]
|
||||
},
|
||||
{
|
||||
"folder": "../../../common",
|
||||
"files": ["StringUTF32.cpp", "StringBuilder.cpp"]
|
||||
"folder": "../../../../OdfFile/Common",
|
||||
"files": ["logging.cpp"]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -621,6 +621,7 @@ function readAnnotType(reader, rec, readDoubleFunc, readDouble2Func, readStringF
|
||||
oFont["vertical"] = readDoubleFunc.call(reader);
|
||||
if (nFontFlag & (1 << 6))
|
||||
oFont["actual"] = readStringFunc.call(reader);
|
||||
oFont["rtl"] = (nFontFlag >> 7) & 1;
|
||||
oFont["size"] = readDoubleFunc.call(reader);
|
||||
oFont["color"] = [];
|
||||
oFont["color"].push(readDouble2Func.call(reader));
|
||||
|
||||
@ -137,7 +137,7 @@ CFile.prototype._UndoMergePages = function()
|
||||
|
||||
CFile.prototype._RedactPage = function(pageIndex, box, filler)
|
||||
{
|
||||
let dataFiller = (undefined !== filler.byteLength) ? new Float64Array(filler) : filler;
|
||||
let dataFiller = (undefined !== filler.byteLength) ? new Uint8Array(filler) : filler;
|
||||
return g_native_drawing_file["RedactPage"](pageIndex, box, dataFiller);
|
||||
};
|
||||
|
||||
|
||||
@ -1046,7 +1046,7 @@ int main(int argc, char* argv[])
|
||||
RELEASEARRAYOBJECTS(pFileData);
|
||||
|
||||
// SPLIT & MERGE
|
||||
if (true)
|
||||
if (false)
|
||||
{
|
||||
int nBufferLen = NULL;
|
||||
BYTE* pBuffer = NULL;
|
||||
@ -1513,6 +1513,8 @@ int main(int argc, char* argv[])
|
||||
std::cout << "; font-actual:" << std::string((char*)(pAnnots + i), nPathLength) << "; ";
|
||||
i += nPathLength;
|
||||
}
|
||||
if (nFontFlag & (1 << 7))
|
||||
std::cout << "; dir:rtl; ";
|
||||
|
||||
nPathLength = READ_INT(pAnnots + i);
|
||||
i += 4;
|
||||
|
||||
@ -121,7 +121,8 @@ METAFILE_PATH = $$PWD/../../raster/Metafile
|
||||
$$METAFILE_PATH/svg/SvgObjects/CFont.h \
|
||||
$$METAFILE_PATH/svg/SvgObjects/CStyle.h \
|
||||
$$METAFILE_PATH/svg/SvgObjects/CObjectBase.h \
|
||||
$$METAFILE_PATH/svg/SvgUtils.h
|
||||
$$METAFILE_PATH/svg/SvgUtils.h \
|
||||
$$METAFILE_PATH/svg/SvgReader.h
|
||||
|
||||
SOURCES += \
|
||||
$$METAFILE_PATH/svg/CSvgFile.cpp \
|
||||
@ -145,7 +146,8 @@ METAFILE_PATH = $$PWD/../../raster/Metafile
|
||||
$$METAFILE_PATH/svg/SvgObjects/CPolyline.cpp \
|
||||
$$METAFILE_PATH/svg/SvgObjects/CFont.cpp \
|
||||
$$METAFILE_PATH/svg/SvgObjects/CObjectBase.cpp \
|
||||
$$METAFILE_PATH/svg/SvgObjects/CStyle.cpp
|
||||
$$METAFILE_PATH/svg/SvgObjects/CStyle.cpp \
|
||||
$$METAFILE_PATH/svg/SvgReader.cpp
|
||||
|
||||
CONFIG += css_calculator_without_xhtml
|
||||
|
||||
|
||||
@ -286,7 +286,6 @@ SOURCES += \
|
||||
|
||||
!build_xp {
|
||||
CONFIG += support_heif
|
||||
CONFIG += support_webp
|
||||
}
|
||||
|
||||
support_heif {
|
||||
@ -295,12 +294,6 @@ support_heif {
|
||||
SOURCES += $$LIB_GRAPHICS_PRI_PATH/raster/heif/heif.cpp
|
||||
}
|
||||
|
||||
support_webp {
|
||||
DEFINES += SUPPORT_LIB_WEBP_SOURCES
|
||||
include($$CORE_ROOT_DIR/Common/3dParty/webp/webp.pri)
|
||||
SOURCES += $$LIB_GRAPHICS_PRI_PATH/raster/WebP/webp.cpp
|
||||
}
|
||||
|
||||
SOURCES += \
|
||||
$$LIB_GRAPHICS_PRI_PATH/cximage/jasper/base/jas_cm.c \
|
||||
$$LIB_GRAPHICS_PRI_PATH/cximage/jasper/base/jas_debug.c \
|
||||
|
||||
@ -48,10 +48,6 @@
|
||||
#include "heif/heif.h"
|
||||
#endif
|
||||
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
#include "WebP/webp.h"
|
||||
#endif
|
||||
|
||||
#include <cmath>
|
||||
#define BGRA_FRAME_CXIMAGE_MAX_MEMORY 67108864 // 256Mb (*4 channel)
|
||||
|
||||
@ -466,13 +462,6 @@ bool CBgraFrame::OpenFile(const std::wstring& strFileName, unsigned int nFileTyp
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
if (CXIMAGE_FORMAT_WEBP == m_nFileType)
|
||||
{
|
||||
return NSWebP::CWebPFile::Open(this, strFileName, m_bIsRGBA);
|
||||
}
|
||||
#endif
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
if (!oFile.OpenFile(strFileName))
|
||||
return false;
|
||||
@ -563,13 +552,6 @@ bool CBgraFrame::Decode(BYTE* pBuffer, int nSize, unsigned int nFileType)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
if (CXIMAGE_FORMAT_WEBP == m_nFileType)
|
||||
{
|
||||
return NSWebP::CWebPFile::Open(this, pBuffer, nSize, m_bIsRGBA);
|
||||
}
|
||||
#endif
|
||||
|
||||
CxImage img;
|
||||
|
||||
if (!img.Decode(pBuffer, nSize, m_nFileType))
|
||||
@ -606,13 +588,6 @@ bool CBgraFrame::SaveFile(const std::wstring& strFileName, unsigned int nFileTyp
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
if (CXIMAGE_FORMAT_WEBP == nFileType)
|
||||
{
|
||||
return NSWebP::CWebPFile::Save(m_pData, m_lWidth, m_lHeight, strFileName, m_bIsRGBA);
|
||||
}
|
||||
#endif
|
||||
|
||||
NSFile::CFileBinary oFile;
|
||||
if (!oFile.CreateFileW(strFileName))
|
||||
return false;
|
||||
|
||||
@ -35,9 +35,6 @@
|
||||
#if CXIMAGE_SUPPORT_HEIF
|
||||
#include "heif/heif.h"
|
||||
#endif
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
#include "WebP/webp.h"
|
||||
#endif
|
||||
|
||||
#ifndef IMAGE_CHECKER_DISABLE_XML
|
||||
#include "../xml/include/xmlutils.h"
|
||||
@ -447,15 +444,6 @@ bool CImageFileFormatChecker::isHeifFile(BYTE* pBuffer, DWORD dwBytes)
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CImageFileFormatChecker::isWebPFile(BYTE* pBuffer, DWORD dwBytes)
|
||||
{
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
return NSWebP::CWebPFile::isWebP(pBuffer, dwBytes);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
bool CImageFileFormatChecker::isImageFile(const std::wstring& fileName)
|
||||
{
|
||||
@ -582,10 +570,6 @@ bool CImageFileFormatChecker::isImageFile(const std::wstring& fileName)
|
||||
{
|
||||
eFileType = _CXIMAGE_FORMAT_HEIF;
|
||||
}
|
||||
else if (isWebPFile(fileName))
|
||||
{
|
||||
eFileType = _CXIMAGE_FORMAT_WEBP;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
delete [] buffer;
|
||||
|
||||
@ -705,10 +689,6 @@ bool CImageFileFormatChecker::isImageFile(BYTE* buffer, DWORD sizeRead)
|
||||
{
|
||||
eFileType = _CXIMAGE_FORMAT_HEIF;
|
||||
}
|
||||
if (isWebPFile(buffer, sizeRead))
|
||||
{
|
||||
eFileType = _CXIMAGE_FORMAT_WEBP;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
if (eFileType) return true;
|
||||
return false;
|
||||
@ -835,15 +815,6 @@ bool CImageFileFormatChecker::isHeifFile(const std::wstring& fileName)
|
||||
#endif
|
||||
}
|
||||
|
||||
bool CImageFileFormatChecker::isWebPFile(const std::wstring& fileName)
|
||||
{
|
||||
#if CXIMAGE_SUPPORT_WEBP
|
||||
return NSWebP::CWebPFile::isWebP(fileName);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
std::wstring CImageFileFormatChecker::DetectFormatByData(BYTE *Data, int DataSize)
|
||||
{
|
||||
if (isBmpFile(Data,DataSize)) return L"bmp";
|
||||
|
||||
@ -64,7 +64,6 @@ enum __ENUM_CXIMAGE_FORMATS
|
||||
_CXIMAGE_FORMAT_SVG = 24,
|
||||
_CXIMAGE_FORMAT_PIC = 25,
|
||||
_CXIMAGE_FORMAT_HEIF = 26,
|
||||
_CXIMAGE_FORMAT_WEBP = 27,
|
||||
};
|
||||
|
||||
class GRAPHICS_DECL CImageFileFormatChecker
|
||||
@ -85,7 +84,6 @@ public:
|
||||
bool isRawFile(const std::wstring& fileName);
|
||||
bool isSvgFile(const std::wstring& fileName);
|
||||
bool isHeifFile(const std::wstring& fileName);
|
||||
bool isWebPFile(const std::wstring& fileName);
|
||||
|
||||
bool isImageFile(BYTE* pBuffer,DWORD dwBytes);
|
||||
bool isBmpFile(BYTE* pBuffer,DWORD dwBytes);
|
||||
@ -116,7 +114,6 @@ public:
|
||||
bool isRawFile(BYTE* pBuffer,DWORD dwBytes);
|
||||
bool isPicFile(BYTE* pBuffer,DWORD dwBytes);
|
||||
bool isHeifFile(BYTE* pBuffer, DWORD dwBytes);
|
||||
bool isWebPFile(BYTE* pBuffer, DWORD dwBytes);
|
||||
|
||||
std::wstring DetectFormatByData(BYTE *Data, int DataSize);
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ namespace MetaFile
|
||||
virtual void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int nBlendMode) = 0;
|
||||
|
||||
virtual void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) = 0;
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) = 0;
|
||||
|
||||
virtual void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) = 0;
|
||||
|
||||
|
||||
@ -352,7 +352,7 @@ namespace MetaFile
|
||||
|
||||
}
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double _dX, double _dY, double* pDx, int iGraphicsMode, double dXScale, double dYScale)
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double _dX, double _dY, double* pDx, int iGraphicsMode, double dXScale, double dYScale, bool bUseGID)
|
||||
{
|
||||
CheckEndPath();
|
||||
const IFont* pFont = m_pFile->GetFont();
|
||||
@ -681,11 +681,12 @@ namespace MetaFile
|
||||
m_pRenderer->put_BrushColor1(m_pFile->GetTextColor());
|
||||
m_pRenderer->put_BrushAlpha1(255);
|
||||
|
||||
if (bUseGID)
|
||||
m_pRenderer->put_FontStringGID(TRUE);
|
||||
|
||||
// Рисуем сам текст
|
||||
if (NULL == pDx)
|
||||
{
|
||||
m_pRenderer->CommandDrawText(wsString, dX, dY, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int unUnicodeLen = 0;
|
||||
@ -704,6 +705,9 @@ namespace MetaFile
|
||||
}
|
||||
}
|
||||
|
||||
if (bUseGID)
|
||||
m_pRenderer->put_FontStringGID(FALSE);
|
||||
|
||||
if (bChangeCTM)
|
||||
m_pRenderer->ResetTransform();
|
||||
}
|
||||
@ -1233,7 +1237,7 @@ namespace MetaFile
|
||||
|
||||
// Вычисление минимально возможной ширины пера
|
||||
// # Код явялется дублированным из Graphics
|
||||
const double dSqrtDet = sqrt(abs(oMatrix.Determinant()));
|
||||
const double dSqrtDet = sqrt(fabs(oMatrix.Determinant()));
|
||||
const double dWidthMinSize = (dSqrtDet != 0) ? (1.0 / dSqrtDet) : dWidth;
|
||||
|
||||
if (0 == pPen->GetWidth())
|
||||
|
||||
@ -999,20 +999,21 @@ namespace MetaFile
|
||||
{
|
||||
std::wstring wsText;
|
||||
for (const wchar_t& wChar : wsString)
|
||||
if (wChar == L'<')
|
||||
{
|
||||
if (wChar == L'<')
|
||||
wsText += L"<";
|
||||
else if (wChar == L'>')
|
||||
else if (wChar == L'>')
|
||||
wsText += L">";
|
||||
else if (wChar == L'&')
|
||||
else if (wChar == L'&')
|
||||
wsText += L"&";
|
||||
else if (wChar == L'\'')
|
||||
else if (wChar == L'\'')
|
||||
wsText += L"'";
|
||||
else if (wChar == L'"')
|
||||
else if (wChar == L'"')
|
||||
wsText += L""";
|
||||
else if (wChar == L'\r' || (wChar >= 0x00 && wChar <=0x1F))
|
||||
continue;
|
||||
|
||||
else wsText += wChar;
|
||||
else wsText += wChar;
|
||||
}
|
||||
return wsText;
|
||||
}
|
||||
|
||||
|
||||
@ -218,7 +218,7 @@ namespace MetaFile
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override {};
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override {};
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override {};
|
||||
|
||||
|
||||
@ -80,10 +80,10 @@ namespace MetaFile
|
||||
}
|
||||
|
||||
void CEmfInterpretatorArray::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,
|
||||
int iGraphicsMode, double dXScale, double dYScale)
|
||||
int iGraphicsMode, double dXScale, double dYScale, bool bUseGID)
|
||||
{
|
||||
for (CEmfInterpretatorBase* pInterpretator : m_arInterpretators)
|
||||
pInterpretator->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale);
|
||||
pInterpretator->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale, bUseGID);
|
||||
}
|
||||
|
||||
void CEmfInterpretatorArray::DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints)
|
||||
|
||||
@ -36,7 +36,7 @@ namespace MetaFile
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override;
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override;
|
||||
|
||||
|
||||
@ -41,10 +41,10 @@ namespace MetaFile
|
||||
}
|
||||
|
||||
void CEmfInterpretatorRender::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,
|
||||
int iGraphicsMode, double dXScale, double dYScale)
|
||||
int iGraphicsMode, double dXScale, double dYScale, bool bUseGID)
|
||||
{
|
||||
if (NULL != m_pMetaFileRenderer)
|
||||
m_pMetaFileRenderer->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale);
|
||||
m_pMetaFileRenderer->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale, bUseGID);
|
||||
}
|
||||
|
||||
void CEmfInterpretatorRender::DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints)
|
||||
|
||||
@ -22,7 +22,7 @@ namespace MetaFile
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override;
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override;
|
||||
|
||||
|
||||
@ -346,7 +346,7 @@ namespace MetaFile
|
||||
if (NULL != oTEmfExtTextoutA.oEmrText.pOutputDx)
|
||||
arDx = std::vector<double>(oTEmfExtTextoutA.oEmrText.pOutputDx, oTEmfExtTextoutA.oEmrText.pOutputDx + oTEmfExtTextoutA.oEmrText.unChars);
|
||||
|
||||
WriteText(wsText, TPointD(oTEmfExtTextoutA.oEmrText.oReference.X, oTEmfExtTextoutA.oEmrText.oReference.Y), oTEmfExtTextoutA.oBounds, TPointD(oTEmfExtTextoutA.dExScale, oTEmfExtTextoutA.dEyScale), arDx);
|
||||
WriteText(wsText, TPointD(oTEmfExtTextoutA.oEmrText.oReference.X, oTEmfExtTextoutA.oEmrText.oReference.Y), oTEmfExtTextoutA.oBounds, TPointD(oTEmfExtTextoutA.dExScale, oTEmfExtTextoutA.dEyScale), arDx, oTEmfExtTextoutA.oEmrText.unOptions & 0x00000010);
|
||||
}
|
||||
|
||||
void CEmfInterpretatorSvg::HANDLE_EMR_EXTTEXTOUTW(const TEmfExtTextoutW &oTEmfExtTextoutW)
|
||||
@ -358,7 +358,7 @@ namespace MetaFile
|
||||
if (NULL != oTEmfExtTextoutW.oEmrText.pOutputDx)
|
||||
arDx = std::vector<double>(oTEmfExtTextoutW.oEmrText.pOutputDx, oTEmfExtTextoutW.oEmrText.pOutputDx + oTEmfExtTextoutW.oEmrText.unChars);
|
||||
|
||||
WriteText(wsText, TPointD(oTEmfExtTextoutW.oEmrText.oReference.X, oTEmfExtTextoutW.oEmrText.oReference.Y), oTEmfExtTextoutW.oBounds, TPointD(oTEmfExtTextoutW.dExScale, oTEmfExtTextoutW.dEyScale), arDx);
|
||||
WriteText(wsText, TPointD(oTEmfExtTextoutW.oEmrText.oReference.X, oTEmfExtTextoutW.oEmrText.oReference.Y), oTEmfExtTextoutW.oBounds, TPointD(oTEmfExtTextoutW.dExScale, oTEmfExtTextoutW.dEyScale), arDx, oTEmfExtTextoutW.oEmrText.unOptions & 0x00000010);
|
||||
}
|
||||
|
||||
void CEmfInterpretatorSvg::HANDLE_EMR_LINETO(const TPointL &oPoint)
|
||||
|
||||
@ -202,7 +202,7 @@ namespace MetaFile
|
||||
void End() override {};
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override {};
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override {};
|
||||
|
||||
|
||||
@ -216,7 +216,7 @@ namespace MetaFile
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override {};
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override {};
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override {};
|
||||
|
||||
|
||||
@ -411,7 +411,7 @@ namespace MetaFile
|
||||
}
|
||||
|
||||
void CEmfParserBase::DrawText(std::wstring &wsString, unsigned int unCharsCount, int _nX, int _nY,
|
||||
int *pnDx, int iGraphicsMode, TScale oScale)
|
||||
int *pnDx, int iGraphicsMode, TScale oScale, bool bUseGID)
|
||||
{
|
||||
int nX = _nX;
|
||||
int nY = _nY;
|
||||
@ -448,7 +448,7 @@ namespace MetaFile
|
||||
}
|
||||
}
|
||||
|
||||
m_pInterpretator->DrawString(wsString, unCharsCount, dX, dY, pdDx, iGraphicsMode, oScale.X, oScale.Y);
|
||||
m_pInterpretator->DrawString(wsString, unCharsCount, dX, dY, pdDx, iGraphicsMode, oScale.X, oScale.Y, bUseGID);
|
||||
|
||||
if (pdDx)
|
||||
delete[] pdDx;
|
||||
@ -480,7 +480,7 @@ namespace MetaFile
|
||||
}
|
||||
}
|
||||
|
||||
DrawText(wsText, oText.unChars, oText.oReference.X, oText.oReference.Y, pDx, iGraphicsMode, oScale);
|
||||
DrawText(wsText, oText.unChars, oText.oReference.X, oText.oReference.Y, pDx, iGraphicsMode, oScale, oText.unOptions & 0x00000010);
|
||||
|
||||
if (pDx)
|
||||
delete[] pDx;
|
||||
@ -550,7 +550,7 @@ namespace MetaFile
|
||||
}
|
||||
|
||||
if (unLen)
|
||||
DrawText(wsText, unLen, oText.oReference.X, oText.oReference.Y, pDx, iGraphicsMode, oScale);
|
||||
DrawText(wsText, unLen, oText.oReference.X, oText.oReference.Y, pDx, iGraphicsMode, oScale, oText.unOptions & 0x00000010);
|
||||
|
||||
if (pDx)
|
||||
delete[] pDx;
|
||||
|
||||
@ -156,7 +156,7 @@ namespace MetaFile
|
||||
void ArcTo(int nL, int nT, int nR, int nB, double dStart, double dSweep);
|
||||
|
||||
void DrawPath(bool bStroke, bool bFill, bool bClosePath = true);
|
||||
void DrawText(std::wstring &wsString, unsigned int unCharsCount, int _nX, int _nY, int *pnDx, int iGraphicsMode, TScale oScale);
|
||||
void DrawText(std::wstring &wsString, unsigned int unCharsCount, int _nX, int _nY, int *pnDx, int iGraphicsMode, TScale oScale, bool bUseGID);
|
||||
void DrawTextA(TEmrTextA &oText, int iGraphicsMode, TScale oScale = TScale(1, 1));
|
||||
void DrawTextW(TEmrTextW &oText, int iGraphicsMode, TScale oScale = TScale(1, 1));
|
||||
|
||||
|
||||
@ -68,6 +68,10 @@ namespace MetaFile
|
||||
#ifdef METAFILE_SUPPORT_SVM
|
||||
m_oSvmFile.SetFontManager(m_pFontManager);
|
||||
#endif
|
||||
|
||||
#ifdef METAFILE_SUPPORT_SVG
|
||||
m_oSvgFile.SetFontManager(m_pFontManager);
|
||||
#endif
|
||||
m_lType = 0;
|
||||
}
|
||||
|
||||
@ -84,7 +88,6 @@ namespace MetaFile
|
||||
|
||||
std::wstring CMetaFile::ConvertToSvg(unsigned int unWidth, unsigned int unHeight)
|
||||
{
|
||||
|
||||
#ifdef METAFILE_SUPPORT_WMF_EMF
|
||||
if (c_lMetaWmf == m_lType)
|
||||
{
|
||||
|
||||
@ -217,15 +217,23 @@ namespace MetaFile
|
||||
m_pXmlWriter->WriteNodeEnd(wsNodeName, false, false);
|
||||
}
|
||||
|
||||
void CInterpretatorSvgBase::WriteText(const std::wstring &wsText, const TPointD &oCoord, const TRectL &oBounds, const TPointD &oScale, const std::vector<double>& arDx)
|
||||
void UpdateStringByGID(std::wstring &wsValue, const std::wstring& wsFontName, const double& dFontSize, const int& nFontStyle, NSFonts::IFontManager* pFontManeger)
|
||||
{
|
||||
if (nullptr == pFontManeger)
|
||||
return;
|
||||
|
||||
pFontManeger->LoadFontByName(wsFontName, dFontSize, nFontStyle, 96, 96);
|
||||
|
||||
for (wchar_t& wChar : wsValue)
|
||||
wChar = (wchar_t)pFontManeger->GetUnicodeByGID(wChar);
|
||||
}
|
||||
|
||||
void CInterpretatorSvgBase::WriteText(const std::wstring &wsText, const TPointD &oCoord, const TRectL &oBounds, const TPointD &oScale, const std::vector<double>& arDx, bool bUseGID)
|
||||
{
|
||||
if (NULL == m_pParser || NULL == m_pParser->GetFont())
|
||||
return;
|
||||
|
||||
const std::wstring wsNormalizedText = StringNormalization(wsText);
|
||||
|
||||
if (wsNormalizedText.empty())
|
||||
return;
|
||||
std::wstring wsNormalizedText{wsText};
|
||||
|
||||
AddClip();
|
||||
|
||||
@ -298,6 +306,22 @@ namespace MetaFile
|
||||
oFontName.WriteEncodeXmlString(pFontInfo->m_wsFontName);
|
||||
oFontName.WriteEncodeXmlString(L"\'");
|
||||
}
|
||||
|
||||
if (bUseGID)
|
||||
{
|
||||
int nStyle = 0;
|
||||
if (pFont->GetWeight() > 550)
|
||||
nStyle |= 0x01;
|
||||
if (pFont->IsItalic())
|
||||
nStyle |= 0x02;
|
||||
if (pFont->IsUnderline())
|
||||
nStyle |= (1 << 2);
|
||||
if (pFont->IsStrikeOut())
|
||||
nStyle |= (1 << 7);
|
||||
|
||||
UpdateStringByGID(wsNormalizedText, (NULL != pFontInfo) ? pFontInfo->m_wsFontName : pFont->GetFaceName(),
|
||||
dFontHeight, nStyle, m_pParser->GetFontManager());
|
||||
}
|
||||
#endif
|
||||
arNodeAttributes.Add(L"font-family", oFontName.GetData());
|
||||
}
|
||||
@ -424,7 +448,7 @@ namespace MetaFile
|
||||
arNodeAttributes.Add(L"x", wsXCoord);
|
||||
arNodeAttributes.Add(L"y", dYCoord);
|
||||
|
||||
WriteNode(L"text", arNodeAttributes, wsNormalizedText);
|
||||
WriteNode(L"text", arNodeAttributes, StringNormalization(wsNormalizedText));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -436,7 +460,7 @@ namespace MetaFile
|
||||
do
|
||||
{
|
||||
WriteNode(L"tspan", {{L"x", wsXCoord},
|
||||
{L"y", ConvertToWString(dYNewCoord)}}, wsNormalizedText.substr(unStart, unPosLineBreak - unStart));
|
||||
{L"y", ConvertToWString(dYNewCoord)}}, StringNormalization(wsNormalizedText.substr(unStart, unPosLineBreak - unStart)));
|
||||
|
||||
dYNewCoord += dFontHeight * 1.6;
|
||||
unStart = wsNormalizedText.find_first_not_of(L"\n", unPosLineBreak);
|
||||
|
||||
@ -106,7 +106,7 @@ namespace MetaFile
|
||||
void WriteNode(const std::wstring& wsNodeName, const NodeAttributes& arAttributes, const std::wstring& wsValueNode = L"");
|
||||
void WriteNodeBegin(const std::wstring& wsNodeName, const NodeAttributes& arAttributes);
|
||||
void WriteNodeEnd(const std::wstring& wsNodeName);
|
||||
void WriteText(const std::wstring& wsText, const TPointD& oCoord, const TRectL& oBounds = TRectL(), const TPointD& oScale = TPointD(1, 1), const std::vector<double>& arDx = {});
|
||||
void WriteText(const std::wstring& wsText, const TPointD& oCoord, const TRectL& oBounds = TRectL(), const TPointD& oScale = TPointD(1, 1), const std::vector<double>& arDx = {}, bool bUseGID = false);
|
||||
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
|
||||
|
||||
|
||||
@ -29,10 +29,10 @@ namespace MetaFile
|
||||
}
|
||||
|
||||
void CWmfInterpretatorRender::DrawString(std::wstring &wsText, unsigned int unCharsCount, double dX, double dY, double *pDx,
|
||||
int iGraphicsMode, double dXScale, double dYScale)
|
||||
int iGraphicsMode, double dXScale, double dYScale, bool bUseGID)
|
||||
{
|
||||
if (NULL != m_pMetaFileRenderer)
|
||||
m_pMetaFileRenderer->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale);
|
||||
m_pMetaFileRenderer->DrawString(wsText, unCharsCount, dX, dY, pDx, iGraphicsMode, dXScale, dYScale, bUseGID);
|
||||
}
|
||||
|
||||
void CWmfInterpretatorRender::DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints)
|
||||
|
||||
@ -19,7 +19,7 @@ namespace MetaFile
|
||||
void DrawBitmap(double dX, double dY, double dW, double dH, BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, unsigned int unBlendMode) override;
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override;
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override;
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override;
|
||||
|
||||
|
||||
@ -109,7 +109,7 @@ namespace MetaFile
|
||||
void End() override {};
|
||||
|
||||
void DrawString(std::wstring& wsText, unsigned int unCharsCount, double dX, double dY, double* pDx,
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1) override {};
|
||||
int iGraphicsMode = 1, double dXScale = 1, double dYScale = 1, bool bUseGID = false) override {};
|
||||
|
||||
void DrawDriverString(const std::wstring& wsString, const std::vector<TPointD>& arPoints) override {};
|
||||
|
||||
|
||||
@ -1740,8 +1740,8 @@ namespace MetaFile
|
||||
const TRectL& oEmfRect{oEmfParser.GetDCBounds()};
|
||||
const TRectL& oCurentRect{GetDCBounds()};
|
||||
|
||||
const double dScaleX = std::abs((oCurentRect.Right - oCurentRect.Left) / (oEmfRect.Right - oEmfRect.Left));
|
||||
const double dScaleY = std::abs((oCurentRect.Bottom - oCurentRect.Top) / (oEmfRect.Bottom - oEmfRect.Top));
|
||||
const double dScaleX = std::abs((double)(oCurentRect.Right - oCurentRect.Left) / (double)(oEmfRect.Right - oEmfRect.Left));
|
||||
const double dScaleY = std::abs((double)(oCurentRect.Bottom - oCurentRect.Top) / (double)(oEmfRect.Bottom - oEmfRect.Top));
|
||||
|
||||
const bool bAddGElement = !Equals(1., dScaleX) || !Equals(1., dScaleY);
|
||||
|
||||
|
||||
@ -3,11 +3,13 @@
|
||||
#include "SvgObjects/CContainer.h"
|
||||
#include "SvgObjects/CFont.h"
|
||||
|
||||
#include "CSvgParser.h"
|
||||
|
||||
#define SVG_FILE_WIDTH 300
|
||||
#define SVG_FILE_HEIGHT 150
|
||||
|
||||
CSvgFile::CSvgFile()
|
||||
: m_oContainer(L"svg")
|
||||
: m_pContainer(NULL), m_pFontManager(NULL)
|
||||
{}
|
||||
|
||||
CSvgFile::~CSvgFile()
|
||||
@ -24,7 +26,10 @@ bool CSvgFile::ReadFromBuffer(BYTE *pBuffer, unsigned int unSize)
|
||||
bool CSvgFile::ReadFromWString(const std::wstring &wsContext)
|
||||
{
|
||||
Clear();
|
||||
return m_oParser.LoadFromString(wsContext, &m_oContainer, this);
|
||||
|
||||
SVG::CSvgParser oSvgParser(m_pFontManager);
|
||||
|
||||
return oSvgParser.LoadFromString(wsContext, m_pContainer, this);
|
||||
}
|
||||
|
||||
bool CSvgFile::OpenFromFile(const std::wstring &wsFile)
|
||||
@ -33,58 +38,14 @@ bool CSvgFile::OpenFromFile(const std::wstring &wsFile)
|
||||
|
||||
m_wsWorkingDirectory = NSFile::GetDirectoryName(wsFile);
|
||||
|
||||
return m_oParser.LoadFromFile(wsFile, &m_oContainer, this);
|
||||
SVG::CSvgParser oSvgParser(m_pFontManager);
|
||||
|
||||
return oSvgParser.LoadFromFile(wsFile, m_pContainer, this);
|
||||
}
|
||||
|
||||
bool CSvgFile::GetBounds(double &dX, double &dY, double &dWidth, double &dHeight) const
|
||||
{
|
||||
if (m_oContainer.Empty())
|
||||
return false;
|
||||
|
||||
SVG::TRect oWindow = m_oContainer.GetWindow();
|
||||
|
||||
dX = oWindow.m_oX.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH);
|
||||
dY = oWindow.m_oY.ToDouble(NSCSS::Pixel, SVG_FILE_HEIGHT);
|
||||
|
||||
dWidth = 0.;
|
||||
dHeight = 0.;
|
||||
|
||||
if (!oWindow.m_oWidth.Empty() && !oWindow.m_oWidth.Zero())
|
||||
{
|
||||
if (NSCSS::Percent == oWindow.m_oWidth.GetUnitMeasure())
|
||||
{
|
||||
if (!m_oContainer.GetViewBox().m_oWidth.Empty() && !m_oContainer.GetViewBox().m_oWidth.Zero())
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oWidth.ToDouble(NSCSS::Pixel));
|
||||
else
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH);
|
||||
}
|
||||
else
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel);
|
||||
}
|
||||
else
|
||||
dWidth = m_oContainer.GetViewBox().m_oWidth.ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (!oWindow.m_oHeight.Empty() && !oWindow.m_oHeight.Zero())
|
||||
{
|
||||
if (NSCSS::Percent == oWindow.m_oHeight.GetUnitMeasure())
|
||||
{
|
||||
if (!m_oContainer.GetViewBox().m_oHeight.Empty() && !m_oContainer.GetViewBox().m_oHeight.Zero())
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, m_oContainer.GetViewBox().m_oHeight.ToDouble(NSCSS::Pixel));
|
||||
else
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH);
|
||||
}
|
||||
else
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel);
|
||||
}
|
||||
else
|
||||
dHeight = m_oContainer.GetViewBox().m_oHeight.ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (DBL_EPSILON > dWidth)
|
||||
dWidth = SVG_FILE_WIDTH;
|
||||
if (DBL_EPSILON > dHeight)
|
||||
dHeight = SVG_FILE_HEIGHT;
|
||||
|
||||
return true;
|
||||
return CalculateFinalSize(true, dX, dY, dWidth, dHeight);
|
||||
}
|
||||
|
||||
const SVG::CSvgCalculator *CSvgFile::GetSvgCalculator() const
|
||||
@ -94,7 +55,7 @@ const SVG::CSvgCalculator *CSvgFile::GetSvgCalculator() const
|
||||
|
||||
void CSvgFile::SetFontManager(NSFonts::IFontManager *pFontManager)
|
||||
{
|
||||
m_oParser.SetFontManager(pFontManager);
|
||||
m_pFontManager = pFontManager;
|
||||
}
|
||||
|
||||
void CSvgFile::SetWorkingDirectory(const std::wstring &wsWorkingDirectory)
|
||||
@ -107,7 +68,13 @@ bool CSvgFile::MarkObject(SVG::CObject *pObject)
|
||||
if (NULL == pObject || pObject->GetId().empty())
|
||||
return false;
|
||||
|
||||
pObject->AddRef();
|
||||
pObject->Mark();
|
||||
|
||||
const MarkedMap::const_iterator itFound = m_mMarkedObjects.find(pObject->GetId());
|
||||
|
||||
if (m_mMarkedObjects.cend() != itFound)
|
||||
RELEASEINTERFACE(m_mMarkedObjects[pObject->GetId()])
|
||||
|
||||
m_mMarkedObjects[pObject->GetId()] = pObject;
|
||||
|
||||
return true;
|
||||
@ -160,69 +127,41 @@ void CSvgFile::AddFontFace(const SVG::TFontArguments& oArguments, const std::wst
|
||||
|
||||
bool CSvgFile::Draw(IRenderer *pRenderer, double dX, double dY, double dWidth, double dHeight)
|
||||
{
|
||||
if (NULL == pRenderer || m_oContainer.Empty())
|
||||
if (NULL == pRenderer || NULL == m_pContainer || m_pContainer->Empty())
|
||||
return false;
|
||||
|
||||
SVG::TRect oWindow = m_oContainer.GetWindow();
|
||||
SVG::TRect oViewBox = m_oContainer.GetViewBox();
|
||||
double dFileX, dFileY, dFileWidth, dFileHeight;
|
||||
|
||||
if (oWindow.m_oWidth.Empty() || oWindow.m_oWidth.Zero())
|
||||
{
|
||||
if (oViewBox.m_oWidth.Empty() || oViewBox.m_oWidth.Zero())
|
||||
oWindow.m_oWidth = SVG_FILE_WIDTH;
|
||||
else
|
||||
{
|
||||
oWindow.m_oWidth = oViewBox.m_oWidth;
|
||||
oViewBox.m_oWidth.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (oWindow.m_oHeight.Empty() || oWindow.m_oHeight.Zero())
|
||||
{
|
||||
if (oViewBox.m_oHeight.Empty() || oViewBox.m_oHeight.Zero())
|
||||
oWindow.m_oHeight = SVG_FILE_HEIGHT;
|
||||
else
|
||||
{
|
||||
oWindow.m_oHeight = oViewBox.m_oHeight;
|
||||
oViewBox.m_oHeight.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
double dViewBoxWidth = oViewBox.m_oWidth.ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH);
|
||||
double dViewBoxHeight = oViewBox.m_oHeight.ToDouble(NSCSS::Pixel, SVG_FILE_HEIGHT);
|
||||
|
||||
double dWindowWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, dViewBoxWidth);
|
||||
double dWindowHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, dViewBoxHeight);
|
||||
|
||||
if (SVG::Equals(0., dWindowWidth) || SVG::Equals(0., dWindowHeight))
|
||||
if (!CalculateFinalSize(false, dFileX, dFileY, dFileWidth, dFileHeight))
|
||||
return false;
|
||||
|
||||
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->ResetTransform();
|
||||
|
||||
double dM11 = dWidth / dWindowWidth;
|
||||
double dM22 = dHeight / dWindowHeight;
|
||||
const double dM11 = dWidth / dFileWidth;
|
||||
const double dM22 = dHeight / dFileHeight;
|
||||
|
||||
double dScaleX = 1, dScaleY = 1;
|
||||
double dScaleX = 1.,
|
||||
dScaleY = 1.;
|
||||
double dTranslateX = dFileX * dM11,
|
||||
dTranslateY = dFileY * dM22;
|
||||
|
||||
if (!SVG::Equals(0., dViewBoxWidth))
|
||||
dScaleX = dWindowWidth / dViewBoxWidth;
|
||||
const SVG::TRect oViewBox{m_pContainer->GetViewBox()};
|
||||
|
||||
if (!SVG::Equals(0., dViewBoxHeight))
|
||||
dScaleY = dWindowHeight / dViewBoxHeight;
|
||||
if (!oViewBox.m_oWidth.Empty() && !oViewBox.m_oHeight.Empty())
|
||||
{
|
||||
dScaleX = dFileWidth / oViewBox.m_oWidth .ToDouble(NSCSS::Pixel, SVG_FILE_WIDTH );
|
||||
dScaleY = dFileHeight / oViewBox.m_oHeight.ToDouble(NSCSS::Pixel, SVG_FILE_HEIGHT);
|
||||
|
||||
double dMinScale = std::min(dScaleX, dScaleY);
|
||||
dTranslateX -= oViewBox.m_oX.ToDouble(NSCSS::Pixel) * dScaleX * dM11;
|
||||
dTranslateY -= oViewBox.m_oY.ToDouble(NSCSS::Pixel) * dScaleY * dM22;
|
||||
}
|
||||
|
||||
double dSkipX = -oViewBox.m_oX.ToDouble(NSCSS::Pixel) * dScaleX * dM11;
|
||||
double dSkipY = -oViewBox.m_oY.ToDouble(NSCSS::Pixel) * dScaleY * dM22;
|
||||
pRenderer->SetTransform(dM11 * dScaleX, 0, 0, dM22 * dScaleY, dTranslateX, dTranslateY);
|
||||
|
||||
pRenderer->SetTransform(dM11 * dMinScale, 0, 0, dM22 * dMinScale, dSkipX, dSkipY);
|
||||
|
||||
bool bResult = m_oContainer.Draw(pRenderer, this);
|
||||
bool bResult = m_pContainer->Draw(pRenderer, this);
|
||||
|
||||
pRenderer->SetTransform(oldTransform[0], oldTransform[1], oldTransform[2], oldTransform[3], oldTransform[4], oldTransform[5]);
|
||||
|
||||
@ -231,7 +170,7 @@ bool CSvgFile::Draw(IRenderer *pRenderer, double dX, double dY, double dWidth, d
|
||||
|
||||
void CSvgFile::Clear()
|
||||
{
|
||||
m_oContainer.Clear();
|
||||
RELEASEINTERFACE(m_pContainer);
|
||||
m_oSvgCalculator.Clear();
|
||||
|
||||
for (MarkedMap::reference oIter : m_mMarkedObjects)
|
||||
@ -240,3 +179,141 @@ void CSvgFile::Clear()
|
||||
m_mMarkedObjects.clear();
|
||||
m_wsWorkingDirectory.clear();
|
||||
}
|
||||
|
||||
bool CSvgFile::CalculateFinalSize(bool bUseViewBox, double& dX, double& dY, double& dWidth, double& dHeight) const
|
||||
{
|
||||
if (NULL == m_pContainer || m_pContainer->Empty())
|
||||
return false;
|
||||
|
||||
const SVG::TRect oWindow = m_pContainer->GetWindow();
|
||||
const SVG::TRect oViewBox = m_pContainer->GetViewBox();
|
||||
|
||||
const double dViewBoxWidth {oViewBox.m_oWidth .ToDouble()};
|
||||
const double dViewBoxHeigth{oViewBox.m_oHeight.ToDouble()};
|
||||
|
||||
dX = 0.;
|
||||
dY = 0.;
|
||||
|
||||
dWidth = 0.;
|
||||
dHeight = 0.;
|
||||
|
||||
#define GET_PREV_WIDTH_VALUE ((NSCSS::UnitMeasure::Em == oWindow.m_oWidth.GetUnitMeasure() || NSCSS::UnitMeasure::Rem == oWindow.m_oWidth.GetUnitMeasure()) ? DEFAULT_FONT_SIZE : ((!SVG::Equals(0., dViewBoxWidth )) ? dViewBoxWidth : SVG_FILE_WIDTH))
|
||||
#define GET_PREV_HEIGHT_VALUE ((NSCSS::UnitMeasure::Em == oWindow.m_oHeight.GetUnitMeasure() || NSCSS::UnitMeasure::Rem == oWindow.m_oHeight.GetUnitMeasure()) ? DEFAULT_FONT_SIZE : ((!SVG::Equals(0., dViewBoxHeigth )) ? dViewBoxHeigth : SVG_FILE_HEIGHT))
|
||||
|
||||
if (!oWindow.m_oWidth.Empty() && !oWindow.m_oHeight.Empty())
|
||||
{
|
||||
dWidth = oWindow.m_oWidth .ToDouble(NSCSS::Pixel, GET_PREV_WIDTH_VALUE);
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, GET_PREV_HEIGHT_VALUE);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (bUseViewBox)
|
||||
{
|
||||
if (!oViewBox.m_oWidth.Empty() && !oViewBox.m_oHeight.Empty())
|
||||
{
|
||||
if (!oWindow.m_oWidth.Empty())
|
||||
{
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, GET_PREV_WIDTH_VALUE);
|
||||
const double dAspectRatio{dViewBoxWidth / dViewBoxHeigth};
|
||||
dHeight = dWidth / dAspectRatio;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!oWindow.m_oHeight.Empty())
|
||||
{
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, GET_PREV_HEIGHT_VALUE);
|
||||
const double dAspectRatio{dViewBoxWidth / dViewBoxHeigth};
|
||||
dWidth = dHeight * dAspectRatio;
|
||||
return true;
|
||||
}
|
||||
|
||||
dX = oViewBox.m_oX.ToDouble();
|
||||
dY = oViewBox.m_oY.ToDouble();
|
||||
|
||||
dWidth = dViewBoxWidth;
|
||||
dHeight = dViewBoxHeigth;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!oWindow.m_oWidth.Empty() || !oWindow.m_oHeight.Empty())
|
||||
{
|
||||
if (!oViewBox.m_oWidth.Empty() && !oViewBox.m_oHeight.Empty())
|
||||
{
|
||||
const double dAspectRatio{dViewBoxWidth / dViewBoxHeigth};
|
||||
|
||||
if (!oWindow.m_oWidth.Empty())
|
||||
{
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, GET_PREV_WIDTH_VALUE);
|
||||
dHeight = dWidth / dAspectRatio;
|
||||
}
|
||||
else if (!oWindow.m_oHeight.Empty())
|
||||
{
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, GET_PREV_HEIGHT_VALUE);
|
||||
dWidth = dHeight * dAspectRatio;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (NULL != m_pContainer && !m_pContainer->Empty())
|
||||
{
|
||||
SVG::SvgMatrix oTransform;
|
||||
const SVG::TBounds oBounds{m_pContainer->GetBounds(&oTransform)};
|
||||
|
||||
const double dContentWidth {oBounds.m_dRight - oBounds.m_dLeft};
|
||||
const double dContentHeight{oBounds.m_dBottom - oBounds.m_dTop };
|
||||
|
||||
const double dAspectRatio{dContentWidth / dContentHeight};
|
||||
|
||||
if (!oWindow.m_oWidth.Empty())
|
||||
{
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, GET_PREV_WIDTH_VALUE);
|
||||
dHeight = dWidth / dAspectRatio;
|
||||
}
|
||||
else if (!oWindow.m_oHeight.Empty())
|
||||
{
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, GET_PREV_HEIGHT_VALUE);
|
||||
dWidth = dHeight * dAspectRatio;
|
||||
}
|
||||
|
||||
dX = oBounds.m_dLeft;
|
||||
dY = oBounds.m_dTop;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!oWindow.m_oWidth.Empty())
|
||||
{
|
||||
dWidth = oWindow.m_oWidth.ToDouble(NSCSS::Pixel, GET_PREV_WIDTH_VALUE);
|
||||
dHeight = SVG_FILE_HEIGHT;
|
||||
}
|
||||
else if (!oWindow.m_oHeight.Empty())
|
||||
{
|
||||
dHeight = oWindow.m_oHeight.ToDouble(NSCSS::Pixel, GET_PREV_HEIGHT_VALUE);
|
||||
dWidth = SVG_FILE_WIDTH;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (NULL != m_pContainer && !m_pContainer->Empty())
|
||||
{
|
||||
SVG::SvgMatrix oTransform;
|
||||
const SVG::TBounds oBounds{m_pContainer->GetBounds(&oTransform)};
|
||||
|
||||
dX = oBounds.m_dLeft;
|
||||
dY = oBounds.m_dTop;
|
||||
|
||||
dWidth = oBounds.m_dRight - oBounds.m_dLeft;
|
||||
dHeight = oBounds.m_dBottom - oBounds.m_dTop;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
dWidth = SVG_FILE_WIDTH;
|
||||
dHeight = SVG_FILE_HEIGHT;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
#include "../../../graphics/IRenderer.h"
|
||||
#include "../../../graphics/pro/Fonts.h"
|
||||
|
||||
#include "CSvgParser.h"
|
||||
#include "SvgObjects/CStyle.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
struct TFontArguments;
|
||||
class CFont;
|
||||
class CGraphicsContainer;
|
||||
}
|
||||
|
||||
class CSvgFile
|
||||
@ -43,9 +43,11 @@ class CSvgFile
|
||||
private:
|
||||
void Clear();
|
||||
|
||||
SVG::CSvgParser m_oParser;
|
||||
SVG::CGraphicsContainer m_oContainer;
|
||||
bool CalculateFinalSize(bool bUseViewBox, double& dX, double& dY, double& dWidth, double& dHeight) const;
|
||||
|
||||
SVG::CGraphicsContainer *m_pContainer;
|
||||
SVG::CSvgCalculator m_oSvgCalculator;
|
||||
NSFonts::IFontManager *m_pFontManager;
|
||||
|
||||
typedef std::map<std::wstring, SVG::CObject*> MarkedMap;
|
||||
|
||||
|
||||
@ -24,16 +24,16 @@
|
||||
#include "SvgObjects/CMask.h"
|
||||
#include "SvgObjects/CUse.h"
|
||||
|
||||
#include "../../../../Common/3dParty/html/css/src/StaticFunctions.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CSvgParser::CSvgParser()
|
||||
: m_pFontManager(NULL)
|
||||
{
|
||||
}
|
||||
CSvgParser::CSvgParser(NSFonts::IFontManager* pFontManager)
|
||||
: m_pFontManager(pFontManager)
|
||||
{}
|
||||
|
||||
CSvgParser::~CSvgParser()
|
||||
{
|
||||
}
|
||||
{}
|
||||
|
||||
void CSvgParser::SetFontManager(NSFonts::IFontManager *pFontManager)
|
||||
{
|
||||
@ -74,7 +74,7 @@ namespace SVG
|
||||
return std::string(itEncodingValueBegin, itEncodingValueEnd);
|
||||
}
|
||||
|
||||
bool CSvgParser::LoadFromFile(const std::wstring &wsFile, CGraphicsContainer* pContainer, CSvgFile* pFile) const
|
||||
bool CSvgParser::LoadFromFile(const std::wstring &wsFile, CGraphicsContainer*& pContainer, CSvgFile* pFile) const
|
||||
{
|
||||
if (wsFile.empty() || NULL == pFile)
|
||||
return false;
|
||||
@ -102,69 +102,54 @@ namespace SVG
|
||||
else
|
||||
return false;
|
||||
|
||||
XmlUtils::IXmlDOMDocument::DisableOutput();
|
||||
bool bResult = LoadFromString(wsContent, pContainer, pFile);
|
||||
XmlUtils::IXmlDOMDocument::EnableOutput();
|
||||
|
||||
return bResult;
|
||||
return LoadFromString(wsContent, pContainer, pFile);
|
||||
}
|
||||
|
||||
bool CSvgParser::LoadFromString(const std::wstring &wsContentent, CGraphicsContainer* pContainer, CSvgFile* pFile) const
|
||||
bool CSvgParser::LoadFromString(const std::wstring &wsContent, CGraphicsContainer*& pContainer, CSvgFile* pFile) const
|
||||
{
|
||||
if (wsContentent.empty() || NULL == pFile)
|
||||
if (wsContent.empty() || NULL == pFile)
|
||||
return false;
|
||||
|
||||
XmlUtils::CXmlNode oXml;
|
||||
if (!oXml.FromXmlString(wsContentent))
|
||||
CSvgReader oReader;
|
||||
if (!oReader.ReadFromString(wsContent))
|
||||
return false;
|
||||
|
||||
ScanStyles(oXml, pFile);
|
||||
ScanStyles(oReader, pFile);
|
||||
oReader.MoveToStart();
|
||||
|
||||
if (NULL != pContainer)
|
||||
pContainer->SetData(oXml);
|
||||
RELEASEINTERFACE(pContainer);
|
||||
|
||||
return LoadFromXmlNode(oXml, pContainer, pFile);
|
||||
pContainer = CObject::Create<CGraphicsContainer>(oReader, pFile);
|
||||
|
||||
if (NULL == pContainer)
|
||||
return false;
|
||||
|
||||
return ReadChildrens(oReader, pContainer, pFile, pContainer);
|
||||
}
|
||||
|
||||
bool CSvgParser::LoadFromXmlNode(XmlUtils::CXmlNode &oElement, CGraphicsContainer* pContainer, CSvgFile* pFile) const
|
||||
bool CSvgParser::ScanStyles(CSvgReader& oReader, CSvgFile *pFile) const
|
||||
{
|
||||
if (NULL == pFile || !oElement.IsValid())
|
||||
if (oReader.IsEmptyNode() || NULL == pFile)
|
||||
return false;
|
||||
|
||||
const CSvgCalculator *pSvgCalculator = pFile->GetSvgCalculator();
|
||||
const std::string sElementName = oReader.GetName();
|
||||
|
||||
if (NULL != pSvgCalculator)
|
||||
pSvgCalculator->SetData(pContainer);
|
||||
|
||||
return ReadChildrens(oElement, pContainer, pFile, pContainer);
|
||||
}
|
||||
|
||||
bool CSvgParser::ScanStyles(XmlUtils::CXmlNode &oElement, CSvgFile *pFile) const
|
||||
{
|
||||
if (!oElement.IsValid() || NULL == pFile)
|
||||
return false;
|
||||
|
||||
std::wstring wsElementName = oElement.GetName();
|
||||
|
||||
if (L"style" == wsElementName)
|
||||
if ("style" == sElementName)
|
||||
{
|
||||
ParseStyles(oElement.GetText(), pFile);
|
||||
ParseStyles(oReader.GetText(), pFile);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool bScanResult = false;
|
||||
|
||||
if (L"svg" == wsElementName || L"g" == wsElementName || L"defs" == wsElementName)
|
||||
if ("svg" == sElementName || "g" == sElementName || "defs" == sElementName)
|
||||
{
|
||||
std::vector<XmlUtils::CXmlNode> arChilds;
|
||||
|
||||
oElement.GetChilds(arChilds);
|
||||
|
||||
for (XmlUtils::CXmlNode& oChild : arChilds)
|
||||
WHILE_READ_NEXT_NODE(oReader)
|
||||
{
|
||||
if (ScanStyles(oChild, pFile))
|
||||
if (ScanStyles(oReader, pFile))
|
||||
bScanResult = true;
|
||||
}
|
||||
END_WHILE
|
||||
}
|
||||
|
||||
return bScanResult;
|
||||
@ -224,155 +209,103 @@ namespace SVG
|
||||
oSearchStart = oMatch.suffix().first;
|
||||
}
|
||||
}
|
||||
|
||||
template <class ObjectType>
|
||||
bool CSvgParser::ReadObject(XmlUtils::CXmlNode &oElement, CContainer<ObjectType> *pContainer, CSvgFile *pFile, CRenderedObject *pParent) const
|
||||
bool CSvgParser::ReadObject(CSvgReader& oReader, CContainer<ObjectType> *pContainer, CSvgFile *pFile, CRenderedObject *pParent) const
|
||||
{
|
||||
if (!oElement.IsValid() || NULL == pFile)
|
||||
if (NULL == pFile)
|
||||
return false;
|
||||
|
||||
std::wstring wsElementName = oElement.GetName();
|
||||
const std::string sElementName = oReader.GetName();
|
||||
|
||||
CObject *pObject = NULL;
|
||||
|
||||
if (L"svg" == wsElementName || L"g" == wsElementName || L"a" == wsElementName)
|
||||
if ("svg" == sElementName || "g" == sElementName || "a" == sElementName)
|
||||
{
|
||||
pObject = new CGraphicsContainer(oElement, pParent);
|
||||
if (!ReadChildrens(oElement, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
|
||||
pObject = CObject::Create<CGraphicsContainer>(oReader, pFile, pParent);
|
||||
if (!ReadChildrens(oReader, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
|
||||
{
|
||||
RELEASEOBJECT(pObject);
|
||||
RELEASEINTERFACE(pObject);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (L"line" == wsElementName)
|
||||
pObject = new CLine(oElement, pParent);
|
||||
else if (L"rect" == wsElementName)
|
||||
pObject = new CRect(oElement, pParent);
|
||||
else if (L"circle" == wsElementName)
|
||||
pObject = new CCircle(oElement, pParent);
|
||||
else if (L"ellipse" == wsElementName)
|
||||
pObject = new CEllipse(oElement, pParent);
|
||||
else if (L"path" == wsElementName)
|
||||
pObject = new CPath(oElement, pParent);
|
||||
else if (L"polyline" == wsElementName)
|
||||
pObject = new CPolyline(oElement, pParent);
|
||||
else if (L"polygon" == wsElementName)
|
||||
pObject = new CPolygon(oElement, pParent);
|
||||
else if (L"image" == wsElementName)
|
||||
pObject = new CImage(oElement, pParent);
|
||||
else if (L"use" == wsElementName)
|
||||
pObject = new CUse(oElement, pParent);
|
||||
else if (L"text" == wsElementName)
|
||||
else if ("line" == sElementName)
|
||||
pObject = CObject::Create<CLine>(oReader, pFile, pParent);
|
||||
else if ("rect" == sElementName)
|
||||
pObject = CObject::Create<CRect>(oReader, pFile, pParent);
|
||||
else if ("circle" == sElementName)
|
||||
pObject = CObject::Create<CCircle>(oReader, pFile, pParent);
|
||||
else if ("ellipse" == sElementName)
|
||||
pObject = CObject::Create<CEllipse>(oReader, pFile, pParent);
|
||||
else if ("path" == sElementName)
|
||||
pObject = CObject::Create<CPath>(oReader, pFile, pParent);
|
||||
else if ("polyline" == sElementName)
|
||||
pObject = CObject::Create<CPolyline>(oReader, pFile, pParent);
|
||||
else if ("polygon" == sElementName)
|
||||
pObject = CObject::Create<CPolygon>(oReader, pFile, pParent);
|
||||
else if ("image" == sElementName)
|
||||
pObject = CObject::Create<CImage>(oReader, pFile, pParent);
|
||||
else if ("use" == sElementName)
|
||||
pObject = CObject::Create<CUse>(oReader, pFile, pParent);
|
||||
else if ("text" == sElementName)
|
||||
pObject = CObject::Create<CText>(oReader, pFile, pParent, m_pFontManager);
|
||||
else if ("tspan" == sElementName)
|
||||
pObject = CObject::Create<CTSpan>(oReader, pFile, pParent, m_pFontManager);
|
||||
else if ("textPath" == sElementName)
|
||||
pObject = CObject::Create<CTextPath>(oReader, pFile, pParent, m_pFontManager);
|
||||
else if ("switch" == sElementName)
|
||||
{
|
||||
pObject = CText::Create(oElement, pParent, m_pFontManager);
|
||||
ReadChildrens(oElement, (CText*)pObject, pFile, (CText*)pObject);
|
||||
}
|
||||
else if (L"tspan" == wsElementName)
|
||||
{
|
||||
pObject = CTSpan::Create(oElement, pParent, m_pFontManager);
|
||||
ReadChildrens(oElement, (CTSpan*)pObject, pFile, (CTSpan*)pObject);
|
||||
}
|
||||
else if (L"textPath" == wsElementName)
|
||||
{
|
||||
pObject = CTextPath::Create(oElement, pParent, m_pFontManager, pFile);
|
||||
ReadChildrens(oElement, (CTextPath*)pObject, pFile);
|
||||
}
|
||||
else if (L"switch" == wsElementName)
|
||||
{
|
||||
pObject = new CSwitch(oElement, pParent);
|
||||
ReadChildrens(oElement, (CSwitch*)pObject, pFile);
|
||||
pObject = CObject::Create<CSwitch>(oReader, pFile, pParent);
|
||||
ReadChildrens(oReader, (CSwitch*)pObject, pFile);
|
||||
}
|
||||
//defs
|
||||
else if (L"defs" == wsElementName)
|
||||
return ReadChildrens<CRenderedObject>(oElement, NULL, pFile);
|
||||
else if(L"linearGradient" == wsElementName)
|
||||
else if ("defs" == sElementName)
|
||||
return ReadChildrens<CRenderedObject>(oReader, NULL, pFile);
|
||||
else if("linearGradient" == sElementName)
|
||||
pObject = CObject::Create<CLinearGradient>(oReader, pFile);
|
||||
else if ("radialGradient" == sElementName)
|
||||
pObject = CObject::Create<CRadialGradient>(oReader, pFile);
|
||||
else if ("pattern" == sElementName)
|
||||
{
|
||||
pObject = new CLinearGradient(oElement);
|
||||
ReadChildrens(oElement, (CLinearGradient*)pObject, pFile);
|
||||
pObject = CObject::Create<CPattern>(oReader, pFile);
|
||||
ReadChildrens(oReader, (CGraphicsContainer*)(&((CPattern*)pObject)->GetContainer()), pFile);
|
||||
}
|
||||
else if (L"radialGradient" == wsElementName)
|
||||
else if ("clipPath" == sElementName)
|
||||
{
|
||||
pObject = new CRadialGradient(oElement);
|
||||
ReadChildrens(oElement, (CRadialGradient*)pObject, pFile);
|
||||
pObject = CObject::Create<CClipPath>(oReader, pFile);
|
||||
ReadChildrens(oReader, (CGraphicsContainer*)(&((CClipPath*)pObject)->GetContainer()), pFile);
|
||||
}
|
||||
else if (L"stop" == wsElementName)
|
||||
else if ("marker" == sElementName)
|
||||
{
|
||||
CStopElement *pStopElement = new CStopElement(oElement);
|
||||
if (AddObject((ObjectType*)pStopElement, pContainer))
|
||||
{
|
||||
UpdateStyles(pStopElement, pFile);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
RELEASEOBJECT(pStopElement);
|
||||
return false;
|
||||
}
|
||||
pObject = CObject::Create<CMarker>(oReader, pFile);
|
||||
ReadChildrens(oReader, (CMarker*)pObject, pFile);
|
||||
}
|
||||
else if (L"pattern" == wsElementName)
|
||||
else if ("mask" == sElementName)
|
||||
{
|
||||
pObject = new CPattern(oElement, m_pFontManager);
|
||||
ReadChildrens(oElement, (CGraphicsContainer*)(&((CPattern*)pObject)->GetContainer()), pFile);
|
||||
pObject = CObject::Create<CMask>(oReader, pFile);
|
||||
ReadChildrens(oReader, (CGraphicsContainer*)(&((CMask*)pObject)->GetContainer()), pFile);
|
||||
}
|
||||
else if (L"clipPath" == wsElementName)
|
||||
else if ("symbol" == sElementName)
|
||||
{
|
||||
pObject = new CClipPath(oElement);
|
||||
ReadChildrens(oElement, (CGraphicsContainer*)(&((CClipPath*)pObject)->GetContainer()), pFile);
|
||||
}
|
||||
else if (L"marker" == wsElementName)
|
||||
{
|
||||
pObject = new CMarker(oElement);
|
||||
ReadChildrens(oElement, (CMarker*)pObject, pFile);
|
||||
}
|
||||
else if (L"mask" == wsElementName)
|
||||
{
|
||||
pObject = new CMask(oElement);
|
||||
ReadChildrens(oElement, (CGraphicsContainer*)(&((CMask*)pObject)->GetContainer()), pFile);
|
||||
}
|
||||
else if (L"symbol" == wsElementName)
|
||||
{
|
||||
pObject = new CSymbol(oElement);
|
||||
if (ReadChildrens(oElement, (CSymbol*)pObject, pFile) && MarkObject(pObject, pFile))
|
||||
pObject = CObject::Create<CSymbol>(oReader, pFile);
|
||||
if (ReadChildrens(oReader, (CSymbol*)pObject, pFile))
|
||||
return true;
|
||||
else
|
||||
RELEASEOBJECT(pObject);
|
||||
RELEASEINTERFACE(pObject);
|
||||
}
|
||||
else if (L"font" == wsElementName)
|
||||
else if ("font" == sElementName)
|
||||
{
|
||||
pObject = new CFont(oElement);
|
||||
pObject = CObject::Create<CFont>(oReader, pFile, pFile);
|
||||
}
|
||||
|
||||
if (NULL != pObject)
|
||||
{
|
||||
if ((MarkObject(pObject, pFile) && (AppliedObject == pObject->GetType() || NULL == pContainer)) ||
|
||||
(RendererObject == pObject->GetType() && AddObject((ObjectType*)pObject, pContainer)))
|
||||
{
|
||||
UpdateStyles(pObject, pFile);
|
||||
return true;
|
||||
}
|
||||
delete pObject;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CSvgParser::UpdateStyles(CObject *pObject, CSvgFile *pFile) const
|
||||
{
|
||||
if (NULL == pObject || NULL == pFile)
|
||||
return;
|
||||
|
||||
const CSvgCalculator *pSvgCalculator = pFile->GetSvgCalculator();
|
||||
|
||||
if (NULL != pSvgCalculator)
|
||||
pSvgCalculator->SetData(pObject);
|
||||
}
|
||||
|
||||
bool CSvgParser::MarkObject(CObject *pObject, CSvgFile *pFile) const
|
||||
{
|
||||
if (NULL == pObject || NULL == pFile)
|
||||
if (NULL == pObject)
|
||||
return false;
|
||||
|
||||
return pFile->MarkObject(pObject);
|
||||
if ((RendererObject == pObject->GetType() && (AddObject((ObjectType*)pObject, pContainer) || pObject->Marked())) ||
|
||||
AppliedObject == pObject->GetType())
|
||||
return true;
|
||||
|
||||
RELEASEINTERFACE(pObject);
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class ObjectType>
|
||||
@ -382,18 +315,15 @@ namespace SVG
|
||||
}
|
||||
|
||||
template <class ObjectType>
|
||||
bool CSvgParser::ReadChildrens(XmlUtils::CXmlNode &oElement, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject *pParent) const
|
||||
bool CSvgParser::ReadChildrens(CSvgReader& oReader, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject *pParent) const
|
||||
{
|
||||
std::vector<XmlUtils::CXmlNode> arChilds;
|
||||
bool bResult = false;
|
||||
|
||||
oElement.GetChilds(arChilds);
|
||||
WHILE_READ_NEXT_NODE(oReader)
|
||||
if (ReadObject(oReader, pContainer, pFile, pParent))
|
||||
bResult = true;
|
||||
END_WHILE
|
||||
|
||||
if (arChilds.empty())
|
||||
return false;
|
||||
|
||||
for (XmlUtils::CXmlNode& oChild : arChilds)
|
||||
ReadObject(oChild, pContainer, pFile, pParent);
|
||||
|
||||
return true;
|
||||
return bResult;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,9 +3,9 @@
|
||||
|
||||
#include "../../../common/Directory.h"
|
||||
#include "../../../graphics/pro/Fonts.h"
|
||||
#include "../../../xml/include/xmlutils.h"
|
||||
|
||||
#include "SvgObjects/CContainer.h"
|
||||
#include "SvgReader.h"
|
||||
|
||||
class CSvgFile;
|
||||
|
||||
@ -14,26 +14,23 @@ namespace SVG
|
||||
class CSvgParser
|
||||
{
|
||||
public:
|
||||
CSvgParser();
|
||||
CSvgParser(NSFonts::IFontManager* pFontManager = NULL);
|
||||
~CSvgParser();
|
||||
|
||||
void SetFontManager(NSFonts::IFontManager* pFontManager);
|
||||
|
||||
bool LoadFromFile(const std::wstring& wsFile, CGraphicsContainer* pContainer, CSvgFile* pFile) const;
|
||||
bool LoadFromString(const std::wstring& wsContentent, CGraphicsContainer* pContainer, CSvgFile* pFile) const;
|
||||
bool LoadFromXmlNode(XmlUtils::CXmlNode& oElement, CGraphicsContainer* pContainer, CSvgFile* pFile) const;
|
||||
bool LoadFromFile(const std::wstring& wsFile, CGraphicsContainer*& pContainer, CSvgFile* pFile) const;
|
||||
bool LoadFromString(const std::wstring& wsContent, CGraphicsContainer*& pContainer, CSvgFile* pFile) const;
|
||||
|
||||
template <class ObjectType>
|
||||
bool ReadObject(XmlUtils::CXmlNode& oElement, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject* pParent = NULL) const;
|
||||
bool ReadObject(CSvgReader& oReader, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject* pParent = NULL) const;
|
||||
private:
|
||||
template <class ObjectType>
|
||||
bool ReadChildrens(XmlUtils::CXmlNode& oElement, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject* pParent = NULL) const;
|
||||
bool ReadChildrens(CSvgReader& oReader, CContainer<ObjectType>* pContainer, CSvgFile* pFile, CRenderedObject* pParent = NULL) const;
|
||||
|
||||
bool ScanStyles(XmlUtils::CXmlNode& oElement, CSvgFile* pFile) const;
|
||||
bool ScanStyles(CSvgReader& oReader, CSvgFile* pFile) const;
|
||||
void ParseStyles(const std::wstring& wsStyles, CSvgFile *pFile) const;
|
||||
|
||||
void UpdateStyles(CObject* pObject, CSvgFile* pFile) const;
|
||||
bool MarkObject(CObject* pObject, CSvgFile* pFile) const;
|
||||
template <class ObjectType>
|
||||
bool AddObject(ObjectType* pObject, CContainer<ObjectType>* pContainer) const;
|
||||
|
||||
|
||||
@ -1,16 +1,27 @@
|
||||
#include "CCircle.h"
|
||||
|
||||
#include "CContainer.h"
|
||||
#include "CStyle.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CCircle::CCircle(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
CCircle::CCircle(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{
|
||||
m_oCx.SetValue(oNode.GetAttribute(L"cx"));
|
||||
m_oCy.SetValue(oNode.GetAttribute(L"cy"));
|
||||
m_oR .SetValue(oNode.GetAttribute(L"r"));
|
||||
START_READ_ATTRIBUTES(oReader)
|
||||
SetAttribute(sAttributeName, oReader);
|
||||
END_READ_ATTRIBUTES(oReader)
|
||||
}
|
||||
|
||||
void CCircle::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("cx" == sName)
|
||||
m_oCx.SetValue(oReader.GetText());
|
||||
else if ("cy" == sName)
|
||||
m_oCy.SetValue(oReader.GetText());
|
||||
else if ("r" == sName)
|
||||
m_oR.SetValue(oReader.GetText());
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CCircle::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
@ -51,7 +62,7 @@ namespace SVG
|
||||
nTypePath += c_nWindingFillMode;
|
||||
}
|
||||
|
||||
TBounds CCircle::GetBounds() const
|
||||
TBounds CCircle::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds;
|
||||
|
||||
@ -60,6 +71,16 @@ namespace SVG
|
||||
oBounds.m_dRight = (m_oCx + m_oR).ToDouble(NSCSS::Pixel);
|
||||
oBounds.m_dBottom = (m_oCy + m_oR).ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (nullptr != pTransform)
|
||||
{
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dLeft, oBounds.m_dTop );
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dRight, oBounds.m_dBottom);
|
||||
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
|
||||
|
||||
@ -7,8 +7,10 @@ namespace SVG
|
||||
{
|
||||
class CCircle : public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CCircle(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CCircle(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
@ -16,7 +18,7 @@ namespace SVG
|
||||
private:
|
||||
void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
|
||||
|
||||
TBounds GetBounds() const override;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
|
||||
SvgDigit m_oCx;
|
||||
SvgDigit m_oCy;
|
||||
|
||||
@ -2,13 +2,19 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CClipPath::CClipPath(XmlUtils::CXmlNode &oNode)
|
||||
: CAppliedObject(oNode)
|
||||
CClipPath::CClipPath(CSvgReader& oReader)
|
||||
: CAppliedObject(oReader), m_enUnits(ClipU_ObjectBoundingBox)
|
||||
{}
|
||||
|
||||
void CClipPath::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if (L"userSpaceOnUse" == oNode.GetAttribute(L"gradientUnits"))
|
||||
m_enUnits = ClipU_UserSpaceOnUse;
|
||||
if ("gradientUnits" == sName)
|
||||
{
|
||||
if ("userSpaceOnUse" == oReader.GetTextA())
|
||||
m_enUnits = ClipU_UserSpaceOnUse;
|
||||
}
|
||||
else
|
||||
m_enUnits = ClipU_ObjectBoundingBox;
|
||||
CAppliedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CClipPath::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
@ -25,7 +31,7 @@ namespace SVG
|
||||
|
||||
ApplyClip(pRenderer, &m_oTransformation.m_oClip, pFile, oObjectBounds);
|
||||
|
||||
for (const CRenderedObject* pObject : m_oContainer.m_arObjects)
|
||||
for (const CRenderedObject* pObject : m_oContainer)
|
||||
pObject->Draw(pRenderer, pFile, CommandeModeClip);
|
||||
|
||||
return true;
|
||||
|
||||
@ -13,8 +13,10 @@ namespace SVG
|
||||
|
||||
class CClipPath : public CAppliedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CClipPath(CSvgReader& oReader);
|
||||
public:
|
||||
CClipPath(XmlUtils::CXmlNode& oNode);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode) override;
|
||||
|
||||
|
||||
@ -5,30 +5,23 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CGraphicsContainer::CGraphicsContainer(const std::wstring &wsName)
|
||||
: CRenderedObject(NSCSS::CNode(wsName, L"", L""))
|
||||
CGraphicsContainer::CGraphicsContainer(CSvgReader& oReader, CRenderedObject *pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{}
|
||||
|
||||
CGraphicsContainer::~CGraphicsContainer()
|
||||
void CGraphicsContainer::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
for (CRenderedObject* pObject : m_arObjects)
|
||||
pObject->m_pParent = NULL;
|
||||
}
|
||||
|
||||
void CGraphicsContainer::SetData(XmlUtils::CXmlNode &oNode)
|
||||
{
|
||||
SetNodeData(oNode);
|
||||
|
||||
m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"x"));
|
||||
m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"y"));
|
||||
m_oWindow.m_oWidth .SetValue(oNode.GetAttribute(L"width"), 0, true);
|
||||
m_oWindow.m_oHeight.SetValue(oNode.GetAttribute(L"height"), 0, true);
|
||||
|
||||
const std::wstring wsViewBox = oNode.GetAttribute(L"viewBox");
|
||||
|
||||
if (!wsViewBox.empty())
|
||||
if ("x" == sName)
|
||||
m_oWindow.m_oX.SetValue(oReader.GetText());
|
||||
else if ("y" == sName)
|
||||
m_oWindow.m_oY.SetValue(oReader.GetText());
|
||||
else if ("width" == sName)
|
||||
m_oWindow.m_oWidth.SetValue(oReader.GetText());
|
||||
else if ("height" == sName)
|
||||
m_oWindow.m_oHeight.SetValue(oReader.GetText());
|
||||
else if ("viewBox" == sName)
|
||||
{
|
||||
std::vector<double> arValues = StrUtils::ReadDoubleValues(wsViewBox);
|
||||
const std::vector<double> arValues{StrUtils::ReadDoubleValues(oReader.GetText())};
|
||||
if (4 == arValues.size())
|
||||
{
|
||||
m_oViewBox.m_oX = arValues[0];
|
||||
@ -38,19 +31,9 @@ namespace SVG
|
||||
}
|
||||
}
|
||||
else
|
||||
m_oViewBox = m_oWindow;
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
CGraphicsContainer::CGraphicsContainer(XmlUtils::CXmlNode& oNode, CRenderedObject *pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
{
|
||||
SetData(oNode);
|
||||
}
|
||||
|
||||
CGraphicsContainer::CGraphicsContainer(double dWidth, double dHeight, XmlUtils::CXmlNode& oNode, CRenderedObject *pParent)
|
||||
: CRenderedObject(oNode, pParent), m_oWindow{0, 0, dWidth, dHeight}
|
||||
{}
|
||||
|
||||
bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
|
||||
{
|
||||
Aggplus::CMatrix oOldTransform;
|
||||
@ -76,7 +59,7 @@ namespace SVG
|
||||
return m_oViewBox;
|
||||
}
|
||||
|
||||
TBounds CGraphicsContainer::GetBounds() const
|
||||
TBounds CGraphicsContainer::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds, oTempBounds;
|
||||
|
||||
@ -85,15 +68,21 @@ namespace SVG
|
||||
oBounds.m_dRight += m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel);
|
||||
oBounds.m_dBottom += m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (nullptr != pTransform)
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
for (const CRenderedObject* pObject : m_arObjects)
|
||||
{
|
||||
oTempBounds = pObject->GetBounds();
|
||||
oTempBounds = pObject->GetBounds(pTransform);
|
||||
oBounds.m_dLeft = std::min(oBounds.m_dLeft, oTempBounds.m_dLeft);
|
||||
oBounds.m_dTop = std::min(oBounds.m_dTop, oTempBounds.m_dTop);
|
||||
oBounds.m_dRight = std::max(oBounds.m_dRight, oTempBounds.m_dRight);
|
||||
oBounds.m_dBottom = std::max(oBounds.m_dBottom, oTempBounds.m_dBottom);
|
||||
}
|
||||
|
||||
if (nullptr != pTransform)
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
|
||||
|
||||
@ -12,8 +12,9 @@ namespace SVG
|
||||
template<typename TypeObject>
|
||||
class CContainer
|
||||
{
|
||||
using const_iterator = typename std::vector<TypeObject*>::const_iterator;
|
||||
public:
|
||||
CContainer(){}
|
||||
CContainer() = default;
|
||||
virtual ~CContainer()
|
||||
{
|
||||
Clear();
|
||||
@ -61,39 +62,35 @@ namespace SVG
|
||||
|
||||
return NULL;
|
||||
}
|
||||
private:
|
||||
std::vector<TypeObject*> m_arObjects;
|
||||
|
||||
friend class CText;
|
||||
friend class CMask;
|
||||
friend class CTSpan;
|
||||
friend class CMarker;
|
||||
friend class CSwitch;
|
||||
friend class CPattern;
|
||||
friend class CGradient;
|
||||
friend class CClipPath;
|
||||
friend class CTextPath;
|
||||
friend class CLinearGradient;
|
||||
friend class CGraphicsContainer;
|
||||
const_iterator begin() const
|
||||
{
|
||||
return m_arObjects.cbegin();
|
||||
}
|
||||
|
||||
const_iterator end() const
|
||||
{
|
||||
return m_arObjects.cend();
|
||||
}
|
||||
protected:
|
||||
std::vector<TypeObject*> m_arObjects;
|
||||
};
|
||||
|
||||
class CGraphicsContainer : public CContainer<CRenderedObject>, public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CGraphicsContainer(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CGraphicsContainer(const std::wstring& wsName = L"GraphicsContainer");
|
||||
CGraphicsContainer(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
CGraphicsContainer(double dWidth, double dHeight, XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
virtual ~CGraphicsContainer() = default;
|
||||
|
||||
virtual ~CGraphicsContainer();
|
||||
|
||||
void SetData(XmlUtils::CXmlNode& oNode);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) 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;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
private:
|
||||
TBounds GetBounds() const override;
|
||||
|
||||
friend class CPattern;
|
||||
friend class CMarker;
|
||||
|
||||
@ -1,18 +1,12 @@
|
||||
#include "CEllipse.h"
|
||||
|
||||
#include "CStyle.h"
|
||||
#include "CContainer.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CEllipse::CEllipse(XmlUtils::CXmlNode &oNode, CRenderedObject *pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
{
|
||||
m_oCx.SetValue(oNode.GetAttribute(L"cx"));
|
||||
m_oCy.SetValue(oNode.GetAttribute(L"cy"));
|
||||
m_oRx.SetValue(oNode.GetAttribute(L"rx"));
|
||||
m_oRy.SetValue(oNode.GetAttribute(L"ry"));
|
||||
}
|
||||
CEllipse::CEllipse(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{}
|
||||
|
||||
void CEllipse::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
@ -22,6 +16,20 @@ namespace SVG
|
||||
SetFill(mAttributes, ushLevel, bHardMode);
|
||||
}
|
||||
|
||||
void CEllipse::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("cx" == sName)
|
||||
m_oCx.SetValue(oReader.GetText());
|
||||
else if ("cy" == sName)
|
||||
m_oCy.SetValue(oReader.GetText());
|
||||
else if ("rx" == sName)
|
||||
m_oRx.SetValue(oReader.GetText());
|
||||
else if ("ry" == sName)
|
||||
m_oRy.SetValue(oReader.GetText());
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
bool CEllipse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
|
||||
{
|
||||
Aggplus::CMatrix oOldTransform;
|
||||
@ -56,7 +64,7 @@ namespace SVG
|
||||
nTypePath += c_nWindingFillMode;
|
||||
}
|
||||
|
||||
TBounds CEllipse::GetBounds() const
|
||||
TBounds CEllipse::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds;
|
||||
|
||||
@ -65,6 +73,16 @@ namespace SVG
|
||||
oBounds.m_dRight = oBounds.m_dLeft + m_oRx.ToDouble(NSCSS::Pixel);
|
||||
oBounds.m_dBottom = oBounds.m_dTop + m_oRy.ToDouble(NSCSS::Pixel);;
|
||||
|
||||
if (nullptr != pTransform)
|
||||
{
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dLeft, oBounds.m_dTop );
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dRight, oBounds.m_dBottom);
|
||||
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,23 +1,24 @@
|
||||
#ifndef CELLIPSE_H
|
||||
#define CELLIPSE_H
|
||||
|
||||
|
||||
#include "CObjectBase.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
class CEllipse : public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CEllipse(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CEllipse(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) 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 CRenderedObject* pContexObject = NULL) const override;
|
||||
|
||||
TBounds GetBounds() const override;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
|
||||
SvgDigit m_oCx;
|
||||
SvgDigit m_oCy;
|
||||
|
||||
@ -2,15 +2,23 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CGlyph::CGlyph(XmlUtils::CXmlNode &oNode)
|
||||
: CPath(oNode)
|
||||
CGlyph::CGlyph(CSvgReader& oReader, CSvgFile* pFile)
|
||||
: CPath(oReader)
|
||||
{}
|
||||
|
||||
void CGlyph::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
std::wstring wsUnicode(oNode.GetAttribute(L"unicode"));
|
||||
if ("unicode" == sName)
|
||||
{
|
||||
const std::wstring wsUnicode{oReader.GetText()};
|
||||
|
||||
if (!wsUnicode.empty())
|
||||
m_wchUnicode = wsUnicode[0];
|
||||
|
||||
m_oHorizAdvX.SetValue(oNode.GetAttributeOrValue(L"horiz-adv-x"));
|
||||
if (!wsUnicode.empty())
|
||||
m_wchUnicode = wsUnicode[0];
|
||||
}
|
||||
else if ("horiz-adv-x" == sName)
|
||||
m_oHorizAdvX.SetValue(oReader.GetText());
|
||||
else
|
||||
CPath::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
wchar_t CGlyph::GetUnicode() const
|
||||
@ -18,21 +26,13 @@ namespace SVG
|
||||
return m_wchUnicode;
|
||||
}
|
||||
|
||||
CFontFace::CFontFace(XmlUtils::CXmlNode &oNode)
|
||||
CFontFace::CFontFace(CSvgReader& oReader)
|
||||
{}
|
||||
|
||||
CFont::CFont(CSvgReader& oReader, CSvgFile* pFile)
|
||||
: CAppliedObject(oReader), m_pMissingGlyph(NULL)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CFont::CFont(XmlUtils::CXmlNode &oNode)
|
||||
: CAppliedObject(oNode), m_pMissingGlyph(NULL)
|
||||
{
|
||||
ParseGlyphs(oNode);
|
||||
|
||||
m_oArguments.m_wsFontVariant = oNode.GetAttribute(L"font-variant");
|
||||
m_oArguments.m_wsFontStyle = oNode.GetAttribute(L"font-style");
|
||||
m_oArguments.m_wsFontWidght = oNode.GetAttribute(L"font-weight");
|
||||
|
||||
m_oHorizAdvX.SetValue(oNode.GetAttributeOrValue(L"horiz-adv-x"));
|
||||
ParseGlyphs(oReader, pFile);
|
||||
}
|
||||
|
||||
CFont::~CFont()
|
||||
@ -43,6 +43,20 @@ namespace SVG
|
||||
RELEASEOBJECT(m_pMissingGlyph);
|
||||
}
|
||||
|
||||
void CFont::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("font-variant" == sName)
|
||||
m_oArguments.m_wsFontVariant = oReader.GetText();
|
||||
else if ("font-style" == sName)
|
||||
m_oArguments.m_wsFontStyle = oReader.GetText();
|
||||
else if ("font-weight" == sName)
|
||||
m_oArguments.m_wsFontWidght = oReader.GetText();
|
||||
else if ("horiz-adv-x" == sName)
|
||||
m_oHorizAdvX.SetValue(oReader.GetText());
|
||||
else
|
||||
CAppliedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CFont::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
}
|
||||
@ -82,7 +96,7 @@ namespace SVG
|
||||
{ \
|
||||
oMatrix.Scale(1. / dGlyphScale, -1. / dGlyphScale); \
|
||||
pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty()); \
|
||||
} \
|
||||
}
|
||||
|
||||
for (wchar_t wchGlyph : wsText)
|
||||
{
|
||||
@ -115,18 +129,13 @@ namespace SVG
|
||||
return true;
|
||||
}
|
||||
|
||||
void CFont::ParseGlyphs(XmlUtils::CXmlNode &oNode)
|
||||
void CFont::ParseGlyphs(CSvgReader& oReader, CSvgFile* pFile)
|
||||
{
|
||||
std::vector<XmlUtils::CXmlNode> arChilds;
|
||||
|
||||
if (!oNode.GetChilds(arChilds) || arChilds.empty())
|
||||
return;
|
||||
|
||||
for (XmlUtils::CXmlNode& oChild : arChilds)
|
||||
WHILE_READ_NEXT_NODE_WITH_NAME(oReader)
|
||||
{
|
||||
if (L"glyph" == oChild.GetName())
|
||||
if ("glyph" == sNodeName)
|
||||
{
|
||||
CGlyph *pGlyph = new CGlyph(oChild);
|
||||
CGlyph *pGlyph = CObject::Create<CGlyph>(oReader, pFile, pFile);
|
||||
|
||||
if (NULL == pGlyph)
|
||||
continue;
|
||||
@ -136,22 +145,17 @@ namespace SVG
|
||||
else
|
||||
delete pGlyph;
|
||||
}
|
||||
else if (L"missing-glyph" == oChild.GetName())
|
||||
else if ("missing-glyph" == sNodeName)
|
||||
{
|
||||
std::vector<XmlUtils::CXmlNode> arMissingGlyphChilds;
|
||||
if (!oChild.GetChilds(arMissingGlyphChilds) || arMissingGlyphChilds.empty())
|
||||
continue;
|
||||
|
||||
for (XmlUtils::CXmlNode& oChildMissingGlyph : arMissingGlyphChilds)
|
||||
WHILE_READ_NEXT_NODE_WITH_DEPTH_ONE_NAME(oReader, Child, "path")
|
||||
{
|
||||
if (L"path" == oChildMissingGlyph.GetName())
|
||||
{
|
||||
m_pMissingGlyph = new CPath(oChildMissingGlyph);
|
||||
if (NULL != m_pMissingGlyph)
|
||||
break;
|
||||
}
|
||||
m_pMissingGlyph = new CPath(oReader);
|
||||
if (NULL != m_pMissingGlyph)
|
||||
break;
|
||||
}
|
||||
END_WHILE
|
||||
}
|
||||
}
|
||||
END_WHILE
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,7 +8,9 @@ namespace SVG
|
||||
class CGlyph : public CPath
|
||||
{
|
||||
public:
|
||||
CGlyph(XmlUtils::CXmlNode& oNode);
|
||||
CGlyph(CSvgReader& oReader, CSvgFile* pFile = nullptr);
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
wchar_t GetUnicode() const;
|
||||
private:
|
||||
@ -21,7 +23,7 @@ namespace SVG
|
||||
class CFontFace
|
||||
{
|
||||
public:
|
||||
CFontFace(XmlUtils::CXmlNode& oNode);
|
||||
CFontFace(CSvgReader& oReader);
|
||||
private:
|
||||
std::wstring m_wsSrcFaceName;
|
||||
};
|
||||
@ -36,16 +38,19 @@ namespace SVG
|
||||
|
||||
class CFont : public CAppliedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CFont(CSvgReader& oReader, CSvgFile* pFile = nullptr);
|
||||
public:
|
||||
CFont(XmlUtils::CXmlNode& oNode);
|
||||
~CFont();
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode) override;
|
||||
|
||||
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
|
||||
bool Draw(const std::wstring& wsText, const double& dX, const double& dY, const double& dFontHeight, IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
|
||||
private:
|
||||
void ParseGlyphs(XmlUtils::CXmlNode& oNode);
|
||||
void ParseGlyphs(CSvgReader& oReader, CSvgFile* pFile = nullptr);
|
||||
|
||||
TFontArguments m_oArguments;
|
||||
|
||||
|
||||
@ -3,13 +3,13 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CStopElement::CStopElement(XmlUtils::CXmlNode& oNode)
|
||||
: CObject(oNode)
|
||||
CStopElement::CStopElement(CSvgReader& oReader)
|
||||
: CObject(oReader)
|
||||
{}
|
||||
|
||||
ObjectType CStopElement::GetType() const
|
||||
{
|
||||
return AppliedObject;
|
||||
return DataObject;
|
||||
}
|
||||
|
||||
SvgDigit CStopElement::GetOffset() const
|
||||
@ -34,20 +34,36 @@ namespace SVG
|
||||
m_oColor.SetOpacity(mAttributes.at(L"stop-opacity"));
|
||||
}
|
||||
|
||||
CGradient::CGradient(XmlUtils::CXmlNode &oNode)
|
||||
: CAppliedObject(oNode)
|
||||
{
|
||||
m_wsXlinkHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href"));
|
||||
m_oTransform.SetMatrix(oNode.GetAttribute(L"gradientTransform"), 0, true);
|
||||
CGradient::CGradient(CSvgReader& oReader)
|
||||
: CAppliedObject(oReader), m_enGradientUnits(GradU_ObjectBoundingBox)
|
||||
{}
|
||||
|
||||
if (L"userSpaceOnUse" == oNode.GetAttribute(L"gradientUnits"))
|
||||
m_enGradientUnits = GradU_UserSpaceOnUse;
|
||||
void CGradient::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("href" == sName || "xlink:href" == sName)
|
||||
m_wsXlinkHref = oReader.GetText();
|
||||
else if ("gradientTransform" == sName)
|
||||
m_oTransform.SetMatrix(oReader.GetText(), 0, true);
|
||||
else if ("gradientUnits" == sName)
|
||||
{
|
||||
if (L"userSpaceOnUse" == oReader.GetText())
|
||||
m_enGradientUnits = GradU_UserSpaceOnUse;
|
||||
}
|
||||
else
|
||||
m_enGradientUnits = GradU_ObjectBoundingBox;
|
||||
CAppliedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CGradient::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
void CGradient::SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{}
|
||||
|
||||
void CGradient::ReadChildrens(CSvgReader& oReader, CSvgFile* pSvgFile)
|
||||
{
|
||||
if (NULL == pSvgFile || NULL == pSvgFile->GetSvgCalculator())
|
||||
return;
|
||||
|
||||
WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "stop")
|
||||
AddObject(CObject::Create<CStopElement>(oReader, pSvgFile));
|
||||
END_WHILE
|
||||
}
|
||||
|
||||
bool CGradient::Apply(IRenderer *pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds)
|
||||
@ -117,13 +133,22 @@ namespace SVG
|
||||
return pRefGradient->Apply(pRenderer, pFile, oObjectBounds);
|
||||
}
|
||||
|
||||
CLinearGradient::CLinearGradient(XmlUtils::CXmlNode& oNode)
|
||||
: CGradient(oNode)
|
||||
CLinearGradient::CLinearGradient(CSvgReader& oReader)
|
||||
: CGradient(oReader)
|
||||
{}
|
||||
|
||||
void CLinearGradient::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
m_oX1.SetValue(oNode.GetAttribute(L"x1"));
|
||||
m_oY1.SetValue(oNode.GetAttribute(L"y1"));
|
||||
m_oX2.SetValue(oNode.GetAttribute(L"x2"));
|
||||
m_oY2.SetValue(oNode.GetAttribute(L"y2"));
|
||||
if ("x1" == sName)
|
||||
m_oX1.SetValue(oReader.GetText());
|
||||
else if ("y1" == sName)
|
||||
m_oY1.SetValue(oReader.GetText());
|
||||
else if ("x2" == sName)
|
||||
m_oX2.SetValue(oReader.GetText());
|
||||
else if ("y2" == sName)
|
||||
m_oY2.SetValue(oReader.GetText());
|
||||
else
|
||||
CGradient::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
bool CLinearGradient::Apply(IRenderer *pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds)
|
||||
@ -169,12 +194,20 @@ namespace SVG
|
||||
return true;
|
||||
}
|
||||
|
||||
CRadialGradient::CRadialGradient(XmlUtils::CXmlNode& oNode)
|
||||
: CGradient(oNode)
|
||||
CRadialGradient::CRadialGradient(CSvgReader& oReader)
|
||||
: CGradient(oReader)
|
||||
{}
|
||||
|
||||
void CRadialGradient::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
m_oCx.SetValue(oNode.GetAttribute(L"cx"));
|
||||
m_oCy.SetValue(oNode.GetAttribute(L"cy"));
|
||||
m_oR.SetValue(oNode.GetAttribute(L"r"));
|
||||
if ("cx" == sName)
|
||||
m_oCx.SetValue(oReader.GetText());
|
||||
else if ("cy" == sName)
|
||||
m_oCy.SetValue(oReader.GetText());
|
||||
else if ("r" == sName)
|
||||
m_oR.SetValue(oReader.GetText());
|
||||
else
|
||||
CGradient::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
bool CRadialGradient::Apply(IRenderer *pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds)
|
||||
|
||||
@ -22,7 +22,7 @@ namespace SVG
|
||||
class CStopElement : public CObject
|
||||
{
|
||||
public:
|
||||
CStopElement(XmlUtils::CXmlNode& oNode);
|
||||
CStopElement(CSvgReader& oReader);
|
||||
|
||||
ObjectType GetType() const override;
|
||||
|
||||
@ -37,16 +37,18 @@ namespace SVG
|
||||
|
||||
class CGradient : public CContainer<CStopElement>, public CAppliedObject
|
||||
{
|
||||
friend class CLinearGradient;
|
||||
friend class CRadialGradient;
|
||||
protected:
|
||||
CGradient(CSvgReader& oReader);
|
||||
public:
|
||||
CGradient(XmlUtils::CXmlNode& oNode);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
void ReadChildrens(CSvgReader& oReader, CSvgFile* pSvgFile) override;
|
||||
|
||||
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
|
||||
void ApplyTransform(IRenderer *pRenderer, const TBounds& oBounds, double& dAngle) const;
|
||||
private:
|
||||
protected:
|
||||
CGradient* GetRefGradient(const CSvgFile *pFile) const;
|
||||
bool ApplyRefGradient(IRenderer *pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) const;
|
||||
|
||||
@ -58,8 +60,10 @@ namespace SVG
|
||||
|
||||
class CLinearGradient : public CGradient
|
||||
{
|
||||
friend class CObject;
|
||||
CLinearGradient(CSvgReader& oReader);
|
||||
public:
|
||||
CLinearGradient(XmlUtils::CXmlNode& oNode);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
|
||||
private:
|
||||
@ -71,8 +75,10 @@ namespace SVG
|
||||
|
||||
class CRadialGradient : public CGradient
|
||||
{
|
||||
friend class CObject;
|
||||
CRadialGradient(CSvgReader& oReader);
|
||||
public:
|
||||
CRadialGradient(XmlUtils::CXmlNode& oNode);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
|
||||
private:
|
||||
|
||||
@ -5,18 +5,29 @@
|
||||
#include "../../../BgraFrame.h"
|
||||
#include "../../../../common/Path.h"
|
||||
#include "../../../../common/ProcessEnv.h"
|
||||
#include "../../../../common/Base64.h"
|
||||
#include "../../../../common/File.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CImage::CImage(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
{
|
||||
m_oRect.m_oX .SetValue(oNode.GetAttribute(L"x"));
|
||||
m_oRect.m_oY .SetValue(oNode.GetAttribute(L"y"));
|
||||
m_oRect.m_oWidth .SetValue(oNode.GetAttribute(L"width"));
|
||||
m_oRect.m_oHeight.SetValue(oNode.GetAttribute(L"height"));
|
||||
CImage::CImage(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{}
|
||||
|
||||
m_wsHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href")); // TODO:: В дальнейшем возможно стоит реализовать отдельный класс CHref для всех типов ссылок
|
||||
void CImage::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("x" == sName)
|
||||
m_oRect.m_oX.SetValue(oReader.GetText());
|
||||
else if ("y" == sName)
|
||||
m_oRect.m_oY.SetValue(oReader.GetText());
|
||||
else if ("width" == sName)
|
||||
m_oRect.m_oWidth.SetValue(oReader.GetText());
|
||||
else if ("height" == sName)
|
||||
m_oRect.m_oHeight.SetValue(oReader.GetText());
|
||||
else if ("href" == sName || "xlink:href" == sName)
|
||||
m_wsHref = oReader.GetText(); // TODO:: В дальнейшем возможно стоит реализовать отдельный класс CHref для всех типов ссылок
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
bool CImage::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
|
||||
@ -124,7 +135,7 @@ namespace SVG
|
||||
return true;
|
||||
}
|
||||
|
||||
TBounds CImage::GetBounds() const
|
||||
TBounds CImage::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds;
|
||||
|
||||
@ -133,6 +144,16 @@ namespace SVG
|
||||
oBounds.m_dRight = oBounds.m_dLeft + m_oRect.m_oWidth.ToDouble(NSCSS::Pixel);
|
||||
oBounds.m_dBottom = oBounds.m_dTop + m_oRect.m_oHeight.ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (nullptr != pTransform)
|
||||
{
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dLeft, oBounds.m_dTop );
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dRight, oBounds.m_dBottom);
|
||||
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,12 +7,14 @@ namespace SVG
|
||||
{
|
||||
class CImage : public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CImage(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CImage(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) 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;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
|
||||
TRect m_oRect;
|
||||
std::wstring m_wsHref;
|
||||
|
||||
@ -2,21 +2,46 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CLine::CLine(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent)
|
||||
: CPath(oNode, pParent, false)
|
||||
{
|
||||
SvgDigit oX1;
|
||||
SvgDigit oY1;
|
||||
SvgDigit oX2;
|
||||
SvgDigit oY2;
|
||||
CLine::CLine(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CPath(oReader, pParent)
|
||||
{
|
||||
AddElement(new CMoveElement(Point{0, 0}));
|
||||
AddElement(new CLineElement(Point{0, 0}));
|
||||
}
|
||||
|
||||
oX1.SetValue(oNode.GetAttribute(L"x1"));
|
||||
oY1.SetValue(oNode.GetAttribute(L"y1"));
|
||||
oX2.SetValue(oNode.GetAttribute(L"x2"));
|
||||
oY2.SetValue(oNode.GetAttribute(L"y2"));
|
||||
void CLine::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
//TODO:: не нравится, подумать как можно сделать иначе
|
||||
if ("x1" == sName)
|
||||
{
|
||||
CMoveElement* pMoveElement{dynamic_cast<CMoveElement*>(operator[](0))};
|
||||
|
||||
AddElement(new CMoveElement(Point{oX1.ToDouble(NSCSS::Pixel), oY1.ToDouble(NSCSS::Pixel)}));
|
||||
AddElement(new CLineElement(Point{oX2.ToDouble(NSCSS::Pixel), oY2.ToDouble(NSCSS::Pixel)}));
|
||||
if (NULL != pMoveElement)
|
||||
pMoveElement->m_oPoint.dX = oReader.GetDouble();
|
||||
}
|
||||
else if ("y1" == sName)
|
||||
{
|
||||
CMoveElement* pMoveElement{dynamic_cast<CMoveElement*>(operator[](0))};
|
||||
|
||||
if (NULL != pMoveElement)
|
||||
pMoveElement->m_oPoint.dY = oReader.GetDouble();
|
||||
}
|
||||
else if ("x2" == sName)
|
||||
{
|
||||
CLineElement* pLineElement{dynamic_cast<CLineElement*>(operator[](1))};
|
||||
|
||||
if (NULL != pLineElement)
|
||||
pLineElement->m_oPoint.dX = oReader.GetDouble();
|
||||
}
|
||||
else if ("y2" == sName)
|
||||
{
|
||||
CLineElement* pLineElement{dynamic_cast<CLineElement*>(operator[](1))};
|
||||
|
||||
if (NULL != pLineElement)
|
||||
pLineElement->m_oPoint.dY = oReader.GetDouble();
|
||||
}
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CLine::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
|
||||
@ -7,8 +7,10 @@ namespace SVG
|
||||
{
|
||||
class CLine : public CPath
|
||||
{
|
||||
friend class CObject;
|
||||
CLine(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CLine(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
private:
|
||||
|
||||
@ -1,26 +1,35 @@
|
||||
#include "CMarker.h"
|
||||
|
||||
#include "../../../graphics/pro/Graphics.h"
|
||||
#include "../SvgUtils.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CMarker::CMarker(XmlUtils::CXmlNode &oNode)
|
||||
: CObject(oNode), m_dAngle(0.), m_oBounds{0., 0., 0., 0.}
|
||||
CMarker::CMarker(CSvgReader& oReader)
|
||||
: CObject(oReader), m_enUnits{EMarkerUnits::StrokeWidth}, m_enOrient{EMarkerOrient::Angle},
|
||||
m_dAngle(0.), m_oBounds{0., 0., 0., 0.}
|
||||
{
|
||||
m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"refX"));
|
||||
m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"refY"));
|
||||
m_oWindow.m_oWidth.SetValue(3);
|
||||
m_oWindow.m_oHeight.SetValue(3);
|
||||
}
|
||||
|
||||
m_oWindow.m_oWidth .SetValue(oNode.GetAttribute(L"markerWidth", L"3"));
|
||||
m_oWindow.m_oHeight.SetValue(oNode.GetAttribute(L"markerHeight", L"3"));
|
||||
ObjectType CMarker::GetType() const
|
||||
{
|
||||
return AppliedObject;
|
||||
}
|
||||
|
||||
m_oViewBox = m_oWindow;
|
||||
|
||||
const std::wstring wsViewBox = oNode.GetAttribute(L"viewBox");
|
||||
|
||||
if (!wsViewBox.empty())
|
||||
void CMarker::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("refX" == sName)
|
||||
m_oWindow.m_oX.SetValue(oReader.GetText());
|
||||
else if ("refY" == sName)
|
||||
m_oWindow.m_oY.SetValue(oReader.GetText());
|
||||
else if ("markerWidth" == sName)
|
||||
m_oWindow.m_oWidth.SetValue(oReader.GetText());
|
||||
else if ("markerHeight" == sName)
|
||||
m_oWindow.m_oHeight.SetValue(oReader.GetText());
|
||||
else if ("viewBox" == sName)
|
||||
{
|
||||
std::vector<double> arValues = StrUtils::ReadDoubleValues(wsViewBox);
|
||||
const std::vector<double> arValues{StrUtils::ReadDoubleValues(oReader.GetText())};
|
||||
if (4 == arValues.size())
|
||||
{
|
||||
m_oViewBox.m_oX = arValues[0];
|
||||
@ -29,35 +38,24 @@ namespace SVG
|
||||
m_oViewBox.m_oHeight = arValues[3];
|
||||
}
|
||||
}
|
||||
|
||||
const std::wstring& wsUnits = oNode.GetAttribute(L"markerUnits");
|
||||
|
||||
if (L"userSpaceOnUse" == wsUnits)
|
||||
m_enUnits = EMarkerUnits::UserSpaceOnUse;
|
||||
else
|
||||
m_enUnits = EMarkerUnits::StrokeWidth;
|
||||
|
||||
const std::wstring& wsOrient = oNode.GetAttribute(L"orient");
|
||||
|
||||
if (L"auto" == wsOrient)
|
||||
m_enOrient = EMarkerOrient::Auto;
|
||||
else if (L"auto-start-reverse" == wsOrient)
|
||||
m_enOrient = EMarkerOrient::Auto_start_reverse;
|
||||
else
|
||||
else if ("markerUnits" == sName)
|
||||
{
|
||||
m_enOrient = EMarkerOrient::Angle;
|
||||
if (!StrUtils::ReadAngle(wsOrient, m_dAngle))
|
||||
if (L"userSpaceOnUse" == oReader.GetText())
|
||||
m_enUnits = EMarkerUnits::UserSpaceOnUse;
|
||||
}
|
||||
else if ("orient" == sName)
|
||||
{
|
||||
const std::wstring& wsOrient{oReader.GetText()};
|
||||
|
||||
if (L"auto" == wsOrient)
|
||||
m_enOrient = EMarkerOrient::Auto;
|
||||
else if (L"auto-start-reverse" == wsOrient)
|
||||
m_enOrient = EMarkerOrient::Auto_start_reverse;
|
||||
else if (!StrUtils::ReadAngle(wsOrient, m_dAngle))
|
||||
StrUtils::ReadDoubleValue(wsOrient, m_dAngle);
|
||||
}
|
||||
}
|
||||
|
||||
CMarker::~CMarker()
|
||||
{
|
||||
}
|
||||
|
||||
ObjectType CMarker::GetType() const
|
||||
{
|
||||
return AppliedObject;
|
||||
else
|
||||
CObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CMarker::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
@ -68,7 +66,11 @@ namespace SVG
|
||||
if (NULL == oExternalData.m_pPoints || oExternalData.m_pPoints->empty() || m_arObjects.empty() || (EMarkerUnits::StrokeWidth == m_enUnits && Equals(0., oExternalData.m_dStroke)))
|
||||
return;
|
||||
|
||||
const double dMaxScale = ((EMarkerUnits::StrokeWidth == m_enUnits) ? oExternalData.m_dStroke : 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)));
|
||||
const double dMaxScale = ((EMarkerUnits::StrokeWidth == m_enUnits) ? oExternalData.m_dStroke : 1.) *
|
||||
((!m_oViewBox.m_oWidth.Empty() && !m_oViewBox.m_oHeight.Empty()) ?
|
||||
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))) :
|
||||
1.);
|
||||
|
||||
double dM11, dM12, dM21, dM22, dDx, dDy;
|
||||
pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
|
||||
|
||||
@ -45,12 +45,15 @@ namespace SVG
|
||||
|
||||
class CMarker : public CObject, public CContainer<CRenderedObject>
|
||||
{
|
||||
friend class CObject;
|
||||
CMarker(CSvgReader& oReader);
|
||||
public:
|
||||
CMarker(XmlUtils::CXmlNode& oNode);
|
||||
virtual ~CMarker();
|
||||
virtual ~CMarker() = default;
|
||||
|
||||
ObjectType GetType() const override;
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode) override;
|
||||
|
||||
void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const TMarkerExternData& oExternalData, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const;
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CMask::CMask(XmlUtils::CXmlNode &oNode)
|
||||
: CClipPath(oNode)
|
||||
CMask::CMask(CSvgReader& oReader)
|
||||
: CClipPath(oReader)
|
||||
{}
|
||||
|
||||
bool CMask::Apply(IRenderer *pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds)
|
||||
@ -14,7 +14,7 @@ namespace SVG
|
||||
pRenderer->BeginCommand(c_nMaskType);
|
||||
pRenderer->PathCommandStart();
|
||||
|
||||
for (const CRenderedObject* pObject : m_oContainer.m_arObjects)
|
||||
for (const CRenderedObject* pObject : m_oContainer)
|
||||
pObject->Draw(pRenderer, pFile, CommandeModeMask);
|
||||
|
||||
pRenderer->EndCommand(c_nMaskType);
|
||||
|
||||
@ -7,9 +7,9 @@ namespace SVG
|
||||
{
|
||||
class CMask : public CClipPath
|
||||
{
|
||||
friend class CObject;
|
||||
CMask(CSvgReader& oReader);
|
||||
public:
|
||||
CMask(XmlUtils::CXmlNode& oNode);
|
||||
|
||||
bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override;
|
||||
};
|
||||
}
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
#include "CObjectBase.h"
|
||||
#include "../CSvgFile.h"
|
||||
|
||||
#include "../../../../../Common/3dParty/html/css/src/StaticFunctions.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
TSvgStyles &TSvgStyles::operator+=(const TSvgStyles &oSvgStyles)
|
||||
@ -31,14 +33,42 @@ namespace SVG
|
||||
: m_oXmlNode(oData)
|
||||
{}
|
||||
|
||||
CObject::CObject(XmlUtils::CXmlNode &oNode)
|
||||
CObject::CObject(CSvgReader& oReader)
|
||||
{
|
||||
SetNodeData(oNode);
|
||||
m_oXmlNode.m_wsName = oReader.GetNameW();
|
||||
}
|
||||
|
||||
CObject::~CObject()
|
||||
CObject::CObject(const CObject& oObject)
|
||||
: m_oXmlNode(oObject.m_oXmlNode), m_oTransformation(oObject.m_oTransformation)
|
||||
{}
|
||||
|
||||
void CObject::Mark()
|
||||
{
|
||||
this->AddRef();
|
||||
}
|
||||
|
||||
bool CObject::Marked() const
|
||||
{
|
||||
//Так как по логике кода объект может храниться только в одном контейнере и в списке маркированных элементов,
|
||||
//то хватит и такой проверки
|
||||
return 1 != m_lRef;
|
||||
}
|
||||
|
||||
void CObject::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("class" == sName)
|
||||
{
|
||||
m_oXmlNode.m_wsClass = oReader.GetText();
|
||||
std::transform(m_oXmlNode.m_wsClass.begin(), m_oXmlNode.m_wsClass.end(), m_oXmlNode.m_wsClass.begin(), std::towlower);
|
||||
}
|
||||
else if ("id" == sName)
|
||||
m_oXmlNode.m_wsId = oReader.GetText();
|
||||
else if ("style" == sName)
|
||||
m_oXmlNode.m_wsStyle = oReader.GetText();
|
||||
else
|
||||
m_oXmlNode.m_mAttributes.insert({oReader.GetNameW(), oReader.GetText()});
|
||||
}
|
||||
|
||||
void CObject::SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
if (wsStyles.empty())
|
||||
@ -47,6 +77,11 @@ namespace SVG
|
||||
SetData(NSCSS::NS_STATIC_FUNCTIONS::GetRules(wsStyles), ushLevel, bHardMode);
|
||||
}
|
||||
|
||||
void CObject::ReadChildrens(CSvgReader& oReader, CSvgFile* pSvgFile)
|
||||
{
|
||||
//TODO:: реализовано в классах там, где нужно
|
||||
}
|
||||
|
||||
void CObject::SetTransform(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
if (mAttributes.end() != mAttributes.find(L"transform"))
|
||||
@ -153,33 +188,6 @@ namespace SVG
|
||||
return pDefObject->Apply(pRenderer, pFile, oBounds);
|
||||
}
|
||||
|
||||
void CObject::SetNodeData(XmlUtils::CXmlNode &oNode)
|
||||
{
|
||||
if (!oNode.IsValid())
|
||||
return;
|
||||
|
||||
std::vector<std::wstring> arProperties, arValues;
|
||||
|
||||
oNode.GetAllAttributes(arProperties, arValues);
|
||||
|
||||
m_oXmlNode.m_wsName = oNode.GetName();
|
||||
|
||||
for (unsigned int unIndex = 0; unIndex < arProperties.size(); ++unIndex)
|
||||
{
|
||||
if (L"class" == arProperties[unIndex])
|
||||
{
|
||||
m_oXmlNode.m_wsClass = arValues[unIndex];
|
||||
std::transform(m_oXmlNode.m_wsClass.begin(), m_oXmlNode.m_wsClass.end(), m_oXmlNode.m_wsClass.begin(), std::towlower);
|
||||
}
|
||||
else if (L"id" == arProperties[unIndex])
|
||||
m_oXmlNode.m_wsId = arValues[unIndex];
|
||||
else if (L"style" == arProperties[unIndex])
|
||||
m_oXmlNode.m_wsStyle = arValues[unIndex];
|
||||
else
|
||||
m_oXmlNode.m_mAttributes.insert({arProperties[unIndex], arValues[unIndex]});
|
||||
}
|
||||
}
|
||||
|
||||
std::wstring CObject::GetId() const
|
||||
{
|
||||
return m_oXmlNode.m_wsId;
|
||||
@ -193,16 +201,18 @@ namespace SVG
|
||||
CRenderedObject::CRenderedObject(const NSCSS::CNode &oData, CRenderedObject *pParent)
|
||||
: CObject(oData), m_pParent(pParent)
|
||||
{
|
||||
SetDefaultStyles();
|
||||
SetDefaultData();
|
||||
}
|
||||
|
||||
CRenderedObject::CRenderedObject(XmlUtils::CXmlNode &oNode, CRenderedObject *pParent)
|
||||
: CObject(oNode), m_pParent(pParent)
|
||||
CRenderedObject::CRenderedObject(CSvgReader& oReader, CRenderedObject *pParent)
|
||||
: CObject(oReader), m_pParent(pParent)
|
||||
{
|
||||
SetDefaultStyles();
|
||||
SetDefaultData();
|
||||
}
|
||||
|
||||
CRenderedObject::~CRenderedObject()
|
||||
CRenderedObject::CRenderedObject(const CRenderedObject& oRenderedObject)
|
||||
: CObject(oRenderedObject), m_oStyles(oRenderedObject.m_oStyles),
|
||||
m_pParent(oRenderedObject.m_pParent)
|
||||
{}
|
||||
|
||||
ObjectType CRenderedObject::GetType() const
|
||||
@ -210,6 +220,11 @@ namespace SVG
|
||||
return RendererObject;
|
||||
}
|
||||
|
||||
void CRenderedObject::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
CObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CRenderedObject::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
SetTransform(mAttributes, ushLevel, bHardMode);
|
||||
@ -229,20 +244,6 @@ namespace SVG
|
||||
return arObjects;
|
||||
}
|
||||
|
||||
void CRenderedObject::SetDefaultStyles()
|
||||
{
|
||||
m_oStyles.m_oStroke.m_oLineCap.SetMapping({std::make_pair(L"butt", Aggplus::LineCapFlat), std::make_pair(L"round", Aggplus::LineCapRound), std::make_pair(L"square", Aggplus::LineCapSquare)});
|
||||
m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineCapFlat;
|
||||
|
||||
m_oStyles.m_oStroke.m_oLineJoin.SetMapping({std::make_pair(L"arcs", Aggplus::LineJoinMiter), std::make_pair(L"bevel", Aggplus::LineJoinBevel), std::make_pair(L"miter", Aggplus::LineJoinMiter), std::make_pair(L"miter-clip", Aggplus::LineJoinMiterClipped), std::make_pair(L"round", Aggplus::LineJoinRound)});
|
||||
m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter;
|
||||
|
||||
m_oStyles.m_oStroke.m_oMiterlimit = 4.;
|
||||
|
||||
m_oTransformation.m_oOpacity = 1.;
|
||||
m_oTransformation.m_bDraw = true;
|
||||
}
|
||||
|
||||
void CRenderedObject::SetStroke(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
if (mAttributes.end() != mAttributes.find(L"stroke"))
|
||||
@ -447,15 +448,27 @@ namespace SVG
|
||||
return false;
|
||||
}
|
||||
|
||||
CAppliedObject::CAppliedObject(XmlUtils::CXmlNode &oNode)
|
||||
: CObject(oNode)
|
||||
{}
|
||||
void CRenderedObject::SetDefaultData()
|
||||
{
|
||||
m_oStyles.m_oStroke.m_oLineCap.SetMapping({std::make_pair(L"butt", Aggplus::LineCapFlat), std::make_pair(L"round", Aggplus::LineCapRound), std::make_pair(L"square", Aggplus::LineCapSquare)});
|
||||
m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineCapFlat;
|
||||
|
||||
CAppliedObject::~CAppliedObject()
|
||||
m_oStyles.m_oStroke.m_oLineJoin.SetMapping({std::make_pair(L"arcs", Aggplus::LineJoinMiter), std::make_pair(L"bevel", Aggplus::LineJoinBevel), std::make_pair(L"miter", Aggplus::LineJoinMiter), std::make_pair(L"miter-clip", Aggplus::LineJoinMiterClipped), std::make_pair(L"round", Aggplus::LineJoinRound)});
|
||||
m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter;
|
||||
|
||||
m_oStyles.m_oStroke.m_oMiterlimit = 4.;
|
||||
|
||||
m_oTransformation.m_oOpacity = 1.;
|
||||
m_oTransformation.m_bDraw = true;
|
||||
}
|
||||
|
||||
CAppliedObject::CAppliedObject(CSvgReader& oReader)
|
||||
: CObject(oReader)
|
||||
{}
|
||||
|
||||
ObjectType CAppliedObject::GetType() const
|
||||
{
|
||||
return AppliedObject;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -2,13 +2,14 @@
|
||||
#define COBJECTBASE_H
|
||||
|
||||
#include "../../../../../Common/3dParty/html/css/src/CNode.h"
|
||||
#include "../../../../../Common/3dParty/html/css/src/StaticFunctions.h"
|
||||
#include "../../../../xml/include/xmlutils.h"
|
||||
#include "../../../../graphics/IRenderer.h"
|
||||
#include "../../../../common/IGrObject.h"
|
||||
#include "../SvgTypes.h"
|
||||
|
||||
class CSvgFile;
|
||||
#include "../SvgTypes.h"
|
||||
#include "../SvgReader.h"
|
||||
#include "CStyle.h"
|
||||
|
||||
#include "../CSvgFile.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
@ -33,22 +34,34 @@ namespace SVG
|
||||
enum ObjectType
|
||||
{
|
||||
RendererObject,
|
||||
AppliedObject
|
||||
AppliedObject,
|
||||
DataObject
|
||||
};
|
||||
|
||||
class CObject : public IGrObject
|
||||
{
|
||||
public:
|
||||
protected:
|
||||
CObject(const NSCSS::CNode& oData);
|
||||
CObject(XmlUtils::CXmlNode& oNode);
|
||||
virtual ~CObject();
|
||||
CObject(CSvgReader& oReader);
|
||||
CObject(const CObject& oObject);
|
||||
public:
|
||||
virtual ~CObject() = default;
|
||||
|
||||
virtual ObjectType GetType() const = 0;
|
||||
|
||||
void Mark();
|
||||
bool Marked() const;
|
||||
|
||||
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader);
|
||||
|
||||
void SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode = false);
|
||||
|
||||
virtual void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) = 0;
|
||||
|
||||
template <class T, typename... Args>
|
||||
static T* Create(CSvgReader& oReader, CSvgFile* pSvgFile, Args&&... args);
|
||||
virtual void ReadChildrens(CSvgReader& oReader, CSvgFile* pSvgFile);
|
||||
|
||||
void SetTransform(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false);
|
||||
void SetClip(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false);
|
||||
void SetMask(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false);
|
||||
@ -57,37 +70,49 @@ namespace SVG
|
||||
|
||||
std::wstring GetId() const;
|
||||
virtual std::vector<NSCSS::CNode> GetFullPath() const;
|
||||
private:
|
||||
protected:
|
||||
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;
|
||||
bool ApplyMask(IRenderer* pRenderer, const SvgColor* pMask, const CSvgFile *pFile, const TBounds& oBounds) const;
|
||||
|
||||
bool ApplyDef(IRenderer* pRenderer, const CSvgFile *pFile, const std::wstring& wsUrl, const TBounds& oBounds) const;
|
||||
|
||||
void SetNodeData(XmlUtils::CXmlNode& oNode);
|
||||
|
||||
friend class CRenderedObject;
|
||||
friend class CAppliedObject;
|
||||
|
||||
friend class CUse;
|
||||
friend class CLine;
|
||||
friend class CRect;
|
||||
friend class CPath;
|
||||
friend class CText;
|
||||
friend class CTSpan;
|
||||
friend class CImage;
|
||||
friend class CCircle;
|
||||
friend class CPolygon;
|
||||
friend class CEllipse;
|
||||
friend class CPolyline;
|
||||
friend class CGraphicsContainer;
|
||||
|
||||
friend class CClipPath;
|
||||
|
||||
NSCSS::CNode m_oXmlNode;
|
||||
TSvgTransformation m_oTransformation;
|
||||
};
|
||||
|
||||
template<class T, typename... Args>
|
||||
inline T* CObject::Create(CSvgReader& oReader, CSvgFile* pSvgFile, Args&&... args)
|
||||
{
|
||||
T* pObject = new T(oReader, std::forward<Args>(args)...);
|
||||
|
||||
if (NULL == pObject)
|
||||
return NULL;
|
||||
|
||||
START_READ_ATTRIBUTES(oReader)
|
||||
pObject->SetAttribute(sAttributeName, oReader);
|
||||
END_READ_ATTRIBUTES(oReader)
|
||||
|
||||
if (NULL == pSvgFile)
|
||||
return pObject;
|
||||
|
||||
if (DataObject != pObject->GetType() &&
|
||||
(!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType()))
|
||||
{
|
||||
delete pObject;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const CSvgCalculator* pSvgCalculator{pSvgFile->GetSvgCalculator()};
|
||||
|
||||
if (NULL != pSvgCalculator)
|
||||
pSvgCalculator->SetData(pObject);
|
||||
|
||||
pObject->ReadChildrens(oReader, pSvgFile);
|
||||
|
||||
return pObject;
|
||||
}
|
||||
|
||||
enum CommandeMode
|
||||
{
|
||||
CommandeModeDraw,
|
||||
@ -95,25 +120,28 @@ namespace SVG
|
||||
CommandeModeMask
|
||||
};
|
||||
|
||||
class CSvgCalculator;
|
||||
|
||||
class CRenderedObject : public CObject
|
||||
{
|
||||
public:
|
||||
protected:
|
||||
CRenderedObject(const NSCSS::CNode& oData, CRenderedObject* pParent = NULL);
|
||||
CRenderedObject(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
virtual ~CRenderedObject();
|
||||
CRenderedObject(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
CRenderedObject(const CRenderedObject& oRenderedObject);
|
||||
public:
|
||||
virtual ~CRenderedObject() = default;
|
||||
|
||||
ObjectType GetType() const override;
|
||||
|
||||
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
virtual void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
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;
|
||||
virtual TBounds GetBounds(SvgMatrix* pTransform = nullptr) const = 0;
|
||||
|
||||
std::vector<NSCSS::CNode> GetFullPath() const override;
|
||||
private:
|
||||
void SetDefaultStyles();
|
||||
|
||||
void SetStroke(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false);
|
||||
void SetFill(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false);
|
||||
|
||||
@ -126,6 +154,8 @@ namespace SVG
|
||||
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;
|
||||
|
||||
void SetDefaultData();
|
||||
|
||||
friend class CUse;
|
||||
friend class CLine;
|
||||
friend class CRect;
|
||||
@ -148,9 +178,10 @@ namespace SVG
|
||||
|
||||
class CAppliedObject : public CObject
|
||||
{
|
||||
protected:
|
||||
CAppliedObject(CSvgReader& oReader);
|
||||
public:
|
||||
CAppliedObject(XmlUtils::CXmlNode& oNode);
|
||||
virtual ~CAppliedObject();
|
||||
virtual ~CAppliedObject() = default;
|
||||
|
||||
ObjectType GetType() const override;
|
||||
|
||||
|
||||
@ -8,49 +8,46 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
IPathElement::~IPathElement()
|
||||
{
|
||||
}
|
||||
|
||||
#define ISPATHCOMMAND(wchar) L'M' == wchar || L'm' == wchar || L'Z' == wchar || L'z' == wchar || L'L' == wchar || L'l' == wchar || L'H' == wchar || L'h' == wchar || L'V' == wchar || L'v' == wchar || L'C' == wchar || L'c' == wchar || L'S' == wchar || L's' == wchar || L'Q' == wchar || L'q' == wchar || L'T' == wchar || L't' == wchar || L'A' == wchar || L'a' == wchar
|
||||
// IpathElement
|
||||
TBounds IPathElement::GetBounds() const
|
||||
{
|
||||
TBounds oBounds{DBL_MAX, DBL_MAX, -DBL_MAX, -DBL_MAX};
|
||||
|
||||
for (const Point& oPoint : m_arPoints)
|
||||
Point IPathElement::GetFirstPoint() const
|
||||
{
|
||||
switch (GetType())
|
||||
{
|
||||
oBounds.m_dLeft = std::min(oBounds.m_dLeft, oPoint.dX);
|
||||
oBounds.m_dTop = std::min(oBounds.m_dTop, oPoint.dY);
|
||||
oBounds.m_dRight = std::max(oBounds.m_dRight, oPoint.dX);
|
||||
oBounds.m_dBottom = std::max(oBounds.m_dBottom, oPoint.dY);
|
||||
case Move: return ((CMoveElement*)this)->m_oPoint;
|
||||
case Line: return ((CLineElement*)this)->m_oPoint;
|
||||
case CBezier:
|
||||
case SBezier:
|
||||
case QBezier:
|
||||
case TBezier:
|
||||
case Arc: return ((CCBezierElement*)this)->m_oPoint1;
|
||||
case Close: return Point{0., 0.};
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
return Point{0., 0.};
|
||||
}
|
||||
|
||||
UINT IPathElement::GetPointCount() const
|
||||
Point IPathElement::GetLastPoint() const
|
||||
{
|
||||
return m_arPoints.size();
|
||||
}
|
||||
switch (GetType())
|
||||
{
|
||||
case Move: return ((CMoveElement*)this)->m_oPoint;
|
||||
case Line: return ((CLineElement*)this)->m_oPoint;
|
||||
case CBezier:
|
||||
case SBezier:
|
||||
case QBezier:
|
||||
case TBezier:
|
||||
case Arc: return ((CCBezierElement*)this)->m_oPointE;
|
||||
case Close: return Point{0., 0.};
|
||||
}
|
||||
|
||||
Point IPathElement::operator[](int nIndex) const
|
||||
{
|
||||
if (m_arPoints.empty() || (nIndex > 0 && nIndex >= m_arPoints.size()) || (nIndex < 0 && -nIndex > m_arPoints.size()))
|
||||
return Point{0., 0.};
|
||||
|
||||
return m_arPoints[(nIndex >= 0) ? nIndex : m_arPoints.size() + nIndex];
|
||||
return Point{0., 0.};
|
||||
}
|
||||
|
||||
//CMoveElement
|
||||
CMoveElement::CMoveElement(const Point &oPoint)
|
||||
{
|
||||
m_arPoints.push_back(oPoint);
|
||||
}
|
||||
|
||||
CMoveElement::~CMoveElement()
|
||||
{
|
||||
}
|
||||
: m_oPoint(oPoint)
|
||||
{}
|
||||
|
||||
EPathElement CMoveElement::GetType() const
|
||||
{
|
||||
@ -65,7 +62,7 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (bRelativeCoordinate && NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
CMoveElement *pMoveElement = new CMoveElement(Point{arValues[0], arValues[1]} + oTranslatePoint);
|
||||
|
||||
@ -76,19 +73,18 @@ namespace SVG
|
||||
|
||||
void CMoveElement::Draw(IRenderer *pRenderer) const
|
||||
{
|
||||
if (m_arPoints.empty())
|
||||
return;
|
||||
if (NULL != pRenderer)
|
||||
pRenderer->PathCommandMoveTo(m_oPoint.dX, m_oPoint.dY);
|
||||
}
|
||||
|
||||
pRenderer->PathCommandMoveTo(m_arPoints[0].dX, m_arPoints[0].dY);
|
||||
TBounds CMoveElement::GetBounds() const
|
||||
{
|
||||
return TBounds{m_oPoint.dX, m_oPoint.dY, 1, 1};
|
||||
}
|
||||
|
||||
//CLineElement
|
||||
CLineElement::CLineElement(const Point &oPoint)
|
||||
{
|
||||
m_arPoints.push_back(oPoint);
|
||||
}
|
||||
|
||||
CLineElement::~CLineElement()
|
||||
: m_oPoint(oPoint)
|
||||
{}
|
||||
|
||||
EPathElement CLineElement::GetType() const
|
||||
@ -104,7 +100,7 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (bRelativeCoordinate && NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
CLineElement *pLineElement = new CLineElement(Point{arValues[0], arValues[1]} + oTranslatePoint);
|
||||
|
||||
@ -121,7 +117,7 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
CLineElement *pLineElement = new CLineElement(Point{oTranslatePoint.dX, arValues[0] + ((bRelativeCoordinate) ? oTranslatePoint.dY : 0)});
|
||||
|
||||
@ -138,7 +134,7 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
CLineElement *pLineElement = new CLineElement(Point{arValues[0] + ((bRelativeCoordinate) ? oTranslatePoint.dX : 0), oTranslatePoint.dY});
|
||||
|
||||
@ -149,23 +145,19 @@ namespace SVG
|
||||
|
||||
void CLineElement::Draw(IRenderer *pRenderer) const
|
||||
{
|
||||
if (m_arPoints.empty())
|
||||
return;
|
||||
if (NULL != pRenderer)
|
||||
pRenderer->PathCommandLineTo(m_oPoint.dX, m_oPoint.dY);
|
||||
}
|
||||
|
||||
pRenderer->PathCommandLineTo(m_arPoints[0].dX, m_arPoints[0].dY);
|
||||
TBounds CLineElement::GetBounds() const
|
||||
{
|
||||
return TBounds{m_oPoint.dX, m_oPoint.dY, 1, 1};
|
||||
}
|
||||
|
||||
//CCurveBezierElement
|
||||
CCBezierElement::CCBezierElement(const Point &oPoint1, const Point &oPoint2, const Point &oPointE, EPathElement enType)
|
||||
: m_enType(enType)
|
||||
{
|
||||
m_arPoints.push_back(oPoint1);
|
||||
m_arPoints.push_back(oPoint2);
|
||||
m_arPoints.push_back(oPointE);
|
||||
}
|
||||
CCBezierElement::~CCBezierElement()
|
||||
{
|
||||
}
|
||||
: m_oPoint1(oPoint1), m_oPoint2(oPoint2), m_oPointE(oPointE), m_enType(enType)
|
||||
{}
|
||||
|
||||
EPathElement CCBezierElement::GetType() const
|
||||
{
|
||||
@ -180,11 +172,11 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (bRelativeCoordinate && NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
CCBezierElement *pCBezierElement = new CCBezierElement(Point{arValues[0], arValues[1]} + oTranslatePoint,
|
||||
Point{arValues[2], arValues[3]} + oTranslatePoint,
|
||||
Point{arValues[4], arValues[5]} + oTranslatePoint);
|
||||
Point{arValues[2], arValues[3]} + oTranslatePoint,
|
||||
Point{arValues[4], arValues[5]} + oTranslatePoint);
|
||||
|
||||
arValues.erase(arValues.begin(), arValues.begin() + 6);
|
||||
|
||||
@ -200,14 +192,19 @@ namespace SVG
|
||||
|
||||
if (NULL != pPrevElement)
|
||||
{
|
||||
oFirstPoint = (*pPrevElement)[-1];
|
||||
oFirstPoint = pPrevElement->GetLastPoint();
|
||||
if (bRelativeCoordinate)
|
||||
oTranslatePoint = oFirstPoint;
|
||||
}
|
||||
|
||||
if (EPathElement::SBezier == pPrevElement->GetType() ||
|
||||
EPathElement::CBezier == pPrevElement->GetType())
|
||||
oFirstPoint += oFirstPoint - (*pPrevElement)[-2];
|
||||
{
|
||||
CCBezierElement *pBezierElement{dynamic_cast<CCBezierElement*>(pPrevElement)};
|
||||
|
||||
if (NULL != pBezierElement)
|
||||
oFirstPoint += oFirstPoint - pBezierElement->m_oPoint2;
|
||||
}
|
||||
|
||||
CCBezierElement *pCBezierElement = new CCBezierElement(oFirstPoint,
|
||||
Point{arValues[0], arValues[1]} + oTranslatePoint,
|
||||
@ -228,7 +225,7 @@ namespace SVG
|
||||
|
||||
if (NULL != pPrevElement)
|
||||
{
|
||||
oLastPoint = (*pPrevElement)[-1];
|
||||
oLastPoint = pPrevElement->GetLastPoint();
|
||||
if (bRelativeCoordinate)
|
||||
oTranslatePoint = oLastPoint;
|
||||
}
|
||||
@ -240,6 +237,14 @@ namespace SVG
|
||||
return pCBezierElement;
|
||||
}
|
||||
|
||||
bool ItBezierType(EPathElement eType)
|
||||
{
|
||||
return EPathElement::CBezier == eType ||
|
||||
EPathElement::SBezier == eType ||
|
||||
EPathElement::QBezier == eType ||
|
||||
EPathElement::TBezier == eType;
|
||||
}
|
||||
|
||||
IPathElement *CCBezierElement::CreateFromTArray(std::vector<double> &arValues, bool bRelativeCoordinate, IPathElement *pPrevElement)
|
||||
{
|
||||
if (arValues.size() < 2)
|
||||
@ -247,10 +252,29 @@ namespace SVG
|
||||
|
||||
Point oFirstPoint{0., 0.}, oSecondPoint{0., 0.}, oTranslatePoint{0., 0.};
|
||||
|
||||
if (EPathElement::SBezier == pPrevElement->GetType() ||
|
||||
EPathElement::CBezier == pPrevElement->GetType())
|
||||
{
|
||||
CCBezierElement *pBezierElement{dynamic_cast<CCBezierElement*>(pPrevElement)};
|
||||
|
||||
if (NULL != pBezierElement)
|
||||
oFirstPoint += oFirstPoint - pBezierElement->m_oPoint2;
|
||||
}
|
||||
|
||||
if (NULL != pPrevElement)
|
||||
{
|
||||
oFirstPoint = (*pPrevElement)[-1];
|
||||
oSecondPoint = (*pPrevElement)[-2];
|
||||
oFirstPoint = pPrevElement->GetLastPoint();
|
||||
|
||||
if (ItBezierType(pPrevElement->GetType()))
|
||||
{
|
||||
CCBezierElement *pBezierElement{dynamic_cast<CCBezierElement*>(pPrevElement)};
|
||||
|
||||
if (NULL != pBezierElement)
|
||||
oSecondPoint = pBezierElement->m_oPoint2;
|
||||
}
|
||||
else
|
||||
oSecondPoint = oFirstPoint;
|
||||
|
||||
if (bRelativeCoordinate)
|
||||
oTranslatePoint = oFirstPoint;
|
||||
}
|
||||
@ -282,9 +306,9 @@ namespace SVG
|
||||
Point oTranslatePoint{0., 0.};
|
||||
|
||||
if (bRelativeCoordinate && NULL != pPrevElement)
|
||||
oTranslatePoint = (*pPrevElement)[-1];
|
||||
oTranslatePoint = pPrevElement->GetLastPoint();
|
||||
|
||||
Point oSrartPoint{(*pPrevElement)[-1]};
|
||||
Point oSrartPoint{pPrevElement->GetLastPoint()};
|
||||
Point oSecondPoint{arValues[5] + oTranslatePoint.dX, arValues[6] + oTranslatePoint.dY};
|
||||
|
||||
if (oSrartPoint == oSecondPoint)
|
||||
@ -361,12 +385,26 @@ namespace SVG
|
||||
|
||||
void CCBezierElement::Draw(IRenderer *pRenderer) const
|
||||
{
|
||||
if (3 != m_arPoints.size())
|
||||
return;
|
||||
pRenderer->PathCommandCurveTo(m_oPoint1.dX, m_oPoint1.dY,
|
||||
m_oPoint2.dX, m_oPoint2.dY,
|
||||
m_oPointE.dX, m_oPointE.dY);
|
||||
}
|
||||
|
||||
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);
|
||||
#define CHECK_BOUNDS(bounds, point)\
|
||||
bounds.m_dLeft = std::min(oBounds.m_dLeft, point.dX);\
|
||||
bounds.m_dTop = std::min(oBounds.m_dTop, point.dY);\
|
||||
bounds.m_dRight = std::max(oBounds.m_dRight, point.dX);\
|
||||
bounds.m_dBottom = std::max(oBounds.m_dBottom, point.dY)
|
||||
|
||||
TBounds CCBezierElement::GetBounds() const
|
||||
{
|
||||
TBounds oBounds{DBL_MAX, DBL_MAX, -DBL_MAX, -DBL_MAX};
|
||||
|
||||
CHECK_BOUNDS(oBounds, m_oPoint1);
|
||||
CHECK_BOUNDS(oBounds, m_oPoint2);
|
||||
CHECK_BOUNDS(oBounds, m_oPointE);
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
|
||||
inline double ClampSinCos(const double& d)
|
||||
@ -422,13 +460,6 @@ namespace SVG
|
||||
}
|
||||
|
||||
//CCloseElement
|
||||
CCloseElement::CCloseElement()
|
||||
{}
|
||||
|
||||
CCloseElement::~CCloseElement()
|
||||
{
|
||||
}
|
||||
|
||||
EPathElement CCloseElement::GetType() const
|
||||
{
|
||||
return EPathElement::Close;
|
||||
@ -439,18 +470,20 @@ namespace SVG
|
||||
pRenderer->PathCommandClose();
|
||||
}
|
||||
|
||||
TBounds CCloseElement::GetBounds() const
|
||||
{
|
||||
return TBounds{0., 0., 0., 0.};
|
||||
}
|
||||
|
||||
#define LASTELEMENT(array) (array.empty()) ? NULL : array.back()
|
||||
#define RANGEALIGMENT(value, left, rigth) if (value < left) value = left; else if (value > rigth) value = rigth;
|
||||
#define EPSILON 0.05
|
||||
#define CURVESTEP 0.05
|
||||
#define MINCURVESTEP 0.001
|
||||
|
||||
CPath::CPath(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent, bool bChechCommands)
|
||||
: CRenderedObject(oNode, pParent), m_bEvenOddRule(false)
|
||||
{
|
||||
if (bChechCommands)
|
||||
ReadFromString(oNode.GetAttribute(L"d"));
|
||||
}
|
||||
CPath::CPath(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CRenderedObject(oReader, pParent), m_bEvenOddRule(false)
|
||||
{}
|
||||
|
||||
CPath::~CPath()
|
||||
{
|
||||
@ -458,6 +491,14 @@ namespace SVG
|
||||
delete pPathElement;
|
||||
}
|
||||
|
||||
void CPath::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("d" == sName)
|
||||
ReadFromString(oReader.GetText());
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
void CPath::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
CRenderedObject::SetData(mAttributes, ushLevel, bHardMode);
|
||||
@ -541,17 +582,22 @@ namespace SVG
|
||||
{
|
||||
const IPathElement* pFirstElement{m_arElements[unIndex]};
|
||||
|
||||
(*oExternalData.m_pPoints)[0].m_oPoint = (*pFirstElement)[0];
|
||||
(*oExternalData.m_pPoints)[0].m_oPoint = pFirstElement->GetFirstPoint();
|
||||
|
||||
if (pStartMarker->NeedExternalAngle())
|
||||
{
|
||||
Point oCurent{(*pFirstElement)[0]};
|
||||
Point oCurent{pFirstElement->GetFirstPoint()};
|
||||
Point oNext;
|
||||
|
||||
if (pFirstElement->GetPointCount() > 1)
|
||||
oNext = (*pFirstElement)[1];
|
||||
if (ItBezierType(pFirstElement->GetType()))
|
||||
{
|
||||
const CCBezierElement* pBezierElement{dynamic_cast<const CCBezierElement*>(pFirstElement)};
|
||||
|
||||
if (NULL != pBezierElement)
|
||||
oNext = pBezierElement->m_oPoint2;
|
||||
}
|
||||
else if (unIndex < m_arElements.size() - 1 && EPathElement::Close != m_arElements[unIndex + 1]->GetType() && EPathElement::Move != m_arElements[unIndex + 1]->GetType())
|
||||
oNext = (*m_arElements[unIndex + 1])[0];
|
||||
oNext = m_arElements[unIndex + 1]->GetFirstPoint();
|
||||
|
||||
(*oExternalData.m_pPoints)[0].m_dAngle = CALCULATE_ANGLE(oCurent, oNext);
|
||||
|
||||
@ -577,12 +623,12 @@ namespace SVG
|
||||
for (unsigned int unIndex = 1; unIndex < m_arElements.size() - 1; ++unIndex)
|
||||
{
|
||||
if (EPathElement::Close != m_arElements[unIndex]->GetType())
|
||||
(*oExternalData.m_pPoints)[unIndex - 1].m_oPoint = (*m_arElements[unIndex])[-1];
|
||||
(*oExternalData.m_pPoints)[unIndex - 1].m_oPoint = m_arElements[unIndex]->GetLastPoint();
|
||||
|
||||
if (pMidMarker->NeedExternalAngle())
|
||||
{
|
||||
const Point oCurrent{(*m_arElements[unIndex])[0]};
|
||||
const Point oPrev{(*m_arElements[unIndex + 1])[-1]};
|
||||
const Point oCurrent{m_arElements[unIndex]->GetFirstPoint()};
|
||||
const Point oPrev{m_arElements[unIndex + 1]->GetLastPoint()};
|
||||
|
||||
(*oExternalData.m_pPoints)[unIndex - 1].m_dAngle = CALCULATE_ANGLE(oCurrent, oPrev);
|
||||
}
|
||||
@ -608,17 +654,22 @@ namespace SVG
|
||||
{
|
||||
const IPathElement* pLastElement{m_arElements[unIndex]};
|
||||
|
||||
(*oExternalData.m_pPoints)[0].m_oPoint = (*pLastElement)[-1];
|
||||
(*oExternalData.m_pPoints)[0].m_oPoint = pLastElement->GetLastPoint();
|
||||
|
||||
if (pEndMarker->NeedExternalAngle())
|
||||
{
|
||||
Point oCurent{(*pLastElement)[-1]};
|
||||
Point oCurent{pLastElement->GetLastPoint()};
|
||||
Point oPrev;
|
||||
|
||||
if (pLastElement->GetPointCount() > 1)
|
||||
oPrev = (*pLastElement)[-2];
|
||||
else if (unIndex > 0 && EPathElement::Close != m_arElements[unIndex - 1]->GetType() && EPathElement::Move != m_arElements[unIndex - 1]->GetType())
|
||||
oPrev = (*m_arElements[unIndex - 1])[0];
|
||||
if (ItBezierType(pLastElement->GetType()))
|
||||
{
|
||||
const CCBezierElement* pBezierElement{dynamic_cast<const CCBezierElement*>(pLastElement)};
|
||||
|
||||
if (NULL != pBezierElement)
|
||||
oPrev = pBezierElement->m_oPoint2;
|
||||
}
|
||||
else if (unIndex > 0 && EPathElement::Close != m_arElements[unIndex - 1]->GetType())
|
||||
oPrev = m_arElements[unIndex - 1]->GetFirstPoint();
|
||||
|
||||
(*oExternalData.m_pPoints)[0].m_dAngle = CALCULATE_ANGLE(oPrev, oCurent);
|
||||
}
|
||||
@ -652,7 +703,7 @@ namespace SVG
|
||||
}
|
||||
}
|
||||
|
||||
TBounds CPath::GetBounds() const
|
||||
TBounds CPath::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds{DBL_MAX, DBL_MAX, -DBL_MAX, -DBL_MAX}, oTempBounds;
|
||||
|
||||
@ -666,6 +717,16 @@ namespace SVG
|
||||
oBounds.m_dBottom = std::max(oBounds.m_dBottom, oTempBounds.m_dBottom);
|
||||
}
|
||||
|
||||
if (nullptr != pTransform)
|
||||
{
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dLeft, oBounds.m_dTop );
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dRight, oBounds.m_dBottom);
|
||||
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
|
||||
@ -701,7 +762,7 @@ namespace SVG
|
||||
if (NULL == pMoveElement)
|
||||
return;
|
||||
|
||||
AddElement(new CCloseElement);
|
||||
AddElement(new CCloseElement());
|
||||
oSecondPos = ++oFirstPos;
|
||||
continue;
|
||||
}
|
||||
@ -841,13 +902,13 @@ namespace SVG
|
||||
case EPathElement::Move:
|
||||
case EPathElement::Close:
|
||||
{
|
||||
m_oPosition = m_oLastPoint = (*m_pCurrentElement)[0];
|
||||
m_oPosition = m_oLastPoint = m_pCurrentElement->GetFirstPoint();
|
||||
m_pCurrentElement = (*m_pPath)[m_unIndexElement++];
|
||||
return Move(dX);
|
||||
}
|
||||
case EPathElement::Line:
|
||||
{
|
||||
Point oPoint{(*m_pCurrentElement)[0]};
|
||||
Point oPoint{m_pCurrentElement->GetFirstPoint()};
|
||||
|
||||
double dDx = oPoint.dX - m_oPosition.dX;
|
||||
double dDy = oPoint.dY - m_oPosition.dY;
|
||||
@ -874,6 +935,11 @@ namespace SVG
|
||||
case EPathElement::QBezier:
|
||||
case EPathElement::TBezier:
|
||||
{
|
||||
const CCBezierElement* pBezierElement{dynamic_cast<const CCBezierElement*>(m_pCurrentElement)};
|
||||
|
||||
if (NULL == pBezierElement)
|
||||
return false;
|
||||
|
||||
Point oCurvePoint{0., 0.};
|
||||
double dPrevValue = dX;
|
||||
|
||||
@ -897,8 +963,8 @@ namespace SVG
|
||||
|
||||
RANGEALIGMENT(m_dCurveIndex, 0., 1.);
|
||||
|
||||
oCurvePoint.dX = std::pow((1. - m_dCurveIndex), 3) * m_oLastPoint.dX + 3 * std::pow((1. - m_dCurveIndex), 2) * m_dCurveIndex * (*m_pCurrentElement)[0].dX + 3 * (1. - m_dCurveIndex)* std::pow(m_dCurveIndex, 2) * (*m_pCurrentElement)[1].dX + std::pow(m_dCurveIndex, 3) * (*m_pCurrentElement)[2].dX;
|
||||
oCurvePoint.dY = std::pow((1. - m_dCurveIndex), 3) * m_oLastPoint.dY + 3 * std::pow((1. - m_dCurveIndex), 2) * m_dCurveIndex * (*m_pCurrentElement)[0].dY + 3 * (1. - m_dCurveIndex)* std::pow(m_dCurveIndex, 2) * (*m_pCurrentElement)[1].dY + std::pow(m_dCurveIndex, 3) * (*m_pCurrentElement)[2].dY;
|
||||
oCurvePoint.dX = std::pow((1. - m_dCurveIndex), 3) * m_oLastPoint.dX + 3 * std::pow((1. - m_dCurveIndex), 2) * m_dCurveIndex * pBezierElement->m_oPoint1.dX + 3 * (1. - m_dCurveIndex)* std::pow(m_dCurveIndex, 2) * pBezierElement->m_oPoint2.dX + std::pow(m_dCurveIndex, 3) * pBezierElement->m_oPointE.dX;
|
||||
oCurvePoint.dY = std::pow((1. - m_dCurveIndex), 3) * m_oLastPoint.dY + 3 * std::pow((1. - m_dCurveIndex), 2) * m_dCurveIndex * pBezierElement->m_oPoint1.dY + 3 * (1. - m_dCurveIndex)* std::pow(m_dCurveIndex, 2) * pBezierElement->m_oPoint2.dY + std::pow(m_dCurveIndex, 3) * pBezierElement->m_oPointE.dY;
|
||||
|
||||
dPrevValue = dX;
|
||||
|
||||
@ -907,7 +973,7 @@ namespace SVG
|
||||
|
||||
m_dCurveStep = CURVESTEP;
|
||||
|
||||
return NextMove(dX, (*m_pCurrentElement)[-1]);
|
||||
return NextMove(dX, m_pCurrentElement->GetLastPoint());
|
||||
}
|
||||
default: return false;
|
||||
}
|
||||
@ -922,7 +988,7 @@ namespace SVG
|
||||
|
||||
m_unIndexElement = 0;
|
||||
m_pCurrentElement = (*m_pPath)[m_unIndexElement++];
|
||||
m_oPosition = m_oLastPoint = (*m_pCurrentElement)[0];
|
||||
m_oPosition = m_oLastPoint = m_pCurrentElement->GetFirstPoint();
|
||||
m_dAngle = m_dCurveIndex = 0.;
|
||||
m_dCurveStep = CURVESTEP;
|
||||
}
|
||||
|
||||
@ -30,57 +30,55 @@ namespace SVG
|
||||
class IPathElement
|
||||
{
|
||||
public:
|
||||
virtual ~IPathElement();
|
||||
virtual ~IPathElement() = default;
|
||||
virtual EPathElement GetType() const = 0;
|
||||
virtual void Draw(IRenderer* pRenderer) const = 0;
|
||||
virtual TBounds GetBounds() const = 0;
|
||||
|
||||
TBounds GetBounds() const;
|
||||
UINT GetPointCount() const;
|
||||
virtual Point operator[](int nIndex) const;
|
||||
|
||||
private:
|
||||
friend class CMoveElement;
|
||||
friend class CLineElement;
|
||||
friend class CVLineElement;
|
||||
friend class CHLineElement;
|
||||
friend class CCBezierElement;
|
||||
friend class CSBezierElement;
|
||||
friend class CQBezierElement;
|
||||
friend class CTBezierElement;
|
||||
friend class CArcElement;
|
||||
friend class CCloseElement;
|
||||
friend class CMovingPath;
|
||||
|
||||
std::vector<Point> m_arPoints;
|
||||
Point GetFirstPoint() const;
|
||||
Point GetLastPoint() const;
|
||||
};
|
||||
|
||||
class CMoveElement : public IPathElement
|
||||
{
|
||||
public:
|
||||
CMoveElement(const Point& oPoint);
|
||||
virtual ~CMoveElement();
|
||||
virtual ~CMoveElement() = default;
|
||||
EPathElement GetType() const override;
|
||||
static CMoveElement* CreateFromArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
void Draw(IRenderer* pRenderer) const override;
|
||||
TBounds GetBounds() const override;
|
||||
private:
|
||||
Point m_oPoint;
|
||||
|
||||
friend class IPathElement;
|
||||
friend class CLine;
|
||||
};
|
||||
|
||||
class CLineElement : public IPathElement
|
||||
{
|
||||
public:
|
||||
CLineElement(const Point& oPoint);
|
||||
virtual ~CLineElement();
|
||||
virtual ~CLineElement() = default;
|
||||
EPathElement GetType() const override;
|
||||
static CLineElement* CreateFromArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
static CLineElement* CreateFromVArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
static CLineElement* CreateFromHArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
void Draw(IRenderer* pRenderer) const override;
|
||||
TBounds GetBounds() const override;
|
||||
Point GetPoint() const;
|
||||
private:
|
||||
Point m_oPoint;
|
||||
|
||||
friend class IPathElement;
|
||||
friend class CLine;
|
||||
};
|
||||
|
||||
class CCBezierElement : public IPathElement
|
||||
{
|
||||
public:
|
||||
CCBezierElement(const Point& oPoint1, const Point& oPoint2, const Point& oPointE, EPathElement enType = CBezier);
|
||||
virtual ~CCBezierElement();
|
||||
virtual ~CCBezierElement() = default;
|
||||
EPathElement GetType() const override;
|
||||
static IPathElement* CreateFromArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
static IPathElement* CreateFromSArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
@ -88,27 +86,40 @@ namespace SVG
|
||||
static IPathElement* CreateFromTArray(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
static std::vector<IPathElement*> CreateFromArc(std::vector<double>& arValues, bool bRelativeCoordinate, IPathElement* pPrevElement = NULL);
|
||||
void Draw(IRenderer* pRenderer) const override;
|
||||
TBounds GetBounds() const override;
|
||||
private:
|
||||
static void CalculateArcData(const Point& oFirst, const Point& oSecond, Point& oRadius, Point& oCenter, double dAngle, bool bLargeArc, bool bSweep, double& dStartAngle, double& dSweep);
|
||||
|
||||
Point m_oPoint1;
|
||||
Point m_oPoint2;
|
||||
Point m_oPointE;
|
||||
EPathElement m_enType;
|
||||
|
||||
friend class IPathElement;
|
||||
friend class CMovingPath;
|
||||
friend class CPath;
|
||||
};
|
||||
|
||||
class CCloseElement : public IPathElement
|
||||
{
|
||||
public:
|
||||
CCloseElement();
|
||||
virtual ~CCloseElement();
|
||||
CCloseElement() = default;
|
||||
virtual ~CCloseElement() = default;
|
||||
EPathElement GetType() const override;
|
||||
void Draw(IRenderer* pRenderer) const override;
|
||||
TBounds GetBounds() const override;
|
||||
};
|
||||
|
||||
class CPath : public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
protected:
|
||||
CPath(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CPath(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, bool bChechCommands = true);
|
||||
virtual ~CPath();
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
|
||||
@ -118,24 +129,22 @@ namespace SVG
|
||||
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<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode);
|
||||
|
||||
TBounds GetBounds() const override;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
|
||||
const int FindIndexFirstNotEmpty(bool bReverseSearch = false) const;
|
||||
|
||||
void ReadFromString(const std::wstring& wsValue);
|
||||
bool AddElement(IPathElement* pElement);
|
||||
|
||||
friend class CLine;
|
||||
friend class CFont;
|
||||
friend class CPolygon;
|
||||
friend class CPolyline;
|
||||
|
||||
std::vector<IPathElement*> m_arElements;
|
||||
|
||||
TMarkers m_oMarkers;
|
||||
bool m_bEvenOddRule;
|
||||
|
||||
friend class CFont;
|
||||
protected:
|
||||
bool AddElement(IPathElement* pElement);
|
||||
|
||||
void SetMarker(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode);
|
||||
};
|
||||
|
||||
class CMovingPath
|
||||
|
||||
@ -5,8 +5,9 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CPattern::CPattern(XmlUtils::CXmlNode& oNode, NSFonts::IFontManager *pFontManager)
|
||||
: CAppliedObject(oNode), m_oContainer(oNode), m_pFontManager(pFontManager), m_pImage(NULL), m_enPatternUnits(objectBoundingBox)
|
||||
CPattern::CPattern(CSvgReader& oReader, NSFonts::IFontManager *pFontManager)
|
||||
: CAppliedObject(oReader), m_oContainer(oReader), m_pFontManager(pFontManager),
|
||||
m_pImage(NULL), m_enPatternUnits(objectBoundingBox)
|
||||
{}
|
||||
|
||||
CPattern::~CPattern()
|
||||
|
||||
@ -14,8 +14,9 @@ namespace SVG
|
||||
|
||||
class CPattern : public CAppliedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CPattern(CSvgReader& oReader, NSFonts::IFontManager *pFontManager = NULL);
|
||||
public:
|
||||
CPattern(XmlUtils::CXmlNode& oNode, NSFonts::IFontManager *pFontManager = NULL);
|
||||
virtual ~CPattern();
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode) override;
|
||||
|
||||
@ -1,24 +1,38 @@
|
||||
#include "CPolyline.h"
|
||||
|
||||
#include "../../../../../Common/3dParty/html/css/src/StaticFunctions.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CPolyline::CPolyline(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent)
|
||||
: CPath(oNode, pParent, false)
|
||||
CPolyline::CPolyline(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CPath(oReader, pParent)
|
||||
{}
|
||||
|
||||
void CPolyline::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
std::vector<double> arValues = NSCSS::NS_STATIC_FUNCTIONS::ReadDoubleValues(oNode.GetAttribute(L"points"));
|
||||
if ("points" == sName)
|
||||
{
|
||||
const std::vector<double> arValues = NSCSS::NS_STATIC_FUNCTIONS::ReadDoubleValues(oReader.GetText());
|
||||
|
||||
if (arValues.size() < 4)
|
||||
return;
|
||||
if (arValues.size() < 4)
|
||||
return;
|
||||
|
||||
AddElement(new CMoveElement(Point{arValues[0], arValues[1]}));
|
||||
AddElement(new CMoveElement(Point{arValues[0], arValues[1]}));
|
||||
|
||||
for (unsigned int unIndex = 2; unIndex < arValues.size(); unIndex += 2)
|
||||
AddElement(new CLineElement(Point{arValues[unIndex + 0], arValues[unIndex + 1]}));
|
||||
for (unsigned int unIndex = 2; unIndex < arValues.size(); unIndex += 2)
|
||||
AddElement(new CLineElement(Point{arValues[unIndex + 0], arValues[unIndex + 1]}));
|
||||
}
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
}
|
||||
|
||||
CPolygon::CPolygon(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent)
|
||||
: CPolyline(oNode, pParent)
|
||||
CPolygon::CPolygon(CSvgReader& oReader, CRenderedObject* pParent)
|
||||
: CPolyline(oReader, pParent)
|
||||
{}
|
||||
|
||||
void CPolygon::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
CPolyline::SetAttribute(sName, oReader);
|
||||
AddElement(new CCloseElement());
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,14 +7,19 @@ namespace SVG
|
||||
{
|
||||
class CPolyline : public CPath
|
||||
{
|
||||
friend class CObject;
|
||||
protected:
|
||||
CPolyline(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CPolyline(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
};
|
||||
|
||||
class CPolygon : public CPolyline
|
||||
{
|
||||
friend class CObject;
|
||||
CPolygon(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CPolygon(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -1,20 +1,32 @@
|
||||
#include "CRect.h"
|
||||
#include "CStyle.h"
|
||||
#include "CContainer.h"
|
||||
#include "../SvgTypes.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CRect::CRect(XmlUtils::CXmlNode& oNode, CRenderedObject *pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
{
|
||||
m_oRect.m_oX .SetValue(oNode.GetAttribute(L"x"));
|
||||
m_oRect.m_oY .SetValue(oNode.GetAttribute(L"y"));
|
||||
m_oRect.m_oWidth .SetValue(oNode.GetAttribute(L"width"));
|
||||
m_oRect.m_oHeight.SetValue(oNode.GetAttribute(L"height"));
|
||||
CRect::CRect(CSvgReader& oReader, CRenderedObject *pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{}
|
||||
|
||||
m_oRx.SetValue(oNode.GetAttribute(L"rx"));
|
||||
m_oRy.SetValue(oNode.GetAttribute(L"ry"));
|
||||
CRect::~CRect()
|
||||
{}
|
||||
|
||||
void CRect::SetAttribute(const std::string& sName, CSvgReader& oReader)
|
||||
{
|
||||
if ("x" == sName)
|
||||
m_oRect.m_oX.SetValue(oReader.GetText());
|
||||
else if ("y" == sName)
|
||||
m_oRect.m_oY.SetValue(oReader.GetText());
|
||||
else if ("width" == sName)
|
||||
m_oRect.m_oWidth.SetValue(oReader.GetText());
|
||||
else if ("height" == sName)
|
||||
m_oRect.m_oHeight.SetValue(oReader.GetText());
|
||||
else if ("rx" == sName)
|
||||
m_oRx.SetValue(oReader.GetText());
|
||||
else if ("ry" == sName)
|
||||
m_oRy.SetValue(oReader.GetText());
|
||||
else
|
||||
CRenderedObject::SetAttribute(sName, oReader);
|
||||
|
||||
if (m_oRx.Empty() && !m_oRy.Empty())
|
||||
m_oRx = m_oRy;
|
||||
@ -22,9 +34,6 @@ namespace SVG
|
||||
m_oRy = m_oRx;
|
||||
}
|
||||
|
||||
CRect::~CRect()
|
||||
{}
|
||||
|
||||
void CRect::SetData(const std::map<std::wstring, std::wstring> &mAttributes, unsigned short ushLevel, bool bHardMode)
|
||||
{
|
||||
CRenderedObject::SetData(mAttributes, ushLevel, bHardMode);
|
||||
@ -94,7 +103,7 @@ namespace SVG
|
||||
nTypePath += c_nWindingFillMode;
|
||||
}
|
||||
|
||||
TBounds CRect::GetBounds() const
|
||||
TBounds CRect::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
TBounds oBounds;
|
||||
|
||||
@ -103,6 +112,16 @@ namespace SVG
|
||||
oBounds.m_dRight = oBounds.m_dLeft + m_oRect.m_oWidth.ToDouble(NSCSS::Pixel);
|
||||
oBounds.m_dBottom = oBounds.m_dTop + m_oRect.m_oHeight.ToDouble(NSCSS::Pixel);
|
||||
|
||||
if (nullptr != pTransform)
|
||||
{
|
||||
*pTransform += m_oTransformation.m_oTransform.GetMatrix();
|
||||
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dLeft, oBounds.m_dTop );
|
||||
pTransform->GetFinalValue().TransformPoint(oBounds.m_dRight, oBounds.m_dBottom);
|
||||
|
||||
*pTransform -= m_oTransformation.m_oTransform.GetMatrix();
|
||||
}
|
||||
|
||||
return oBounds;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,11 +7,13 @@ namespace SVG
|
||||
{
|
||||
class CRect : public CRenderedObject
|
||||
{
|
||||
friend class CObject;
|
||||
CRect(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CRect(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
|
||||
virtual ~CRect();
|
||||
|
||||
void SetAttribute(const std::string& sName, CSvgReader& oReader) override;
|
||||
|
||||
void SetData(const std::map<std::wstring, std::wstring>& mAttributes, unsigned short ushLevel, bool bHardMode = false) override;
|
||||
|
||||
bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
|
||||
@ -19,7 +21,7 @@ namespace SVG
|
||||
private:
|
||||
void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override;
|
||||
|
||||
TBounds GetBounds() const override;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
|
||||
TRect m_oRect;
|
||||
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
#include "CStyle.h"
|
||||
#include "CObjectBase.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
@ -31,7 +32,7 @@ namespace SVG
|
||||
|
||||
const std::vector<NSCSS::CNode> arSelectors = pSvgObject->GetFullPath();
|
||||
|
||||
std::vector<std::wstring> arNodes = m_pInternal->CalculateAllNodes(arSelectors);
|
||||
std::vector<std::wstring> arNodes = m_pInternal->CalculateAllNodes(arSelectors, 0, arSelectors.size());
|
||||
std::vector<std::wstring> arPrevNodes;
|
||||
|
||||
for (size_t i = 0; i < arSelectors.size(); ++i)
|
||||
|
||||
@ -3,12 +3,10 @@
|
||||
|
||||
#include <string>
|
||||
#include "../../../../../Common/3dParty/html/css/src/CCssCalculator_Private.h"
|
||||
#include "CObjectBase.h"
|
||||
|
||||
#include <numeric>
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
class CObject;
|
||||
class CSvgCalculator
|
||||
{
|
||||
NSCSS::CCssCalculator_Private *m_pInternal;
|
||||
|
||||
@ -2,10 +2,9 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CSwitch::CSwitch(XmlUtils::CXmlNode &oNode, CRenderedObject *pParent)
|
||||
: CRenderedObject(oNode, pParent)
|
||||
{
|
||||
}
|
||||
CSwitch::CSwitch(CSvgReader& oReader, CRenderedObject *pParent)
|
||||
: CRenderedObject(oReader, pParent)
|
||||
{}
|
||||
|
||||
bool CSwitch::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles, const CRenderedObject* pContexObject) const
|
||||
{
|
||||
@ -18,7 +17,7 @@ namespace SVG
|
||||
return false;
|
||||
}
|
||||
|
||||
TBounds CSwitch::GetBounds() const
|
||||
TBounds CSwitch::GetBounds(SvgMatrix* pTransform) const
|
||||
{
|
||||
for (const CRenderedObject* pObject : m_arObjects)
|
||||
if (NULL != pObject)
|
||||
|
||||
@ -7,12 +7,12 @@ namespace SVG
|
||||
{
|
||||
class CSwitch : public CRenderedObject, public CContainer<CRenderedObject>
|
||||
{
|
||||
friend class CObject;
|
||||
CSwitch(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
public:
|
||||
CSwitch(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL);
|
||||
|
||||
bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const override;
|
||||
|
||||
TBounds GetBounds() const override;
|
||||
TBounds GetBounds(SvgMatrix* pTransform = nullptr) const override;
|
||||
};
|
||||
}
|
||||
#endif // CSWITCH_H
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
CSymbol::CSymbol(XmlUtils::CXmlNode &oNode, CRenderedObject *pParent, NSFonts::IFontManager *pFontManager)
|
||||
: CGraphicsContainer(oNode)
|
||||
CSymbol::CSymbol(CSvgReader& oReader, CRenderedObject *pParent)
|
||||
: CGraphicsContainer(oReader)
|
||||
{}
|
||||
|
||||
bool CSymbol::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const
|
||||
|
||||
@ -2,15 +2,14 @@
|
||||
#define CSYMBOL_H
|
||||
|
||||
#include "CContainer.h"
|
||||
#include "../../../graphics/pro/Fonts.h"
|
||||
|
||||
namespace SVG
|
||||
{
|
||||
class CSymbol : public CGraphicsContainer
|
||||
{
|
||||
friend class CObject;
|
||||
CSymbol(CSvgReader& oReader, CRenderedObject* pParent = NULL);
|
||||
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 CRenderedObject* pContexObject = NULL) const override;
|
||||
};
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user