Nest CPDF_ImageCacheEntry in CPDF_PageRenderCache.

Hide implementation details from callers, giving them one less
class to worry about.

Change-Id: If5c8a1181a53ec7a02c3c84ed4727d9ce7f16e79
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96430
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/BUILD.gn b/core/fpdfapi/render/BUILD.gn
index a4ab336..514d204 100644
--- a/core/fpdfapi/render/BUILD.gn
+++ b/core/fpdfapi/render/BUILD.gn
@@ -13,8 +13,6 @@
     "cpdf_devicebuffer.h",
     "cpdf_docrenderdata.cpp",
     "cpdf_docrenderdata.h",
-    "cpdf_imagecacheentry.cpp",
-    "cpdf_imagecacheentry.h",
     "cpdf_imageloader.cpp",
     "cpdf_imageloader.h",
     "cpdf_imagerenderer.cpp",
diff --git a/core/fpdfapi/render/cpdf_imagecacheentry.cpp b/core/fpdfapi/render/cpdf_imagecacheentry.cpp
deleted file mode 100644
index fe4e331..0000000
--- a/core/fpdfapi/render/cpdf_imagecacheentry.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fpdfapi/render/cpdf_imagecacheentry.h"
-
-#include <utility>
-
-#include "core/fpdfapi/page/cpdf_dib.h"
-#include "core/fpdfapi/page/cpdf_image.h"
-#include "core/fpdfapi/page/cpdf_page.h"
-#include "core/fpdfapi/parser/cpdf_dictionary.h"
-#include "core/fpdfapi/parser/cpdf_document.h"
-#include "core/fpdfapi/parser/cpdf_stream.h"
-#include "core/fpdfapi/render/cpdf_pagerendercache.h"
-#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)
-    : m_pDocument(pDoc), m_pImage(std::move(pImage)) {}
-
-CPDF_ImageCacheEntry::~CPDF_ImageCacheEntry() = default;
-
-void CPDF_ImageCacheEntry::Reset() {
-  m_pCachedBitmap.Reset();
-  CalcSize();
-}
-
-RetainPtr<CFX_DIBBase> CPDF_ImageCacheEntry::DetachBitmap() {
-  return std::move(m_pCurBitmap);
-}
-
-RetainPtr<CFX_DIBBase> CPDF_ImageCacheEntry::DetachMask() {
-  return std::move(m_pCurMask);
-}
-
-CPDF_DIB::LoadState CPDF_ImageCacheEntry::StartGetCachedBitmap(
-    const CPDF_Dictionary* pPageResources,
-    const CPDF_RenderStatus* pRenderStatus,
-    bool bStdCS) {
-  if (m_pCachedBitmap) {
-    m_pCurBitmap = m_pCachedBitmap;
-    m_pCurMask = m_pCachedMask;
-    return CPDF_DIB::LoadState::kSuccess;
-  }
-
-  // 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());
-  if (ret == CPDF_DIB::LoadState::kContinue)
-    return CPDF_DIB::LoadState::kContinue;
-
-  if (ret == CPDF_DIB::LoadState::kSuccess)
-    ContinueGetCachedBitmap(pRenderStatus);
-  else
-    m_pCurBitmap.Reset();
-  return CPDF_DIB::LoadState::kFail;
-}
-
-bool CPDF_ImageCacheEntry::Continue(PauseIndicatorIface* pPause,
-                                    CPDF_RenderStatus* pRenderStatus) {
-  CPDF_DIB::LoadState ret =
-      m_pCurBitmap.As<CPDF_DIB>()->ContinueLoadDIBBase(pPause);
-  if (ret == CPDF_DIB::LoadState::kContinue)
-    return true;
-
-  if (ret == CPDF_DIB::LoadState::kSuccess)
-    ContinueGetCachedBitmap(pRenderStatus);
-  else
-    m_pCurBitmap.Reset();
-  return false;
-}
-
-void CPDF_ImageCacheEntry::ContinueGetCachedBitmap(
-    const CPDF_RenderStatus* pRenderStatus) {
-  m_MatteColor = m_pCurBitmap.As<CPDF_DIB>()->GetMatteColor();
-  m_pCurMask = m_pCurBitmap.As<CPDF_DIB>()->DetachMask();
-  CPDF_RenderContext* pContext = pRenderStatus->GetContext();
-  CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache();
-  m_dwTimeCount = pPageRenderCache->GetTimeCount();
-  if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < kHugeImageSize) {
-    m_pCachedBitmap = m_pCurBitmap->Realize();
-    m_pCurBitmap.Reset();
-  } else {
-    m_pCachedBitmap = m_pCurBitmap;
-  }
-  if (m_pCurMask) {
-    m_pCachedMask = m_pCurMask->Realize();
-    m_pCurMask.Reset();
-  }
-  m_pCurBitmap = m_pCachedBitmap;
-  m_pCurMask = m_pCachedMask;
-  CalcSize();
-}
-
-void CPDF_ImageCacheEntry::CalcSize() {
-  m_dwCacheSize = 0;
-  if (m_pCachedBitmap)
-    m_dwCacheSize += m_pCachedBitmap->GetEstimatedImageMemoryBurden();
-  if (m_pCachedMask)
-    m_dwCacheSize += m_pCachedMask->GetEstimatedImageMemoryBurden();
-}
diff --git a/core/fpdfapi/render/cpdf_imagecacheentry.h b/core/fpdfapi/render/cpdf_imagecacheentry.h
deleted file mode 100644
index 802da84..0000000
--- a/core/fpdfapi/render/cpdf_imagecacheentry.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_
-#define CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_
-
-#include <stdint.h>
-
-#include "core/fpdfapi/page/cpdf_dib.h"
-#include "core/fxcrt/retain_ptr.h"
-#include "core/fxcrt/unowned_ptr.h"
-
-class CPDF_Dictionary;
-class CPDF_Document;
-class CPDF_Image;
-class CPDF_RenderStatus;
-class PauseIndicatorIface;
-
-class CPDF_ImageCacheEntry {
- public:
-  CPDF_ImageCacheEntry(CPDF_Document* pDoc, RetainPtr<CPDF_Image> pImage);
-  ~CPDF_ImageCacheEntry();
-
-  void Reset();
-  uint32_t EstimateSize() const { return m_dwCacheSize; }
-  uint32_t GetMatteColor() const { return m_MatteColor; }
-  uint32_t GetTimeCount() const { return m_dwTimeCount; }
-  void SetTimeCount(uint32_t count) { m_dwTimeCount = count; }
-  CPDF_Image* GetImage() const { return m_pImage.Get(); }
-
-  CPDF_DIB::LoadState StartGetCachedBitmap(
-      const CPDF_Dictionary* pPageResources,
-      const CPDF_RenderStatus* pRenderStatus,
-      bool bStdCS);
-
-  // Returns whether to Continue() or not.
-  bool Continue(PauseIndicatorIface* pPause, CPDF_RenderStatus* pRenderStatus);
-
-  RetainPtr<CFX_DIBBase> DetachBitmap();
-  RetainPtr<CFX_DIBBase> DetachMask();
-
- private:
-  void ContinueGetCachedBitmap(const CPDF_RenderStatus* pRenderStatus);
-  void CalcSize();
-
-  uint32_t m_dwTimeCount = 0;
-  uint32_t m_MatteColor = 0;
-  uint32_t m_dwCacheSize = 0;
-  UnownedPtr<CPDF_Document> const m_pDocument;
-  RetainPtr<CPDF_Image> const m_pImage;
-  RetainPtr<CFX_DIBBase> m_pCurBitmap;
-  RetainPtr<CFX_DIBBase> m_pCurMask;
-  RetainPtr<CFX_DIBBase> m_pCachedBitmap;
-  RetainPtr<CFX_DIBBase> m_pCachedMask;
-};
-
-#endif  // CORE_FPDFAPI_RENDER_CPDF_IMAGECACHEENTRY_H_
diff --git a/core/fpdfapi/render/cpdf_imageloader.cpp b/core/fpdfapi/render/cpdf_imageloader.cpp
index f2d53df..f1602eb 100644
--- a/core/fpdfapi/render/cpdf_imageloader.cpp
+++ b/core/fpdfapi/render/cpdf_imageloader.cpp
@@ -12,7 +12,6 @@
 #include "core/fpdfapi/page/cpdf_image.h"
 #include "core/fpdfapi/page/cpdf_imageobject.h"
 #include "core/fpdfapi/page/cpdf_transferfunc.h"
