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;