diff options
author | Tom Sepez <tsepez@chromium.org> | 2015-06-15 16:58:19 -0700 |
---|---|---|
committer | Tom Sepez <tsepez@chromium.org> | 2015-06-15 16:58:19 -0700 |
commit | 3403db90496fc87269d7bb1d033347ee19fc0c38 (patch) | |
tree | 5a021983df77507ccead2cdb6faef4f2b6294c04 | |
parent | 366e1c47335717b73d14b804020291758c8afc38 (diff) | |
download | pdfium-3403db90496fc87269d7bb1d033347ee19fc0c38.tar.xz |
Merge to XFA: Provide a constructor for CPDF_CountedObject.
Original Review URL: https://codereview.chromium.org/1182903002.
TBR=thestig@chromium.org
Review URL: https://codereview.chromium.org/1191553005.
-rw-r--r-- | core/include/fpdfapi/fpdf_resource.h | 26 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp | 6 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp | 206 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp | 2 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_page/pageint.h | 8 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_render/fpdf_render.cpp | 42 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_render/render_int.h | 4 |
7 files changed, 138 insertions, 156 deletions
diff --git a/core/include/fpdfapi/fpdf_resource.h b/core/include/fpdfapi/fpdf_resource.h index 268e75c7bf..2787d97329 100644 --- a/core/include/fpdfapi/fpdf_resource.h +++ b/core/include/fpdfapi/fpdf_resource.h @@ -7,6 +7,7 @@ #ifndef CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_ #define CORE_INCLUDE_FPDFAPI_FPDF_RESOURCE_H_ +#include "../fxcrt/fx_system.h" #include "../fxge/fx_font.h" #include "fpdf_parser.h" @@ -37,14 +38,29 @@ class CPDF_Type1Font; class CPDF_Type3Font; typedef struct FT_FaceRec_* FXFT_Face; -template <class ObjClass> class CPDF_CountedObject +template <class T> class CPDF_CountedObject { public: - ObjClass m_Obj; - FX_DWORD m_nCount; + explicit CPDF_CountedObject(T* ptr) : m_nCount(1), m_pObj(ptr) { } + void reset(T* ptr) { // CAUTION: tosses prior ref counts. + m_nCount = 1; + m_pObj = ptr; + } + void clear() { // Now you're all weak ptrs ... + delete m_pObj; + m_pObj = nullptr; + } + T* get() const { return m_pObj; } + T* AddRef() { FXSYS_assert(m_pObj); ++m_nCount; return m_pObj; } + void RemoveRef() { if (m_nCount) --m_nCount; } + size_t use_count() const { return m_nCount; } + +protected: + size_t m_nCount; + T* m_pObj; }; -using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace*>; -using CPDF_CountedPattern = CPDF_CountedObject<CPDF_Pattern*>; +using CPDF_CountedColorSpace = CPDF_CountedObject<CPDF_ColorSpace>; +using CPDF_CountedPattern = CPDF_CountedObject<CPDF_Pattern>; #define PDFFONT_TYPE1 1 #define PDFFONT_TRUETYPE 2 diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp index 1bab98dc18..8ee966fcfb 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_colors.cpp @@ -783,7 +783,7 @@ CPDF_IndexedCS::~CPDF_IndexedCS() if (m_pCompMinMax) { FX_Free(m_pCompMinMax); } - CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->m_Obj : NULL; + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL; if (pCS && m_pDocument) { m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); } @@ -869,7 +869,7 @@ CPDF_PatternCS::CPDF_PatternCS() } CPDF_PatternCS::~CPDF_PatternCS() { - CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->m_Obj : NULL; + CPDF_ColorSpace* pCS = m_pCountedBaseCS ? m_pCountedBaseCS->get() : NULL; if (pCS && m_pDocument) { m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); } @@ -1309,7 +1309,7 @@ void CPDF_Color::ReleaseBuffer() } if (m_pCS->GetFamily() == PDFCS_PATTERN) { PatternValue* pvalue = (PatternValue*)m_pBuffer; - CPDF_Pattern* pPattern = pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->m_Obj : NULL; + CPDF_Pattern* pPattern = pvalue->m_pCountedPattern ? pvalue->m_pCountedPattern->get() : NULL; if (pPattern && pPattern->m_pDocument) { CPDF_DocPageData *pPageData = pPattern->m_pDocument->GetPageData(); if (pPageData) { diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp index ab945c5f87..0c2a773176 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp @@ -145,45 +145,43 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) for (auto& it : m_PatternMap) { CPDF_CountedPattern* ptData = it.second; - if (!ptData->m_Obj) + if (!ptData->get()) continue; - if (bForceRelease || ptData->m_nCount < 2) { - ptData->m_Obj->SetForceClear(bForceRelease); - delete ptData->m_Obj; - ptData->m_Obj = nullptr; + if (bForceRelease || ptData->use_count() < 2) { + ptData->get()->SetForceClear(bForceRelease); + ptData->clear(); } } for (auto& it : m_FontMap) { CPDF_CountedFont* fontData = it.second; - if (!fontData->m_Obj) + if (!fontData->get()) continue; - if (bForceRelease || fontData->m_nCount < 2) { - delete fontData->m_Obj; - fontData->m_Obj = nullptr; + if (bForceRelease || fontData->use_count() < 2) { + fontData->clear(); } } for (auto& it : m_ColorSpaceMap) { CPDF_CountedColorSpace* csData = it.second; - if (!csData->m_Obj) + if (!csData->get()) continue; - if (bForceRelease || csData->m_nCount < 2) { - csData->m_Obj->ReleaseCS(); - csData->m_Obj = nullptr; + if (bForceRelease || csData->use_count() < 2) { + csData->get()->ReleaseCS(); + csData->reset(nullptr); } } for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) { auto curr_it = it++; CPDF_CountedIccProfile* ipData = curr_it->second; - if (!ipData->m_Obj) + if (!ipData->get()) continue; - if (bForceRelease || ipData->m_nCount < 2) { + if (bForceRelease || ipData->use_count() < 2) { CPDF_Stream* ipKey = curr_it->first; FX_POSITION pos2 = m_HashProfileMap.GetStartPosition(); while (pos2) { @@ -195,7 +193,7 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) break; } } - delete ipData->m_Obj; + delete ipData->get(); delete ipData; m_IccProfileMap.erase(curr_it); } @@ -204,11 +202,11 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) { auto curr_it = it++; CPDF_CountedStreamAcc* ftData = curr_it->second; - if (!ftData->m_Obj) + if (!ftData->get()) continue; - if (bForceRelease || ftData->m_nCount < 2) { - delete ftData->m_Obj; + if (bForceRelease || ftData->use_count() < 2) { + delete ftData->get(); delete ftData; m_FontFileMap.erase(curr_it); } @@ -217,11 +215,11 @@ void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) { auto curr_it = it++; CPDF_CountedImage* imageData = curr_it->second; - if (!imageData->m_Obj) + if (!imageData->get()) continue; - if (bForceRelease || imageData->m_nCount < 2) { - delete imageData->m_Obj; + if (bForceRelease || imageData->use_count() < 2) { + delete imageData->get(); delete imageData; m_ImageMap.erase(curr_it); } @@ -235,13 +233,8 @@ CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl } if (findOnly) { auto it = m_FontMap.find(pFontDict); - if (it != m_FontMap.end()) { - CPDF_CountedFont* fontData = it->second; - if (!fontData->m_Obj) - return nullptr; - - fontData->m_nCount++; - return fontData->m_Obj; + if (it != m_FontMap.end() && it->second->get()) { + return it->second->AddRef(); } return nullptr; } @@ -250,28 +243,22 @@ CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl auto it = m_FontMap.find(pFontDict); if (it != m_FontMap.end()) { fontData = it->second; - if (fontData->m_Obj) { - fontData->m_nCount++; - return fontData->m_Obj; + if (fontData->get()) { + return fontData->AddRef(); } } - FX_BOOL bNew = FALSE; - if (!fontData) { - fontData = new CPDF_CountedFont; - bNew = TRUE; - } CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict); if (!pFont) { - if (bNew) - delete fontData; return nullptr; } - fontData->m_nCount = 2; - fontData->m_Obj = pFont; - if (bNew) + if (!fontData) { + fontData = new CPDF_CountedFont(pFont); m_FontMap[pFontDict] = fontData; - return pFont; + } else { + fontData->reset(pFont); + } + return fontData->AddRef(); } CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CPDF_FontEncoding* pEncoding) @@ -281,7 +268,7 @@ CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CP for (auto& it : m_FontMap) { CPDF_CountedFont* fontData = it.second; - CPDF_Font* pFont = fontData->m_Obj; + CPDF_Font* pFont = fontData->get(); if (!pFont) continue; if (pFont->GetBaseFont() != fontName) @@ -297,8 +284,7 @@ CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CP if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) continue; - fontData->m_nCount++; - return pFont; + return fontData->AddRef(); } CPDF_Dictionary* pDict = new CPDF_Dictionary; @@ -309,16 +295,13 @@ CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CP pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize()); } m_pPDFDoc->AddIndirectObject(pDict); - CPDF_CountedFont* fontData = new CPDF_CountedFont; CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict); if (!pFont) { - delete fontData; return nullptr; } - fontData->m_nCount = 2; - fontData->m_Obj = pFont; + CPDF_CountedFont* fontData = new CPDF_CountedFont(pFont); m_FontMap[pDict] = fontData; - return pFont; + return fontData->AddRef(); } void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) @@ -331,9 +314,11 @@ void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) return; CPDF_CountedFont* fontData = it->second; - if (fontData->m_Obj && --fontData->m_nCount == 0) { - delete fontData->m_Obj; - fontData->m_Obj = nullptr; + if (fontData->get()) { + fontData->RemoveRef(); + if (fontData->use_count() == 0) { + fontData->clear(); + } } } @@ -389,9 +374,8 @@ CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dicti auto it = m_ColorSpaceMap.find(pCSObj); if (it != m_ColorSpaceMap.end()) { csData = it->second; - if (csData->m_Obj) { - csData->m_nCount++; - return csData->m_Obj; + if (csData->get()) { + return csData->AddRef(); } } @@ -400,12 +384,12 @@ CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dicti return nullptr; if (!csData) { - csData = new CPDF_CountedColorSpace; + csData = new CPDF_CountedColorSpace(pCS); m_ColorSpaceMap[pCSObj] = csData; + } else { + csData->reset(pCS); } - csData->m_nCount = 2; - csData->m_Obj = pCS; - return pCS; + return csData->AddRef(); } CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) @@ -414,15 +398,10 @@ CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) return nullptr; auto it = m_ColorSpaceMap.find(pCSObj); - if (it == m_ColorSpaceMap.end()) - return nullptr; - - CPDF_CountedColorSpace* csData = it->second; - if (!csData->m_Obj) - return nullptr; + if (it != m_ColorSpaceMap.end()) + return it->second->AddRef(); - csData->m_nCount++; - return csData->m_Obj; + return nullptr; } void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace) @@ -435,9 +414,12 @@ void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace) return; CPDF_CountedColorSpace* csData = it->second; - if (csData->m_Obj && --csData->m_nCount == 0) { - csData->m_Obj->ReleaseCS(); - csData->m_Obj = nullptr; + if (csData->get()) { + csData->RemoveRef(); + if (csData->use_count() == 0) { + csData->get()->ReleaseCS(); + csData->reset(nullptr); + } } } @@ -450,9 +432,8 @@ CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bSh auto it = m_PatternMap.find(pPatternObj); if (it != m_PatternMap.end()) { ptData = it->second; - if (ptData->m_Obj) { - ptData->m_nCount++; - return ptData->m_Obj; + if (ptData->get()) { + return ptData->AddRef(); } } CPDF_Pattern* pPattern = nullptr; @@ -473,12 +454,12 @@ CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bSh return nullptr; if (!ptData) { - ptData = new CPDF_CountedPattern; + ptData = new CPDF_CountedPattern(pPattern); m_PatternMap[pPatternObj] = ptData; + } else { + ptData->reset(pPattern); } - ptData->m_nCount = 2; - ptData->m_Obj = pPattern; - return pPattern; + return ptData->AddRef(); } void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) @@ -491,9 +472,11 @@ void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) return; CPDF_CountedPattern* ptData = it->second; - if (ptData->m_Obj && --ptData->m_nCount == 0) { - delete ptData->m_Obj; - ptData->m_Obj = nullptr; + if (ptData->get()) { + ptData->RemoveRef(); + if (ptData->use_count() == 0) { + ptData->clear(); + } } } @@ -505,17 +488,15 @@ CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) const FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); auto it = m_ImageMap.find(dwImageObjNum); if (it != m_ImageMap.end()) { - CPDF_CountedImage* imageData = it->second; - imageData->m_nCount++; - return imageData->m_Obj; + return it->second->AddRef(); } - CPDF_CountedImage* imageData = new CPDF_CountedImage; + CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc); pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE); - imageData->m_nCount = 2; - imageData->m_Obj = pImage; + + CPDF_CountedImage* imageData = new CPDF_CountedImage(pImage); m_ImageMap[dwImageObjNum] = imageData; - return pImage; + return imageData->AddRef(); } void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) @@ -531,8 +512,9 @@ void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) if (!image) return; - if ((--image->m_nCount) == 0) { - delete image->m_Obj; + image->RemoveRef(); + if (image->use_count() == 0) { + delete image->get(); delete image; m_ImageMap.erase(it); } @@ -545,9 +527,7 @@ CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) auto it = m_IccProfileMap.find(pIccProfileStream); if (it != m_IccProfileMap.end()) { - CPDF_CountedIccProfile* ipData = it->second; - ipData->m_nCount++; - return ipData->m_Obj; + return it->second->AddRef(); } CPDF_StreamAcc stream; @@ -557,17 +537,13 @@ CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) { auto it_copied_stream = m_IccProfileMap.find(pCopiedStream); - CPDF_CountedIccProfile* ipData = it_copied_stream->second; - ipData->m_nCount++; - return ipData->m_Obj; + return it_copied_stream->second->AddRef(); } CPDF_IccProfile* pProfile = new CPDF_IccProfile(stream.GetData(), stream.GetSize()); - CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile; - ipData->m_nCount = 2; - ipData->m_Obj = pProfile; + CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); m_IccProfileMap[pIccProfileStream] = ipData; m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); - return pProfile; + return ipData->AddRef(); } void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) @@ -576,11 +552,12 @@ void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { CPDF_CountedIccProfile* profile = it->second; - if (profile->m_Obj != pIccProfile) + if (profile->get() != pIccProfile) continue; - if ((--profile->m_nCount) == 0) { - delete profile->m_Obj; + profile->RemoveRef(); + if (profile->use_count() == 0) { + delete profile->get(); delete profile; m_IccProfileMap.erase(it); return; @@ -593,14 +570,9 @@ CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream) ASSERT(pFontStream); auto it = m_FontFileMap.find(pFontStream); - if (it != m_FontFileMap.end()) { - CPDF_CountedStreamAcc* ftData = it->second; - ftData->m_nCount++; - return ftData->m_Obj; - } + if (it != m_FontFileMap.end()) + return it->second->AddRef(); - CPDF_CountedStreamAcc* ftData = new CPDF_CountedStreamAcc; - CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc; CPDF_Dictionary* pFontDict = pFontStream->GetDict(); int32_t org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + @@ -608,11 +580,12 @@ CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream) if (org_size < 0) org_size = 0; + CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc; pFontFile->LoadAllData(pFontStream, FALSE, org_size); - ftData->m_nCount = 2; - ftData->m_Obj = pFontFile; + + CPDF_CountedStreamAcc* ftData = new CPDF_CountedStreamAcc(pFontFile); m_FontFileMap[pFontStream] = ftData; - return pFontFile; + return ftData->AddRef(); } void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce) @@ -628,8 +601,9 @@ void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO if (!findData) return; - if ((--findData->m_nCount) == 0 || bForce) { - delete findData->m_Obj; + findData->RemoveRef(); + if (findData->use_count() == 0 || bForce) { + delete findData->get(); delete findData; m_FontFileMap.erase(it); } diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp index f66e58cb1b..bd53874af4 100644 --- a/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp +++ b/core/src/fpdfapi/fpdf_page/fpdf_page_pattern.cpp @@ -97,7 +97,7 @@ void CPDF_ShadingPattern::Clear() } m_pFunctions[i] = NULL; } - CPDF_ColorSpace* pCS = m_pCountedCS ? m_pCountedCS->m_Obj : NULL; + CPDF_ColorSpace* pCS = m_pCountedCS ? m_pCountedCS->get() : NULL; if (pCS && m_pDocument) { m_pDocument->GetPageData()->ReleaseColorSpace(pCS->GetArray()); } diff --git a/core/src/fpdfapi/fpdf_page/pageint.h b/core/src/fpdfapi/fpdf_page/pageint.h index d8c83a2638..283008d71e 100644 --- a/core/src/fpdfapi/fpdf_page/pageint.h +++ b/core/src/fpdfapi/fpdf_page/pageint.h @@ -353,10 +353,10 @@ class CPDF_DocPageData CPDF_CountedPattern* FindPatternPtr(CPDF_Object* pPatternObj) const; private: - using CPDF_CountedFont = CPDF_CountedObject<CPDF_Font*>; - using CPDF_CountedIccProfile = CPDF_CountedObject<CPDF_IccProfile*>; - using CPDF_CountedImage = CPDF_CountedObject<CPDF_Image*>; - using CPDF_CountedStreamAcc = CPDF_CountedObject<CPDF_StreamAcc*>; + using CPDF_CountedFont = CPDF_CountedObject<CPDF_Font>; + using CPDF_CountedIccProfile = CPDF_CountedObject<CPDF_IccProfile>; + using CPDF_CountedImage = CPDF_CountedObject<CPDF_Image>; + using CPDF_CountedStreamAcc = CPDF_CountedObject<CPDF_StreamAcc>; using CPDF_ColorSpaceMap = std::map<CPDF_Object*, CPDF_CountedColorSpace*>; using CPDF_FontFileMap = std::map<CPDF_Stream*, CPDF_CountedStreamAcc*>; diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp index e111976e98..01bec5bcb7 100644 --- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp +++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp @@ -26,10 +26,10 @@ void CPDF_DocRenderData::Clear(FX_BOOL bRelease) pos = m_Type3FaceMap.GetStartPosition(); while (pos) { CPDF_Font* pFont; - CPDF_CountedObject<CPDF_Type3Cache*>* cache; + CPDF_CountedObject<CPDF_Type3Cache>* cache; m_Type3FaceMap.GetNextAssoc(pos, pFont, cache); - if (bRelease || cache->m_nCount < 2) { - delete cache->m_Obj; + if (bRelease || cache->use_count() < 2) { + delete cache->get(); delete cache; m_Type3FaceMap.RemoveKey(pFont); } @@ -39,10 +39,10 @@ void CPDF_DocRenderData::Clear(FX_BOOL bRelease) pos = m_TransferFuncMap.GetStartPosition(); while (pos) { CPDF_Object* key; - CPDF_CountedObject<CPDF_TransferFunc*>* value; + CPDF_CountedObject<CPDF_TransferFunc>* value; m_TransferFuncMap.GetNextAssoc(pos, key, value); - if (bRelease || value->m_nCount < 2) { - delete value->m_Obj; + if (bRelease || value->use_count() < 2) { + delete value->get(); delete value; m_TransferFuncMap.RemoveKey(key); } @@ -64,24 +64,19 @@ FX_BOOL CPDF_DocRenderData::Initialize() } CPDF_Type3Cache* CPDF_DocRenderData::GetCachedType3(CPDF_Type3Font* pFont) { - CPDF_CountedObject<CPDF_Type3Cache*>* pCache; + CPDF_CountedObject<CPDF_Type3Cache>* pCache; if (!m_Type3FaceMap.Lookup(pFont, pCache)) { CPDF_Type3Cache* pType3 = new CPDF_Type3Cache(pFont); - pCache = new CPDF_CountedObject<CPDF_Type3Cache*>; - pCache->m_Obj = pType3; - pCache->m_nCount = 1; + pCache = new CPDF_CountedObject<CPDF_Type3Cache>(pType3); m_Type3FaceMap.SetAt(pFont, pCache); } - pCache->m_nCount++; - return pCache->m_Obj; + return pCache->AddRef(); } void CPDF_DocRenderData::ReleaseCachedType3(CPDF_Type3Font* pFont) { - CPDF_CountedObject<CPDF_Type3Cache*>* pCache; - if (!m_Type3FaceMap.Lookup(pFont, pCache)) { - return; - } - pCache->m_nCount--; + CPDF_CountedObject<CPDF_Type3Cache>* pCache; + if (m_Type3FaceMap.Lookup(pFont, pCache)) + pCache->RemoveRef(); } class CPDF_RenderModule : public CPDF_RenderModuleDef { @@ -1184,7 +1179,7 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) if (pObj == NULL) { return NULL; } - CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter; + CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter; if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) { CPDF_TransferFunc* pTransfer = NULL; CPDF_Function* pFuncs[3] = {NULL, NULL, NULL}; @@ -1211,9 +1206,7 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) } pTransfer = new CPDF_TransferFunc; pTransfer->m_pPDFDoc = m_pPDFDoc; - pTransferCounter = new CPDF_CountedObject<CPDF_TransferFunc*>; - pTransferCounter->m_nCount = 1; - pTransferCounter->m_Obj = pTransfer; + pTransferCounter = new CPDF_CountedObject<CPDF_TransferFunc>(pTransfer); m_TransferFuncMap.SetAt(pObj, pTransferCounter); static const int kMaxOutputs = 16; FX_FLOAT output[kMaxOutputs]; @@ -1253,16 +1246,15 @@ CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) } pTransfer->m_bIdentity = bIdentity; } - pTransferCounter->m_nCount++; - return pTransferCounter->m_Obj; + return pTransferCounter->AddRef(); } void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj) { - CPDF_CountedObject<CPDF_TransferFunc*>* pTransferCounter; + CPDF_CountedObject<CPDF_TransferFunc>* pTransferCounter; if (!m_TransferFuncMap.Lookup(pObj, pTransferCounter)) { return; } - pTransferCounter->m_nCount--; + pTransferCounter->RemoveRef(); } CPDF_RenderConfig::CPDF_RenderConfig() { diff --git a/core/src/fpdfapi/fpdf_render/render_int.h b/core/src/fpdfapi/fpdf_render/render_int.h index 8d40b17f85..7aa8358b8d 100644 --- a/core/src/fpdfapi/fpdf_render/render_int.h +++ b/core/src/fpdfapi/fpdf_render/render_int.h @@ -52,8 +52,8 @@ public: CFX_DIBSource* TranslateImage(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc); FX_COLORREF TranslateColor(FX_COLORREF src); }; -typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache*>*> CPDF_Type3CacheMap; -typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc*>*> CPDF_TransferFuncMap; +typedef CFX_MapPtrTemplate<CPDF_Font*, CPDF_CountedObject<CPDF_Type3Cache>*> CPDF_Type3CacheMap; +typedef CFX_MapPtrTemplate<CPDF_Object*, CPDF_CountedObject<CPDF_TransferFunc>*> CPDF_TransferFuncMap; class CPDF_DocRenderData { public: |