diff options
Diffstat (limited to 'core/fxcodec')
-rw-r--r-- | core/fxcodec/codec/ccodec_progressivedecoder.h | 34 | ||||
-rw-r--r-- | core/fxcodec/codec/fx_codec.cpp | 13 | ||||
-rw-r--r-- | core/fxcodec/codec/fx_codec_progress.cpp | 92 | ||||
-rw-r--r-- | core/fxcodec/fx_codec.h | 20 | ||||
-rw-r--r-- | core/fxcodec/fx_codec_def.h | 2 |
5 files changed, 102 insertions, 59 deletions
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.h b/core/fxcodec/codec/ccodec_progressivedecoder.h index 07716a80ae..4eeb59d559 100644 --- a/core/fxcodec/codec/ccodec_progressivedecoder.h +++ b/core/fxcodec/codec/ccodec_progressivedecoder.h @@ -11,7 +11,6 @@ #include <utility> #include <vector> -#include "core/fxcodec/codec/ccodec_bmpmodule.h" #include "core/fxcodec/codec/ccodec_jpegmodule.h" #include "core/fxcodec/fx_codec_def.h" #include "core/fxcrt/fx_system.h" @@ -20,9 +19,13 @@ #include "core/fxge/dib/cfx_dibitmap.h" #include "core/fxge/fx_dib.h" +#ifdef PDF_ENABLE_XFA_BMP +#include "core/fxcodec/codec/ccodec_bmpmodule.h" +#endif // PDF_ENABLE_XFA_BMP + #ifdef PDF_ENABLE_XFA_GIF #include "core/fxcodec/codec/ccodec_gifmodule.h" -#endif // PDF_ENABLE_XFA_gif +#endif // PDF_ENABLE_XFA_GIF #ifdef PDF_ENABLE_XFA_PNG #include "core/fxcodec/codec/ccodec_pngmodule.h" @@ -38,14 +41,17 @@ class IFX_SeekableReadStream; class CCodec_Dummy {}; // Placeholder to work around C++ syntax issues -class CCodec_ProgressiveDecoder : public CCodec_BmpModule::Delegate, +class CCodec_ProgressiveDecoder : +#ifdef PDF_ENABLE_XFA_BMP + public CCodec_BmpModule::Delegate, +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF - public CCodec_GifModule::Delegate, + public CCodec_GifModule::Delegate, #endif // PDF_ENABLE_XFA_GIF #ifdef PDF_ENABLE_XFA_PNG - public CCodec_PngModule::Delegate, + public CCodec_PngModule::Delegate, #endif // PDF_ENABLE_XFA_PNG - public CCodec_Dummy { + public CCodec_Dummy { public: enum FXCodec_Format { FXCodec_Invalid = 0, @@ -166,17 +172,21 @@ class CCodec_ProgressiveDecoder : public CCodec_BmpModule::Delegate, void GifReadScanline(int32_t row_num, uint8_t* row_buf) override; #endif // PDF_ENABLE_XFA_GIF +#ifdef PDF_ENABLE_XFA_BMP // CCodec_BmpModule::Delegate bool BmpInputImagePositionBuf(uint32_t rcd_pos) override; void BmpReadScanline(uint32_t row_num, const std::vector<uint8_t>& row_buf) override; +#endif // PDF_ENABLE_XFA_BMP private: +#ifdef PDF_ENABLE_XFA_BMP bool BmpReadMoreData(CCodec_BmpModule* pBmpModule, FXCODEC_STATUS& err_status); bool BmpDetectImageType(CFX_DIBAttribute* pAttribute, uint32_t size); FXCODEC_STATUS BmpStartDecode(const RetainPtr<CFX_DIBitmap>& pDIBitmap); FXCODEC_STATUS BmpContinueDecode(); +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF bool GifReadMoreData(CCodec_GifModule* pGifModule, @@ -234,14 +244,16 @@ class CCodec_ProgressiveDecoder : public CCodec_BmpModule::Delegate, RetainPtr<IFX_SeekableReadStream> m_pFile; RetainPtr<CFX_DIBitmap> m_pDeviceBitmap; UnownedPtr<CCodec_ModuleMgr> m_pCodecMgr; +#ifdef PDF_ENABLE_XFA_BMP + std::unique_ptr<CCodec_BmpModule::Context> m_pBmpContext; +#endif // PDF_ENABLE_XFA_BMP +#ifdef PDF_ENABLE_XFA_GIF + std::unique_ptr<CCodec_GifModule::Context> m_pGifContext; +#endif // PDF_ENABLE_XFA_GIF std::unique_ptr<CCodec_JpegModule::Context> m_pJpegContext; #ifdef PDF_ENABLE_XFA_PNG std::unique_ptr<CCodec_PngModule::Context> m_pPngContext; #endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF - std::unique_ptr<CCodec_GifModule::Context> m_pGifContext; -#endif // PDF_ENABLE_XFA_GIF - std::unique_ptr<CCodec_BmpModule::Context> m_pBmpContext; #ifdef PDF_ENABLE_XFA_TIFF std::unique_ptr<CCodec_TiffModule::Context> m_pTiffContext; #endif // PDF_ENABLE_XFA_TIFF @@ -279,7 +291,9 @@ class CCodec_ProgressiveDecoder : public CCodec_BmpModule::Delegate, FX_RECT m_GifFrameRect; bool m_InvalidateGifBuffer; #endif // PDF_ENABLE_XFA_GIF +#ifdef PDF_ENABLE_XFA_BMP bool m_BmpIsTopBottom; +#endif // PDF_ENABLE_XFA_BMP FXCODEC_STATUS m_status; }; diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp index e58da052aa..d81e8f756c 100644 --- a/core/fxcodec/codec/fx_codec.cpp +++ b/core/fxcodec/codec/fx_codec.cpp @@ -1510,17 +1510,20 @@ bool CCodec_BasicModule::A85Encode(const uint8_t* src_buf, #ifdef PDF_ENABLE_XFA CFX_DIBAttribute::CFX_DIBAttribute() - : m_nXDPI(-1), - m_nYDPI(-1), - m_fAspectRatio(-1.0f), - m_wDPIUnit(0), + : +#ifdef PDF_ENABLE_XFA_BMP + m_nBmpCompressType(0), +#endif // PDF_ENABLE_BMP #ifdef PDF_ENABLE_XFA_GIF m_nGifLeft(0), m_nGifTop(0), m_pGifLocalPalette(nullptr), m_nGifLocalPalNum(0), #endif // PDF_ENABLE_XFA_GIF - m_nBmpCompressType(0) { + m_nXDPI(-1), + m_nYDPI(-1), + m_fAspectRatio(-1.0f), + m_wDPIUnit(0) { } CFX_DIBAttribute::~CFX_DIBAttribute() { diff --git a/core/fxcodec/codec/fx_codec_progress.cpp b/core/fxcodec/codec/fx_codec_progress.cpp index 1d6bc708db..e45dff6682 100644 --- a/core/fxcodec/codec/fx_codec_progress.cpp +++ b/core/fxcodec/codec/fx_codec_progress.cpp @@ -283,7 +283,9 @@ CCodec_ProgressiveDecoder::CCodec_ProgressiveDecoder( m_GifFrameRect = FX_RECT(0, 0, 0, 0); m_InvalidateGifBuffer = true; #endif // PDF_ENABLE_XFA_GIF +#ifdef PDF_ENABLE_XFA_BMP m_BmpIsTopBottom = false; +#endif // PDF_ENABLE_XFA_BMP } CCodec_ProgressiveDecoder::~CCodec_ProgressiveDecoder() { @@ -613,6 +615,7 @@ void CCodec_ProgressiveDecoder::GifReadScanline(int32_t row_num, } #endif // PDF_ENABLE_XFA_GIF +#ifdef PDF_ENABLE_XFA_BMP bool CCodec_ProgressiveDecoder::BmpInputImagePositionBuf(uint32_t rcd_pos) { m_offSet = rcd_pos; FXCODEC_STATUS error_status = FXCODEC_STATUS_ERROR; @@ -926,6 +929,7 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::BmpContinueDecode() { return m_status; } } +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF bool CCodec_ProgressiveDecoder::GifReadMoreData(CCodec_GifModule* pGifModule, @@ -1733,18 +1737,20 @@ bool CCodec_ProgressiveDecoder::DetectImageType(FXCODEC_IMAGE_TYPE imageType, memset(m_pSrcBuf, 0, size); m_SrcSize = size; switch (imageType) { +#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: return BmpDetectImageType(pAttribute, size); +#endif // PDF_ENABLE_XFA_BMP +#ifdef PDF_ENABLE_XFA_GIF + case FXCODEC_IMAGE_GIF: + return GifDetectImageType(pAttribute, size); +#endif // PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_JPG: return JpegDetectImageType(pAttribute, size); #ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: return PngDetectImageType(pAttribute, size); #endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_GIF: - return GifDetectImageType(pAttribute, size); -#endif // PDF_ENABLE_XFA_GIF #ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIFF: return TiffDetectImageType(pAttribute, size); @@ -1794,9 +1800,9 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::LoadImageInfo( if (bSkipImageTypeCheck) return m_status; - for (int type = FXCODEC_IMAGE_BMP; type < FXCODEC_IMAGE_MAX; type++) { - if (DetectImageType((FXCODEC_IMAGE_TYPE)type, pAttribute)) { - m_imagType = (FXCODEC_IMAGE_TYPE)type; + for (int type = FXCODEC_IMAGE_UNKNOWN + 1; type < FXCODEC_IMAGE_MAX; type++) { + if (DetectImageType(static_cast<FXCODEC_IMAGE_TYPE>(type), pAttribute)) { + m_imagType = static_cast<FXCODEC_IMAGE_TYPE>(type); m_status = FXCODEC_STATUS_FRAME_READY; return m_status; } @@ -2065,6 +2071,7 @@ void CCodec_ProgressiveDecoder::ReSampleScanline( dest_scan += dest_bytes_per_pixel - 3; } break; case 12: { +#ifdef PDF_ENABLE_XFA_BMP if (m_pBmpContext) { int dest_r = 0; int dest_g = 0; @@ -2082,26 +2089,27 @@ void CCodec_ProgressiveDecoder::ReSampleScanline( *dest_scan++ = (uint8_t)((dest_g) >> 16); *dest_scan++ = (uint8_t)((dest_r) >> 16); *dest_scan++ = 0xFF; - } else { - int dest_a = 0; - int dest_r = 0; - int dest_g = 0; - int dest_b = 0; - for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; - j++) { - int pixel_weight = - pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; - unsigned long argb = m_pSrcPalette[src_scan[j]]; - dest_a += pixel_weight * (uint8_t)(argb >> 24); - dest_r += pixel_weight * (uint8_t)(argb >> 16); - dest_g += pixel_weight * (uint8_t)(argb >> 8); - dest_b += pixel_weight * (uint8_t)argb; - } - *dest_scan++ = (uint8_t)((dest_b) >> 16); - *dest_scan++ = (uint8_t)((dest_g) >> 16); - *dest_scan++ = (uint8_t)((dest_r) >> 16); - *dest_scan++ = (uint8_t)((dest_a) >> 16); + break; + } +#endif // PDF_ENABLE_XFA_BMP + int dest_a = 0; + int dest_r = 0; + int dest_g = 0; + int dest_b = 0; + for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; + j++) { + int pixel_weight = + pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart]; + unsigned long argb = m_pSrcPalette[src_scan[j]]; + dest_a += pixel_weight * (uint8_t)(argb >> 24); + dest_r += pixel_weight * (uint8_t)(argb >> 16); + dest_g += pixel_weight * (uint8_t)(argb >> 8); + dest_b += pixel_weight * (uint8_t)argb; } + *dest_scan++ = (uint8_t)((dest_b) >> 16); + *dest_scan++ = (uint8_t)((dest_g) >> 16); + *dest_scan++ = (uint8_t)((dest_r) >> 16); + *dest_scan++ = (uint8_t)((dest_a) >> 16); } break; case 9: { uint32_t dest_b = 0; @@ -2306,8 +2314,10 @@ std::pair<FXCODEC_STATUS, size_t> CCodec_ProgressiveDecoder::GetFrames() { } switch (m_imagType) { - case FXCODEC_IMAGE_JPG: +#ifdef PDF_ENABLE_XFA_BMP case FXCODEC_IMAGE_BMP: +#endif // PDF_ENABLE_XFA_BMP + case FXCODEC_IMAGE_JPG: #ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: #endif // PDF_ENABLE_XFA_PNG @@ -2405,18 +2415,20 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::StartDecode( return FXCODEC_STATUS_ERR_PARAMS; } switch (m_imagType) { +#ifdef PDF_ENABLE_XFA_BMP + case FXCODEC_IMAGE_BMP: + return BmpStartDecode(pDIBitmap); +#endif // PDF_ENABLE_XFA_BMP +#ifdef PDF_ENABLE_XFA_GIF + case FXCODEC_IMAGE_GIF: + return GifStartDecode(pDIBitmap); +#endif // PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_JPG: return JpegStartDecode(pDIBitmap); #ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: return PngStartDecode(pDIBitmap); #endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_GIF: - return GifStartDecode(pDIBitmap); -#endif // PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_BMP: - return BmpStartDecode(pDIBitmap); #ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIFF: m_status = FXCODEC_STATUS_DECODE_TOBECONTINUE; @@ -2432,18 +2444,20 @@ FXCODEC_STATUS CCodec_ProgressiveDecoder::ContinueDecode() { return FXCODEC_STATUS_ERROR; switch (m_imagType) { +#ifdef PDF_ENABLE_XFA_BMP + case FXCODEC_IMAGE_BMP: + return BmpContinueDecode(); +#endif // PDF_ENABLE_XFA_BMP +#ifdef PDF_ENABLE_XFA_GIF + case FXCODEC_IMAGE_GIF: + return GifContinueDecode(); +#endif // PDF_ENABLE_XFA_GIF case FXCODEC_IMAGE_JPG: return JpegContinueDecode(); #ifdef PDF_ENABLE_XFA_PNG case FXCODEC_IMAGE_PNG: return PngContinueDecode(); #endif // PDF_ENABLE_XFA_PNG -#ifdef PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_GIF: - return GifContinueDecode(); -#endif // PDF_ENABLE_XFA_GIF - case FXCODEC_IMAGE_BMP: - return BmpContinueDecode(); #ifdef PDF_ENABLE_XFA_TIFF case FXCODEC_IMAGE_TIFF: return TiffContinueDecode(); diff --git a/core/fxcodec/fx_codec.h b/core/fxcodec/fx_codec.h index b5e8d8ad39..91d9f2fb32 100644 --- a/core/fxcodec/fx_codec.h +++ b/core/fxcodec/fx_codec.h @@ -19,7 +19,9 @@ #include "core/fxcrt/fx_string.h" #ifdef PDF_ENABLE_XFA +#ifdef PDF_ENABLE_XFA_BMP #include "core/fxcodec/codec/ccodec_bmpmodule.h" +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF #include "core/fxcodec/codec/ccodec_gifmodule.h" @@ -54,17 +56,20 @@ class CFX_DIBAttribute { CFX_DIBAttribute(); ~CFX_DIBAttribute(); - int32_t m_nXDPI; - int32_t m_nYDPI; - float m_fAspectRatio; - uint16_t m_wDPIUnit; +#ifdef PDF_ENABLE_XFA_BMP + int32_t m_nBmpCompressType; +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF int32_t m_nGifLeft; int32_t m_nGifTop; uint32_t* m_pGifLocalPalette; uint32_t m_nGifLocalPalNum; #endif // PDF_ENABLE_XFA_GIF - int32_t m_nBmpCompressType; + + int32_t m_nXDPI; + int32_t m_nYDPI; + float m_fAspectRatio; + uint16_t m_wDPIUnit; std::map<uint32_t, void*> m_Exif; }; #endif // PDF_ENABLE_XFA @@ -84,10 +89,13 @@ class CCodec_ModuleMgr { #ifdef PDF_ENABLE_XFA std::unique_ptr<CCodec_ProgressiveDecoder> CreateProgressiveDecoder(); + +#ifdef PDF_ENABLE_XFA_BMP CCodec_BmpModule* GetBmpModule() const { return m_pBmpModule.get(); } void SetBmpModule(std::unique_ptr<CCodec_BmpModule> module) { m_pBmpModule = std::move(module); } +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF CCodec_GifModule* GetGifModule() const { return m_pGifModule.get(); } @@ -120,7 +128,9 @@ class CCodec_ModuleMgr { std::unique_ptr<CCodec_IccModule> m_pIccModule; #ifdef PDF_ENABLE_XFA +#ifdef PDF_ENABLE_XFA_BMP std::unique_ptr<CCodec_BmpModule> m_pBmpModule; +#endif // PDF_ENABLE_XFA_BMP #ifdef PDF_ENABLE_XFA_GIF std::unique_ptr<CCodec_GifModule> m_pGifModule; diff --git a/core/fxcodec/fx_codec_def.h b/core/fxcodec/fx_codec_def.h index f7d6916aa5..154fe967ee 100644 --- a/core/fxcodec/fx_codec_def.h +++ b/core/fxcodec/fx_codec_def.h @@ -26,7 +26,9 @@ enum FXCODEC_STATUS { #ifdef PDF_ENABLE_XFA enum FXCODEC_IMAGE_TYPE { FXCODEC_IMAGE_UNKNOWN = 0, +#ifdef PDF_ENABLE_XFA_BMP FXCODEC_IMAGE_BMP, +#endif // PDF_ENABLE_XFA_BMP FXCODEC_IMAGE_JPG, #ifdef PDF_ENABLE_XFA_PNG FXCODEC_IMAGE_PNG, |