diff options
Diffstat (limited to 'core/fpdfapi/render')
-rw-r--r-- | core/fpdfapi/render/cpdf_docrenderdata.cpp | 35 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_docrenderdata.h | 9 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_renderstatus.cpp | 21 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_renderstatus.h | 2 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_type3cache.h | 10 |
5 files changed, 35 insertions, 42 deletions
diff --git a/core/fpdfapi/render/cpdf_docrenderdata.cpp b/core/fpdfapi/render/cpdf_docrenderdata.cpp index 39d1fcd0b4..2d0bca4497 100644 --- a/core/fpdfapi/render/cpdf_docrenderdata.cpp +++ b/core/fpdfapi/render/cpdf_docrenderdata.cpp @@ -32,10 +32,7 @@ CPDF_DocRenderData::~CPDF_DocRenderData() { void CPDF_DocRenderData::Clear(bool bRelease) { for (auto it = m_Type3FaceMap.begin(); it != m_Type3FaceMap.end();) { auto curr_it = it++; - CPDF_CountedObject<CPDF_Type3Cache>* cache = curr_it->second; - if (bRelease || cache->use_count() < 2) { - delete cache->get(); - delete cache; + if (bRelease || curr_it->second->HasOneRef()) { m_Type3FaceMap.erase(curr_it); } } @@ -47,29 +44,21 @@ void CPDF_DocRenderData::Clear(bool bRelease) { } } -CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont) { - CPDF_CountedObject<CPDF_Type3Cache>* pCache; +CFX_RetainPtr<CPDF_Type3Cache> CPDF_DocRenderData::GetCachedType3( + CPDF_Type3Font* pFont) { auto it = m_Type3FaceMap.find(pFont); - if (it == m_Type3FaceMap.end()) { - pCache = new CPDF_CountedObject<CPDF_Type3Cache>( - pdfium::MakeUnique<CPDF_Type3Cache>(pFont)); - m_Type3FaceMap[pFont] = pCache; - } else { - pCache = it->second; - } - return pCache->AddRef(); + if (it != m_Type3FaceMap.end()) + return it->second; + + auto pCache = pdfium::MakeRetain<CPDF_Type3Cache>(pFont); + m_Type3FaceMap[pFont] = pCache; + return pCache; } -void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont) { +void CPDF_DocRenderData::MaybePurgeCachedType3(CPDF_Type3Font* pFont) { auto it = m_Type3FaceMap.find(pFont); - if (it != m_Type3FaceMap.end()) { - it->second->RemoveRef(); - if (it->second->use_count() < 2) { - delete it->second->get(); - delete it->second; - m_Type3FaceMap.erase(it); - } - } + if (it != m_Type3FaceMap.end() && it->second->HasOneRef()) + m_Type3FaceMap.erase(it); } CFX_RetainPtr<CPDF_TransferFunc> CPDF_DocRenderData::GetTransferFunc( diff --git a/core/fpdfapi/render/cpdf_docrenderdata.h b/core/fpdfapi/render/cpdf_docrenderdata.h index 5daee34176..7952f95991 100644 --- a/core/fpdfapi/render/cpdf_docrenderdata.h +++ b/core/fpdfapi/render/cpdf_docrenderdata.h @@ -23,8 +23,8 @@ class CPDF_DocRenderData { explicit CPDF_DocRenderData(CPDF_Document* pPDFDoc); ~CPDF_DocRenderData(); - CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); - void ReleaseCachedType3(CPDF_Type3Font* pFont); + CFX_RetainPtr<CPDF_Type3Cache> GetCachedType3(CPDF_Type3Font* pFont); + void MaybePurgeCachedType3(CPDF_Type3Font* pFont); CFX_RetainPtr<CPDF_TransferFunc> GetTransferFunc(CPDF_Object* pObj); void MaybePurgeTransferFunc(CPDF_Object* pOb); @@ -32,11 +32,8 @@ class CPDF_DocRenderData { void Clear(bool bRelease); private: - using CPDF_Type3CacheMap = - std::map<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache>*>; - CPDF_Document* m_pPDFDoc; // Not Owned - CPDF_Type3CacheMap m_Type3FaceMap; + std::map<CPDF_Font*, CFX_RetainPtr<CPDF_Type3Cache>> m_Type3FaceMap; std::map<CPDF_Object*, CFX_RetainPtr<CPDF_TransferFunc>> m_TransferFuncMap; }; diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index 69293e6ed3..09e5bc1433 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -66,11 +66,12 @@ namespace { void ReleaseCachedType3(CPDF_Type3Font* pFont) { - if (!pFont->m_pDocument) + CPDF_Document* pDoc = pFont->m_pDocument; + if (!pDoc) return; - pFont->m_pDocument->GetRenderData()->ReleaseCachedType3(pFont); - pFont->m_pDocument->GetPageData()->ReleaseFont(pFont->GetFontDict()); + pDoc->GetRenderData()->MaybePurgeCachedType3(pFont); + pDoc->GetPageData()->ReleaseFont(pFont->GetFontDict()); } class CPDF_RefType3Cache { @@ -1795,12 +1796,14 @@ bool CPDF_RenderStatus::ProcessText(CPDF_TextObject* textobj, &text_matrix, fill_argb, &m_Options); } -CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont) { - if (!pFont->m_pDocument) { +CFX_RetainPtr<CPDF_Type3Cache> CPDF_RenderStatus::GetCachedType3( + CPDF_Type3Font* pFont) { + CPDF_Document* pDoc = pFont->m_pDocument; + if (!pDoc) return nullptr; - } - pFont->m_pDocument->GetPageData()->GetFont(pFont->GetFontDict()); - return pFont->m_pDocument->GetRenderData()->GetCachedType3(pFont); + + pDoc->GetPageData()->GetFont(pFont->GetFontDict()); + return pDoc->GetRenderData()->GetCachedType3(pFont); } // TODO(npm): Font fallback for type 3 fonts? (Completely separate code!!) @@ -1902,7 +1905,7 @@ bool CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj, delete pStates; } else if (pType3Char->m_pBitmap) { if (device_class == FXDC_DISPLAY) { - CPDF_Type3Cache* pCache = GetCachedType3(pType3Font); + CFX_RetainPtr<CPDF_Type3Cache> pCache = GetCachedType3(pType3Font); refTypeCache.m_dwCount++; CFX_GlyphBitmap* pBitmap = pCache->LoadGlyph(charcode, &matrix, sa, sd); if (!pBitmap) diff --git a/core/fpdfapi/render/cpdf_renderstatus.h b/core/fpdfapi/render/cpdf_renderstatus.h index 354c7b163a..e9d1f87387 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.h +++ b/core/fpdfapi/render/cpdf_renderstatus.h @@ -141,7 +141,7 @@ class CPDF_RenderStatus { CFX_RetainPtr<CFX_DIBitmap> LoadSMask(CPDF_Dictionary* pSMaskDict, FX_RECT* pClipRect, const CFX_Matrix* pMatrix); - static CPDF_Type3Cache* GetCachedType3(CPDF_Type3Font* pFont); + static CFX_RetainPtr<CPDF_Type3Cache> GetCachedType3(CPDF_Type3Font* pFont); static CPDF_GraphicStates* CloneObjStates(const CPDF_GraphicStates* pPathObj, bool bStroke); CFX_RetainPtr<CPDF_TransferFunc> GetTransferFunc(CPDF_Object* pObject) const; diff --git a/core/fpdfapi/render/cpdf_type3cache.h b/core/fpdfapi/render/cpdf_type3cache.h index f03578650b..0b3cdcbfa4 100644 --- a/core/fpdfapi/render/cpdf_type3cache.h +++ b/core/fpdfapi/render/cpdf_type3cache.h @@ -10,16 +10,17 @@ #include <map> #include "core/fpdfapi/font/cpdf_type3font.h" +#include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/fx_coordinates.h" #include "core/fxcrt/fx_string.h" #include "core/fxcrt/fx_system.h" class CPDF_Type3Glyphs; -class CPDF_Type3Cache { +class CPDF_Type3Cache : public CFX_Retainable { public: - explicit CPDF_Type3Cache(CPDF_Type3Font* pFont); - ~CPDF_Type3Cache(); + template <typename T, typename... Args> + friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args); CFX_GlyphBitmap* LoadGlyph(uint32_t charcode, const CFX_Matrix* pMatrix, @@ -27,6 +28,9 @@ class CPDF_Type3Cache { float retinaScaleY); private: + explicit CPDF_Type3Cache(CPDF_Type3Font* pFont); + ~CPDF_Type3Cache() override; + CFX_GlyphBitmap* RenderGlyph(CPDF_Type3Glyphs* pSize, uint32_t charcode, const CFX_Matrix* pMatrix, |