Fix ReadImage

This commit is contained in:
Svetlana Kulikova
2024-08-06 18:59:28 +03:00
parent e8c7a4f670
commit c7d0f27f6b
2 changed files with 24 additions and 20 deletions

View File

@ -4125,7 +4125,7 @@ namespace PdfReader
return isMask; return isMask;
} }
bool RendererOutputDev::ReadDCT(Aggplus::CImage* pImageRes, Object *pRef, Stream *pStream) bool RendererOutputDev::ReadImage(Aggplus::CImage* pImageRes, Object *pRef, Stream *pStream)
{ {
Object oIm; Object oIm;
int nLength = 0; int nLength = 0;
@ -4140,36 +4140,40 @@ namespace PdfReader
if (!nLength) if (!nLength)
return false; return false;
BYTE* pBuffer = new BYTE[nLength];
StreamKind nSKB = pStream->getBaseStream()->getKind(); StreamKind nSKB = pStream->getBaseStream()->getKind();
Stream* pStrIn = NULL;
if (nSKB == strFile) if (nSKB == strFile)
pStrIn = (FileStream*)(pStream->getBaseStream());
else if (nSKB == strWeird)
pStrIn = dynamic_cast<MemStream*>(pStream->getBaseStream());
BYTE* pBuffer = new BYTE[nLength];
if (!pStrIn)
{ {
FileStream* pFS = (FileStream*)(pStream->getBaseStream()); RELEASEARRAYOBJECTS(pBuffer);
int nReadData = pFS->getBlock((char*)pBuffer, nLength); return false;
if (nReadData != nLength) }
unsigned int nFileType = 0;
StreamKind nSK = pStream->getKind();
if (nSK == strDCT)
{
nFileType = _CXIMAGE_FORMAT_JPG;
if (pStrIn->getBlock((char*)pBuffer, nLength) != nLength)
{ {
RELEASEARRAYOBJECTS(pBuffer); RELEASEARRAYOBJECTS(pBuffer);
return false; return false;
} }
} }
else if (nSKB == strWeird) else if (nSK == strFlate)
{ {
MemStream* pMemory = dynamic_cast<MemStream*>(pStream->getBaseStream()); if (pStrIn->getBlock((char*)pBuffer, nLength) != nLength)
if (pMemory)
{ {
int nReadData = pMemory->getBlock((char*)pBuffer, nLength); RELEASEARRAYOBJECTS(pBuffer);
if (nReadData != nLength) return false;
{
RELEASEARRAYOBJECTS(pBuffer);
return false;
}
} }
} }
unsigned int nFileType = 0;
if (pStream->getKind() == strDCT)
nFileType = _CXIMAGE_FORMAT_JPG;
CBgraFrame oFrame; CBgraFrame oFrame;
if (oFrame.Decode(pBuffer, nLength, nFileType)) if (oFrame.Decode(pBuffer, nLength, nFileType))
{ {
@ -4190,7 +4194,7 @@ namespace PdfReader
StreamKind nSK = pStream->getKind(); StreamKind nSK = pStream->getKind();
// Чтение jpeg через cximage происходит быстрее чем через xpdf на ~40% // Чтение jpeg через cximage происходит быстрее чем через xpdf на ~40%
if (nSK != strDCT || !ReadDCT(&oImage, pRef, pStream)) if ((nSK != strDCT && nSK != strFlate) || !ReadImage(&oImage, pRef, pStream))
{ {
int nBufferSize = 4 * nWidth * nHeight; int nBufferSize = 4 * nWidth * nHeight;
if (nBufferSize < 1) if (nBufferSize < 1)

View File

@ -222,7 +222,7 @@ namespace PdfReader
virtual GBool beginMCOShapes(GfxState *state, GString *s, Object *ref) override; virtual GBool beginMCOShapes(GfxState *state, GString *s, Object *ref) override;
virtual void endMarkedContent(GfxState *state) override; virtual void endMarkedContent(GfxState *state) override;
//----- Вывод картинок //----- Вывод картинок
bool ReadDCT(Aggplus::CImage* pImageRes, Object *pRef, Stream *pStream); bool ReadImage(Aggplus::CImage* pImageRes, Object *pRef, Stream *pStream);
virtual void drawImageMask(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GBool bInvert, GBool bInlineImage, GBool interpolate) override; virtual void drawImageMask(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GBool bInvert, GBool bInlineImage, GBool interpolate) override;
virtual void setSoftMaskFromImageMask(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GBool bInvert, GBool bInlineImage, GBool interpolate) override; virtual void setSoftMaskFromImageMask(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GBool bInvert, GBool bInlineImage, GBool interpolate) override;
virtual void drawImage(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GfxImageColorMap *pColorMap, int *pMaskColors, GBool bInlineImg, GBool interpolate) override; virtual void drawImage(GfxState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GfxImageColorMap *pColorMap, int *pMaskColors, GBool bInlineImg, GBool interpolate) override;