Use smart pointers in CPDF_PageRenderCache.

Use std::unique_ptr and MaybeOwned, instead of manual memory management.

Change-Id: I5f08abd869245fb55b7e868621369ff3ea34146f
Reviewed-on: https://pdfium-review.googlesource.com/43211
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.cpp b/core/fpdfapi/render/cpdf_pagerendercache.cpp
index dfd05bc..f58837a 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.cpp
+++ b/core/fpdfapi/render/cpdf_pagerendercache.cpp
@@ -28,17 +28,9 @@
 
 }  // namespace
 
-CPDF_PageRenderCache::CPDF_PageRenderCache(CPDF_Page* pPage)
-    : m_pPage(pPage),
-      m_pCurImageCacheEntry(nullptr),
-      m_nTimeCount(0),
-      m_nCacheSize(0),
-      m_bCurFindCache(false) {}
+CPDF_PageRenderCache::CPDF_PageRenderCache(CPDF_Page* pPage) : m_pPage(pPage) {}
 
-CPDF_PageRenderCache::~CPDF_PageRenderCache() {
-  for (const auto& it : m_ImageCache)
-    delete it.second;
-}
+CPDF_PageRenderCache::~CPDF_PageRenderCache() = default;
 
 void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) {
   if (m_nCacheSize <= (uint32_t)dwLimitCacheSize)
@@ -76,7 +68,6 @@
     return;
 
   m_nCacheSize -= it->second->EstimateSize();
-  delete it->second;
   m_ImageCache.erase(it);
 }
 
@@ -90,10 +81,10 @@
   const auto it = m_ImageCache.find(pStream);
   m_bCurFindCache = it != m_ImageCache.end();
   if (m_bCurFindCache) {
-    m_pCurImageCacheEntry = it->second;
+    m_pCurImageCacheEntry = it->second.get();
   } else {
-    m_pCurImageCacheEntry =
-        new CPDF_ImageCacheEntry(m_pPage->GetDocument(), pImage);
+    m_pCurImageCacheEntry = pdfium::MakeUnique<CPDF_ImageCacheEntry>(
+        m_pPage->GetDocument(), pImage);
   }
   CPDF_DIBBase::LoadState ret = m_pCurImageCacheEntry->StartGetCachedBitmap(
       pRenderStatus->GetFormResource(), m_pPage->m_pPageResources.Get(), bStdCS,
@@ -103,7 +94,7 @@
 
   m_nTimeCount++;
   if (!m_bCurFindCache)
-    m_ImageCache[pStream] = m_pCurImageCacheEntry;
+    m_ImageCache[pStream] = m_pCurImageCacheEntry.Release();
 
   if (ret == CPDF_DIBBase::LoadState::kFail)
     m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
@@ -120,7 +111,7 @@
   m_nTimeCount++;
   if (!m_bCurFindCache) {
     m_ImageCache[m_pCurImageCacheEntry->GetImage()->GetStream()] =
-        m_pCurImageCacheEntry;
+        m_pCurImageCacheEntry.Release();
   }
   m_nCacheSize += m_pCurImageCacheEntry->EstimateSize();
   return false;
@@ -133,7 +124,7 @@
   if (it == m_ImageCache.end())
     return;
 
-  pEntry = it->second;
+  pEntry = it->second.get();
   m_nCacheSize -= pEntry->EstimateSize();
   pEntry->Reset(nullptr);
   m_nCacheSize += pEntry->EstimateSize();
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.h b/core/fpdfapi/render/cpdf_pagerendercache.h
index 8f0cb59..5cfdebb 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.h
+++ b/core/fpdfapi/render/cpdf_pagerendercache.h
@@ -8,8 +8,10 @@
 #define CORE_FPDFAPI_RENDER_CPDF_PAGERENDERCACHE_H_
 
 #include <map>
+#include <memory>
 
 #include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/maybe_owned.h"
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxcrt/unowned_ptr.h"
 
@@ -30,7 +32,7 @@
   void ResetBitmap(const RetainPtr<CPDF_Image>& pImage);
   CPDF_Page* GetPage() const { return m_pPage.Get(); }
   CPDF_ImageCacheEntry* GetCurImageCacheEntry() const {
-    return m_pCurImageCacheEntry;
+    return m_pCurImageCacheEntry.Get();
   }
 
   bool StartGetCachedBitmap(const RetainPtr<CPDF_Image>& pImage,
@@ -45,11 +47,11 @@
   void ClearImageCacheEntry(CPDF_Stream* pStream);
 
   UnownedPtr<CPDF_Page> const m_pPage;
-  CPDF_ImageCacheEntry* m_pCurImageCacheEntry;
-  std::map<CPDF_Stream*, CPDF_ImageCacheEntry*> m_ImageCache;
-  uint32_t m_nTimeCount;
-  uint32_t m_nCacheSize;
-  bool m_bCurFindCache;
+  std::map<CPDF_Stream*, std::unique_ptr<CPDF_ImageCacheEntry>> m_ImageCache;
+  MaybeOwned<CPDF_ImageCacheEntry> m_pCurImageCacheEntry;
+  uint32_t m_nTimeCount = 0;
+  uint32_t m_nCacheSize = 0;
+  bool m_bCurFindCache = false;
 };
 
 #endif  // CORE_FPDFAPI_RENDER_CPDF_PAGERENDERCACHE_H_