Commit 1e0c4179 authored by Elen.Subbotina's avatar Elen.Subbotina Committed by Alexander Trofimov

PPTFormatReader - fix по результатам тестирвоания

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@65299 954022d7-b5bf-4e40-9824-e11837661b57
parent 0443bad1
#pragma once
#include "../../../Common/DocxFormat/Source/SystemUtility/FileSystem/Directory.h"
#include "../Records/Drawing/ArtBlip.h"
#include "PPTDocumentInfo.h"
......@@ -156,262 +157,17 @@ protected:
while (TRUE)
{
CMetaFileBuffer oMetaFile;
CString sExt = L".jpg";
if (oHeader.ReadFromStream(pStream) == false )
{
break;
}
int pos = pStream->tell();
if ((oHeader.RecVersion != PSFLAG_CONTAINER) && ((oHeader.RecVersion & 0x0F) != 0x0F))
{
int lOffset = 0;
switch (oHeader.RecType)
{
case RECORD_TYPE_ESCHER_BLIP_EMF:
{
if (0x03D4 == oHeader.RecInstance)
{
lOffset = 16;
}
else if (0x03D5 == oHeader.RecInstance)
{
lOffset = 32;
}
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".emf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::ENHMETAHEADER3 oEmfHeader;
oMetaHeader.ToEMFHeader(&oEmfHeader);
//LONG lLenHeader = 88;
//BYTE* pMetaHeader = new BYTE[lLenHeader];
//memcpy(pMetaHeader, (void*)(&oEmfHeader), lLenHeader);
//oMetaFile.SetHeader(pMetaHeader, lLenHeader);
oMetaFile.SetHeader(NULL, 0);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave,
oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression)
{
RELEASEARRAYOBJECTS(pData);
}
break;
}
case RECORD_TYPE_ESCHER_BLIP_WMF:
{
if (0x0216 == oHeader.RecInstance)
{
lOffset = 16;
}
else if (0x0217 == oHeader.RecInstance)
{
lOffset = 32;
}
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".wmf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::WmfPlaceableFileHeader oWmfHeader;
oMetaHeader.ToWMFHeader(&oWmfHeader);
LONG lLenHeader = 22;
BYTE* pMetaHeader = new BYTE[lLenHeader];
memcpy(pMetaHeader, (void*)(&oWmfHeader), lLenHeader);
oMetaFile.SetHeader(pMetaHeader, lLenHeader);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave,
oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression)
{
RELEASEARRAYOBJECTS(pData);
}
break;
}
case RECORD_TYPE_ESCHER_BLIP_PICT:
{
if (0x0542 == oHeader.RecInstance)
{
lOffset = 16;
}
else if (0x0543 == oHeader.RecInstance)
{
lOffset = 32;
}
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".wmf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::WmfPlaceableFileHeader oWmfHeader;
oMetaHeader.ToWMFHeader(&oWmfHeader);
LONG lLenHeader = 22;
BYTE* pMetaHeader = new BYTE[lLenHeader];
memcpy(pMetaHeader, (void*)(&oWmfHeader), lLenHeader);
oMetaFile.SetHeader(pMetaHeader, lLenHeader);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave,
oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression)
{
RELEASEARRAYOBJECTS(pData);
}
break;
}
case RECORD_TYPE_ESCHER_BLIP_JPEG:
{
if (0x046A == oHeader.RecInstance || 0x06E2 == oHeader.RecInstance)
{
lOffset = 17;
}
else if (0x046B == oHeader.RecInstance || 0x06E3 == oHeader.RecInstance)
{
lOffset = 33;
}
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".jpg");
break;
}
case RECORD_TYPE_ESCHER_BLIP_PNG:
{
if (0x06E0 == oHeader.RecInstance)
{
lOffset = 17;
}
else if (0x06E1 == oHeader.RecInstance)
{
lOffset = 33;
}
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".png");
break;
}
case RECORD_TYPE_ESCHER_BLIP_DIB:
{
if (0x07A8 == oHeader.RecInstance)
{
lOffset = 17;
}
else if (0x07A9 == oHeader.RecInstance)
{
lOffset = 33;
}
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".bmp");
break;
}
case RECORD_TYPE_ESCHER_BLIP_TIFF:
{
if (0x06E4 == oHeader.RecInstance)
{
lOffset = 17;
}
else if (0x06E5 == oHeader.RecInstance)
{
lOffset = 33;
}
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".tif");
break;
}
default:
{
break;
}
};
if (oMetaFile.m_bIsValid)
{
CString strFile = CString(L"Image ") + CDirectory::ToString(++m_lImagesCount) + oMetaFile.m_sExtension;
CFile fileMeta;
HRESULT hr = fileMeta.CreateFile(m_strMemoryForder + FILE_SEPARATOR_STR + strFile);
if (hr == S_OK)
{
oMetaFile.ToFile(&fileMeta);
fileMeta.CloseFile();
}
m_oDocumentInfo.m_mapStoreImageFile[m_lImagesCount] = string2std_string(strFile);
continue;
}
BYTE* pImage = new BYTE[oHeader.RecLen - lOffset];
CRecordOfficeArtBlip art_blip;
art_blip.m_strMemoryForder = m_strMemoryForder;
art_blip.m_oDocumentInfo = &m_oDocumentInfo;
pStream->read(pImage, oHeader.RecLen - lOffset);
art_blip.ReadFromStream(oHeader, pStream);
CString strFile = CString(L"Image ") + CDirectory::ToString(++m_lImagesCount) + sExt;
CFile fileImage;
HRESULT hr = fileImage.CreateFile(m_strMemoryForder+ FILE_SEPARATOR_STR + strFile);
if (hr == S_OK)
{
if (RECORD_TYPE_ESCHER_BLIP_DIB == oHeader.RecType)
{
WORD vtType = 0x4D42;
fileImage.WriteFile((void*)&vtType, 2);
DWORD dwLen = oHeader.RecLen - lOffset;
fileImage.WriteFile((void*)&dwLen, 4);
DWORD dwRes = 0;
fileImage.WriteFile((void*)&dwRes, 4);
DWORD dwOffset = 2;
fileImage.WriteFile((void*)&dwOffset, 4);
}
fileImage.WriteFile((void*)pImage, oHeader.RecLen - lOffset);
fileImage.CloseFile();
}
m_oDocumentInfo.m_mapStoreImageFile[pos-8/*m_lImagesCount*/] = string2std_string(strFile);
delete[] pImage;
}
else
{
// ...
m_lImagesCount++;
continue;
}
}
return TRUE;
}
......
......@@ -98,15 +98,20 @@ public:
{
if (NULL == m_parEmptyPictures)
return -1;
if ( m_parEmptyPictures->size() < 1 )
return -1;
lIndex -= 1;
if (lIndex < 0) lIndex = 0;
//int lResult = 0;
//int nCount = m_parEmptyPictures->size();
// for (int nIndex = 0; nIndex < (std::min)(lIndex, nCount); ++nIndex)
//{
// if ((*m_parEmptyPictures)[nIndex] < 0)
// ++lResult;
//}
return m_parEmptyPictures->at(lIndex - 1);
if(lIndex >= 0 && lIndex < m_parEmptyPictures->size())
{
return m_parEmptyPictures->at(lIndex);
}
else
{
return m_parEmptyPictures->at(0);//???
}
}
};
#include "ArtBlip.h"
#include "../../../Common/DocxFormat/Source/SystemUtility/FileSystem/Directory.h"
#include "../../Reader/PPTDocumentInfo.h"
void CRecordOfficeArtBlip::ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream)
{
CMetaFileBuffer oMetaFile;
CString sExt = L".jpg";
int pos = pStream->tell();
if ((oHeader.RecVersion != PSFLAG_CONTAINER) && ((oHeader.RecVersion & 0x0F) != 0x0F))
{
int lOffset = 0;
switch (oHeader.RecType)
{
case RECORD_TYPE_ESCHER_BLIP_EMF:
{
if (0x03D4 == oHeader.RecInstance) lOffset = 16;
else if (0x03D5 == oHeader.RecInstance) lOffset = 32;
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".emf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::ENHMETAHEADER3 oEmfHeader;
oMetaHeader.ToEMFHeader(&oEmfHeader);
oMetaFile.SetHeader(NULL, 0);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave, oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression) RELEASEARRAYOBJECTS(pData);
}break;
case RECORD_TYPE_ESCHER_BLIP_WMF:
{
if (0x0216 == oHeader.RecInstance) lOffset = 16;
else if (0x0217 == oHeader.RecInstance) lOffset = 32;
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".wmf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::WmfPlaceableFileHeader oWmfHeader;
oMetaHeader.ToWMFHeader(&oWmfHeader);
LONG lLenHeader = 22;
BYTE* pMetaHeader = new BYTE[lLenHeader];
memcpy(pMetaHeader, (void*)(&oWmfHeader), lLenHeader);
oMetaFile.SetHeader(pMetaHeader, lLenHeader);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave,
oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression) RELEASEARRAYOBJECTS(pData);
}break;
case RECORD_TYPE_ESCHER_BLIP_PICT:
{
if (0x0542 == oHeader.RecInstance) lOffset = 16;
else if (0x0543 == oHeader.RecInstance) lOffset = 32;
StreamUtils::StreamSkip(lOffset, pStream);
lOffset += 34;
oMetaFile.m_bIsValid = TRUE;
oMetaFile.m_sExtension = L".wmf";
CMetaHeader oMetaHeader;
oMetaHeader.FromStream(pStream);
Gdiplus::WmfPlaceableFileHeader oWmfHeader;
oMetaHeader.ToWMFHeader(&oWmfHeader);
LONG lLenHeader = 22;
BYTE* pMetaHeader = new BYTE[lLenHeader];
memcpy(pMetaHeader, (void*)(&oWmfHeader), lLenHeader);
oMetaFile.SetHeader(pMetaHeader, lLenHeader);
BYTE* pData = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pData, oHeader.RecLen - lOffset);
oMetaFile.SetData(pData, oMetaHeader.cbSave, oMetaHeader.cbSize, 0 == oMetaHeader.compression);
if (0 == oMetaHeader.compression) RELEASEARRAYOBJECTS(pData);
}break;
case RECORD_TYPE_ESCHER_BLIP_JPEG:
{
if (0x046A == oHeader.RecInstance || 0x06E2 == oHeader.RecInstance) lOffset = 17;
else if (0x046B == oHeader.RecInstance || 0x06E3 == oHeader.RecInstance) lOffset = 33;
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".jpg");
break;
}
case RECORD_TYPE_ESCHER_BLIP_PNG:
{
if (0x06E0 == oHeader.RecInstance) lOffset = 17;
else if (0x06E1 == oHeader.RecInstance) lOffset = 33;
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".png");
break;
}
case RECORD_TYPE_ESCHER_BLIP_DIB:
{
if (0x07A8 == oHeader.RecInstance) lOffset = 17;
else if (0x07A9 == oHeader.RecInstance) lOffset = 33;
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".bmp");
break;
}
case RECORD_TYPE_ESCHER_BLIP_TIFF:
{
if (0x06E4 == oHeader.RecInstance) lOffset = 17;
else if (0x06E5 == oHeader.RecInstance) lOffset = 33;
StreamUtils::StreamSkip(lOffset, pStream);
sExt = _T(".tif");
break;
}
default:
{
break;
}
}
int nImagesCount = 0;
if (m_oDocumentInfo)
{
nImagesCount = m_oDocumentInfo->m_mapStoreImageFile.size();
}
//else nImagesCount = generate uniq name
if (oMetaFile.m_bIsValid)
{
CString strFile = CString(L"Image ") + CDirectory::ToString(nImagesCount + 1) + oMetaFile.m_sExtension;
CFile fileMeta;
HRESULT hr = fileMeta.CreateFile(m_strMemoryForder + FILE_SEPARATOR_STR + strFile);
if (hr == S_OK)
{
oMetaFile.ToFile(&fileMeta);
fileMeta.CloseFile();
}
m_sFileName = string2std_string(strFile);
}
else
{
BYTE* pImage = new BYTE[oHeader.RecLen - lOffset];
pStream->read(pImage, oHeader.RecLen - lOffset);
CString strFile = CString(L"Image ") + CDirectory::ToString(nImagesCount + 1) + sExt;
CFile fileImage;
HRESULT hr = fileImage.CreateFile(m_strMemoryForder + FILE_SEPARATOR_STR + strFile);
if (hr == S_OK)
{
if (RECORD_TYPE_ESCHER_BLIP_DIB == oHeader.RecType)
{
WORD vtType = 0x4D42;
fileImage.WriteFile((void*)&vtType, 2);
DWORD dwLen = oHeader.RecLen - lOffset;
fileImage.WriteFile((void*)&dwLen, 4);
DWORD dwRes = 0;
fileImage.WriteFile((void*)&dwRes, 4);
DWORD dwOffset = 2;
fileImage.WriteFile((void*)&dwOffset, 4);
}
fileImage.WriteFile((void*)pImage, oHeader.RecLen - lOffset);
fileImage.CloseFile();
}
if (pImage)delete[] pImage;
pImage = NULL;
m_sFileName = string2std_string(strFile);
}
int dwOffset = pos - 8;
if (m_oDocumentInfo)
{
m_oDocumentInfo->m_mapStoreImageFile[dwOffset ] = m_sFileName;
}
}
}
#pragma once
#include "../../Reader/Records.h"
class CPPTDocumentInfo;
class CRecordOfficeArtBlip : public CUnknownRecord
{
public:
CPPTDocumentInfo * m_oDocumentInfo;
std::wstring m_sFileName;
CString m_strMemoryForder;
CRecordOfficeArtBlip()
{
m_oDocumentInfo = NULL;
}
~CRecordOfficeArtBlip()
{
}
virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream);
virtual CString ToString()
{
return CUnknownRecord::ToString();
}
};
class CRecordBitmapBlip : public CUnknownRecord
{
BYTE m_pRgbUid[16];
......
......@@ -616,18 +616,25 @@ public:
}break;
case NSOfficeDrawing::fillBlip:
{
int dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue);
int nIndex = pParentShape->m_oBrush.TexturePath.rfind(FILE_SEPARATOR_CHAR);
int dwOffset = 0 ;
if (pProperty->m_bComplex)
{
//inline
dwOffset = -1;
}
else
{
dwOffset = pInfo->GetIndexPicture(pProperty->m_lValue);
}
int nLen = pParentShape->m_oBrush.TexturePath.length() - 1;
int nIndex = pParentShape->m_oBrush.TexturePath.rfind(FILE_SEPARATOR_CHAR);
if (nLen != nIndex)
{
pParentShape->m_oBrush.TexturePath.erase(nIndex + 1, nLen - nIndex);
}
//pElemProps->SetAt(CElementProperty::epBrushTxPath, pParentShape->m_oBrush.TexturePath + strVal + L".jpg");
}
pParentShape->m_oBrush.TexturePath = pParentShape->m_oBrush.TexturePath + pInfo->GetFileNamePicture(dwOffset);
if (pParentShape->m_oBrush.Type == c_BrushTypePattern)
{
int rgbColor1 = 0;
......
......@@ -10,7 +10,6 @@
// drawing records
#include "Drawing/ChildAnchor.h"
#include "Drawing/BitmapBlip.h"
#include "Drawing/BlipStoreContainer.h"
#include "Drawing/BlipStoreEntry.h"
#include "Drawing/ClientAnchor.h"
......
......@@ -842,7 +842,11 @@
Name="Drawing"
>
<File
RelativePath="..\Records\Drawing\BitmapBlip.h"
RelativePath="..\Records\Drawing\ArtBlip.cpp"
>
</File>
<File
RelativePath="..\Records\Drawing\ArtBlip.h"
>
</File>
<File
......@@ -954,6 +958,10 @@
RelativePath="..\..\..\ASCPresentationEditor\OfficeDrawing\Elements.h"
>
</File>
<File
RelativePath="..\..\..\ASCPresentationEditor\OfficeDrawing\Shapes\BaseShape\PPTShape\ElementSettings.h"
>
</File>
<File
RelativePath="..\..\..\ASCPresentationEditor\PPTXWriter\ImageManager.h"
>
......
#pragma once
#include "../../../ASCOfficePPTFile/PPTFormatLib/Records/Drawing/ArtBlip.h"
#include "../../../../../Common/DocxFormat/Source/SystemUtility/File.h"
#include "Enums.h"
......@@ -47,7 +50,7 @@ public:
void ComplexFromStream(POLE::Stream* pStream)
{
if (m_bComplex && 0 != m_lValue)
if (m_bComplex && m_lValue > 0)
{
if (NSOfficeDrawing::dgmConstrainBounds == m_ePID ||
NSOfficeDrawing::fillShadeColors == m_ePID ||
......@@ -86,20 +89,49 @@ public:
m_lValue = dwSize;
}
if (0 == m_lValue)
{
return;
}
RELEASEARRAYOBJECTS(m_pOptions);
m_pOptions = new BYTE[m_lValue];
ULONG lReadBytes = 0;
lReadBytes = pStream->read(m_pOptions, m_lValue);
if (lReadBytes != m_lValue)
switch( m_ePID )
{
return;
case NSOfficeDrawing::fillBlip:
{
SRecordHeader oHeader;
if (oHeader.ReadFromStream(pStream) == false )
{
return;
}
switch (oHeader.RecType)
{
case RECORD_TYPE_ESCHER_BLIP_EMF:
case RECORD_TYPE_ESCHER_BLIP_WMF:
case RECORD_TYPE_ESCHER_BLIP_PICT:
case RECORD_TYPE_ESCHER_BLIP_JPEG:
case RECORD_TYPE_ESCHER_BLIP_PNG:
case RECORD_TYPE_ESCHER_BLIP_DIB:
case RECORD_TYPE_ESCHER_BLIP_TIFF:
{
CRecordOfficeArtBlip art_blip;
art_blip.ReadFromStream(oHeader, pStream);
}
}
}break;
default:
{
if (0 == m_lValue)
{
return;
}
RELEASEARRAYOBJECTS(m_pOptions);
m_pOptions = new BYTE[m_lValue];
ULONG lReadBytes = 0;
lReadBytes = pStream->read(m_pOptions, m_lValue);
if (lReadBytes != m_lValue)
{
return;
}
}
}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment