| // Copyright 2014 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 "../../../include/fpdfapi/fpdf_page.h" |
| #include "../../../include/fpdfapi/fpdf_module.h" |
| #include "../../../include/fdrm/fx_crypt.h" |
| #include "../fpdf_font/font_int.h" |
| #include "pageint.h" |
| class CPDF_PageModule : public CPDF_PageModuleDef |
| { |
| public: |
| CPDF_PageModule() : m_StockGrayCS(PDFCS_DEVICEGRAY), m_StockRGBCS(PDFCS_DEVICERGB), |
| m_StockCMYKCS(PDFCS_DEVICECMYK) {} |
| virtual ~CPDF_PageModule() {} |
| virtual FX_BOOL Installed() |
| { |
| return TRUE; |
| } |
| virtual CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) |
| { |
| return new CPDF_DocPageData(pDoc); |
| } |
| virtual void ReleaseDoc(CPDF_Document* pDoc); |
| virtual void ClearDoc(CPDF_Document* pDoc); |
| virtual CPDF_FontGlobals* GetFontGlobals() |
| { |
| return &m_FontGlobals; |
| } |
| virtual void ClearStockFont(CPDF_Document* pDoc) |
| { |
| m_FontGlobals.Clear(pDoc); |
| } |
| virtual CPDF_ColorSpace* GetStockCS(int family); |
| virtual void NotifyCJKAvailable(); |
| CPDF_FontGlobals m_FontGlobals; |
| CPDF_DeviceCS m_StockGrayCS; |
| CPDF_DeviceCS m_StockRGBCS; |
| CPDF_DeviceCS m_StockCMYKCS; |
| CPDF_PatternCS m_StockPatternCS; |
| }; |
| CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family) |
| { |
| if (family == PDFCS_DEVICEGRAY) { |
| return &m_StockGrayCS; |
| } |
| if (family == PDFCS_DEVICERGB) { |
| return &m_StockRGBCS; |
| } |
| if (family == PDFCS_DEVICECMYK) { |
| return &m_StockCMYKCS; |
| } |
| if (family == PDFCS_PATTERN) { |
| return &m_StockPatternCS; |
| } |
| return NULL; |
| } |
| void CPDF_ModuleMgr::InitPageModule() |
| { |
| delete m_pPageModule; |
| m_pPageModule = new CPDF_PageModule; |
| } |
| void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc) |
| { |
| delete pDoc->GetPageData(); |
| } |
| void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc) |
| { |
| pDoc->GetPageData()->Clear(FALSE); |
| } |
| void CPDF_PageModule::NotifyCJKAvailable() |
| { |
| m_FontGlobals.m_CMapManager.ReloadAll(); |
| } |
| CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) |
| { |
| if (!pFontDict) { |
| return NULL; |
| } |
| return GetValidatePageData()->GetFont(pFontDict, FALSE); |
| } |
| CPDF_Font* CPDF_Document::FindFont(CPDF_Dictionary* pFontDict) |
| { |
| if (!pFontDict) { |
| return NULL; |
| } |
| return GetValidatePageData()->GetFont(pFontDict, TRUE); |
| } |
| CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream) |
| { |
| if (pStream == NULL) { |
| return NULL; |
| } |
| return GetValidatePageData()->GetFontFileStreamAcc(pStream); |
| } |
| CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name); |
| CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources) |
| { |
| return GetValidatePageData()->GetColorSpace(pCSObj, pResources); |
| } |
| CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix) |
| { |
| return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix); |
| } |
| CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream) |
| { |
| return GetValidatePageData()->GetIccProfile(pStream); |
| } |
| CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) |
| { |
| if (!pObj) { |
| return NULL; |
| } |
| FXSYS_assert(pObj->GetObjNum()); |
| return GetValidatePageData()->GetImage(pObj); |
| } |
| void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) |
| { |
| if (!pCSObj) { |
| return; |
| } |
| GetPageData()->ReleaseColorSpace(pCSObj); |
| } |
| CPDF_DocPageData::CPDF_DocPageData(CPDF_Document *pPDFDoc) |
| : m_pPDFDoc(pPDFDoc) |
| , m_FontMap() |
| , m_ColorSpaceMap() |
| , m_PatternMap() |
| , m_ImageMap() |
| , m_IccProfileMap() |
| , m_FontFileMap() |
| , m_bForceClear(FALSE) |
| { |
| m_FontMap.InitHashTable(64); |
| m_ColorSpaceMap.InitHashTable(32); |
| m_PatternMap.InitHashTable(16); |
| m_ImageMap.InitHashTable(64); |
| m_IccProfileMap.InitHashTable(16); |
| m_FontFileMap.InitHashTable(32); |
| } |
| CPDF_DocPageData::~CPDF_DocPageData() |
| { |
| Clear(FALSE); |
| Clear(TRUE); |
| FX_POSITION pos = m_PatternMap.GetStartPosition(); |
| while (pos) |
| { |
| CPDF_Object* ptObj; |
| CPDF_CountedObject<CPDF_Pattern*>* ptData; |
| m_PatternMap.GetNextAssoc(pos, ptObj, ptData); |
| delete ptData; |
| } |
| m_PatternMap.RemoveAll(); |
| pos = m_FontMap.GetStartPosition(); |
| while (pos) |
| { |
| CPDF_Dictionary* fontDict; |
| CPDF_CountedObject<CPDF_Font*>* fontData; |
| m_FontMap.GetNextAssoc(pos, fontDict, fontData); |
| delete fontData; |
| } |
| m_FontMap.RemoveAll(); |
| pos = m_ColorSpaceMap.GetStartPosition(); |
| while (pos) |
| { |
| CPDF_Object* csKey; |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData; |
| m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData); |
| delete csData; |
| } |
| m_ColorSpaceMap.RemoveAll(); |
| } |
| void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) |
| { |
| FX_POSITION pos; |
| m_bForceClear = bForceRelease; |
| pos = m_PatternMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Object* ptObj; |
| CPDF_CountedObject<CPDF_Pattern*>* ptData; |
| m_PatternMap.GetNextAssoc(pos, ptObj, ptData); |
| if (!ptData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || ptData->m_nCount < 2) { |
| ptData->m_Obj->SetForceClear(bForceRelease); |
| delete ptData->m_Obj; |
| ptData->m_Obj = NULL; |
| } |
| } |
| pos = m_FontMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Dictionary* fontDict; |
| CPDF_CountedObject<CPDF_Font*>* fontData; |
| m_FontMap.GetNextAssoc(pos, fontDict, fontData); |
| if (!fontData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || fontData->m_nCount < 2) { |
| delete fontData->m_Obj; |
| fontData->m_Obj = NULL; |
| } |
| } |
| pos = m_ColorSpaceMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Object* csKey; |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData; |
| m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData); |
| if (!csData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || csData->m_nCount < 2) { |
| // csData->m_Obj is deleted in the function of ReleaseCS(). |
| csData->m_Obj->ReleaseCS(); |
| csData->m_Obj = NULL; |
| } |
| } |
| pos = m_IccProfileMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Stream* ipKey; |
| CPDF_CountedObject<CPDF_IccProfile*>* ipData; |
| m_IccProfileMap.GetNextAssoc(pos, ipKey, ipData); |
| if (!ipData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || ipData->m_nCount < 2) { |
| FX_POSITION pos2 = m_HashProfileMap.GetStartPosition(); |
| while (pos2) { |
| CFX_ByteString bsKey; |
| CPDF_Stream* pFindStream = NULL; |
| m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream); |
| if (ipKey == pFindStream) { |
| m_HashProfileMap.RemoveKey(bsKey); |
| break; |
| } |
| } |
| delete ipData->m_Obj; |
| delete ipData; |
| m_IccProfileMap.RemoveKey(ipKey); |
| } |
| } |
| pos = m_FontFileMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Stream* ftKey; |
| CPDF_CountedObject<CPDF_StreamAcc*>* ftData; |
| m_FontFileMap.GetNextAssoc(pos, ftKey, ftData); |
| if (!ftData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || ftData->m_nCount < 2) { |
| delete ftData->m_Obj; |
| delete ftData; |
| m_FontFileMap.RemoveKey(ftKey); |
| } |
| } |
| pos = m_ImageMap.GetStartPosition(); |
| while (pos) { |
| FX_DWORD objNum; |
| CPDF_CountedObject<CPDF_Image*>* imageData; |
| m_ImageMap.GetNextAssoc(pos, objNum, imageData); |
| if (!imageData->m_Obj) { |
| continue; |
| } |
| if (bForceRelease || imageData->m_nCount < 2) { |
| delete imageData->m_Obj; |
| delete imageData; |
| m_ImageMap.RemoveKey(objNum); |
| } |
| } |
| } |
| CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnly) |
| { |
| if (!pFontDict) { |
| return NULL; |
| } |
| if (findOnly) { |
| CPDF_CountedObject<CPDF_Font*>* fontData; |
| if (m_FontMap.Lookup(pFontDict, fontData)) { |
| if (!fontData->m_Obj) { |
| return NULL; |
| } |
| fontData->m_nCount ++; |
| return fontData->m_Obj; |
| } |
| return NULL; |
| } |
| CPDF_CountedObject<CPDF_Font*>* fontData = NULL; |
| if (m_FontMap.Lookup(pFontDict, fontData)) { |
| if (fontData->m_Obj) { |
| fontData->m_nCount ++; |
| return fontData->m_Obj; |
| } |
| } |
| FX_BOOL bNew = FALSE; |
| if (!fontData) { |
| fontData = new CPDF_CountedObject<CPDF_Font*>; |
| bNew = TRUE; |
| } |
| CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict); |
| if (!pFont) { |
| if (bNew) { |
| delete fontData; |
| } |
| return NULL; |
| } |
| fontData->m_nCount = 2; |
| fontData->m_Obj = pFont; |
| m_FontMap.SetAt(pFontDict, fontData); |
| return pFont; |
| } |
| CPDF_Font* CPDF_DocPageData::GetStandardFont(FX_BSTR fontName, CPDF_FontEncoding* pEncoding) |
| { |
| if (fontName.IsEmpty()) { |
| return NULL; |
| } |
| FX_POSITION pos = m_FontMap.GetStartPosition(); |
| while (pos) { |
| CPDF_Dictionary* fontDict; |
| CPDF_CountedObject<CPDF_Font*>* fontData; |
| m_FontMap.GetNextAssoc(pos, fontDict, fontData); |
| CPDF_Font* pFont = fontData->m_Obj; |
| if (!pFont) { |
| continue; |
| } |
| if (pFont->GetBaseFont() != fontName) { |
| continue; |
| } |
| if (pFont->IsEmbedded()) { |
| continue; |
| } |
| if (pFont->GetFontType() != PDFFONT_TYPE1) { |
| continue; |
| } |
| if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) { |
| continue; |
| } |
| CPDF_Type1Font* pT1Font = pFont->GetType1Font(); |
| if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) { |
| continue; |
| } |
| fontData->m_nCount ++; |
| return pFont; |
| } |
| CPDF_Dictionary* pDict = new CPDF_Dictionary; |
| pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font")); |
| pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1")); |
| pDict->SetAtName(FX_BSTRC("BaseFont"), fontName); |
| if (pEncoding) { |
| pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize()); |
| } |
| m_pPDFDoc->AddIndirectObject(pDict); |
| CPDF_CountedObject<CPDF_Font*>* fontData = new CPDF_CountedObject<CPDF_Font*>; |
| CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict); |
| if (!pFont) { |
| delete fontData; |
| return NULL; |
| } |
| fontData->m_nCount = 2; |
| fontData->m_Obj = pFont; |
| m_FontMap.SetAt(pDict, fontData); |
| return pFont; |
| } |
| void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) |
| { |
| if (!pFontDict) { |
| return; |
| } |
| CPDF_CountedObject<CPDF_Font*>* fontData; |
| if (!m_FontMap.Lookup(pFontDict, fontData)) { |
| return; |
| } |
| if (fontData->m_Obj && --fontData->m_nCount == 0) { |
| delete fontData->m_Obj; |
| fontData->m_Obj = NULL; |
| } |
| } |
| CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dictionary* pResources) |
| { |
| if (!pCSObj) { |
| return NULL; |
| } |
| if (pCSObj->GetType() == PDFOBJ_NAME) { |
| CFX_ByteString name = pCSObj->GetConstString(); |
| CPDF_ColorSpace* pCS = _CSFromName(name); |
| if (!pCS && pResources) { |
| CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace")); |
| if (pList) { |
| pCSObj = pList->GetElementValue(name); |
| return GetColorSpace(pCSObj, NULL); |
| } |
| } |
| if (pCS == NULL || pResources == NULL) { |
| return pCS; |
| } |
| CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace")); |
| if (pColorSpaces == NULL) { |
| return pCS; |
| } |
| CPDF_Object* pDefaultCS = NULL; |
| switch (pCS->GetFamily()) { |
| case PDFCS_DEVICERGB: |
| pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB")); |
| break; |
| case PDFCS_DEVICEGRAY: |
| pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray")); |
| break; |
| case PDFCS_DEVICECMYK: |
| pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK")); |
| break; |
| } |
| if (pDefaultCS == NULL) { |
| return pCS; |
| } |
| return GetColorSpace(pDefaultCS, NULL); |
| } |
| if (pCSObj->GetType() != PDFOBJ_ARRAY) { |
| return NULL; |
| } |
| CPDF_Array* pArray = (CPDF_Array*)pCSObj; |
| if (pArray->GetCount() == 0) { |
| return NULL; |
| } |
| if (pArray->GetCount() == 1) { |
| return GetColorSpace(pArray->GetElementValue(0), pResources); |
| } |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData = NULL; |
| if (m_ColorSpaceMap.Lookup(pCSObj, csData)) { |
| if (csData->m_Obj) { |
| csData->m_nCount++; |
| return csData->m_Obj; |
| } |
| } |
| FX_BOOL bNew = FALSE; |
| if (!csData) { |
| csData = new CPDF_CountedObject<CPDF_ColorSpace*>; |
| bNew = TRUE; |
| } |
| CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray); |
| if (!pCS) { |
| if (bNew) { |
| delete csData; |
| } |
| return NULL; |
| } |
| csData->m_nCount = 2; |
| csData->m_Obj = pCS; |
| m_ColorSpaceMap.SetAt(pCSObj, csData); |
| return pCS; |
| } |
| CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) |
| { |
| if (!pCSObj) { |
| return NULL; |
| } |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData; |
| if (!m_ColorSpaceMap.Lookup(pCSObj, csData)) { |
| return NULL; |
| } |
| if (!csData->m_Obj) { |
| return NULL; |
| } |
| csData->m_nCount ++; |
| return csData->m_Obj; |
| } |
| void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace) |
| { |
| if (!pColorSpace) { |
| return; |
| } |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData; |
| if (!m_ColorSpaceMap.Lookup(pColorSpace, csData)) { |
| return; |
| } |
| if (csData->m_Obj && --csData->m_nCount == 0) { |
| csData->m_Obj->ReleaseCS(); |
| csData->m_Obj = NULL; |
| } |
| } |
| CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bShading, const CFX_AffineMatrix* matrix) |
| { |
| if (!pPatternObj) { |
| return NULL; |
| } |
| CPDF_CountedObject<CPDF_Pattern*>* ptData = NULL; |
| if (m_PatternMap.Lookup(pPatternObj, ptData)) { |
| if (ptData->m_Obj) { |
| ptData->m_nCount++; |
| return ptData->m_Obj; |
| } |
| } |
| FX_BOOL bNew = FALSE; |
| if (!ptData) { |
| ptData = new CPDF_CountedObject<CPDF_Pattern*>; |
| bNew = TRUE; |
| } |
| CPDF_Pattern* pPattern = NULL; |
| if (bShading) { |
| pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix); |
| } else { |
| CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : NULL; |
| if (pDict) { |
| int type = pDict->GetInteger(FX_BSTRC("PatternType")); |
| if (type == 1) { |
| pPattern = new CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix); |
| } else if (type == 2) { |
| pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix); |
| } |
| } |
| } |
| if (!pPattern) { |
| if (bNew) { |
| delete ptData; |
| } |
| return NULL; |
| } |
| ptData->m_nCount = 2; |
| ptData->m_Obj = pPattern; |
| m_PatternMap.SetAt(pPatternObj, ptData); |
| return pPattern; |
| } |
| void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) |
| { |
| if (!pPatternObj) { |
| return; |
| } |
| CPDF_CountedObject<CPDF_Pattern*>* ptData; |
| if (!m_PatternMap.Lookup(pPatternObj, ptData)) { |
| return; |
| } |
| if (ptData->m_Obj && --ptData->m_nCount == 0) { |
| delete ptData->m_Obj; |
| ptData->m_Obj = NULL; |
| } |
| } |
| CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) |
| { |
| if (!pImageStream) { |
| return NULL; |
| } |
| FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); |
| CPDF_CountedObject<CPDF_Image*>* imageData; |
| if (m_ImageMap.Lookup(dwImageObjNum, imageData)) { |
| imageData->m_nCount ++; |
| return imageData->m_Obj; |
| } |
| imageData = new CPDF_CountedObject<CPDF_Image*>; |
| CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc); |
| pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE); |
| imageData->m_nCount = 2; |
| imageData->m_Obj = pImage; |
| m_ImageMap.SetAt(dwImageObjNum, imageData); |
| return pImage; |
| } |
| void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) |
| { |
| if (!pImageStream) { |
| return; |
| } |
| PDF_DocPageData_Release<FX_DWORD, CPDF_Image*>(m_ImageMap, pImageStream->GetObjNum(), NULL); |
| } |
| CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) |
| { |
| if (!pIccProfileStream) { |
| return NULL; |
| } |
| CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL; |
| if (m_IccProfileMap.Lookup(pIccProfileStream, ipData)) { |
| ipData->m_nCount++; |
| return ipData->m_Obj; |
| } |
| CPDF_StreamAcc stream; |
| stream.LoadAllData(pIccProfileStream, FALSE); |
| FX_BYTE digest[20]; |
| CPDF_Stream* pCopiedStream = NULL; |
| CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); |
| if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStream)) { |
| m_IccProfileMap.Lookup(pCopiedStream, ipData); |
| ipData->m_nCount++; |
| return ipData->m_Obj; |
| } |
| CPDF_IccProfile* pProfile = new CPDF_IccProfile(stream.GetData(), stream.GetSize()); |
| ipData = new CPDF_CountedObject<CPDF_IccProfile*>; |
| ipData->m_nCount = 2; |
| ipData->m_Obj = pProfile; |
| m_IccProfileMap.SetAt(pIccProfileStream, ipData); |
| m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); |
| return pProfile; |
| } |
| void CPDF_DocPageData::ReleaseIccProfile(CPDF_Stream* pIccProfileStream, CPDF_IccProfile* pIccProfile) |
| { |
| if (!pIccProfileStream && !pIccProfile) { |
| return; |
| } |
| CPDF_CountedObject<CPDF_IccProfile*>* ipData = NULL; |
| if (m_IccProfileMap.Lookup(pIccProfileStream, ipData) && ipData->m_nCount < 2) { |
| FX_POSITION pos = m_HashProfileMap.GetStartPosition(); |
| while (pos) { |
| CFX_ByteString key; |
| CPDF_Stream* pFindStream = NULL; |
| m_HashProfileMap.GetNextAssoc(pos, key, (void*&)pFindStream); |
| if (pIccProfileStream == pFindStream) { |
| m_HashProfileMap.RemoveKey(key); |
| break; |
| } |
| } |
| } |
| PDF_DocPageData_Release<CPDF_Stream*, CPDF_IccProfile*>(m_IccProfileMap, pIccProfileStream, pIccProfile); |
| } |
| CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream) |
| { |
| if (!pFontStream) { |
| return NULL; |
| } |
| CPDF_CountedObject<CPDF_StreamAcc*>* ftData; |
| if (m_FontFileMap.Lookup(pFontStream, ftData)) { |
| ftData->m_nCount ++; |
| return ftData->m_Obj; |
| } |
| ftData = new CPDF_CountedObject<CPDF_StreamAcc*>; |
| CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc; |
| CPDF_Dictionary* pFontDict = pFontStream->GetDict(); |
| FX_INT32 org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + pFontDict->GetInteger(FX_BSTRC("Length2")) + pFontDict->GetInteger(FX_BSTRC("Length3")); |
| if (org_size < 0) { |
| org_size = 0; |
| } |
| pFontFile->LoadAllData(pFontStream, FALSE, org_size); |
| ftData->m_nCount = 2; |
| ftData->m_Obj = pFontFile; |
| m_FontFileMap.SetAt(pFontStream, ftData); |
| return pFontFile; |
| } |
| void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOOL bForce) |
| { |
| if (!pFontStream) { |
| return; |
| } |
| PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontStream, NULL, bForce); |
| } |
| CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj) const |
| { |
| if (!pCSObj) return NULL; |
| CPDF_CountedObject<CPDF_ColorSpace*>* csData; |
| if (m_ColorSpaceMap.Lookup(pCSObj, csData)) |
| { |
| return csData; |
| } |
| return NULL; |
| } |
| CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj) const |
| { |
| if (!pPatternObj) return NULL; |
| CPDF_CountedObject<CPDF_Pattern*>* ptData; |
| if (m_PatternMap.Lookup(pPatternObj, ptData)) |
| { |
| return ptData; |
| } |
| return NULL; |
| } |