Merge branch 'hotfix/v9.0.4' into feature/libheif

This commit is contained in:
Mikhail Lobotskiy
2025-08-04 17:47:50 +04:00
298 changed files with 15326 additions and 3454 deletions

View File

@ -195,7 +195,7 @@
},
{
"folder": "../../../../PdfFile/SrcWriter/",
"files": ["AcroForm.cpp", "Annotation.cpp", "Catalog.cpp", "Destination.cpp", "Document.cpp", "Encrypt.cpp", "EncryptDictionary.cpp", "Field.cpp", "Font.cpp", "Font14.cpp", "FontCidTT.cpp", "FontTT.cpp", "FontTTWriter.cpp", "GState.cpp", "Image.cpp", "Info.cpp", "Metadata.cpp", "Objects.cpp", "Outline.cpp", "Pages.cpp", "Pattern.cpp", "ResourcesDictionary.cpp", "Shading.cpp", "States.cpp", "Streams.cpp", "Utils.cpp"]
"files": ["AcroForm.cpp", "Annotation.cpp", "Catalog.cpp", "Destination.cpp", "Document.cpp", "Encrypt.cpp", "EncryptDictionary.cpp", "Field.cpp", "Font.cpp", "Font14.cpp", "FontCidTT.cpp", "FontOTWriter.cpp", "FontTT.cpp", "FontTTWriter.cpp", "GState.cpp", "Image.cpp", "Info.cpp", "Metadata.cpp", "Objects.cpp", "Outline.cpp", "Pages.cpp", "Pattern.cpp", "ResourcesDictionary.cpp", "Shading.cpp", "States.cpp", "Streams.cpp", "Utils.cpp"]
},
{
"folder": "../../../../PdfFile/Resources/",

View File

@ -717,6 +717,7 @@ SOURCES += \
$$PDF_ROOT_DIR/SrcWriter/FontCidTT.cpp \
$$PDF_ROOT_DIR/SrcWriter/FontTT.cpp \
$$PDF_ROOT_DIR/SrcWriter/FontTTWriter.cpp \
$$PDF_ROOT_DIR/SrcWriter/FontOTWriter.cpp \
$$PDF_ROOT_DIR/SrcWriter/GState.cpp \
$$PDF_ROOT_DIR/SrcWriter/Image.cpp \
$$PDF_ROOT_DIR/SrcWriter/Info.cpp \

View File

@ -40,7 +40,7 @@ var UpdateFontsSource = {
function CFile()
{
this.nativeFile = 0;
this.stream = [];
this.stream = -1;
this.stream_size = 0;
this.type = -1;
this.pages = [];
@ -128,17 +128,17 @@ CFile.prototype["close"] = function()
this.pages = [];
this.info = null;
this.StartID = null;
for (let i = 0; i < this.stream.length; i++)
this._free(this.stream[i]);
this.stream = [];
if (this.stream > 0)
this._free(this.stream);
this.stream = -1;
self.drawingFile = null;
};
CFile.prototype["getFileBinary"] = function()
{
if (this.stream.length == 0)
if (0 >= this.stream)
return "";
return new Uint8Array(Module["HEAP8"].buffer, this.stream[0], this.stream_size);
return new Uint8Array(Module["HEAP8"].buffer, this.stream, this.stream_size);
};
CFile.prototype["isNeedPassword"] = function()
@ -1566,8 +1566,13 @@ CFile.prototype["readAnnotationsInfoFromBinary"] = function(AnnotInfo)
CFile.prototype["scanPage"] = function(page, mode)
{
let ptr = this._scanPage(page, mode);
let reader = ptr.getReader();
if (mode == 2) {
data = ptr.getMemory(true);
ptr.free();
return data;
}
let reader = ptr.getReader();
if (!reader) return [];
let shapesCount = reader.readInt();

View File

@ -101,9 +101,8 @@ CFile.prototype._openFile = function(buffer, password)
{
let data = new Uint8Array(buffer);
this.stream_size = data.length;
let stream = Module["_malloc"](this.stream_size);
Module["HEAP8"].set(data, stream);
this.stream.push(stream);
this.stream = Module["_malloc"](this.stream_size);
Module["HEAP8"].set(data, this.stream);
}
let passwordPtr = 0;
@ -114,7 +113,7 @@ CFile.prototype._openFile = function(buffer, password)
Module["HEAP8"].set(passwordBuf, passwordPtr);
}
this.nativeFile = Module["_Open"](this.stream[0], this.stream_size, passwordPtr);
this.nativeFile = Module["_Open"](this.stream, this.stream_size, passwordPtr);
if (passwordPtr)
Module["_free"](passwordPtr);
@ -128,7 +127,7 @@ CFile.prototype._closeFile = function()
CFile.prototype._getType = function()
{
return Module["_GetType"](this.stream[0], this.stream_size);
return Module["_GetType"](this.nativeFile);
};
CFile.prototype._getError = function()
@ -180,10 +179,7 @@ CFile.prototype._MergePages = function(buffer, maxID, prefixForm)
}
let bRes = Module["_MergePages"](this.nativeFile, stream2, data.length, maxID, prefixPtr);
if (bRes == 1)
this.stream.push(stream2);
else
Module["_free"](stream2);
stream2 = 0; // Success or not, stream2 is either taken or freed
if (prefixPtr)
Module["_free"](prefixPtr);
@ -193,13 +189,7 @@ CFile.prototype._MergePages = function(buffer, maxID, prefixForm)
CFile.prototype._UndoMergePages = function()
{
let bRes = Module["_UnmergePages"](this.nativeFile);
if (bRes == 1)
{
let str = this.stream.pop();
Module["_free"](str);
}
return bRes == 1;
return Module["_UnmergePages"](this.nativeFile) == 1;
};
// FONTS

View File

@ -68,25 +68,6 @@ WASM_EXPORT int IsFontBinaryExist(char* path)
return 0;
}
WASM_EXPORT int GetType(BYTE* data, LONG size)
{
// 0 - PDF
// 1 - DJVU
// 2 - XPS
LONG nHeaderSearchSize = 1024;
LONG nSize = size < nHeaderSearchSize ? size : nHeaderSearchSize;
char* pData = (char*)data;
for (int i = 0; i < nSize - 5; ++i)
{
int nPDF = strncmp(&pData[i], "%PDF-", 5);
if (!nPDF)
return 0;
}
if ( (8 <= size) && (0x41 == data[0] && 0x54 == data[1] && 0x26 == data[2] && 0x54 == data[3] &&
0x46 == data[4] && 0x4f == data[5] && 0x52 == data[6] && 0x4d == data[7]))
return 1;
return 2;
}
WASM_EXPORT CDrawingFile* Open(BYTE* data, LONG size, const char* password)
{
if (!g_applicationFonts)
@ -102,6 +83,13 @@ WASM_EXPORT CDrawingFile* Open(BYTE* data, LONG size, const char* password)
pFile->OpenFile(data, size, sPassword);
return pFile;
}
WASM_EXPORT int GetType(CDrawingFile* pFile)
{
// 0 - PDF
// 1 - DJVU
// 2 - XPS
return pFile->GetType();
}
WASM_EXPORT int GetErrorCode(CDrawingFile* pFile)
{
if (!pFile)
@ -111,6 +99,7 @@ WASM_EXPORT int GetErrorCode(CDrawingFile* pFile)
WASM_EXPORT void Close(CDrawingFile* pFile)
{
delete pFile;
g_applicationFonts->GetStreams()->Clear();
NSFonts::NSApplicationFontStream::SetGlobalMemoryStorage(NULL);
}
WASM_EXPORT BYTE* GetInfo(CDrawingFile* pFile)

View File

@ -1022,9 +1022,9 @@ int main(int argc, char* argv[])
}
}
RELEASEARRAYOBJECTS(pFileData);
// SPLIT & MERGE
BYTE* pSplitPages = NULL;
BYTE* pFileMerge = NULL;
if (false)
{
int nBufferLen = NULL;
@ -1036,12 +1036,19 @@ int main(int argc, char* argv[])
BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen);
int nLength = READ_INT(pSplitPages);
NSFile::CFileBinary oFile;
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split1.pdf"))
oFile.WriteFile(pSplitPages + 4, nLength - 4);
oFile.CloseFile();
if (nLength > 4)
{
NSFile::CFileBinary oFile;
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split1.pdf"))
oFile.WriteFile(pSplitPages + 4, nLength - 4);
oFile.CloseFile();
MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge1");
BYTE* pMallocData = (BYTE*)malloc(nLength - 4);
memcpy(pMallocData, pSplitPages + 4, nLength - 4);
MergePages(pGrFile, pMallocData, nLength - 4, 0, "merge1");
}
RELEASEARRAYOBJECTS(pSplitPages);
}
RELEASEARRAYOBJECTS(pBuffer);
@ -1051,12 +1058,19 @@ int main(int argc, char* argv[])
BYTE* pSplitPages = SplitPages(pGrFile, arrPages.data(), arrPages.size(), pBuffer, nBufferLen);
int nLength = READ_INT(pSplitPages);
NSFile::CFileBinary oFile;
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf"))
oFile.WriteFile(pSplitPages + 4, nLength - 4);
oFile.CloseFile();
if (nLength > 4)
{
NSFile::CFileBinary oFile;
if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/split2.pdf"))
oFile.WriteFile(pSplitPages + 4, nLength - 4);
oFile.CloseFile();
MergePages(pGrFile, pSplitPages + 4, nLength - 4, 0, "merge2");
BYTE* pMallocData = (BYTE*)malloc(nLength - 4);
memcpy(pMallocData, pSplitPages + 4, nLength - 4);
MergePages(pGrFile, pMallocData, nLength - 4, 0, "merge2");
}
RELEASEARRAYOBJECTS(pSplitPages);
}
RELEASEARRAYOBJECTS(pBuffer);
}
@ -2053,10 +2067,6 @@ int main(int argc, char* argv[])
}
Close(pGrFile);
RELEASEARRAYOBJECTS(pFileData);
RELEASEARRAYOBJECTS(pSplitPages);
RELEASEARRAYOBJECTS(pFileMerge);
RELEASEARRAYOBJECTS(pCMapData);
return 0;
}

