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; }
FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, CFX_AffineMatrix* pImage2Device, const FX_RECT* pClipBox) { if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) { return FALSE; } CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect(); FX_RECT image_rect = image_rect_f.GetOutterRect(); m_DestWidth = image_rect.Width(); m_DestHeight = image_rect.Height(); m_bFlipX = pImage2Device->a < 0; m_bFlipY = pImage2Device->d > 0; FX_RECT result_rect = *pClipBox; result_rect.Intersect(image_rect); if (result_rect.IsEmpty()) { return FALSE; } m_ResultWidth = result_rect.Width(); m_ResultHeight = result_rect.Height(); m_ResultLeft = result_rect.left; m_ResultTop = result_rect.top; m_ClipLeft = result_rect.left - image_rect.left; m_ClipTop = result_rect.top - image_rect.top; CPDF_Dictionary* pDict = pImageObj->m_pImage->GetDict(); if (pDict->GetInteger(FX_BSTRC("BitsPerComponent")) != 8) { return FALSE; } if (pDict->KeyExist(FX_BSTRC("SMask")) || pDict->KeyExist(FX_BSTRC("Mask"))) { return FALSE; } m_SrcWidth = pDict->GetInteger(FX_BSTRC("Width")); m_SrcHeight = pDict->GetInteger(FX_BSTRC("Height")); m_pCS = NULL; m_Bpp = 3; CPDF_Object* pCSObj = pDict->GetElementValue(FX_BSTRC("ColorSpace")); if (pCSObj == NULL) { return FALSE; } m_pCS = CPDF_ColorSpace::Load(pImageObj->m_pImage->GetDocument(), pCSObj); if (m_pCS == NULL) { return FALSE; } if (!_IsSupported(m_pCS)) { return FALSE; } m_Bpp = m_pCS->CountComponents(); if (m_pCS->sRGB()) { m_pCS->ReleaseCS(); m_pCS = NULL; } CPDF_Stream* pStream = pImageObj->m_pImage->GetStream(); m_StreamAcc.LoadAllData(pStream, FALSE, m_SrcWidth * m_SrcHeight * m_Bpp, TRUE); m_pDecoder = NULL; if (!m_StreamAcc.GetImageDecoder().IsEmpty()) { if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("DCTDecode")) { const CPDF_Dictionary* pParam = m_StreamAcc.GetImageParam(); m_pDecoder = CPDF_ModuleMgr::Get()->GetJpegModule()->CreateDecoder( m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, pParam ? pParam->GetInteger(FX_BSTRC("ColorTransform"), 1) : 1); } else if (m_StreamAcc.GetImageDecoder() == FX_BSTRC("FlateDecode")) { m_pDecoder = FPDFAPI_CreateFlateDecoder( m_StreamAcc.GetData(), m_StreamAcc.GetSize(), m_SrcWidth, m_SrcHeight, m_Bpp, 8, m_StreamAcc.GetImageParam()); } else { return FALSE; } m_pDecoder->DownScale(m_DestWidth, m_DestHeight); } m_pBitmap = new CFX_DIBitmap; #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb32); #else m_pBitmap->Create(m_ResultWidth, m_ResultHeight, FXDIB_Rgb); #endif m_LineIndex = 0; return TRUE; }