diff --git a/Common/OfficeFileErrorDescription.h b/Common/OfficeFileErrorDescription.h index 894c3a541d..898cb85cf9 100644 --- a/Common/OfficeFileErrorDescription.h +++ b/Common/OfficeFileErrorDescription.h @@ -244,3 +244,4 @@ #define AVS_FILEUTILS_ERROR_CONVERT_LIMITS (AVS_ERROR_FIRST + AVS_FILEUTILS_ERROR_FIRST + 0x005d) #define AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS (AVS_ERROR_FIRST + AVS_FILEUTILS_ERROR_FIRST + 0x005e) #define AVS_FILEUTILS_ERROR_CONVERT_DETECT (AVS_ERROR_FIRST + AVS_FILEUTILS_ERROR_FIRST + 0x005f) +#define AVS_FILEUTILS_ERROR_CONVERT_CELLLIMITS (AVS_ERROR_FIRST + AVS_FILEUTILS_ERROR_FIRST + 0x0060) diff --git a/DesktopEditor/common/StringBuilder.cpp b/DesktopEditor/common/StringBuilder.cpp index 79aad5fa38..99f4eb626b 100644 --- a/DesktopEditor/common/StringBuilder.cpp +++ b/DesktopEditor/common/StringBuilder.cpp @@ -682,9 +682,10 @@ namespace NSStringUtils } if (val < 0) { - val = -val; - if (val < 0) + if (val == -2147483648) val = 2147483647; + else + val = -val; *m_pDataCur++ = (wchar_t)'-'; ++m_lSizeCur; diff --git a/DesktopEditor/graphics/AlphaMask.cpp b/DesktopEditor/graphics/AlphaMask.cpp index 952375c0d5..b0863980b8 100644 --- a/DesktopEditor/graphics/AlphaMask.cpp +++ b/DesktopEditor/graphics/AlphaMask.cpp @@ -1,5 +1,4 @@ -#include "AlphaMask.h" -#include +#include "AlphaMask_p.h" namespace Aggplus { @@ -33,7 +32,6 @@ namespace Aggplus { case EMaskDataType::ImageBuffer: return 4; case EMaskDataType::AlphaBuffer: return 1; - case EMaskDataType::Alpha4Buffer: return 4; } } @@ -65,130 +63,26 @@ namespace Aggplus return Ok; } - - - CSoftMask::CSoftMask() : m_unWidth(0), m_unHeight(0), m_pImageData(NULL), m_pAlphaBufferData(NULL) {} - CSoftMask::CSoftMask(BYTE* pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bExternalBuffer, bool bFlip) : m_pImageData(NULL), m_pAlphaBufferData(NULL) + CSoftMask::CSoftMask(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bFlip, bool bRGB, bool bAlpha) { - LoadFromBuffer(pBuffer, unWidth, unHeight, enDataType, bExternalBuffer, bFlip); + if (bAlpha) + m_pInternal = new CSoftMaskAlpha(pBuffer, unWidth, unHeight, false, bFlip); + else + { + if (bRGB) + m_pInternal = new CSoftMaskBGRAgray(pBuffer, unWidth, unHeight, false, bFlip); + else + m_pInternal = new CSoftMaskRGBAgray(pBuffer, unWidth, unHeight, false, bFlip); + } } CSoftMask::~CSoftMask() { - BYTE* pBuffer = m_oRenderingBuffer.buf(); - if (NULL != pBuffer) - { - if (!m_bExternalBuffer) - RELEASEARRAYOBJECTS(pBuffer); - - m_oRenderingBuffer.attach(NULL, 0, 0, 0); - } - - RELEASEOBJECT(m_pImageData); - RELEASEOBJECT(m_pAlphaBufferData); + RELEASEOBJECT(m_pInternal); } - EMaskDataType CSoftMask::GetDataType() const { return m_enDataType; } - unsigned int CSoftMask::GetStep() const - { - switch(m_enDataType) - { - case EMaskDataType::ImageBuffer: return 4; - case EMaskDataType::AlphaBuffer: return 1; - case EMaskDataType::Alpha4Buffer: return 4; - } - } - unsigned int CSoftMask::GetWidth() const { return m_unWidth; } - unsigned int CSoftMask::GetHeight() const { return m_unHeight; } - - void CSoftMask::SetType(EMaskDataType enDataType) - { - m_enDataType = enDataType; - - RELEASEOBJECT(m_pImageData); - RELEASEOBJECT(m_pAlphaBufferData); - - switch (enDataType) - { - case EMaskDataType::ImageBuffer: - { - m_pImageData = new AMaskFromImage(m_oRenderingBuffer); - m_pImageData->m_oRendererBase.attach(m_pImageData->m_oPixfmt); - m_pImageData->m_oAlphaMask.attach(m_oRenderingBuffer); - break; - } - case EMaskDataType::Alpha4Buffer: - { - m_pAlphaBufferData = new AMaskFromABuffer(m_oRenderingBuffer); - m_pAlphaBufferData->m_oRendererBase.attach(m_pAlphaBufferData->m_oPixfmt); - m_pAlphaBufferData->m_oAlphaMask.attach(m_oRenderingBuffer); - break; - } - } - } - - Status CSoftMask::Create(UINT unWidth, UINT unHeight, EMaskDataType enDataType) - { - if (0 == unWidth || 0 == unHeight) - return InvalidParameter; - - m_bExternalBuffer = false; - - UINT unSize = unWidth * unHeight * GetStep(); - BYTE* pAlphaBufffer = new BYTE[unSize]; - if (!pAlphaBufffer) - return OutOfMemory; - - memset(pAlphaBufffer, 0x00, unSize); - - Set(pAlphaBufffer, unWidth, unHeight, enDataType); - - return Ok; - } - - Status CSoftMask::LoadFromBuffer(BYTE *pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bExternalBuffer, bool bFlip) - { - if (NULL == pBuffer || 0 == unWidth || 0 == unHeight) - return InvalidParameter; - - m_bExternalBuffer = bExternalBuffer; - - Set(pBuffer, unWidth, unHeight, enDataType, bFlip); - - return Ok; - } - - RenBaseBGRA32& CSoftMask::GetRendererBaseImage() - { - return m_pImageData->m_oRendererBase; - } - - ScanlineBGRA32Gray& CSoftMask::GetScanlineImage() - { - return m_pImageData->m_oScanLine; - } - - ScanlineBGRA32A& CSoftMask::GetScanlineABuffer() - { - return m_pAlphaBufferData->m_oScanLine; - } - - BYTE* CSoftMask::GetBuffer() - { - return m_oRenderingBuffer.buf(); - } - - agg::rendering_buffer& CSoftMask::GetRenderingBuffer() - { - return m_oRenderingBuffer; - } - - void CSoftMask::Set(BYTE* pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bFlip) - { - m_enDataType = enDataType; - m_unWidth = unWidth; - m_unHeight = unHeight; - m_oRenderingBuffer.attach(pBuffer, unWidth, unHeight, (bFlip ? -1 : 1) * GetStep() * unWidth); - - SetType(enDataType); - } + unsigned int CSoftMask::GetStep() const { return m_pInternal->GetStep(); } + unsigned int CSoftMask::GetWidth() const { return m_pInternal->GetWidth(); } + unsigned int CSoftMask::GetHeight() const { return m_pInternal->GetHeight(); } + BYTE* CSoftMask::GetBuffer() { return m_pInternal->GetBuffer(); } + ESoftMaskType CSoftMask::GetDataType() { return m_pInternal->GetDataType(); } } diff --git a/DesktopEditor/graphics/AlphaMask.h b/DesktopEditor/graphics/AlphaMask.h index 273d0d3361..f47a14e96b 100644 --- a/DesktopEditor/graphics/AlphaMask.h +++ b/DesktopEditor/graphics/AlphaMask.h @@ -1,23 +1,16 @@ #ifndef _BUILD_ALPHAMASK_H_ #define _BUILD_ALPHAMASK_H_ -#include #include "aggplustypes.h" #include "../common/IGrObject.h" #include "./config.h" -#include "../agg-2.4/include/agg_renderer_base.h" -#include "../agg-2.4/include/agg_pixfmt_rgba.h" -#include "../agg-2.4/include/agg_scanline_u.h" -#include "../agg-2.4/include/agg_alpha_mask_u8.h" - namespace Aggplus { enum class EMaskDataType { ImageBuffer, - AlphaBuffer, - Alpha4Buffer + AlphaBuffer }; class GRAPHICS_DECL CAlphaMask : public IGrObject @@ -39,56 +32,30 @@ namespace Aggplus bool m_bExternalBuffer; }; - template - struct TAlphaMaskData + enum class ESoftMaskType { - TAlphaMaskData(agg::rendering_buffer& oRenderingBuffer) : m_oPixfmt(oRenderingBuffer), m_oScanLine(m_oAlphaMask) {}; - - PixelFormat m_oPixfmt; - agg::renderer_base m_oRendererBase; - AlphaMask m_oAlphaMask; - agg::scanline_u8_am m_oScanLine; + RGBGrayBuffer, + BGRGrayBuffer, + Alpha4Buffer }; - typedef agg::renderer_base RenBaseBGRA32; - typedef agg::scanline_u8_am ScanlineBGRA32Gray; - typedef agg::scanline_u8_am ScanlineBGRA32A; - + class CSoftMask_private; class GRAPHICS_DECL CSoftMask : public IGrObject { public: - CSoftMask(); - CSoftMask(BYTE* pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bExternalBuffer = true, bool bFlip = false); - virtual ~CSoftMask(); + CSoftMask(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bFlip, bool bRGB, bool bAlpha); + ~CSoftMask(); - EMaskDataType GetDataType() const; unsigned int GetStep() const; unsigned int GetWidth() const; unsigned int GetHeight() const; + BYTE* GetBuffer(); + ESoftMaskType GetDataType(); - void SetType(EMaskDataType enDataType); - Status Create(UINT unWidth, UINT unHeight, EMaskDataType enDataType); - Status LoadFromBuffer(BYTE* pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bExternalBuffer = true, bool bFlip = false); - - agg::rendering_buffer& GetRenderingBuffer(); - RenBaseBGRA32& GetRendererBaseImage(); - ScanlineBGRA32Gray& GetScanlineImage(); - ScanlineBGRA32A& GetScanlineABuffer(); - BYTE* GetBuffer(); private: - void Set(BYTE* pBuffer, UINT unWidth, UINT unHeight, EMaskDataType enDataType, bool bFlip = false); + CSoftMask_private* m_pInternal; - agg::rendering_buffer m_oRenderingBuffer; - EMaskDataType m_enDataType; - bool m_bExternalBuffer; - unsigned int m_unWidth; - unsigned int m_unHeight; - - typedef TAlphaMaskData AMaskFromImage; - typedef TAlphaMaskData AMaskFromABuffer; - - AMaskFromImage* m_pImageData; - AMaskFromABuffer* m_pAlphaBufferData; + friend class CGraphics; }; } diff --git a/DesktopEditor/graphics/AlphaMask_p.h b/DesktopEditor/graphics/AlphaMask_p.h new file mode 100644 index 0000000000..42a59c7166 --- /dev/null +++ b/DesktopEditor/graphics/AlphaMask_p.h @@ -0,0 +1,96 @@ +#ifndef _BUILD_ALPHAMASK_P_H_ +#define _BUILD_ALPHAMASK_P_H_ + +#include "AlphaMask.h" +#include +#include + +#include "../agg-2.4/include/agg_rendering_buffer.h" +#include "../agg-2.4/include/agg_scanline_u.h" +#include "../agg-2.4/include/agg_alpha_mask_u8.h" + +namespace Aggplus +{ + class CSoftMask_private + { + public: + virtual ~CSoftMask_private() + { + BYTE* pBuffer = m_oRenderingBuffer.buf(); + if (NULL != pBuffer) + { + if (!m_bExternalBuffer) + RELEASEARRAYOBJECTS(pBuffer); + + m_oRenderingBuffer.attach(NULL, 0, 0, 0); + } + } + + unsigned int GetStep() const { return 4; } + unsigned int GetWidth() const { return m_unWidth; } + unsigned int GetHeight() const { return m_unHeight; } + BYTE* GetBuffer() { return m_oRenderingBuffer.buf(); } + + virtual ESoftMaskType GetDataType() const = 0; + virtual bool GetSwapRGB() const { return true; }; + + protected: + CSoftMask_private(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bExternalBuffer, bool bFlip) + { + m_bExternalBuffer = bExternalBuffer; + m_unWidth = unWidth; + m_unHeight = unHeight; + m_oRenderingBuffer.attach(pBuffer, unWidth, unHeight, (bFlip ? -1 : 1) * GetStep() * unWidth); + } + + agg::rendering_buffer m_oRenderingBuffer; + bool m_bExternalBuffer; + unsigned int m_unWidth; + unsigned int m_unHeight; + }; + + class CSoftMaskBGRAgray : public CSoftMask_private + { + public: + CSoftMaskBGRAgray(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bExternalBuffer, bool bFlip) + : CSoftMask_private(pBuffer, unWidth, unHeight, bExternalBuffer, bFlip), m_oAlphaMask(m_oRenderingBuffer), m_oScanLine(m_oAlphaMask) {} + + agg::scanline_u8_am& GetScanline() { return m_oScanLine; } + virtual ESoftMaskType GetDataType() const override { return ESoftMaskType::BGRGrayBuffer; } + + private: + agg::alpha_mask_bgra32gray m_oAlphaMask; + agg::scanline_u8_am m_oScanLine; + }; + + class CSoftMaskRGBAgray : public CSoftMask_private + { + public: + CSoftMaskRGBAgray(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bExternalBuffer, bool bFlip) + : CSoftMask_private(pBuffer, unWidth, unHeight, bExternalBuffer, bFlip), m_oAlphaMask(m_oRenderingBuffer), m_oScanLine(m_oAlphaMask) {} + + agg::scanline_u8_am& GetScanline() { return m_oScanLine; } + virtual bool GetSwapRGB() const override { return false; }; + virtual ESoftMaskType GetDataType() const override { return ESoftMaskType::RGBGrayBuffer; } + + private: + agg::alpha_mask_rgba32gray m_oAlphaMask; + agg::scanline_u8_am m_oScanLine; + }; + + class CSoftMaskAlpha : public CSoftMask_private + { + public: + CSoftMaskAlpha(BYTE* pBuffer, unsigned int unWidth, unsigned int unHeight, bool bExternalBuffer, bool bFlip) + : CSoftMask_private(pBuffer, unWidth, unHeight, bExternalBuffer, bFlip), m_oAlphaMask(m_oRenderingBuffer), m_oScanLine(m_oAlphaMask) {} + + agg::scanline_u8_am& GetScanline() { return m_oScanLine; } + virtual ESoftMaskType GetDataType() const override { return ESoftMaskType::Alpha4Buffer; } + + private: + agg::alpha_mask_rgba32a m_oAlphaMask; + agg::scanline_u8_am m_oScanLine; + }; +} + +#endif // _BUILD_ALPHAMASK_P_H_ diff --git a/DesktopEditor/graphics/Graphics.cpp b/DesktopEditor/graphics/Graphics.cpp index dba220d2de..a6d6ce2d7b 100644 --- a/DesktopEditor/graphics/Graphics.cpp +++ b/DesktopEditor/graphics/Graphics.cpp @@ -1297,7 +1297,9 @@ namespace Aggplus RELEASEINTERFACE(pCurrentGraphicsLayer); RELEASEINTERFACE(m_pSoftMask); - m_pSoftMask = new CSoftMask(pBuffer, m_frame_buffer.ren_buf().width(), m_frame_buffer.ren_buf().height(), bAlpha ? EMaskDataType::Alpha4Buffer : EMaskDataType::ImageBuffer, false, m_frame_buffer.ren_buf().stride() < 0); + unsigned int unWidth = m_frame_buffer.ren_buf().width(), unHeight = m_frame_buffer.ren_buf().height(); + bool bFlip = m_frame_buffer.ren_buf().stride() < 0; + m_pSoftMask = new CSoftMask(pBuffer, unWidth, unHeight, bFlip, m_bSwapRGB, bAlpha); pBuffer = m_arLayers.empty() ? m_pPixels : m_arLayers.top()->GetBuffer(); if (!pBuffer) @@ -1306,7 +1308,7 @@ namespace Aggplus return NULL; } - m_frame_buffer.ren_buf().attach(pBuffer, m_frame_buffer.ren_buf().width(), m_frame_buffer.ren_buf().height(), m_frame_buffer.ren_buf().stride()); + m_frame_buffer.ren_buf().attach(pBuffer, unWidth, unHeight, m_frame_buffer.ren_buf().stride()); return m_pSoftMask; } @@ -1401,19 +1403,13 @@ namespace Aggplus } else if (m_pSoftMask) { - switch(m_pSoftMask->GetDataType()) - { - case EMaskDataType::ImageBuffer: - { + ESoftMaskType nType = m_pSoftMask->GetDataType(); + if (nType == ESoftMaskType::RGBGrayBuffer) + Aggplus::BlendTo>(pCurrentGraphicsLayer, m_frame_buffer.pixfmt(), m_pSoftMask->GetBuffer(), m_pSoftMask->GetStep()); + else if (nType == ESoftMaskType::BGRGrayBuffer) Aggplus::BlendTo>(pCurrentGraphicsLayer, m_frame_buffer.pixfmt(), m_pSoftMask->GetBuffer(), m_pSoftMask->GetStep()); - break; - } - case EMaskDataType::Alpha4Buffer: - { + else if (nType == ESoftMaskType::Alpha4Buffer) Aggplus::BlendTo(pCurrentGraphicsLayer, m_frame_buffer.pixfmt(), m_pSoftMask->GetBuffer() + 3, m_pSoftMask->GetStep()); - break; - } - } } else { @@ -1549,10 +1545,13 @@ namespace Aggplus { if (m_pSoftMask) { - if (m_pSoftMask->GetDataType() == EMaskDataType::ImageBuffer) - return render_scanlines_3(ras, ren, m_pSoftMask->GetScanlineImage()); - if (m_pSoftMask->GetDataType() == EMaskDataType::Alpha4Buffer) - return render_scanlines_3(ras, ren, m_pSoftMask->GetScanlineABuffer()); + ESoftMaskType nType = m_pSoftMask->GetDataType(); + if (nType == ESoftMaskType::RGBGrayBuffer) + return render_scanlines_3(ras, ren, ((CSoftMaskRGBAgray*)m_pSoftMask->m_pInternal)->GetScanline()); + if (nType == ESoftMaskType::BGRGrayBuffer) + return render_scanlines_3(ras, ren, ((CSoftMaskBGRAgray*)m_pSoftMask->m_pInternal)->GetScanline()); + if (nType == ESoftMaskType::Alpha4Buffer) + return render_scanlines_3(ras, ren, ((CSoftMaskAlpha*)m_pSoftMask->m_pInternal)->GetScanline()); } render_scanlines_3(ras, ren, m_rasterizer.get_scanline()); } diff --git a/DesktopEditor/graphics/Graphics.h b/DesktopEditor/graphics/Graphics.h index 710f52fffa..fdeb9135cd 100644 --- a/DesktopEditor/graphics/Graphics.h +++ b/DesktopEditor/graphics/Graphics.h @@ -66,7 +66,7 @@ #include "Matrix.h" #include "GraphicsLayerBlend.h" #include "GraphicsPath.h" -#include "AlphaMask.h" +#include "AlphaMask_p.h" #include "Clip.h" #include "Brush.h" #include "Image.h" diff --git a/DesktopEditor/graphics/GraphicsRenderer.cpp b/DesktopEditor/graphics/GraphicsRenderer.cpp index 2f14a36b59..f2fe7443e4 100644 --- a/DesktopEditor/graphics/GraphicsRenderer.cpp +++ b/DesktopEditor/graphics/GraphicsRenderer.cpp @@ -955,61 +955,62 @@ HRESULT CGraphicsRenderer::DrawPath(const LONG& nType) } Aggplus::CBrushTexture* pTextureBrush = NULL; - - if (NULL != m_pCache) - { - pCacheImage = (CCacheImage*)m_pCache->Lock(m_oBrush.TexturePath); - pTextureBrush = new Aggplus::CBrushTexture(pCacheImage->GetImage(), oMode); + if (NULL != m_oBrush.Image) + { + pTextureBrush = new Aggplus::CBrushTexture(m_oBrush.Image, oMode); + } + else if (m_oBrush.TexturePath.find(L"data:") == 0) + { + bool bIsOnlyOfficeHatch = false; + if (m_oBrush.TexturePath.find(L"onlyoffice_hatch") != std::wstring::npos) + bIsOnlyOfficeHatch = true; + + int countErase = (int)(m_oBrush.TexturePath.find(',') + 1); + int nInputSize = (int)(m_oBrush.TexturePath.length() - countErase); + const wchar_t* pInputSrc = m_oBrush.TexturePath.c_str() + countErase; + + int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nInputSize); + BYTE* pImageData = new BYTE[nDecodeLen]; + if (TRUE == NSBase64::Base64Decode(pInputSrc, nInputSize, pImageData, &nDecodeLen)) + { + CBgraFrame oFrame; + if (bIsOnlyOfficeHatch) + { + int nSize = (int)sqrt(nDecodeLen >> 2); + oFrame.put_IsRGBA(true); + oFrame.put_Data(pImageData); + oFrame.put_Width(nSize); + oFrame.put_Height(nSize); + oFrame.put_Stride(4 * nSize); + } + else + { + oFrame.put_IsRGBA(false); + oFrame.Decode(pImageData, nDecodeLen); + RELEASEARRAYOBJECTS(pImageData); + } + // pImage отдается pTextureBrush и освобождается вместе с pBrush + Aggplus::CImage* pImage = new Aggplus::CImage(); + pImage->Create(oFrame.get_Data(), oFrame.get_Width(), oFrame.get_Height(), oFrame.get_Stride()); + oFrame.ClearNoAttack(); + pTextureBrush = new Aggplus::CBrushTexture(pImage, oMode); + pTextureBrush->m_bReleaseImage = TRUE; + } + else + RELEASEARRAYOBJECTS(pImageData); } else { - #ifdef BUILDING_WASM_MODULE - if (NULL != m_oBrush.Image) - pTextureBrush = new Aggplus::CBrushTexture(m_oBrush.Image, oMode); - else if (m_oBrush.TexturePath.find(L"data:") == 0) + if (NULL != m_pCache) { - bool bIsOnlyOfficeHatch = false; - if (m_oBrush.TexturePath.find(L"onlyoffice_hatch") != std::wstring::npos) - bIsOnlyOfficeHatch = true; - std::string sBase64MultyByte(m_oBrush.TexturePath.begin(), m_oBrush.TexturePath.end()); - sBase64MultyByte.erase(0, sBase64MultyByte.find(',') + 1); - int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(sBase64MultyByte.length()); - BYTE* pImageData = new BYTE[nDecodeLen + 64]; - if (TRUE == NSBase64::Base64Decode(sBase64MultyByte.c_str(), sBase64MultyByte.length(), pImageData, &nDecodeLen)) - { - CBgraFrame oFrame; - if (bIsOnlyOfficeHatch) - { - int nSize = (int)sqrt(nDecodeLen >> 2); - oFrame.put_IsRGBA(true); - oFrame.put_Data(pImageData); - oFrame.put_Width(nSize); - oFrame.put_Height(nSize); - oFrame.put_Stride(4 * nSize); - } - else - { - oFrame.put_IsRGBA(false); - oFrame.Decode(pImageData, nDecodeLen); - RELEASEARRAYOBJECTS(pImageData); - } - // pImage отдается pTextureBrush и освобождается вместе с pBrush - Aggplus::CImage* pImage = new Aggplus::CImage(); - pImage->Create(oFrame.get_Data(), oFrame.get_Width(), oFrame.get_Height(), oFrame.get_Stride()); - oFrame.ClearNoAttack(); - pTextureBrush = new Aggplus::CBrushTexture(pImage, oMode); - pTextureBrush->m_bReleaseImage = TRUE; - } - else - RELEASEARRAYOBJECTS(pImageData); + pCacheImage = (CCacheImage*)m_pCache->Lock(m_oBrush.TexturePath); + pTextureBrush = new Aggplus::CBrushTexture(pCacheImage->GetImage(), oMode); } - #else - if (NULL != m_oBrush.Image) - pTextureBrush = new Aggplus::CBrushTexture(m_oBrush.Image, oMode); else + { pTextureBrush = new Aggplus::CBrushTexture(m_oBrush.TexturePath, oMode); - #endif + } } if( pTextureBrush ) diff --git a/DesktopEditor/graphics/pro/graphics.pro b/DesktopEditor/graphics/pro/graphics.pro index d940762df4..212cbc268d 100644 --- a/DesktopEditor/graphics/pro/graphics.pro +++ b/DesktopEditor/graphics/pro/graphics.pro @@ -59,7 +59,8 @@ SOURCES += \ # alpha mask HEADERS += \ - ./../AlphaMask.h + ./../AlphaMask.h \ + ./../AlphaMask_p.h SOURCES += \ ./../AlphaMask.cpp diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js index fc4f69cf23..d43e81dd80 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js @@ -144,7 +144,7 @@ CFile.prototype._getInteractiveFormsInfo = function() CFile.prototype._getAnnotationsInfo = function(pageIndex) { - g_module_pointer.ptr = g_native_drawing_file["GetAnnotationsInfo"](pageIndex); + g_module_pointer.ptr = g_native_drawing_file["GetAnnotationsInfo"](pageIndex === undefined ? -1 : pageIndex); return g_module_pointer; }; diff --git a/DesktopEditor/xml/build/qt/libxml2.pri b/DesktopEditor/xml/build/qt/libxml2.pri index 0722b6932a..960bacfa1a 100644 --- a/DesktopEditor/xml/build/qt/libxml2.pri +++ b/DesktopEditor/xml/build/qt/libxml2.pri @@ -74,6 +74,8 @@ SOURCES += \ $$PWD/../../libxml2/valid.c \ $$PWD/../../libxml2/parser.c } + +!core_only_libxml { SOURCES += \ $$PWD/../../src/xmlwriter.cpp \ $$PWD/../../src/xmllight.cpp \ @@ -85,3 +87,4 @@ HEADERS += \ HEADERS += \ $$PWD/../../include/xmlutils.h \ $$PWD/../../include/xmlwriter.h +} diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 01c81bf617..b163cf427e 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -8622,7 +8622,7 @@ _UINT32 BinaryFileWriter::Open(const std::wstring& sInputDir, const std::wstring } }break; } - if (0 != result && AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS != result) + if (0 != result && AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS != result && AVS_FILEUTILS_ERROR_CONVERT_CELLLIMITS != result) { RELEASEOBJECT(pXlsx); return result; diff --git a/OOXML/Binary/Sheets/Reader/CSVReader.cpp b/OOXML/Binary/Sheets/Reader/CSVReader.cpp index 29aba988e6..c7bcae6392 100644 --- a/OOXML/Binary/Sheets/Reader/CSVReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CSVReader.cpp @@ -56,7 +56,7 @@ public: Impl() {} _UINT32 Read(const std::wstring &sFileName, OOX::Spreadsheet::CXlsx &oXlsx, _UINT32 nCodePage, const std::wstring& wcDelimiter); private: - void AddCell(std::wstring &sText, INT nStartCell, std::stack &oDeleteChars, OOX::Spreadsheet::CRow &oRow, INT nRow, INT nCol, bool bIsWrap); + int AddCell(std::wstring &sText, INT nStartCell, std::stack &oDeleteChars, OOX::Spreadsheet::CRow &oRow, INT nRow, INT nCol, bool bIsWrap); std::shared_ptr cellFormatController_ = NULL; //--------------------------------------------------------------------------------------------------------- @@ -181,8 +181,10 @@ private: } }; //----------------------------------------------------------------------------------------------- -void CSVReader::Impl::AddCell(std::wstring &sText, INT nStartCell, std::stack &oDeleteChars, OOX::Spreadsheet::CRow &oRow, INT nRow, INT nCol, bool bIsWrap) +int CSVReader::Impl::AddCell(std::wstring &sText, INT nStartCell, std::stack &oDeleteChars, OOX::Spreadsheet::CRow &oRow, INT nRow, INT nCol, bool bIsWrap) { + int result = 0; + while (!oDeleteChars.empty()) { INT nIndex = oDeleteChars.top() - nStartCell; @@ -193,17 +195,19 @@ void CSVReader::Impl::AddCell(std::wstring &sText, INT nStartCell, std::stackm_oType.Init(); pCell->m_oCacheValue = sText; // как есть - cellFormatController_->ProcessCellType(pCell, sText, bIsWrap); + result = cellFormatController_->ProcessCellType(pCell, sText, bIsWrap); pCell->setRowCol(nRow, nCol); oRow.m_arrItems.push_back(pCell); + + return result; } _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::CXlsx &oXlsx, _UINT32 nCodePage, const std::wstring& sDelimiter) { @@ -309,7 +313,10 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C std::stack oDeleteChars; bool bMsLimit = false; + bool bMsLimitCell = false; + bool bInQuote = false; + INT nIndexRow = 0; INT nIndexCol = 0; OOX::Spreadsheet::CRow *pRow = new OOX::Spreadsheet::CRow(); @@ -328,7 +335,11 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C // New Cell std::wstring sCellText(pTemp + nStartCell, nIndex - nStartCell); - AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap); + if (1 == AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap)) + { + bMsLimitCell = true; + } + oDeleteChars = std::stack(); bIsWrap = false; @@ -360,7 +371,10 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C if (nStartCell != nIndex) { std::wstring sCellText(pTemp + nStartCell, nIndex - nStartCell); - AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap); + if (1 == AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap)) + { + bMsLimitCell = true; + } bIsWrap = false; } @@ -430,7 +444,10 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C else nSize--; } std::wstring sCellText(pTemp + nStartCell, nSize - nStartCell); - AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap); + if (1 == AddCell(sCellText, nStartCell, oDeleteChars, *pRow, nIndexRow, nIndexCol++, bIsWrap)) + { + bMsLimitCell = true; + } pWorksheet->m_oSheetData->m_arrItems.push_back(pRow); } else @@ -455,7 +472,7 @@ _UINT32 CSVReader::Impl::Read(const std::wstring &sFileName, OOX::Spreadsheet::C oXlsx.m_pWorkbook->m_oSheets.Init(); oXlsx.m_pWorkbook->m_oSheets->m_arrItems.push_back(pSheet); - return bMsLimit ? AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS : 0; + return bMsLimit ? AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS : (bMsLimitCell ? AVS_FILEUTILS_ERROR_CONVERT_CELLLIMITS : 0); } //---------------------------------------------------------------------------------- CSVReader::CSVReader() : impl_(new CSVReader::Impl()) diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp index 0fe7eacab0..5d37e02736 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.cpp @@ -94,8 +94,9 @@ CellFormatController::CellFormatController(OOX::Spreadsheet::CStyles *styles): createFormatStyle(DefaultPercentFormat); } -void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const std::wstring &value, bool bIsWrap) +int CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const std::wstring &value, bool bIsWrap) { + int result = 0; // ok pCell_ = pCell; /// формат для булева значения в верхнем регистре @@ -107,13 +108,16 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const auto tempValue = value; std::transform(tempValue.begin(), tempValue.end(), tempValue.begin(), [](unsigned char c) { return std::toupper(c); }); + pText->m_sText = tempValue; pCell_->m_oRichText->m_arrItems.push_back(pText); - return; + + return result; } DigitReader digits = {}; std::wstring digitFormat = {}; std::wstring digitValue = {}; + if(digits.ReadScientific(value, digitValue, digitFormat)) { if(!pCell_->m_oValue.IsInit()) @@ -128,7 +132,6 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const } else { - if (!m_pStyles->m_oNumFmts.IsInit()) { m_pStyles->m_oNumFmts.Init(); @@ -143,14 +146,14 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const { pCell_->m_oStyle = 1; } - return; + return result; } else if(digits.ReadDigit(value, digitValue, digitFormat)) { if(!pCell_->m_oValue.IsInit()) { pCell_->m_oValue.Init(); - }// + } pCell_->m_oValue->m_sText = digitValue; std::map::iterator pFind = mapDataNumber_.find(digitFormat); if (pFind != mapDataNumber_.end()) @@ -174,7 +177,7 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const { pCell_->m_oStyle = 1; } - return; + return result; } DateReader dateReader = {}; @@ -219,7 +222,16 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const pCell_->m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeInlineStr); pCell_->m_oRichText.Init(); OOX::Spreadsheet::CText *pText = new OOX::Spreadsheet::CText(); + + if (value.length() > 32767) + { + pText->m_sText = value.substr(0, 32767); + result = 1; // limit + } + else + { pText->m_sText = value; + } pCell_->m_oRichText->m_arrItems.push_back(pText); } } @@ -228,7 +240,7 @@ void CellFormatController::ProcessCellType(OOX::Spreadsheet::CCell *pCell, const { pCell_->m_oStyle = 1; } - + return result; } void CellFormatController::createFormatStyle(const std::wstring &format) diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.h b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.h index 2028f4fae1..b8d6e58589 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.h +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/CellFormatController.h @@ -49,7 +49,7 @@ public: /// @brief обрабатывает вставляемые в ячейку таблицы данные, переводя их в нужный тип, и заполняет ими ячейку /// @param pCell указатель на ячейку /// @param value вставляемые в ячейку данные в строковом типе - void ProcessCellType(OOX::Spreadsheet::CCell *pCell, const std::wstring &value, bool bIsWrap = false); + int ProcessCellType(OOX::Spreadsheet::CCell *pCell, const std::wstring &value, bool bIsWrap = false); private: diff --git a/OOXML/PPTXFormat/Logic/CSld.cpp b/OOXML/PPTXFormat/Logic/CSld.cpp index 1a23108e30..9e6b6759ce 100644 --- a/OOXML/PPTXFormat/Logic/CSld.cpp +++ b/OOXML/PPTXFormat/Logic/CSld.cpp @@ -95,6 +95,7 @@ namespace PPTX pWriter->WriteULONG((_UINT32)spTree.SpTreeElems.size()); for (size_t i = 0; i < spTree.SpTreeElems.size(); i++) { + pWriter->m_bInGroup = false; pWriter->WriteRecord1(0, spTree.SpTreeElems[i]); } pWriter->EndRecord(); diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index d21b3ed0bf..b0604329ae 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -3407,8 +3407,8 @@ namespace PdfReader } } - if (!bAlpha) // pTransferFunc преобразовала результат luminosity маски в alpha маску - m_pSoftMask->SetType(Aggplus::EMaskDataType::Alpha4Buffer); + // if (!bAlpha) // pTransferFunc преобразовала результат luminosity маски в alpha маску + // m_pSoftMask->SetType(Aggplus::EMaskDataType::Alpha4Buffer); } m_sCS.pop_back(); diff --git a/RtfFile/OOXml/Writer/OOXDocumentWriter.cpp b/RtfFile/OOXml/Writer/OOXDocumentWriter.cpp index 58d73c9d94..22bb99aca4 100644 --- a/RtfFile/OOXml/Writer/OOXDocumentWriter.cpp +++ b/RtfFile/OOXml/Writer/OOXDocumentWriter.cpp @@ -274,7 +274,7 @@ bool OOXDocumentWriter::SaveBySection() RtfParagraph *para = dynamic_cast(m_oDocument[0].props->operator[](i).get()); bParaCurrEmpty = (para) ? (para->GetCount() < 1) : true; - sXml = m_oDocument[0].props->operator[](i)->RenderToOOX(oNewParam); + sXml = m_oDocument[0].props->operator[](i)->RenderToOOX(oNewParam); if (!sXml.empty() || !sXmlSectProp.empty()) { @@ -292,24 +292,30 @@ bool OOXDocumentWriter::SaveBySection() } else { - size_t nFind, nFindPict, pos = sXml.size(); + size_t nFindPPr, nFindP, nFindPictStart, nFindPictEnd, pos = sXml.size(); do { - nFindPict = sXml.rfind(L"", pos); - nFind = sXml.rfind(L"", pos); - pos = nFindPict - 1; - }while(nFind != std::wstring::npos && nFindPict != std::wstring::npos && nFind > nFindPict); + nFindPictStart = sXml.rfind(L"", pos); + nFindPictEnd = sXml.rfind(L"/w:pict>", pos); + nFindPPr = sXml.rfind(L"", pos); + nFindP = sXml.rfind(L"", pos); - if( nFind != std::wstring::npos) + pos = nFindPictStart - 1; + + if (nFindPictStart == std::wstring::npos) + break; + + } while (true); + + if (nFindPPr != std::wstring::npos) { - sXml.insert( nFind, sXmlSectProp ); + sXml.insert(nFindPPr, sXmlSectProp ); } - else + else if (nFindP != std::wstring::npos) { - nFind = sXml.rfind( L"" ); - if( std::wstring::npos != nFind ) - sXml.insert( nFind + 5, L"" + sXmlSectProp + L"" ); + if( std::wstring::npos != nFindP) + sXml.insert(nFindP + 5, L"" + sXmlSectProp + L"" ); } } } diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index 32f0e3811f..af0ec74cd8 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -49,7 +49,7 @@ #include #include -#define SUCCEEDED_X2T(nRes) (0 == (nRes) || AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS == (nRes)) +#define SUCCEEDED_X2T(nRes) (0 == (nRes) || AVS_FILEUTILS_ERROR_CONVERT_ROWLIMITS == (nRes) || AVS_FILEUTILS_ERROR_CONVERT_CELLLIMITS == (nRes)) namespace NExtractTools { diff --git a/X2tConverter/src/lib/common.h b/X2tConverter/src/lib/common.h index 4e17ab999d..47a901dbbf 100644 --- a/X2tConverter/src/lib/common.h +++ b/X2tConverter/src/lib/common.h @@ -449,7 +449,10 @@ namespace NExtractTools if (SUCCEEDED_X2T(hRes)) { if (bIsCrypt) - hRes = dir2zipMscrypt(sOOXMLDir, sTo, params, convertParams); + { + _UINT32 hRes2 = dir2zipMscrypt(sOOXMLDir, sTo, params, convertParams); + hRes = (hRes2 == 0 ? hRes : hRes2); + } else { COfficeUtils oCOfficeUtils(NULL); diff --git a/X2tConverter/src/lib/csv.h b/X2tConverter/src/lib/csv.h index 0ce635462e..f6deabb60c 100644 --- a/X2tConverter/src/lib/csv.h +++ b/X2tConverter/src/lib/csv.h @@ -54,10 +54,13 @@ namespace NExtractTools CSVReader csvReader; _UINT32 nRes = csvReader.Read(sFrom, oXlsx, nCodePage, sDelimiter); - oXlsx.PrepareToWrite(); + if (SUCCEEDED_X2T(nRes)) + { + oXlsx.PrepareToWrite(); - OOX::CContentTypes oContentTypes; - nRes = oXlsx.Write(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + OOX::CContentTypes oContentTypes; + nRes = oXlsx.Write(sTo, oContentTypes) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; + } return nRes; } diff --git a/X2tConverter/src/lib/odf.h b/X2tConverter/src/lib/odf.h index ae46c5d637..6c0709b6dd 100644 --- a/X2tConverter/src/lib/odf.h +++ b/X2tConverter/src/lib/odf.h @@ -69,7 +69,7 @@ namespace NExtractTools { nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTo, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); - params.m_bMacro = false; // todooo odf + params.m_bMacro = false; // todooo ������� ��������� �������� odf nRes = processEncryptionError(nRes, sFrom, params); } else @@ -98,7 +98,7 @@ namespace NExtractTools nRes = ConvertODF2OOXml(sTempUnpackedOdf, sTempUnpackedOox, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); - params.m_bMacro = false; // todooo odf + params.m_bMacro = false; // todooo ������� ��������� �������� odf nRes = processEncryptionError(nRes, sFrom, params); if (SUCCEEDED_X2T(nRes)) @@ -165,7 +165,7 @@ namespace NExtractTools _UINT32 odf_flat2oox_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { _UINT32 nRes = ConvertODF2OOXml(sFrom, sTo, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); - params.m_bMacro = false; // todooo odf + params.m_bMacro = false; // todooo ������� ��������� �������� odf nRes = processEncryptionError(nRes, sFrom, params); return nRes; @@ -180,7 +180,7 @@ namespace NExtractTools NSDirectory::CreateDirectory(sTempUnpackedOox); _UINT32 nRes = ConvertODF2OOXml(sFrom, sTempUnpackedOox, params.getFontPath(), convertParams.m_sTempDir, params.getPassword()); - params.m_bMacro = false; // todooo odf + params.m_bMacro = false; // todooo ������� ��������� �������� odf nRes = processEncryptionError(nRes, sFrom, params); if (SUCCEEDED_X2T(nRes)) @@ -324,7 +324,7 @@ namespace NExtractTools if (SUCCEEDED_X2T(nRes)) { COfficeUtils oCOfficeUtils(NULL); - nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedOdf, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedOdf, sTo, true)) ? nRes : AVS_FILEUTILS_ERROR_CONVERT; } return nRes; }