View File

@ -2,8 +2,11 @@
#define _WASM_SERIALIZE_H
#include <vector>
#include <stack>
#include "../../../../../common/File.h"
#define CLEAR_STACK(stack) while (!(stack).empty()) (stack).pop()
namespace NSWasm
{
class CData
@ -15,6 +18,8 @@ namespace NSWasm
BYTE* m_pDataCur;
size_t m_lSizeCur;
std::stack<size_t> m_lStack;
public:
CData()
{
@ -24,10 +29,70 @@ namespace NSWasm
m_pDataCur = m_pData;
m_lSizeCur = m_lSize;
}
CData(const CData& other)
{
m_lSize = other.m_lSize;
m_lSizeCur = other.m_lSizeCur;
m_pData = (BYTE*)malloc(m_lSize * sizeof(BYTE));
memcpy(m_pData, other.m_pData, other.m_lSizeCur * sizeof(BYTE));
m_pDataCur = m_pData + m_lSizeCur;
m_lStack = other.m_lStack;
}
CData(CData&& other)
{
m_lSize = other.m_lSize;
m_lSizeCur = other.m_lSizeCur;
m_pData = other.m_pData;
m_pDataCur = other.m_pDataCur;
m_lStack = std::move(other.m_lStack);
other.ClearWithoutAttack();
}
virtual ~CData()
{
Clear();
}
CData& operator= (const CData& other)
{
if (this == &other)
return *this;
Clear();
m_lSize = other.m_lSize;
m_lSizeCur = other.m_lSizeCur;
m_pData = (BYTE*)malloc(m_lSize * sizeof(BYTE));
memcpy(m_pData, other.m_pData, other.m_lSizeCur * sizeof(BYTE));
m_pDataCur = m_pData + m_lSizeCur;
m_lStack = other.m_lStack;
return *this;
}
CData& operator= (CData&& other)
{
if (this == &other)
return *this;
Clear();
m_lSize = other.m_lSize;
m_lSizeCur = other.m_lSizeCur;
m_pData = other.m_pData;
m_pDataCur = other.m_pDataCur;
other.ClearWithoutAttack();
m_lStack = std::move(other.m_lStack);
return *this;
}
inline void AddSize(size_t nSize)
{
@ -68,6 +133,20 @@ namespace NSWasm
}
public:
void StartRecord(BYTE type)
{
AddSize(5); // sizeof (BYTE + unsigned int)
WriteBYTE(type);
AddInt(0);
m_lStack.push(m_lSizeCur);
}
void EndRecord()
{
size_t start = m_lStack.top();
unsigned int len = m_lSizeCur - start;
memcpy(m_pData + start - 4, &len, sizeof(unsigned int));
m_lStack.pop();
}
void AddInt(unsigned int value)
{
AddSize(4);
@ -75,6 +154,13 @@ namespace NSWasm
m_pDataCur += 4;
m_lSizeCur += 4;
}
void AddSInt(int value)
{
AddSize(4);
memcpy(m_pDataCur, &value, sizeof(int));
m_pDataCur += 4;
m_lSizeCur += 4;
}
void AddInt(unsigned int value, size_t pos)
{
if (pos < m_lSizeCur)
@ -93,6 +179,10 @@ namespace NSWasm
m_pDataCur += sizeof(BYTE);
m_lSizeCur += sizeof(BYTE);
}
void WriteBool(bool value)
{
WriteBYTE(value ? 1 : 0);
}
void WriteDouble(double value)
{
int nV = value * 10000;
@ -151,6 +241,37 @@ namespace NSWasm
WriteString(pDataUtf8, (unsigned int)lDataUtf8);
RELEASEARRAYOBJECTS(pDataUtf8);
}
void WriteStringUtf16(const std::wstring& sStr, const bool& isBytes = false)
{
unsigned int size = static_cast<unsigned int>(sStr.length());
int len = 0;
size_t posLen = m_lSizeCur;
// len reserve
AddInt(0);
if (sizeof(wchar_t) == 4)
{
AddSize(4 * size + 2/*'\0'*/);
NSFile::CUtf8Converter::GetUtf16StringFromUnicode_4bytes(sStr.c_str(), (LONG)size, m_pDataCur, len, false);
}
else
{
size_t bufferLen = 2 * size;
AddSize(bufferLen);
len = (int)(bufferLen);
memcpy(m_pDataCur, sStr.c_str(), bufferLen);
}
m_pDataCur += static_cast<unsigned int>(len);
m_lSizeCur += static_cast<unsigned int>(len);
if (!isBytes)
len /= 2;
AddInt((unsigned int)len, posLen);
}
void Write(BYTE* value, unsigned int len)
{
if (!value || len == 0)
@ -165,6 +286,13 @@ namespace NSWasm
return m_pData;
}
BYTE* MoveBuffer()
{
BYTE* pData = m_pData;
ClearWithoutAttack();
return pData;
}
void Clear()
{
if (m_pData)
@ -175,6 +303,8 @@ namespace NSWasm
m_pDataCur = m_pData;
m_lSizeCur = 0;
CLEAR_STACK(m_lStack);
}
void ClearWithoutAttack()
{
@ -183,11 +313,15 @@ namespace NSWasm
m_pDataCur = m_pData;
m_lSizeCur = 0;
CLEAR_STACK(m_lStack);
}
void ClearNoAttack()
{
m_pDataCur = m_pData;
m_lSizeCur = 0;
CLEAR_STACK(m_lStack);
}
unsigned int GetSize()
{