diff options
Diffstat (limited to 'core/fxcodec/codec/fx_codec_progress.cpp')
-rw-r--r-- | core/fxcodec/codec/fx_codec_progress.cpp | 385 |
1 files changed, 158 insertions, 227 deletions
diff --git a/core/fxcodec/codec/fx_codec_progress.cpp b/core/fxcodec/codec/fx_codec_progress.cpp index e4996c887a..1f2f50c29e 100644 --- a/core/fxcodec/codec/fx_codec_progress.cpp +++ b/core/fxcodec/codec/fx_codec_progress.cpp @@ -12,18 +12,17 @@ #include "core/fxcodec/fx_codec.h" #include "core/fxge/fx_dib.h" #include "third_party/base/numerics/safe_math.h" +#include "third_party/base/ptr_util.h" #define FXCODEC_BLOCK_SIZE 4096 namespace { -#ifdef PDF_ENABLE_XFA_PNG #if _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ const double kPngGamma = 1.7; #else // _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ const double kPngGamma = 2.2; #endif // _FX_OS_ == _FX_MACOSX_ || _FX_OS_ == _FX_IOS_ -#endif // PDF_ENABLE_XFA_PNG void RGB2BGR(uint8_t* buffer, int width = 1) { if (buffer && width > 0) { @@ -301,22 +300,14 @@ CCodec_ProgressiveDecoder::~CCodec_ProgressiveDecoder() { m_pFile = nullptr; if (m_pJpegContext) m_pCodecMgr->GetJpegModule()->Finish(m_pJpegContext); -#ifdef PDF_ENABLE_XFA_BMP if (m_pBmpContext) m_pCodecMgr->GetBmpModule()->Finish(m_pBmpContext); -#endif // PDF_ENABLE_XFA_BMP -#ifdef PDF_ENABLE_XFA_GIF if (m_pGifContext) m_pCodecMgr->GetGifModule()->Finish(m_pGifContext); -#endif // PDF_ENABLE_XFA_GIF -#ifdef PDF_ENABLE_XFA_PNG if (m_pPngContext) m_pCodecMgr->GetPngModule()->Finish(m_pPngContext); -#endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_TIFF if (m_pTiffContext) m_pCodecMgr->GetTiffModule()->DestroyDecoder(m_pTiffContext); -#endif // PDF_ENABLE_XFA_TIFF FX_Free(m_pSrcBuf); FX_Free(m_pDecodeBuf); FX_Free(m_pSrcPalette); @@ -359,42 +350,39 @@ bool CCodec_ProgressiveDecoder::JpegReadMoreData(CCodec_JpegModule* pJpegModule, return true; } -#ifdef PDF_ENABLE_XFA_PNG -bool CCodec_ProgressiveDecoder::PngReadHeaderFunc(void* pModule, - int width, - int height, - int bpc, - int pass, - int* color_type, - double* gamma) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - if (!pCodec->m_pDeviceBitmap) { - pCodec->m_SrcWidth = width; - pCodec->m_SrcHeight = height; - pCodec->m_SrcBPC = bpc; - pCodec->m_SrcPassNumber = pass; +bool CCodec_ProgressiveDecoder::PngReadHeader(int width, + int height, + int bpc, + int pass, + int* color_type, + double* gamma) { + if (!m_pDeviceBitmap) { + m_SrcWidth = width; + m_SrcHeight = height; + m_SrcBPC = bpc; + m_SrcPassNumber = pass; switch (*color_type) { case 0: - pCodec->m_SrcComponents = 1; + m_SrcComponents = 1; break; case 4: - pCodec->m_SrcComponents = 2; + m_SrcComponents = 2; break; case 2: - pCodec->m_SrcComponents = 3; + m_SrcComponents = 3; break; case 3: case 6: - pCodec->m_SrcComponents = 4; + m_SrcComponents = 4; break; default: - pCodec->m_SrcComponents = 0; + m_SrcComponents = 0; break; } - pCodec->m_clipBox = FX_RECT(0, 0, width, height); + m_clipBox = FX_RECT(0, 0, width, height); return false; } - FXDIB_Format format = pCodec->m_pDeviceBitmap->GetFormat(); + FXDIB_Format format = m_pDeviceBitmap->GetFormat(); switch (format) { case FXDIB_1bppMask: case FXDIB_1bppRgb: @@ -419,32 +407,26 @@ bool CCodec_ProgressiveDecoder::PngReadHeaderFunc(void* pModule, return true; } -bool CCodec_ProgressiveDecoder::PngAskScanlineBufFunc(void* pModule, - int line, - uint8_t*& src_buf) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - CFX_DIBitmap* pDIBitmap = pCodec->m_pDeviceBitmap; +bool CCodec_ProgressiveDecoder::PngAskScanlineBuf(int line, uint8_t*& src_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; if (!pDIBitmap) { ASSERT(false); return false; } - if (line >= pCodec->m_clipBox.top && line < pCodec->m_clipBox.bottom) { - double scale_y = - (double)pCodec->m_sizeY / (double)pCodec->m_clipBox.Height(); - int32_t row = - (int32_t)((line - pCodec->m_clipBox.top) * scale_y) + pCodec->m_startY; + if (line >= m_clipBox.top && line < m_clipBox.bottom) { + double scale_y = (double)m_sizeY / (double)m_clipBox.Height(); + int32_t row = (int32_t)((line - m_clipBox.top) * scale_y) + m_startY; uint8_t* src_scan = (uint8_t*)pDIBitmap->GetScanline(row); - uint8_t* des_scan = pCodec->m_pDecodeBuf; - src_buf = pCodec->m_pDecodeBuf; + uint8_t* des_scan = m_pDecodeBuf; + src_buf = m_pDecodeBuf; int32_t src_Bpp = pDIBitmap->GetBPP() >> 3; - int32_t des_Bpp = (pCodec->m_SrcFormat & 0xff) >> 3; - int32_t src_left = pCodec->m_startX; - int32_t des_left = pCodec->m_clipBox.left; + int32_t des_Bpp = (m_SrcFormat & 0xff) >> 3; + int32_t src_left = m_startX; + int32_t des_left = m_clipBox.left; src_scan += src_left * src_Bpp; des_scan += des_left * des_Bpp; - for (int32_t src_col = 0; src_col < pCodec->m_sizeX; src_col++) { - PixelWeight* pPixelWeights = - pCodec->m_WeightHorzOO.GetPixelWeight(src_col); + for (int32_t src_col = 0; src_col < m_sizeX; src_col++) { + PixelWeight* pPixelWeights = m_WeightHorzOO.GetPixelWeight(src_col); if (pPixelWeights->m_SrcStart != pPixelWeights->m_SrcEnd) { continue; } @@ -566,17 +548,15 @@ void CCodec_ProgressiveDecoder::PngOneOneMapResampleHorz( } } -void CCodec_ProgressiveDecoder::PngFillScanlineBufCompletedFunc(void* pModule, - int pass, - int line) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - CFX_DIBitmap* pDIBitmap = pCodec->m_pDeviceBitmap; +void CCodec_ProgressiveDecoder::PngFillScanlineBufCompleted(int pass, + int line) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; ASSERT(pDIBitmap); - int src_top = pCodec->m_clipBox.top; - int src_bottom = pCodec->m_clipBox.bottom; - int des_top = pCodec->m_startY; - int src_hei = pCodec->m_clipBox.Height(); - int des_hei = pCodec->m_sizeY; + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; if (line >= src_top && line < src_bottom) { double scale_y = (double)des_hei / (double)src_hei; int src_row = line - src_top; @@ -584,21 +564,18 @@ void CCodec_ProgressiveDecoder::PngFillScanlineBufCompletedFunc(void* pModule, if (des_row >= des_top + des_hei) { return; } - pCodec->PngOneOneMapResampleHorz(pDIBitmap, des_row, pCodec->m_pDecodeBuf, - pCodec->m_SrcFormat); - if (pCodec->m_SrcPassNumber == 1 && scale_y > 1.0) { - pCodec->ResampleVert(pDIBitmap, scale_y, des_row); + PngOneOneMapResampleHorz(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); + if (m_SrcPassNumber == 1 && scale_y > 1.0) { + ResampleVert(pDIBitmap, scale_y, des_row); return; } if (pass == 6 && scale_y > 1.0) { - pCodec->ResampleVert(pDIBitmap, scale_y, des_row); + ResampleVert(pDIBitmap, scale_y, des_row); } } } -#endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF -bool CCodec_ProgressiveDecoder::GifReadMoreData(CCodec_GifModule* pGifModule, +bool CCodec_ProgressiveDecoder::GifReadMoreData(ICodec_GifModule* pGifModule, FXCODEC_STATUS& err_status) { uint32_t dwSize = (uint32_t)m_pFile->GetSize(); if (dwSize <= m_offSet) { @@ -635,24 +612,18 @@ bool CCodec_ProgressiveDecoder::GifReadMoreData(CCodec_GifModule* pGifModule, return true; } -void CCodec_ProgressiveDecoder::GifRecordCurrentPositionCallback( - void* pModule, - uint32_t& cur_pos) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; +void CCodec_ProgressiveDecoder::GifRecordCurrentPosition(uint32_t& cur_pos) { uint32_t remain_size = - pCodec->m_pCodecMgr->GetGifModule()->GetAvailInput(pCodec->m_pGifContext); - cur_pos = pCodec->m_offSet - remain_size; + m_pCodecMgr->GetGifModule()->GetAvailInput(m_pGifContext); + cur_pos = m_offSet - remain_size; } -uint8_t* CCodec_ProgressiveDecoder::GifAskLocalPaletteBufCallback( - void* pModule, - int32_t frame_num, - int32_t pal_size) { +uint8_t* CCodec_ProgressiveDecoder::GifAskLocalPaletteBuf(int32_t frame_num, + int32_t pal_size) { return FX_Alloc(uint8_t, pal_size); } -bool CCodec_ProgressiveDecoder::GifInputRecordPositionBufCallback( - void* pModule, +bool CCodec_ProgressiveDecoder::GifInputRecordPositionBuf( uint32_t rcd_pos, const FX_RECT& img_rc, int32_t pal_num, @@ -662,58 +633,56 @@ bool CCodec_ProgressiveDecoder::GifInputRecordPositionBufCallback( int32_t trans_index, int32_t disposal_method, bool interlace) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - pCodec->m_offSet = rcd_pos; + m_offSet = rcd_pos; FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; - if (!pCodec->GifReadMoreData(pCodec->m_pCodecMgr->GetGifModule(), - error_status)) { + if (!GifReadMoreData(m_pCodecMgr->GetGifModule(), error_status)) { return false; } uint8_t* pPalette = nullptr; if (pal_num != 0 && pal_ptr) { pPalette = (uint8_t*)pal_ptr; } else { - pal_num = pCodec->m_GifPltNumber; - pPalette = pCodec->m_pGifPalette; + pal_num = m_GifPltNumber; + pPalette = m_pGifPalette; } - if (!pCodec->m_pSrcPalette) - pCodec->m_pSrcPalette = FX_Alloc(FX_ARGB, pal_num); - else if (pal_num > pCodec->m_SrcPaletteNumber) - pCodec->m_pSrcPalette = FX_Realloc(FX_ARGB, pCodec->m_pSrcPalette, pal_num); - if (!pCodec->m_pSrcPalette) + if (!m_pSrcPalette) + m_pSrcPalette = FX_Alloc(FX_ARGB, pal_num); + else if (pal_num > m_SrcPaletteNumber) + m_pSrcPalette = FX_Realloc(FX_ARGB, m_pSrcPalette, pal_num); + if (!m_pSrcPalette) return false; - pCodec->m_SrcPaletteNumber = pal_num; + m_SrcPaletteNumber = pal_num; for (int i = 0; i < pal_num; i++) { uint32_t j = i * 3; - pCodec->m_pSrcPalette[i] = + m_pSrcPalette[i] = ArgbEncode(0xff, pPalette[j], pPalette[j + 1], pPalette[j + 2]); } - pCodec->m_GifTransIndex = trans_index; - pCodec->m_GifFrameRect = img_rc; - pCodec->m_SrcPassNumber = interlace ? 4 : 1; - int32_t pal_index = pCodec->m_GifBgIndex; - CFX_DIBitmap* pDevice = pCodec->m_pDeviceBitmap; + m_GifTransIndex = trans_index; + m_GifFrameRect = img_rc; + m_SrcPassNumber = interlace ? 4 : 1; + int32_t pal_index = m_GifBgIndex; + CFX_DIBitmap* pDevice = m_pDeviceBitmap; if (trans_index >= pal_num) trans_index = -1; if (trans_index != -1) { - pCodec->m_pSrcPalette[trans_index] &= 0x00ffffff; + m_pSrcPalette[trans_index] &= 0x00ffffff; if (pDevice->HasAlpha()) pal_index = trans_index; } if (pal_index >= pal_num) return false; - int startX = pCodec->m_startX; - int startY = pCodec->m_startY; - int sizeX = pCodec->m_sizeX; - int sizeY = pCodec->m_sizeY; + int startX = m_startX; + int startY = m_startY; + int sizeX = m_sizeX; + int sizeY = m_sizeY; int Bpp = pDevice->GetBPP() / 8; - FX_ARGB argb = pCodec->m_pSrcPalette[pal_index]; + FX_ARGB argb = m_pSrcPalette[pal_index]; for (int row = 0; row < sizeY; row++) { uint8_t* pScanline = (uint8_t*)pDevice->GetScanline(row + startY) + startX * Bpp; - switch (pCodec->m_TransMethod) { + switch (m_TransMethod) { case 3: { uint8_t gray = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb)); @@ -741,36 +710,34 @@ bool CCodec_ProgressiveDecoder::GifInputRecordPositionBufCallback( return true; } -void CCodec_ProgressiveDecoder::GifReadScanlineCallback(void* pModule, - int32_t row_num, - uint8_t* row_buf) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - CFX_DIBitmap* pDIBitmap = pCodec->m_pDeviceBitmap; +void CCodec_ProgressiveDecoder::GifReadScanline(int32_t row_num, + uint8_t* row_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; ASSERT(pDIBitmap); - int32_t img_width = pCodec->m_GifFrameRect.Width(); + int32_t img_width = m_GifFrameRect.Width(); if (!pDIBitmap->HasAlpha()) { uint8_t* byte_ptr = row_buf; for (int i = 0; i < img_width; i++) { - if (*byte_ptr == pCodec->m_GifTransIndex) { - *byte_ptr = pCodec->m_GifBgIndex; + if (*byte_ptr == m_GifTransIndex) { + *byte_ptr = m_GifBgIndex; } byte_ptr++; } } - int32_t pal_index = pCodec->m_GifBgIndex; - if (pCodec->m_GifTransIndex != -1 && pCodec->m_pDeviceBitmap->HasAlpha()) { - pal_index = pCodec->m_GifTransIndex; + int32_t pal_index = m_GifBgIndex; + if (m_GifTransIndex != -1 && m_pDeviceBitmap->HasAlpha()) { + pal_index = m_GifTransIndex; } - FXSYS_memset(pCodec->m_pDecodeBuf, pal_index, pCodec->m_SrcWidth); + FXSYS_memset(m_pDecodeBuf, pal_index, m_SrcWidth); bool bLastPass = (row_num % 2) == 1; - int32_t line = row_num + pCodec->m_GifFrameRect.top; - int32_t left = pCodec->m_GifFrameRect.left; - FXSYS_memcpy(pCodec->m_pDecodeBuf + left, row_buf, img_width); - int src_top = pCodec->m_clipBox.top; - int src_bottom = pCodec->m_clipBox.bottom; - int des_top = pCodec->m_startY; - int src_hei = pCodec->m_clipBox.Height(); - int des_hei = pCodec->m_sizeY; + int32_t line = row_num + m_GifFrameRect.top; + int32_t left = m_GifFrameRect.left; + FXSYS_memcpy(m_pDecodeBuf + left, row_buf, img_width); + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; if (line < src_top || line >= src_bottom) return; @@ -780,18 +747,17 @@ void CCodec_ProgressiveDecoder::GifReadScanlineCallback(void* pModule, if (des_row >= des_top + des_hei) return; - pCodec->ReSampleScanline(pDIBitmap, des_row, pCodec->m_pDecodeBuf, - pCodec->m_SrcFormat); - if (scale_y > 1.0 && (!pCodec->m_bInterpol || pCodec->m_SrcPassNumber == 1)) { - pCodec->ResampleVert(pDIBitmap, scale_y, des_row); + ReSampleScanline(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); + if (scale_y > 1.0 && (!m_bInterpol || m_SrcPassNumber == 1)) { + ResampleVert(pDIBitmap, scale_y, des_row); return; } if (scale_y <= 1.0) return; - int des_bottom = des_top + pCodec->m_sizeY; + int des_bottom = des_top + m_sizeY; int des_Bpp = pDIBitmap->GetBPP() >> 3; - uint32_t des_ScanOffet = pCodec->m_startX * des_Bpp; + uint32_t des_ScanOffet = m_startX * des_Bpp; if (des_row + (int)scale_y >= des_bottom - 1) { uint8_t* scan_src = (uint8_t*)pDIBitmap->GetScanline(des_row) + des_ScanOffet; @@ -799,12 +765,12 @@ void CCodec_ProgressiveDecoder::GifReadScanlineCallback(void* pModule, while (++cur_row < des_bottom) { uint8_t* scan_des = (uint8_t*)pDIBitmap->GetScanline(cur_row) + des_ScanOffet; - uint32_t size = pCodec->m_sizeX * des_Bpp; + uint32_t size = m_sizeX * des_Bpp; FXSYS_memmove(scan_des, scan_src, size); } } if (bLastPass) - pCodec->GifDoubleLineResampleVert(pDIBitmap, scale_y, des_row); + GifDoubleLineResampleVert(pDIBitmap, scale_y, des_row); } void CCodec_ProgressiveDecoder::GifDoubleLineResampleVert( @@ -887,10 +853,8 @@ void CCodec_ProgressiveDecoder::GifDoubleLineResampleVert( GifDoubleLineResampleVert(pDeviceBitmap, scale_y, des_row + (int)scale_y); } } -#endif // PDF_ENABLE_XFA_GIF -#ifdef PDF_ENABLE_XFA_BMP -bool CCodec_ProgressiveDecoder::BmpReadMoreData(CCodec_BmpModule* pBmpModule, +bool CCodec_ProgressiveDecoder::BmpReadMoreData(ICodec_BmpModule* pBmpModule, FXCODEC_STATUS& err_status) { uint32_t dwSize = (uint32_t)m_pFile->GetSize(); if (dwSize <= m_offSet) @@ -927,28 +891,22 @@ bool CCodec_ProgressiveDecoder::BmpReadMoreData(CCodec_BmpModule* pBmpModule, return true; } -bool CCodec_ProgressiveDecoder::BmpInputImagePositionBufCallback( - void* pModule, - uint32_t rcd_pos) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - pCodec->m_offSet = rcd_pos; +bool CCodec_ProgressiveDecoder::BmpInputImagePositionBuf(uint32_t rcd_pos) { + m_offSet = rcd_pos; FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; - return pCodec->BmpReadMoreData(pCodec->m_pCodecMgr->GetBmpModule(), - error_status); + return BmpReadMoreData(m_pCodecMgr->GetBmpModule(), error_status); } -void CCodec_ProgressiveDecoder::BmpReadScanlineCallback(void* pModule, - int32_t row_num, - uint8_t* row_buf) { - CCodec_ProgressiveDecoder* pCodec = (CCodec_ProgressiveDecoder*)pModule; - CFX_DIBitmap* pDIBitmap = pCodec->m_pDeviceBitmap; +void CCodec_ProgressiveDecoder::BmpReadScanline(int32_t row_num, + uint8_t* row_buf) { + CFX_DIBitmap* pDIBitmap = m_pDeviceBitmap; ASSERT(pDIBitmap); - FXSYS_memcpy(pCodec->m_pDecodeBuf, row_buf, pCodec->m_ScanlineSize); - int src_top = pCodec->m_clipBox.top; - int src_bottom = pCodec->m_clipBox.bottom; - int des_top = pCodec->m_startY; - int src_hei = pCodec->m_clipBox.Height(); - int des_hei = pCodec->m_sizeY; + FXSYS_memcpy(m_pDecodeBuf, row_buf, m_ScanlineSize); + int src_top = m_clipBox.top; + int src_bottom = m_clipBox.bottom; + int des_top = m_startY; + int src_hei = m_clipBox.Height(); + int des_hei = m_sizeY; if (row_num < src_top || row_num >= src_bottom) return; @@ -958,18 +916,16 @@ void CCodec_ProgressiveDecoder::BmpReadScanlineCallback(void* pModule, if (des_row >= des_top + des_hei) return; - pCodec->ReSampleScanline(pDIBitmap, des_row, pCodec->m_pDecodeBuf, - pCodec->m_SrcFormat); + ReSampleScanline(pDIBitmap, des_row, m_pDecodeBuf, m_SrcFormat); if (scale_y <= 1.0) return; - if (pCodec->m_BmpIsTopBottom || !pCodec->m_bInterpol) { - pCodec->ResampleVert(pDIBitmap, scale_y, des_row); + if (m_BmpIsTopBottom || !m_bInterpol) { + ResampleVert(pDIBitmap, scale_y, des_row); return; } - pCodec->ResampleVertBT(pDIBitmap, scale_y, des_row); + ResampleVertBT(pDIBitmap, scale_y, des_row); } -#endif // PDF_ENABLE_XFA_BMP void CCodec_ProgressiveDecoder::ResampleVertBT(CFX_DIBitmap* pDeviceBitmap, double scale_y, @@ -1067,17 +1023,14 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, FXSYS_memset(m_pSrcBuf, 0, size); m_SrcSize = size; switch (imageType) { -#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: { - CCodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); if (!pBmpModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } - pBmpModule->InputImagePositionBufCallback = - BmpInputImagePositionBufCallback; - pBmpModule->ReadScanlineCallback = BmpReadScanlineCallback; - m_pBmpContext = pBmpModule->Start((void*)this); + pBmpModule->SetDelegate(this); + m_pBmpContext = pBmpModule->Start(); if (!m_pBmpContext) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; @@ -1123,7 +1076,6 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, m_status = FXCODEC_STATUS_ERR_FORMAT; return false; } -#endif // PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_JPG: { CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule(); if (!pJpegModule) { @@ -1167,20 +1119,14 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, m_status = FXCODEC_STATUS_ERR_FORMAT; return false; } -#ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: { - CCodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); if (!pPngModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } - pPngModule->ReadHeaderCallback = - CCodec_ProgressiveDecoder::PngReadHeaderFunc; - pPngModule->AskScanlineBufCallback = - CCodec_ProgressiveDecoder::PngAskScanlineBufFunc; - pPngModule->FillScanlineBufCompletedCallback = - CCodec_ProgressiveDecoder::PngFillScanlineBufCompletedFunc; - m_pPngContext = pPngModule->Start((void*)this); + pPngModule->SetDelegate(this); + m_pPngContext = pPngModule->Start(); if (!m_pPngContext) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; @@ -1230,23 +1176,14 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, } return true; } -#endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_GIF: { - CCodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); if (!pGifModule) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; } - pGifModule->RecordCurrentPositionCallback = - CCodec_ProgressiveDecoder::GifRecordCurrentPositionCallback; - pGifModule->AskLocalPaletteBufCallback = - CCodec_ProgressiveDecoder::GifAskLocalPaletteBufCallback; - pGifModule->InputRecordPositionBufCallback = - CCodec_ProgressiveDecoder::GifInputRecordPositionBufCallback; - pGifModule->ReadScanlineCallback = - CCodec_ProgressiveDecoder::GifReadScanlineCallback; - m_pGifContext = pGifModule->Start((void*)this); + pGifModule->SetDelegate(this); + m_pGifContext = pGifModule->Start(); if (!m_pGifContext) { m_status = FXCODEC_STATUS_ERR_MEMORY; return false; @@ -1284,10 +1221,8 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, m_status = FXCODEC_STATUS_ERR_FORMAT; return false; } -#endif // PDF_XFA_ENABLE_GIF -#ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIF: { - CCodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); + ICodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); if (!pTiffModule) { m_status = FXCODEC_STATUS_ERR_FORMAT; return false; @@ -1311,7 +1246,6 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, } return true; } -#endif // PDF_ENABLE_XFA_TIFF default: m_status = FXCODEC_STATUS_ERR_FORMAT; return false; @@ -1857,21 +1791,18 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::GetFrames(int32_t& frames, } switch (m_imagType) { case FXCODEC_IMAGE_JPG: -#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: -#endif -#ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: -#endif -#ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIF: -#endif frames = m_FrameNumber = 1; m_status = FXCODEC_STATUS_DECODE_READY; return m_status; -#ifdef PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_GIF: { - CCodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } while (true) { int32_t readResult = pGifModule->LoadFrameInfo(m_pGifContext, &m_FrameNumber); @@ -1899,7 +1830,6 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::GetFrames(int32_t& frames, return m_status; } } -#endif // PDF_ENABLE_XFA_GIF default: return FXCODEC_STATUS_ERROR; } @@ -2000,9 +1930,8 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; return m_status; } -#ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: { - CCodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); if (!pPngModule) { m_pDeviceBitmap = nullptr; m_pFile = nullptr; @@ -2013,7 +1942,7 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, pPngModule->Finish(m_pPngContext); m_pPngContext = nullptr; } - m_pPngContext = pPngModule->Start((void*)this); + m_pPngContext = pPngModule->Start(); if (!m_pPngContext) { m_pDeviceBitmap = nullptr; m_pFile = nullptr; @@ -2053,10 +1982,8 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; return m_status; } -#endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_GIF: { - CCodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); if (!pGifModule) { m_pDeviceBitmap = nullptr; m_pFile = nullptr; @@ -2076,10 +2003,8 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; return m_status; } -#endif // PDF_ENABLE_XFA_GIF -#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: { - CCodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); if (!pBmpModule) { m_pDeviceBitmap = nullptr; m_pFile = nullptr; @@ -2108,12 +2033,9 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode(CFX_DIBitmap* pDIBitmap, m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; return m_status; } -#endif // PDF_ENABLE_XFA_BMP -#ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIF: m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; return m_status; -#endif // PDF_ENABLE_XFA_TIFF default: return FXCODEC_STATUS_ERROR; } @@ -2156,9 +2078,12 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { } } } -#ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: { - CCodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + ICodec_PngModule* pPngModule = m_pCodecMgr->GetPngModule(); + if (!pPngModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } while (true) { uint32_t remain_size = (uint32_t)m_pFile->GetSize() - m_offSet; uint32_t input_size = @@ -2201,10 +2126,12 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { } } } -#endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_GIF: { - CCodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + ICodec_GifModule* pGifModule = m_pCodecMgr->GetGifModule(); + if (!pGifModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } while (true) { int32_t readRes = pGifModule->LoadFrame(m_pGifContext, m_FrameCur, nullptr); @@ -2234,10 +2161,12 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { return m_status; } } -#endif // PDF_ENABLE_XFA_GIF -#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: { - CCodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + ICodec_BmpModule* pBmpModule = m_pCodecMgr->GetBmpModule(); + if (!pBmpModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } while (true) { int32_t readRes = pBmpModule->LoadImage(m_pBmpContext); while (readRes == 2) { @@ -2265,11 +2194,13 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { m_status = FXCODEC_STATUS_ERROR; return m_status; } - }; -#endif // PDF_ENABLE_XFA_BMP -#ifdef PDF_ENABLE_XFA_TIFF + } case FXCODEC_IMAGE_TIF: { - CCodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); + ICodec_TiffModule* pTiffModule = m_pCodecMgr->GetTiffModule(); + if (!pTiffModule) { + m_status = FXCODEC_STATUS_ERR_MEMORY; + return m_status; + } bool ret = false; if (m_pDeviceBitmap->GetBPP() == 32 && m_pDeviceBitmap->GetWidth() == m_SrcWidth && m_SrcWidth == m_sizeX && @@ -2411,12 +2342,12 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode(IFX_Pause* pPause) { m_status = FXCODEC_STATUS_DECODE_FINISH; return m_status; } -#endif // PDF_ENABLE_XFA_TIFF default: return FXCODEC_STATUS_ERROR; } } -CCodec_ProgressiveDecoder* CCodec_ModuleMgr::CreateProgressiveDecoder() { - return new CCodec_ProgressiveDecoder(this); +std::unique_ptr<CCodec_ProgressiveDecoder> +CCodec_ModuleMgr::CreateProgressiveDecoder() { + return pdfium::MakeUnique<CCodec_ProgressiveDecoder>(this); } |