-#include "core/fpdfapi/render/cpdf_imagecacheentry.h"
 #include "core/fpdfapi/render/cpdf_pagerendercache.h"
 #include "core/fpdfapi/render/cpdf_rendercontext.h"
 #include "core/fpdfapi/render/cpdf_renderstatus.h"
@@ -64,11 +63,10 @@
 
 void CPDF_ImageLoader::HandleFailure() {
   if (m_pCache) {
-    CPDF_ImageCacheEntry* entry = m_pCache->GetCurImageCacheEntry();
     m_bCached = true;
-    m_pBitmap = entry->DetachBitmap();
-    m_pMask = entry->DetachMask();
-    m_MatteColor = entry->GetMatteColor();
+    m_pBitmap = m_pCache->DetachCurBitmap();
+    m_pMask = m_pCache->DetachCurMask();
+    m_MatteColor = m_pCache->GetCurMatteColor();
     return;
   }
   RetainPtr<CPDF_Image> pImage = m_pImageObject->GetImage();
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.cpp b/core/fpdfapi/render/cpdf_pagerendercache.cpp
index 956f2fe..4a49778 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.cpp
+++ b/core/fpdfapi/render/cpdf_pagerendercache.cpp
@@ -10,9 +10,13 @@
 #include <utility>
 #include <vector>
 
+#include "core/fpdfapi/page/cpdf_dib.h"
 #include "core/fpdfapi/page/cpdf_image.h"
 #include "core/fpdfapi/page/cpdf_page.h"
-#include "core/fpdfapi/render/cpdf_imagecacheentry.h"
+#include "core/fpdfapi/parser/cpdf_dictionary.h"
+#include "core/fpdfapi/parser/cpdf_document.h"
+#include "core/fpdfapi/parser/cpdf_stream.h"
+#include "core/fpdfapi/render/cpdf_rendercontext.h"
 #include "core/fpdfapi/render/cpdf_renderstatus.h"
 #include "core/fxcrt/stl_util.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
@@ -83,7 +87,7 @@
   if (m_bCurFindCache) {
     m_pCurImageCacheEntry = it->second.get();
   } else {
-    m_pCurImageCacheEntry = std::make_unique<CPDF_ImageCacheEntry>(
+    m_pCurImageCacheEntry = std::make_unique<ImageCacheEntry>(
         m_pPage->GetDocument(), std::move(pImage));
   }
   CPDF_DIB::LoadState ret = m_pCurImageCacheEntry->StartGetCachedBitmap(
@@ -117,14 +121,118 @@
 }
 
 void CPDF_PageRenderCache::ResetBitmapForImage(RetainPtr<CPDF_Image> pImage) {
-  CPDF_ImageCacheEntry* pEntry;
   const CPDF_Stream* pStream = pImage->GetStream();
   const auto it = m_ImageCache.find(pStream);
   if (it == m_ImageCache.end())
     return;
 
-  pEntry = it->second.get();
+  ImageCacheEntry* pEntry = it->second.get();
   m_nCacheSize -= pEntry->EstimateSize();
   pEntry->Reset();
   m_nCacheSize += pEntry->EstimateSize();
 }
+
+uint32_t CPDF_PageRenderCache::GetCurMatteColor() const {
+  return m_pCurImageCacheEntry->GetMatteColor();
+}
+
+RetainPtr<CFX_DIBBase> CPDF_PageRenderCache::DetachCurBitmap() {
+  return m_pCurImageCacheEntry->DetachBitmap();
+}
+
+RetainPtr<CFX_DIBBase> CPDF_PageRenderCache::DetachCurMask() {
+  return m_pCurImageCacheEntry->DetachMask();
+}
+
+CPDF_PageRenderCache::ImageCacheEntry::ImageCacheEntry(
+    CPDF_Document* pDoc,
+    RetainPtr<CPDF_Image> pImage)
+    : m_pDocument(pDoc), m_pImage(std::move(pImage)) {}
+
+CPDF_PageRenderCache::ImageCacheEntry::~ImageCacheEntry() = default;
+
+void CPDF_PageRenderCache::ImageCacheEntry::Reset() {
+  m_pCachedBitmap.Reset();
+  CalcSize();
+}
+
+RetainPtr<CFX_DIBBase> CPDF_PageRenderCache::ImageCacheEntry::DetachBitmap() {
+  return std::move(m_pCurBitmap);
+}
+
+RetainPtr<CFX_DIBBase> CPDF_PageRenderCache::ImageCacheEntry::DetachMask() {
+  return std::move(m_pCurMask);
+}
+
+CPDF_DIB::LoadState CPDF_PageRenderCache::ImageCacheEntry::StartGetCachedBitmap(
+    const CPDF_Dictionary* pPageResources,
+    const CPDF_RenderStatus* pRenderStatus,
+    bool bStdCS) {
+  if (m_pCachedBitmap) {
+    m_pCurBitmap = m_pCachedBitmap;
+    m_pCurMask = m_pCachedMask;
+    return CPDF_DIB::LoadState::kSuccess;
+  }
+
+  // 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());
+  if (ret == CPDF_DIB::LoadState::kContinue)
+    return CPDF_DIB::LoadState::kContinue;
+
+  if (ret == CPDF_DIB::LoadState::kSuccess)
+    ContinueGetCachedBitmap(pRenderStatus);
+  else
+    m_pCurBitmap.Reset();
+  return CPDF_DIB::LoadState::kFail;
+}
+
+bool CPDF_PageRenderCache::ImageCacheEntry::Continue(
+    PauseIndicatorIface* pPause,
+    CPDF_RenderStatus* pRenderStatus) {
+  CPDF_DIB::LoadState ret =
+      m_pCurBitmap.As<CPDF_DIB>()->ContinueLoadDIBBase(pPause);
+  if (ret == CPDF_DIB::LoadState::kContinue)
+    return true;
+
+  if (ret == CPDF_DIB::LoadState::kSuccess)
+    ContinueGetCachedBitmap(pRenderStatus);
+  else
+    m_pCurBitmap.Reset();
+  return false;
+}
+
+void CPDF_PageRenderCache::ImageCacheEntry::ContinueGetCachedBitmap(
+    const CPDF_RenderStatus* pRenderStatus) {
+  m_MatteColor = m_pCurBitmap.As<CPDF_DIB>()->GetMatteColor();
+  m_pCurMask = m_pCurBitmap.As<CPDF_DIB>()->DetachMask();
+  CPDF_RenderContext* pContext = pRenderStatus->GetContext();
+  CPDF_PageRenderCache* pPageRenderCache = pContext->GetPageCache();
+  m_dwTimeCount = pPageRenderCache->GetTimeCount();
+  if (m_pCurBitmap->GetPitch() * m_pCurBitmap->GetHeight() < kHugeImageSize) {
+    m_pCachedBitmap = m_pCurBitmap->Realize();
+    m_pCurBitmap.Reset();
+  } else {
+    m_pCachedBitmap = m_pCurBitmap;
+  }
+  if (m_pCurMask) {
+    m_pCachedMask = m_pCurMask->Realize();
+    m_pCurMask.Reset();
+  }
+  m_pCurBitmap = m_pCachedBitmap;
+  m_pCurMask = m_pCachedMask;
+  CalcSize();
+}
+
+void CPDF_PageRenderCache::ImageCacheEntry::CalcSize() {
+  m_dwCacheSize = 0;
+  if (m_pCachedBitmap)
+    m_dwCacheSize += m_pCachedBitmap->GetEstimatedImageMemoryBurden();
+  if (m_pCachedMask)
+    m_dwCacheSize += m_pCachedMask->GetEstimatedImageMemoryBurden();
+}
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.h b/core/fpdfapi/render/cpdf_pagerendercache.h
index 6270964..e98dba1 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.h
+++ b/core/fpdfapi/render/cpdf_pagerendercache.h
@@ -12,13 +12,15 @@
 #include <map>
 #include <memory>
 
+#include "core/fpdfapi/page/cpdf_dib.h"
 #include "core/fpdfapi/page/cpdf_page.h"
 #include "core/fxcrt/maybe_owned.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 
+class CPDF_Dictionary;
+class CPDF_Document;
 class CPDF_Image;
-class CPDF_ImageCacheEntry;
 class CPDF_Page;
 class CPDF_RenderStatus;
 class CPDF_Stream;
@@ -35,9 +37,6 @@
   void CacheOptimization(int32_t dwLimitCacheSize);
   uint32_t GetTimeCount() const { return m_nTimeCount; }
   CPDF_Page* GetPage() const { return m_pPage.Get(); }
-  CPDF_ImageCacheEntry* GetCurImageCacheEntry() const {
-    return m_pCurImageCacheEntry.Get();
-  }
 
   bool StartGetCachedBitmap(RetainPtr<CPDF_Image> pImage,
                             const CPDF_RenderStatus* pRenderStatus,
@@ -45,13 +44,55 @@
 
   bool Continue(PauseIndicatorIface* pPause, CPDF_RenderStatus* pRenderStatus);
 
+  uint32_t GetCurMatteColor() const;
+  RetainPtr<CFX_DIBBase> DetachCurBitmap();
+  RetainPtr<CFX_DIBBase> DetachCurMask();
+
  private:
+  class ImageCacheEntry {
+   public:
+    ImageCacheEntry(CPDF_Document* pDoc, RetainPtr<CPDF_Image> pImage);
+    ~ImageCacheEntry();
+
+    void Reset();
+    uint32_t EstimateSize() const { return m_dwCacheSize; }
+    uint32_t GetMatteColor() const { return m_MatteColor; }
+    uint32_t GetTimeCount() const { return m_dwTimeCount; }
+    void SetTimeCount(uint32_t count) { m_dwTimeCount = count; }
+    CPDF_Image* GetImage() const { return m_pImage.Get(); }
+
+    CPDF_DIB::LoadState StartGetCachedBitmap(
+        const CPDF_Dictionary* pPageResources,
+        const CPDF_RenderStatus* pRenderStatus,
+        bool bStdCS);
+
+    // Returns whether to Continue() or not.
+    bool Continue(PauseIndicatorIface* pPause,
+                  CPDF_RenderStatus* pRenderStatus);
+
+    RetainPtr<CFX_DIBBase> DetachBitmap();
+    RetainPtr<CFX_DIBBase> DetachMask();
+
+   private:
+    void ContinueGetCachedBitmap(const CPDF_RenderStatus* pRenderStatus);
+    void CalcSize();
+
+    uint32_t m_dwTimeCount = 0;
+    uint32_t m_MatteColor = 0;
+    uint32_t m_dwCacheSize = 0;
+    UnownedPtr<CPDF_Document> const m_pDocument;
+    RetainPtr<CPDF_Image> const m_pImage;
+    RetainPtr<CFX_DIBBase> m_pCurBitmap;
+    RetainPtr<CFX_DIBBase> m_pCurMask;
+    RetainPtr<CFX_DIBBase> m_pCachedBitmap;
+    RetainPtr<CFX_DIBBase> m_pCachedMask;
+  };
+
   void ClearImageCacheEntry(const CPDF_Stream* pStream);
 
   UnownedPtr<CPDF_Page> const m_pPage;
-  std::map<const CPDF_Stream*, std::unique_ptr<CPDF_ImageCacheEntry>>
-      m_ImageCache;
-  MaybeOwned<CPDF_ImageCacheEntry> m_pCurImageCacheEntry;
+  std::map<const CPDF_Stream*, std::unique_ptr<ImageCacheEntry>> m_ImageCache;
+  MaybeOwned<ImageCacheEntry> m_pCurImageCacheEntry;
   uint32_t m_nTimeCount = 0;
   uint32_t m_nCacheSize = 0;
   bool m_bCurFindCache = false;
diff --git a/core/fpdfapi/render/cpdf_renderstatus.h b/core/fpdfapi/render/cpdf_renderstatus.h
index e42cda9..a1e5079 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.h
+++ b/core/fpdfapi/render/cpdf_renderstatus.h
@@ -26,7 +26,6 @@
 class CPDF_Color;
 class CPDF_Font;
 class CPDF_FormObject;
-class CPDF_ImageCacheEntry;
 class CPDF_ImageObject;
 class CPDF_ImageRenderer;
 class CPDF_Object;