diff --git a/DesktopEditor/graphics/pro/js/wasm/src/serialize.h b/DesktopEditor/graphics/pro/js/wasm/src/serialize.h index d28d7234f0..1d36cbbabc 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/serialize.h +++ b/DesktopEditor/graphics/pro/js/wasm/src/serialize.h @@ -264,6 +264,9 @@ namespace NSWasm memcpy(m_pDataCur, sStr.c_str(), bufferLen); } + m_pDataCur += static_cast(len); + m_lSizeCur += static_cast(len); + if (!isBytes) len /= 2; diff --git a/DocxRenderer/src/logic/Page.cpp b/DocxRenderer/src/logic/Page.cpp index 4c3e94238f..22f2ff688f 100644 --- a/DocxRenderer/src/logic/Page.cpp +++ b/DocxRenderer/src/logic/Page.cpp @@ -3,6 +3,7 @@ #include #include #include +// #include #include "../../../DesktopEditor/graphics/pro/Graphics.h" @@ -473,13 +474,65 @@ namespace NSDocxRenderer shape->ToBin(writer); } - // if (!m_arCompleteObjectsXml.empty()) - // xml_shapes.insert(xml_shapes.end(), m_arCompleteObjectsXml.begin(), m_arCompleteObjectsXml.end()); + /* + // testing m_arCompleteObjectsBinBase64 + NSWasm::CData test_writer; + test_writer.SkipLen(); + test_writer.AddInt(static_cast(m_arShapes.size())); + for (const auto& shape : m_arShapes) + { + if (!shape) continue; + shape->ToBin(test_writer); + + int size = test_writer.GetSize(); + BYTE* data = test_writer.GetBuffer(); + + int size_base64 = NSBase64::Base64EncodeGetRequiredLength(size); + char* data_base64 = new char[size_base64]; + + NSBase64::Base64Encode(data, size, (BYTE*)data_base64, &size_base64, NSBase64::B64_BASE64_FLAG_NOCRLF); + m_arCompleteObjectsBinBase64.push_back(std::string(data_base64, size_base64)); + + delete[] data_base64; + } + */ + + /* comment it if testing */ + if (!m_arCompleteObjectsBinBase64.empty()) + { + for (const auto& elem : m_arCompleteObjectsBinBase64) + { + int buff_len = NSBase64::Base64DecodeGetRequiredLength(elem.size()); + BYTE* buff = new BYTE[buff_len]; + bool is_ok = NSBase64::Base64Decode(elem.c_str(), elem.size(), buff, &buff_len); + + if (!is_ok) + continue; + + writer.Write(buff, buff_len); + + delete[] buff; + } + } writer.WriteLen(); + + /* + test_writer.WriteLen(); + size_t size = writer.GetSize(); + size_t test_size = test_writer.GetSize(); + + assert(size != test_size); + + auto buffer = writer.GetBuffer(); + auto test_buffer = writer.GetBuffer(); + for (size_t i = 0; i < size; ++i) + assert(buffer[i] == test_buffer[i]); + */ + return writer; } - void CPage::AddCompleteXml(const std::wstring oXml) + void CPage::AddCompleteXml(const std::wstring& oXml) { m_arCompleteObjectsXml.push_back(oXml); } @@ -1814,7 +1867,8 @@ namespace NSDocxRenderer } // первая строка может быть с отступом - if (is_first_line) + double first_line_indent = line_top->m_dLeft - line_bot->m_dLeft; + if (is_first_line && first_line_indent < c_dMAX_FIRST_LINE_INDENT) { // если больше трех линий - проверим третью if (index < ar_positions.size() - 2) @@ -1877,7 +1931,7 @@ namespace NSDocxRenderer double diff = 0; - if (position.right) + if (position.right && !position.left) diff = line_with_first_left - curr_min_left; else if (position.left || ar_indents[index]) diff = curr_max_right - line_with_first_right; diff --git a/DocxRenderer/src/logic/Page.h b/DocxRenderer/src/logic/Page.h index ed9d5a4a9c..c52cc50c49 100644 --- a/DocxRenderer/src/logic/Page.h +++ b/DocxRenderer/src/logic/Page.h @@ -82,7 +82,9 @@ namespace NSDocxRenderer std::vector GetXmlShapes(); std::vector GetXmlShapesPptx(); NSWasm::CData GetShapesBin(); - void AddCompleteXml(const std::wstring oXml); + + void AddCompleteXml(const std::wstring& oXml); + void AddCompleteBinBase64(const std::string& oBase64); private: using shape_ptr_t = std::shared_ptr; @@ -214,6 +216,7 @@ namespace NSDocxRenderer std::vector m_arOutputObjects; std::vector m_arCompleteObjectsXml; + std::vector m_arCompleteObjectsBinBase64; size_t m_nShapeOrder = 0; }; diff --git a/DocxRenderer/src/logic/elements/Shape.cpp b/DocxRenderer/src/logic/elements/Shape.cpp index c5ea7a7658..ecf1f11f51 100644 --- a/DocxRenderer/src/logic/elements/Shape.cpp +++ b/DocxRenderer/src/logic/elements/Shape.cpp @@ -1274,29 +1274,31 @@ namespace NSDocxRenderer if (m_oBrush.Image == NULL) { oWriter.StartRecord(1); + oWriter.WriteBYTE(kBin_g_nodeAttributeStart); // coeff - double offset_left = (right - m_dImageLeft) / width - 1; - double offset_right = (m_dImageRight - left) / width - 1; - double offset_top = (bot - m_dImageTop) / height - 1; - double offset_bot = (m_dImageBot - top) / height - 1; + double src_offset_left = 1 - (width / (right - m_dImageLeft)); + double src_offset_right = 1 - (width / (m_dImageRight - left)); + double src_offset_top = 1 - (height / (bot - m_dImageTop)); + double src_offset_bot = 1 - (height / (m_dImageBot - top)); // percentage - offset_left *= 100; - offset_right *= 100; - offset_top *= 100; - offset_bot *= 100; + src_offset_left *= 100; + src_offset_right *= 100; + src_offset_top *= 100; + src_offset_bot *= 100; - std::wstring l = std::to_wstring(static_cast(-offset_left * 1000)); - std::wstring t = std::to_wstring(static_cast(-offset_right * 1000)); - std::wstring r = std::to_wstring(static_cast(-offset_top * 1000)); - std::wstring b = std::to_wstring(static_cast(-offset_bot * 1000)); + std::wstring l = std::to_wstring(static_cast(src_offset_left * 1000)); + std::wstring t = std::to_wstring(static_cast(src_offset_top * 1000)); + std::wstring r = std::to_wstring(static_cast(src_offset_right * 1000)); + std::wstring b = std::to_wstring(static_cast(src_offset_bot * 1000)); oWriter.WriteBYTE(0); oWriter.WriteStringUtf16(l); oWriter.WriteBYTE(1); oWriter.WriteStringUtf16(t); oWriter.WriteBYTE(2); oWriter.WriteStringUtf16(r); oWriter.WriteBYTE(3); oWriter.WriteStringUtf16(b); + oWriter.WriteBYTE(kBin_g_nodeAttributeEnd); oWriter.EndRecord(); oWriter.StartRecord(3); diff --git a/DocxRenderer/src/resources/Constants.h b/DocxRenderer/src/resources/Constants.h index 809b6fbbae..98a74b3a66 100644 --- a/DocxRenderer/src/resources/Constants.h +++ b/DocxRenderer/src/resources/Constants.h @@ -47,6 +47,7 @@ const double c_dSHAPE_X_OFFSET_MM = 1.5; const double c_dAVERAGE_SPACE_WIDTH_COEF = 0.9; const double c_dSPACE_WIDTH_COEF = 0.4; const double c_dMIN_ROTATION = 0.01; +const double c_dMAX_FIRST_LINE_INDENT = 20.0; const UINT c_iWhiteColor = 0xFFFFFF; const UINT c_iBlackColor = 0x000000;