diff --git a/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.cpp b/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.cpp index b65251f0ca..4bf52f930a 100644 --- a/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.cpp +++ b/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.cpp @@ -95,6 +95,21 @@ namespace DocFileFormat m_pMetaHeader = pHeader; m_lMetaHeaderSize = lSize; } + void CMetaFileBuffer::AddData(BYTE* pBuf, LONG lBuf) + { + BYTE *pMetaFile = new BYTE[lBuf + m_lMetaFileSize]; + if (m_pMetaFile) + memcpy(pMetaFile, m_pMetaFile, m_lMetaFileSize); + if (pBuf) + memcpy(pMetaFile + m_lMetaFileSize, pBuf, lBuf); + + if (m_pMetaFile) + delete[]m_pMetaFile; + + m_pMetaFile = pMetaFile; + m_lMetaFileSize += lBuf; + } + void CMetaFileBuffer::SetData(BYTE* pCompress, LONG lCompressSize, LONG lUncompressSize, bool bIsCompressed) { if (!bIsCompressed) @@ -127,6 +142,18 @@ namespace DocFileFormat } } } + bool CMetaFileBuffer::isWMV() + { + if (!m_pMetaFile) return false; + if (m_lMetaFileSize < 3) return false; + + for (int i = 0; i < (std::min)((int)m_lMetaFileSize, 1024) - 2; ++i) + { + if (m_pMetaFile[i] == 'W' && m_pMetaFile[i + 1] == 'M') + return true; + } + return false; + } int CMetaFileBuffer::ToBuffer(BYTE *& Data) { int sz = 0; @@ -205,6 +232,18 @@ namespace DocFileFormat oMetaHeader.compression = m_fCompression; oMetaHeader.filter = m_fFilter; + oMetaFile.SetData(m_pvBits, oMetaHeader.cbSave, oMetaHeader.cbSize, 0 == oMetaHeader.compression); + + //if (sz - m_cbSave > m_cb) + //{ + // oMetaFile.AddData(m_pvBits + m_cbSave, sz - m_cbSave); + //} + + //if (oMetaFile.isWMV()) + //{ + // typeCode = 0xf01b; + //} + if (typeCode == 0xf01b) { oMetaFile.m_sExtension = L".wmf"; @@ -220,10 +259,8 @@ namespace DocFileFormat } if (typeCode == 0xf01c) { - oMetaFile.m_sExtension = L".pcz"; - //decompress??? + oMetaFile.m_sExtension = L".pct"; } - oMetaFile.SetData(m_pvBits, oMetaHeader.cbSave, oMetaHeader.cbSize, 0 == oMetaHeader.compression); } MetafilePictBlip::~MetafilePictBlip() diff --git a/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.h b/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.h index bb0385780d..02bb23aab6 100644 --- a/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.h +++ b/MsBinaryFile/DocFile/OfficeDrawing/MetafilePictBlip.h @@ -91,10 +91,11 @@ public: void SetHeader(BYTE* pHeader, LONG lSize); void SetData(BYTE* pCompress, LONG lCompressSize, LONG lUncompressSize, bool bIsCompressed); + void AddData(BYTE* pBuf, LONG lBuf); int ToBuffer(BYTE *& Data); - void ToFile(NSFile::CFileBinary* pFile); + bool isWMV(); }; diff --git a/MsBinaryFile/DocFile/TextboxMapping.cpp b/MsBinaryFile/DocFile/TextboxMapping.cpp index af08753977..27c92a8406 100644 --- a/MsBinaryFile/DocFile/TextboxMapping.cpp +++ b/MsBinaryFile/DocFile/TextboxMapping.cpp @@ -140,6 +140,10 @@ namespace DocFileFormat cpStart = txtbxSubdocStart + m_document->TextboxBreakPlexHeader->CharacterPositions[m_nTBIndex]; cpEnd = txtbxSubdocStart + m_document->TextboxBreakPlexHeader->CharacterPositions[m_nTBIndex + 1]; } + else + { + cpEnd = 0x7fffffff; + } bool bUsed = bkd ? bkd->bUsed : false; _isTextBoxContent = true; @@ -170,7 +174,7 @@ namespace DocFileFormat else { //this PAPX is for a normal paragraph - cp = writeParagraph(cp, 0x7fffffff); + cp = writeParagraph(cp, cpEnd - 1); } } _isTextBoxContent = false; diff --git a/MsBinaryFile/DocFile/VMLPictureMapping.cpp b/MsBinaryFile/DocFile/VMLPictureMapping.cpp index b3c5c577b8..728b90a526 100644 --- a/MsBinaryFile/DocFile/VMLPictureMapping.cpp +++ b/MsBinaryFile/DocFile/VMLPictureMapping.cpp @@ -622,11 +622,14 @@ namespace DocFileFormat }break; case Global::msoblipPICT: { - BitmapBlip* bitBlip = static_cast(oBlipEntry->Blip); - if (bitBlip) + MetafilePictBlip* metaBlip = static_cast(oBlipEntry->Blip); + if (metaBlip) { + unsigned char* newData = NULL; + unsigned int newDataSize = metaBlip->oMetaFile.ToBuffer(newData); + CBgraFrame bgraFrame; - if (bgraFrame.Decode(bitBlip->m_pvBits, bitBlip->pvBitsSize)) + if (bgraFrame.Decode(newData, newDataSize)) { std::wstring file_name = m_context->_doc->m_sTempFolder + FILE_SEPARATOR_STR + L"tmp_image"; bgraFrame.SaveFile(file_name, 4); // png @@ -640,6 +643,11 @@ namespace DocFileFormat } NSFile::CFileBinary::Remove(file_name); } + else + { + m_context->_docx->ImagesList.push_back(ImageFileStructure(metaBlip->oMetaFile.m_sExtension, + newData, newDataSize, oBlipEntry->btWin32)); + } } }break; case Global::msoblipJPEG: @@ -695,7 +703,7 @@ namespace DocFileFormat return std::wstring(L".wmf"); case Global::msoblipPICT: - return std::wstring(L".pcz"); + return std::wstring(L".pct"); default: return std::wstring(L".png");