From 928f64d821d2a0c4ff803bd196d370bfed314ca2 Mon Sep 17 00:00:00 2001 From: SEAlGo Date: Thu, 1 Sep 2022 21:53:54 +0300 Subject: [PATCH] Some optimizations... 2. --- DocxRenderer/readme.md | 1 - DocxRenderer/src/logic/Page.cpp | 48 +++++------------------ DocxRenderer/src/logic/Page.h | 1 - DocxRenderer/src/logic/elements/Shape.cpp | 15 ++++--- DocxRenderer/src/logic/elements/Shape.h | 8 +++- DocxRenderer/src/resources/Constants.h | 1 + 6 files changed, 25 insertions(+), 49 deletions(-) diff --git a/DocxRenderer/readme.md b/DocxRenderer/readme.md index b319a4c029..af6b437014 100644 --- a/DocxRenderer/readme.md +++ b/DocxRenderer/readme.md @@ -20,7 +20,6 @@ II Этап Собрали все объекты для текущей страницы. Начинаем анализ. 1. Анализируем графику - AnalyzeCollectedShapes() - - RemoveSubstratesUnderPictures() - удаляем подложки под картинками, т.е. любой шейп, который совпадает по геометрии (2 вложенных цикла m_arImages - m_arShapes) - DetermineLinesType() - превращаем шейпы в горизонтальные линии в зависимости от геометрии, удаляем обработанные шейпы, определяем тип полученной линии на основании типа графики (Rectangle, Curve, ComplicatedFigure, NoGraphics) и подтипа (LongDash, Dash, Dot, Wave). (2 вложенных цикла m_arShapes - m_arShapes с сортировкой вектора) 2. AnalyzeCollectedSymbols() - добавляем свойства каждому символу отдельно diff --git a/DocxRenderer/src/logic/Page.cpp b/DocxRenderer/src/logic/Page.cpp index 35e7e105dd..e975aee198 100644 --- a/DocxRenderer/src/logic/Page.cpp +++ b/DocxRenderer/src/logic/Page.cpp @@ -33,6 +33,8 @@ namespace NSDocxRenderer m_dLastTextX = -1; m_dLastTextY = -1; m_dLastTextX_block = m_dLastTextX; + + CShape::ResetRelativeHeight(); } void CPage::Clear() @@ -249,27 +251,23 @@ namespace NSDocxRenderer pShape->m_bIsNoFill = false; } - //Все белые прямоугольники-подложки на задний фон - //todo задать приоритеты отображения шейпов - if ((!pShape->m_bIsNoFill && pShape->m_bIsNoStroke) || - (pShape->m_bIsNoFill && m_pBrush->Color1 == c_iWhiteColor)) - { - pShape->m_bIsBehindDoc = true; - } - if (pShape->m_bIsNoStroke) { if ((fabs(m_oVector.m_dLeft - m_oVector.m_dRight) < 0.3) || (fabs(m_oVector.m_dTop - m_oVector.m_dBottom) < 0.3)) { - lType = 0x01; pShape->m_oPen.Color = m_pBrush->Color1; pShape->m_oPen.Alpha = m_pBrush->Alpha1; - //pShape->m_oPen.Size = max(pShape->m_oPen.Size, 1); } } pShape->GetDataFromVector(m_oVector); + if (pShape->m_bIsNotNecessaryToUse) + { + delete pShape; + return; + } + m_arShapes.push_back(pShape); } } @@ -373,38 +371,9 @@ namespace NSDocxRenderer void CPage::AnalyzeCollectedShapes() { //todo Объединить контур и заливку одного рисунка в шейпе если m_strPath одинаковые - RemoveSubstratesUnderPictures(); DetermineLinesType(); } - void CPage::RemoveSubstratesUnderPictures() - { - for (const auto &pImage : m_arImages) - { - for (const auto &pShape : m_arShapes) - { - if (pShape->m_bIsNotNecessaryToUse) - { - continue; - } - - //Note Картинка может выходить за пределы страницы - if ((fabs(pImage->m_dTop - pShape->m_dTop) < c_dGRAPHICS_ERROR_MM || - (pImage->m_dTop < 0.0 && pShape->m_dTop == 0.0)) && - (fabs(pImage->m_dLeft - pShape->m_dLeft) < c_dGRAPHICS_ERROR_MM || - (pImage->m_dLeft < 0.0 && pShape->m_dLeft == 0.0)) && - (fabs(pImage->m_dBaselinePos - pShape->m_dBaselinePos) < c_dGRAPHICS_ERROR_MM || - (pImage->m_dBaselinePos > m_dHeight && pShape->m_dLeft == m_dHeight)) && - (fabs(pImage->m_dRight - pShape->m_dRight) < c_dGRAPHICS_ERROR_MM || - (pImage->m_dRight > m_dWidth && pShape->m_dRight == m_dWidth))) - { - pShape->m_bIsNotNecessaryToUse = true; - break; - } - } - } - } - void CPage::DetermineLinesType() { for (size_t i = 0; i < m_arShapes.size(); ++i) @@ -1472,6 +1441,7 @@ namespace NSDocxRenderer pShape->m_dTop = pLine->m_dTop; pShape->m_dWidth = pLine->m_dWidth; pShape->m_dHeight = pLine->m_dHeight; + pShape->m_bIsBehindDoc = false; m_arShapes.push_back(pShape); } diff --git a/DocxRenderer/src/logic/Page.h b/DocxRenderer/src/logic/Page.h index 6ef539e5f0..98cb0d94db 100644 --- a/DocxRenderer/src/logic/Page.h +++ b/DocxRenderer/src/logic/Page.h @@ -85,7 +85,6 @@ namespace NSDocxRenderer const double& fBaseLineOffset, const bool& bIsPDFAnalyzer); void AnalyzeCollectedShapes(); - void RemoveSubstratesUnderPictures(); void DetermineLinesType(); //Собранные для текущей страницы данные нужно проанализировать и сгруппировать, лишнее удалить diff --git a/DocxRenderer/src/logic/elements/Shape.cpp b/DocxRenderer/src/logic/elements/Shape.cpp index 589f4b8576..494ad80025 100644 --- a/DocxRenderer/src/logic/elements/Shape.cpp +++ b/DocxRenderer/src/logic/elements/Shape.cpp @@ -5,13 +5,17 @@ namespace NSDocxRenderer { + UINT CShape::m_gRelativeHeight = c_iStartRelativeHeight; + CShape::CShape() : CBaseItem(ElemType::etShape) { + m_nRelativeHeight = ++m_gRelativeHeight; } CShape::CShape(std::shared_ptr pInfo, const std::wstring& strDstMedia) : CBaseItem(ElemType::etShape), m_strPath(strDstMedia), m_pImageInfo(pInfo) { + m_nRelativeHeight = ++m_gRelativeHeight; } CShape::~CShape() @@ -31,11 +35,9 @@ namespace NSDocxRenderer return iId; } - UINT CShape::GenerateRelativeHeight() + void CShape::ResetRelativeHeight() { - static UINT RelativeHeight = UINT_MAX; - RelativeHeight--; - return RelativeHeight; + m_gRelativeHeight = c_iStartRelativeHeight; } void CShape::GetDataFromVector(const CVectorGraphics& oVector) @@ -173,7 +175,8 @@ namespace NSDocxRenderer void CShape::DetermineGraphicsType(double dWidth, double dHeight,size_t nPeacks, size_t nCurves) { //note параллельно для каждой текстовой строки создается шейп, который содержит цвет фона для данного текста. - if (m_oBrush.Color1 == c_iWhiteColor && m_oPen.Color == c_iWhiteColor) + if ((m_bIsNoStroke && m_bIsNoFill) || + (m_oBrush.Color1 == c_iWhiteColor && m_oPen.Color == c_iWhiteColor)) { m_eGraphicsType = eGraphicsType::gtNoGraphics; //заранее отбрасываем некоторые фигуры @@ -591,7 +594,7 @@ namespace NSDocxRenderer oWriter.WriteString(L" distR=\"0\""); oWriter.WriteString(L" simplePos=\"0\""); //true/1 Указывает, что этот объект должен быть позиционирован с использованием информации о позиционировании в дочернем элементе simplePos oWriter.WriteString(L" relativeHeight=\""); //Определяет относительное упорядочивание по Z всех объектов DrawingML в этом документе. - oWriter.AddUInt(GenerateRelativeHeight()); + oWriter.AddUInt(m_nRelativeHeight); oWriter.WriteString(L"\""); oWriter.WriteString(L" behindDoc=\""); //позади текста - 1, перед текстом - 0 oWriter.AddUInt(static_cast(m_bIsBehindDoc)); diff --git a/DocxRenderer/src/logic/elements/Shape.h b/DocxRenderer/src/logic/elements/Shape.h index 8a92fda02f..a96207695a 100644 --- a/DocxRenderer/src/logic/elements/Shape.h +++ b/DocxRenderer/src/logic/elements/Shape.h @@ -38,7 +38,7 @@ namespace NSDocxRenderer bool m_bIsNoFill {true}; bool m_bIsNoStroke {true}; - bool m_bIsBehindDoc {false}; + bool m_bIsBehindDoc {true}; eGraphicsType m_eGraphicsType {eGraphicsType::gtUnknown}; eSimpleLineType m_eSimpleLineType {eSimpleLineType::sltUnknown}; @@ -50,6 +50,9 @@ namespace NSDocxRenderer private: UINT m_nShapeId {0}; + UINT m_nRelativeHeight {0}; + + static UINT m_gRelativeHeight; public: CShape(); @@ -80,8 +83,9 @@ namespace NSDocxRenderer void BuildGraphicProperties(NSStringUtils::CStringBuilder &oWriter); void BuildTextBox(NSStringUtils::CStringBuilder &oWriter); + static void ResetRelativeHeight(); + private: UINT GenerateShapeId(); - UINT GenerateRelativeHeight(); }; } diff --git a/DocxRenderer/src/resources/Constants.h b/DocxRenderer/src/resources/Constants.h index 803ccc7f54..a751a23438 100644 --- a/DocxRenderer/src/resources/Constants.h +++ b/DocxRenderer/src/resources/Constants.h @@ -41,3 +41,4 @@ const double c_dSTANDART_FIRSTLINE_INDENT_MM = 12.5; const UINT c_iStartingIdForImages = 6; constexpr size_t c_nAntiZero = ~0; +const UINT c_iStartRelativeHeight = 0x0F000000;