FX_DWORD PDF_DecodeInlineStream(const uint8_t* src_buf, FX_DWORD limit, int width, int height, CFX_ByteString& decoder, CPDF_Dictionary* pParam, uint8_t*& dest_buf, FX_DWORD& dest_size) { if (decoder == FX_BSTRC("CCITTFaxDecode") || decoder == FX_BSTRC("CCF")) { ICodec_ScanlineDecoder* pDecoder = FPDFAPI_CreateFaxDecoder(src_buf, limit, width, height, pParam); return _DecodeAllScanlines(pDecoder, dest_buf, dest_size); } else if (decoder == FX_BSTRC("ASCII85Decode") || decoder == FX_BSTRC("A85")) { return _A85Decode(src_buf, limit, dest_buf, dest_size); } else if (decoder == FX_BSTRC("ASCIIHexDecode") || decoder == FX_BSTRC("AHx")) { return _HexDecode(src_buf, limit, dest_buf, dest_size); } else if (decoder == FX_BSTRC("FlateDecode") || decoder == FX_BSTRC("Fl")) { return FPDFAPI_FlateOrLZWDecode(FALSE, src_buf, limit, pParam, dest_size, dest_buf, dest_size); } else if (decoder == FX_BSTRC("LZWDecode") || decoder == FX_BSTRC("LZW")) { return FPDFAPI_FlateOrLZWDecode(TRUE, src_buf, limit, pParam, 0, dest_buf, dest_size); } else if (decoder == FX_BSTRC("DCTDecode") || decoder == FX_BSTRC("DCT")) { ICodec_ScanlineDecoder* pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( src_buf, limit, width, height, 0, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1); return _DecodeAllScanlines(pDecoder, dest_buf, dest_size); } else if (decoder == FX_BSTRC("RunLengthDecode") || decoder == FX_BSTRC("RL")) { return RunLengthDecode(src_buf, limit, dest_buf, dest_size); } dest_size = 0; dest_buf = 0; return (FX_DWORD) - 1; }
int CPDF_DIBSource::CreateDecoder() { const CFX_ByteString& decoder = m_pStreamAcc->GetImageDecoder(); if (decoder.IsEmpty()) return 1; if (m_bDoBpcCheck && m_bpc == 0) return 0; if (decoder == "JPXDecode") { LoadJpxBitmap(); return m_pCachedBitmap ? 1 : 0; } if (decoder == "JBIG2Decode") { m_pCachedBitmap = pdfium::MakeUnique<CFX_DIBitmap>(); if (!m_pCachedBitmap->Create( m_Width, m_Height, m_bImageMask ? FXDIB_1bppMask : FXDIB_1bppRgb)) { m_pCachedBitmap.reset(); return 0; } m_Status = 1; return 2; } const uint8_t* src_data = m_pStreamAcc->GetData(); uint32_t src_size = m_pStreamAcc->GetSize(); const CPDF_Dictionary* pParams = m_pStreamAcc->GetImageParam(); if (decoder == "CCITTFaxDecode") { m_pDecoder = FPDFAPI_CreateFaxDecoder(src_data, src_size, m_Width, m_Height, pParams); } else if (decoder == "FlateDecode") { m_pDecoder = FPDFAPI_CreateFlateDecoder( src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc, pParams); } else if (decoder == "RunLengthDecode") { m_pDecoder = CPDF_ModuleMgr::Get() ->GetCodecModule() ->GetBasicModule() ->CreateRunLengthDecoder(src_data, src_size, m_Width, m_Height, m_nComponents, m_bpc); } else if (decoder == "DCTDecode") { m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( src_data, src_size, m_Width, m_Height, m_nComponents, !pParams || pParams->GetIntegerFor("ColorTransform", 1)); if (!m_pDecoder) { bool bTransform = false; int comps; int bpc; CCodec_JpegModule* pJpegModule = CPDF_ModuleMgr::Get()->GetJpegModule(); if (pJpegModule->LoadInfo(src_data, src_size, &m_Width, &m_Height, &comps, &bpc, &bTransform)) { if (m_nComponents != static_cast<uint32_t>(comps)) { FX_Free(m_pCompData); m_pCompData = nullptr; m_nComponents = static_cast<uint32_t>(comps); if (m_pColorSpace) { switch (m_Family) { case PDFCS_DEVICEGRAY: case PDFCS_DEVICERGB: case PDFCS_DEVICECMYK: { uint32_t dwMinComps = ComponentsForFamily(m_Family); if (m_pColorSpace->CountComponents() < dwMinComps || m_nComponents < dwMinComps) { return 0; } break; } case PDFCS_LAB: { if (m_nComponents != 3 || m_pColorSpace->CountComponents() < 3) return 0; break; } case PDFCS_ICCBASED: { if (!IsAllowedICCComponents(m_nComponents) || !IsAllowedICCComponents(m_pColorSpace->CountComponents()) || m_pColorSpace->CountComponents() < m_nComponents) { return 0; } break; } default: { if (m_pColorSpace->CountComponents() != m_nComponents) return 0; break; } } } else { if (m_Family == PDFCS_LAB && m_nComponents != 3) return 0; } m_pCompData = GetDecodeAndMaskArray(m_bDefaultDecode, m_bColorKey); if (!m_pCompData) return 0; } m_bpc = bpc; m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( src_data, src_size, m_Width, m_Height, m_nComponents, bTransform); } } } if (!m_pDecoder) return 0; FX_SAFE_UINT32 requested_pitch = CalculatePitch8(m_bpc, m_nComponents, m_Width); if (!requested_pitch.IsValid()) return 0; FX_SAFE_UINT32 provided_pitch = CalculatePitch8( m_pDecoder->GetBPC(), m_pDecoder->CountComps(), m_pDecoder->GetWidth()); if (!provided_pitch.IsValid()) return 0; if (provided_pitch.ValueOrDie() < requested_pitch.ValueOrDie()) return 0; return 1; }