diff options
Diffstat (limited to 'core/fxcodec/codec/ccodec_progressivedecoder.cpp')
-rw-r--r-- | core/fxcodec/codec/ccodec_progressivedecoder.cpp | 114 |
1 files changed, 44 insertions, 70 deletions
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.cpp b/core/fxcodec/codec/ccodec_progressivedecoder.cpp index 280b647ebd..f7c9f6544d 100644 --- a/core/fxcodec/codec/ccodec_progressivedecoder.cpp +++ b/core/fxcodec/codec/ccodec_progressivedecoder.cpp @@ -708,8 +708,8 @@ void CCodec_ProgressiveDecoder::ResampleVertBT( } } -bool CCodec_ProgressiveDecoder::BmpDetectImageType(CFX_DIBAttribute* pAttribute, - uint32_t size) { +bool CCodec_ProgressiveDecoder::BmpDetectImageTypeInBuffer( + CFX_DIBAttribute* pAttribute) { CCodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); if (!pBmpModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; @@ -718,18 +718,8 @@ bool CCodec_ProgressiveDecoder::BmpDetectImageType(CFX_DIBAttribute* pAttribute, std::unique_ptr<CCodec_BmpModule::Context> pBmpContext = pBmpModule->Start(this); - if (!pBmpContext) { - m_status = FXCODEC_STATUS_ERR_MEMORY; - return false; - } + pBmpModule->Input(pBmpContext.get(), {m_pSrcBuf.get(), m_SrcSize}); - if (!m_pFile->ReadBlock(m_pSrcBuf.get(), 0, size)) { - m_status = FXCODEC_STATUS_ERR_READ; - return false; - } - - m_offSet += size; - pBmpModule->Input(pBmpContext.get(), {m_pSrcBuf.get(), size}); std::vector<uint32_t> palette; int32_t readResult = pBmpModule->ReadHeader( pBmpContext.get(), &m_SrcWidth, &m_SrcHeight, &m_BmpIsTopBottom, @@ -936,21 +926,15 @@ bool CCodec_ProgressiveDecoder::GifReadMoreData(CCodec_GifModule* pGifModule, return true; } -bool CCodec_ProgressiveDecoder::GifDetectImageType(CFX_DIBAttribute* pAttribute, - uint32_t size) { +bool CCodec_ProgressiveDecoder::GifDetectImageTypeInBuffer( + CFX_DIBAttribute* pAttribute) { CCodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); if (!pGifModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } m_pGifContext = pGifModule->Start(this); - bool bResult = m_pFile->ReadBlock(m_pSrcBuf.get(), 0, size); - if (!bResult) { - m_status = FXCODEC_STATUS_ERR_READ; - return false; - } - m_offSet += size; - pGifModule->Input(m_pGifContext.get(), {m_pSrcBuf.get(), size}); + pGifModule->Input(m_pGifContext.get(), {m_pSrcBuf.get(), m_SrcSize}); m_SrcComponents = 1; CFX_GifDecodeStatus readResult = pGifModule->ReadHeader( m_pGifContext.get(), &m_SrcWidth, &m_SrcHeight, &m_GifPltNumber, @@ -1158,21 +1142,15 @@ bool CCodec_ProgressiveDecoder::JpegReadMoreData(CCodec_JpegModule* pJpegModule, return true; } -bool CCodec_ProgressiveDecoder::JpegDetectImageType( - CFX_DIBAttribute* pAttribute, - uint32_t size) { +bool CCodec_ProgressiveDecoder::JpegDetectImageTypeInBuffer( + CFX_DIBAttribute* pAttribute) { CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule(); m_pJpegContext = pJpegModule->Start(); if (!m_pJpegContext) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } - if (!m_pFile->ReadBlock(m_pSrcBuf.get(), 0, size)) { - m_status = FXCODEC_STATUS_ERR_READ; - return false; - } - m_offSet += size; - pJpegModule->Input(m_pJpegContext.get(), m_pSrcBuf.get(), size); + pJpegModule->Input(m_pJpegContext.get(), m_pSrcBuf.get(), m_SrcSize); // Setting jump marker before calling ReadHeader, since a longjmp to // the marker indicates a fatal error. if (setjmp(*m_pJpegContext->GetJumpMark()) == -1) { @@ -1370,8 +1348,8 @@ void CCodec_ProgressiveDecoder::PngOneOneMapResampleHorz( } } -bool CCodec_ProgressiveDecoder::PngDetectImageType(CFX_DIBAttribute* pAttribute, - uint32_t size) { +bool CCodec_ProgressiveDecoder::PngDetectImageTypeInBuffer( + CFX_DIBAttribute* pAttribute) { CCodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); if (!pPngModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; @@ -1382,15 +1360,8 @@ bool CCodec_ProgressiveDecoder::PngDetectImageType(CFX_DIBAttribute* pAttribute, m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } - bool bResult = m_pFile->ReadBlock(m_pSrcBuf.get(), 0, size); - if (!bResult) { - m_status = FXCODEC_STATUS_ERR_READ; - return false; - } - - m_offSet += size; - bResult = - pPngModule->Input(m_pPngContext.get(), m_pSrcBuf.get(), size, pAttribute); + bool bResult = pPngModule->Input(m_pPngContext.get(), m_pSrcBuf.get(), + m_SrcSize, pAttribute); while (bResult) { uint32_t remain_size = static_cast<uint32_t>(m_pFile->GetSize()) - m_offSet; uint32_t input_size = @@ -1414,7 +1385,6 @@ bool CCodec_ProgressiveDecoder::PngDetectImageType(CFX_DIBAttribute* pAttribute, bResult = pPngModule->Input(m_pPngContext.get(), m_pSrcBuf.get(), input_size, pAttribute); } - ASSERT(!bResult); m_pPngContext.reset(); if (m_SrcPassNumber == 0) { m_status = FXCODEC_STATUS_ERR_FORMAT; @@ -1515,9 +1485,8 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::PngContinueDecode() { #endif // PDF_ENABLE_XFA_PNG #ifdef PDF_ENABLE_XFA_TIFF -bool CCodec_ProgressiveDecoder::TiffDetectImageType( - CFX_DIBAttribute* pAttribute, - uint32_t size) { +bool CCodec_ProgressiveDecoder::TiffDetectImageTypeFromFile( + CFX_DIBAttribute* pAttribute) { CCodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); if (!pTiffModule) { m_status = FXCODEC_STATUS_ERR_FORMAT; @@ -1684,37 +1653,42 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::TiffContinueDecode() { bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, CFX_DIBAttribute* pAttribute) { +#ifdef PDF_ENABLE_XFA_TIFF + if (imageType == FXCODEC_IMAGE_TIFF) + return TiffDetectImageTypeFromFile(pAttribute); +#endif // PDF_ENABLE_XFA_TIFF + + size_t size = std::min<size_t>(m_pFile->GetSize(), FXCODEC_BLOCK_SIZE); + m_SrcSize = static_cast<uint32_t>(size); + m_pSrcBuf.reset(FX_Alloc(uint8_t, m_SrcSize)); + m_offSet = 0; - uint32_t size = (uint32_t)m_pFile->GetSize(); - if (size > FXCODEC_BLOCK_SIZE) { - size = FXCODEC_BLOCK_SIZE; - } - m_pSrcBuf.reset(FX_Alloc(uint8_t, size)); - memset(m_pSrcBuf.get(), 0, size); - m_SrcSize = size; - switch (imageType) { - case FXCODEC_IMAGE_JPG: - return JpegDetectImageType(pAttribute, size); + if (!m_pFile->ReadBlock(m_pSrcBuf.get(), m_offSet, m_SrcSize)) { + m_status = FXCODEC_STATUS_ERR_READ; + return false; + } + m_offSet += m_SrcSize; + + if (imageType == FXCODEC_IMAGE_JPG) + return JpegDetectImageTypeInBuffer(pAttribute); + #ifdef PDF_ENABLE_XFA_BMP - case FXCODEC_IMAGE_BMP: - return BmpDetectImageType(pAttribute, size); + if (imageType == FXCODEC_IMAGE_BMP) + return BmpDetectImageTypeInBuffer(pAttribute); #endif // PDF_ENABLE_XFA_BMP + #ifdef PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_GIF: - return GifDetectImageType(pAttribute, size); + if (imageType == FXCODEC_IMAGE_GIF) + return GifDetectImageTypeInBuffer(pAttribute); #endif // PDF_ENABLE_XFA_GIF + #ifdef PDF_ENABLE_XFA_PNG - case FXCODEC_IMAGE_PNG: - return PngDetectImageType(pAttribute, size); + if (imageType == FXCODEC_IMAGE_PNG) + return PngDetectImageTypeInBuffer(pAttribute); #endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_TIFF - case FXCODEC_IMAGE_TIFF: - return TiffDetectImageType(pAttribute, size); -#endif // PDF_ENABLE_XFA_TIFF - default: - m_status = FXCODEC_STATUS_ERR_FORMAT; - return false; - } + + m_status = FXCODEC_STATUS_ERR_FORMAT; + return false; } FXCODEC_STATUS CCodec_ProgressiveDecoder::LoadImageInfo( |