Introduce CPDF_Image::CreateNewDIB() helper method
Consolidate some code inside CPDF_Image class.
Change-Id: I7e4a456da0a9813bda8a415290bb74546eaa2242
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96310
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index d6b5495..806e82d 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -332,9 +332,12 @@
pPage->GetRenderCache()->ResetBitmapForImage(std::move(pHolder));
}
+RetainPtr<CPDF_DIB> CPDF_Image::CreateNewDIB() const {
+ return pdfium::MakeRetain<CPDF_DIB>(GetDocument(), GetStream());
+}
+
RetainPtr<CFX_DIBBase> CPDF_Image::LoadDIBBase() const {
- auto source =
- pdfium::MakeRetain<CPDF_DIB>(m_pDocument.Get(), m_pStream.Get());
+ RetainPtr<CPDF_DIB> source = CreateNewDIB();
if (!source->Load())
return nullptr;
@@ -360,8 +363,7 @@
bool bStdCS,
CPDF_ColorSpace::Family GroupFamily,
bool bLoadMask) {
- auto source =
- pdfium::MakeRetain<CPDF_DIB>(m_pDocument.Get(), m_pStream.Get());
+ RetainPtr<CPDF_DIB> source = CreateNewDIB();
CPDF_DIB::LoadState ret = source->StartLoadDIBBase(
true, pFormResource, pPageResource, bStdCS, GroupFamily, bLoadMask);
if (ret == CPDF_DIB::LoadState::kFail) {
diff --git a/core/fpdfapi/page/cpdf_image.h b/core/fpdfapi/page/cpdf_image.h
index 89fdd6a..1de8209 100644
--- a/core/fpdfapi/page/cpdf_image.h
+++ b/core/fpdfapi/page/cpdf_image.h
@@ -16,6 +16,7 @@
class CFX_DIBBase;
class CFX_DIBitmap;
+class CPDF_DIB;
class CPDF_Dictionary;
class CPDF_Document;
class CPDF_Page;
@@ -44,6 +45,7 @@
bool IsMask() const { return m_bIsMask; }
bool IsInterpol() const { return m_bInterpolate; }
+ RetainPtr<CPDF_DIB> CreateNewDIB() const;
RetainPtr<CFX_DIBBase> LoadDIBBase() const;
void SetImage(const RetainPtr<CFX_DIBitmap>& pBitmap);
diff --git a/core/fpdfapi/render/cpdf_imagecacheentry.cpp b/core/fpdfapi/render/cpdf_imagecacheentry.cpp
index 355faaa..fe4e331 100644
--- a/core/fpdfapi/render/cpdf_imagecacheentry.cpp
+++ b/core/fpdfapi/render/cpdf_imagecacheentry.cpp
@@ -18,6 +18,7 @@
#include "core/fpdfapi/render/cpdf_rendercontext.h"
#include "core/fpdfapi/render/cpdf_renderstatus.h"
#include "core/fxge/dib/cfx_dibitmap.h"
+#include "third_party/base/check_op.h"
CPDF_ImageCacheEntry::CPDF_ImageCacheEntry(CPDF_Document* pDoc,
RetainPtr<CPDF_Image> pImage)
@@ -48,8 +49,11 @@
return CPDF_DIB::LoadState::kSuccess;
}
- m_pCurBitmap =
- pdfium::MakeRetain<CPDF_DIB>(m_pDocument.Get(), m_pImage->GetStream());
+ // A cross-document image may have come from the embedder.
+ if (m_pDocument != m_pImage->GetDocument())
+ return CPDF_DIB::LoadState::kFail;
+
+ m_pCurBitmap = m_pImage->CreateNewDIB();
CPDF_DIB::LoadState ret = m_pCurBitmap.As<CPDF_DIB>()->StartLoadDIBBase(
true, pRenderStatus->GetFormResource(), pPageResources, bStdCS,
pRenderStatus->GetGroupFamily(), pRenderStatus->GetLoadMask());
diff --git a/fpdfsdk/fpdf_editimg.cpp b/fpdfsdk/fpdf_editimg.cpp
index 0ead01d..5a40c7b 100644
--- a/fpdfsdk/fpdf_editimg.cpp
+++ b/fpdfsdk/fpdf_editimg.cpp
@@ -375,8 +375,11 @@
if (!pPage || !pPage->GetDocument() || !pImg->GetStream())
return true;
- auto pSource =
- pdfium::MakeRetain<CPDF_DIB>(pPage->GetDocument(), pImg->GetStream());
+ // A cross-document image may have come from the embedder.
+ if (pPage->GetDocument() != pImg->GetDocument())
+ return false;
+
+ RetainPtr<CPDF_DIB> pSource = pImg->CreateNewDIB();
CPDF_DIB::LoadState ret = pSource->StartLoadDIBBase(
false, nullptr, pPage->GetPageResources(), false,
CPDF_ColorSpace::Family::kUnknown, false);