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);