| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "../../../include/fpdfapi/fpdf_page.h" | 7 #include "../../../include/fpdfapi/fpdf_page.h" |
| 8 #include "../../../include/fpdfapi/fpdf_module.h" | 8 #include "../../../include/fpdfapi/fpdf_module.h" |
| 9 #include "../../../include/fdrm/fx_crypt.h" | 9 #include "../../../include/fdrm/fx_crypt.h" |
| 10 #include "../fpdf_font/font_int.h" | 10 #include "../fpdf_font/font_int.h" |
| 11 #include "pageint.h" | 11 #include "pageint.h" |
| 12 | 12 |
| 13 class CPDF_PageModule : public IPDF_PageModule | 13 class CPDF_PageModule : public IPDF_PageModule { |
| 14 { | 14 public: |
| 15 public: | 15 CPDF_PageModule() |
| 16 CPDF_PageModule() | 16 : m_StockGrayCS(nullptr, PDFCS_DEVICEGRAY), |
| 17 : m_StockGrayCS(nullptr, PDFCS_DEVICEGRAY), | 17 m_StockRGBCS(nullptr, PDFCS_DEVICERGB), |
| 18 m_StockRGBCS(nullptr, PDFCS_DEVICERGB), | 18 m_StockCMYKCS(nullptr, PDFCS_DEVICECMYK), |
| 19 m_StockCMYKCS(nullptr, PDFCS_DEVICECMYK), | 19 m_StockPatternCS(nullptr) {} |
| 20 m_StockPatternCS(nullptr) {} | 20 |
| 21 | 21 private: |
| 22 private: | 22 ~CPDF_PageModule() override {} |
| 23 ~CPDF_PageModule() override {} | 23 |
| 24 | 24 CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) override { |
| 25 CPDF_DocPageData* CreateDocData(CPDF_Document* pDoc) override | 25 return new CPDF_DocPageData(pDoc); |
| 26 { | 26 } |
| 27 return new CPDF_DocPageData(pDoc); | 27 |
| 28 } | 28 void ReleaseDoc(CPDF_Document* pDoc) override; |
| 29 | 29 void ClearDoc(CPDF_Document* pDoc) override; |
| 30 void ReleaseDoc(CPDF_Document* pDoc) override; | 30 |
| 31 void ClearDoc(CPDF_Document* pDoc) override; | 31 CPDF_FontGlobals* GetFontGlobals() override { return &m_FontGlobals; } |
| 32 | 32 |
| 33 CPDF_FontGlobals* GetFontGlobals() override | 33 void ClearStockFont(CPDF_Document* pDoc) override { |
| 34 { | 34 m_FontGlobals.Clear(pDoc); |
| 35 return &m_FontGlobals; | 35 } |
| 36 } | 36 |
| 37 | 37 CPDF_ColorSpace* GetStockCS(int family) override; |
| 38 void ClearStockFont(CPDF_Document* pDoc) override | 38 void NotifyCJKAvailable() override; |
| 39 { | 39 |
| 40 m_FontGlobals.Clear(pDoc); | 40 CPDF_FontGlobals m_FontGlobals; |
| 41 } | 41 CPDF_DeviceCS m_StockGrayCS; |
| 42 | 42 CPDF_DeviceCS m_StockRGBCS; |
| 43 CPDF_ColorSpace* GetStockCS(int family) override; | 43 CPDF_DeviceCS m_StockCMYKCS; |
| 44 void NotifyCJKAvailable() override; | 44 CPDF_PatternCS m_StockPatternCS; |
| 45 | |
| 46 CPDF_FontGlobals m_FontGlobals; | |
| 47 CPDF_DeviceCS m_StockGrayCS; | |
| 48 CPDF_DeviceCS m_StockRGBCS; | |
| 49 CPDF_DeviceCS m_StockCMYKCS; | |
| 50 CPDF_PatternCS m_StockPatternCS; | |
| 51 }; | 45 }; |
| 52 | 46 |
| 53 CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family) | 47 CPDF_ColorSpace* CPDF_PageModule::GetStockCS(int family) { |
| 54 { | 48 if (family == PDFCS_DEVICEGRAY) { |
| 55 if (family == PDFCS_DEVICEGRAY) { | 49 return &m_StockGrayCS; |
| 56 return &m_StockGrayCS; | 50 } |
| 57 } | 51 if (family == PDFCS_DEVICERGB) { |
| 58 if (family == PDFCS_DEVICERGB) { | 52 return &m_StockRGBCS; |
| 59 return &m_StockRGBCS; | 53 } |
| 60 } | 54 if (family == PDFCS_DEVICECMYK) { |
| 61 if (family == PDFCS_DEVICECMYK) { | 55 return &m_StockCMYKCS; |
| 62 return &m_StockCMYKCS; | 56 } |
| 63 } | 57 if (family == PDFCS_PATTERN) { |
| 64 if (family == PDFCS_PATTERN) { | 58 return &m_StockPatternCS; |
| 65 return &m_StockPatternCS; | 59 } |
| 66 } | 60 return NULL; |
| 61 } |
| 62 |
| 63 void CPDF_ModuleMgr::InitPageModule() { |
| 64 m_pPageModule.reset(new CPDF_PageModule); |
| 65 } |
| 66 |
| 67 void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc) { |
| 68 delete pDoc->GetPageData(); |
| 69 } |
| 70 void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc) { |
| 71 pDoc->GetPageData()->Clear(FALSE); |
| 72 } |
| 73 void CPDF_PageModule::NotifyCJKAvailable() { |
| 74 m_FontGlobals.m_CMapManager.ReloadAll(); |
| 75 } |
| 76 |
| 77 CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) { |
| 78 ASSERT(pFontDict); |
| 79 return GetValidatePageData()->GetFont(pFontDict, FALSE); |
| 80 } |
| 81 |
| 82 CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream) { |
| 83 return GetValidatePageData()->GetFontFileStreamAcc(pStream); |
| 84 } |
| 85 |
| 86 CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name); |
| 87 CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, |
| 88 CPDF_Dictionary* pResources) { |
| 89 return GetValidatePageData()->GetColorSpace(pCSObj, pResources); |
| 90 } |
| 91 CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, |
| 92 FX_BOOL bShading, |
| 93 const CFX_AffineMatrix* matrix) { |
| 94 return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix); |
| 95 } |
| 96 CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream) { |
| 97 return GetValidatePageData()->GetIccProfile(pStream); |
| 98 } |
| 99 CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) { |
| 100 if (!pObj) { |
| 67 return NULL; | 101 return NULL; |
| 68 } | 102 } |
| 69 | 103 FXSYS_assert(pObj->GetObjNum()); |
| 70 void CPDF_ModuleMgr::InitPageModule() | 104 return GetValidatePageData()->GetImage(pObj); |
| 71 { | 105 } |
| 72 m_pPageModule.reset(new CPDF_PageModule); | 106 void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) { |
| 73 } | 107 if (!pCSObj) { |
| 74 | 108 return; |
| 75 void CPDF_PageModule::ReleaseDoc(CPDF_Document* pDoc) | 109 } |
| 76 { | 110 GetPageData()->ReleaseColorSpace(pCSObj); |
| 77 delete pDoc->GetPageData(); | |
| 78 } | |
| 79 void CPDF_PageModule::ClearDoc(CPDF_Document* pDoc) | |
| 80 { | |
| 81 pDoc->GetPageData()->Clear(FALSE); | |
| 82 } | |
| 83 void CPDF_PageModule::NotifyCJKAvailable() | |
| 84 { | |
| 85 m_FontGlobals.m_CMapManager.ReloadAll(); | |
| 86 } | |
| 87 | |
| 88 CPDF_Font* CPDF_Document::LoadFont(CPDF_Dictionary* pFontDict) | |
| 89 { | |
| 90 ASSERT(pFontDict); | |
| 91 return GetValidatePageData()->GetFont(pFontDict, FALSE); | |
| 92 } | |
| 93 | |
| 94 CPDF_StreamAcc* CPDF_Document::LoadFontFile(CPDF_Stream* pStream) | |
| 95 { | |
| 96 return GetValidatePageData()->GetFontFileStreamAcc(pStream); | |
| 97 } | |
| 98 | |
| 99 CPDF_ColorSpace* _CSFromName(const CFX_ByteString& name); | |
| 100 CPDF_ColorSpace* CPDF_Document::LoadColorSpace(CPDF_Object* pCSObj, CPDF_Diction
ary* pResources) | |
| 101 { | |
| 102 return GetValidatePageData()->GetColorSpace(pCSObj, pResources); | |
| 103 } | |
| 104 CPDF_Pattern* CPDF_Document::LoadPattern(CPDF_Object* pPatternObj, FX_BOOL bShad
ing, const CFX_AffineMatrix* matrix) | |
| 105 { | |
| 106 return GetValidatePageData()->GetPattern(pPatternObj, bShading, matrix); | |
| 107 } | |
| 108 CPDF_IccProfile* CPDF_Document::LoadIccProfile(CPDF_Stream* pStream) | |
| 109 { | |
| 110 return GetValidatePageData()->GetIccProfile(pStream); | |
| 111 } | |
| 112 CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) | |
| 113 { | |
| 114 if (!pObj) { | |
| 115 return NULL; | |
| 116 } | |
| 117 FXSYS_assert(pObj->GetObjNum()); | |
| 118 return GetValidatePageData()->GetImage(pObj); | |
| 119 } | |
| 120 void CPDF_Document::RemoveColorSpaceFromPageData(CPDF_Object* pCSObj) | |
| 121 { | |
| 122 if (!pCSObj) { | |
| 123 return; | |
| 124 } | |
| 125 GetPageData()->ReleaseColorSpace(pCSObj); | |
| 126 } | 111 } |
| 127 CPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc) | 112 CPDF_DocPageData::CPDF_DocPageData(CPDF_Document* pPDFDoc) |
| 128 : m_pPDFDoc(pPDFDoc), | 113 : m_pPDFDoc(pPDFDoc), m_bForceClear(FALSE) {} |
| 129 m_bForceClear(FALSE) | 114 |
| 130 { | 115 CPDF_DocPageData::~CPDF_DocPageData() { |
| 131 } | 116 Clear(FALSE); |
| 132 | 117 Clear(TRUE); |
| 133 CPDF_DocPageData::~CPDF_DocPageData() | 118 |
| 134 { | 119 for (auto& it : m_PatternMap) |
| 135 Clear(FALSE); | 120 delete it.second; |
| 136 Clear(TRUE); | 121 m_PatternMap.clear(); |
| 137 | 122 |
| 138 for (auto& it : m_PatternMap) | 123 for (auto& it : m_FontMap) |
| 139 delete it.second; | 124 delete it.second; |
| 140 m_PatternMap.clear(); | 125 m_FontMap.clear(); |
| 141 | 126 |
| 142 for (auto& it : m_FontMap) | 127 for (auto& it : m_ColorSpaceMap) |
| 143 delete it.second; | 128 delete it.second; |
| 144 m_FontMap.clear(); | 129 m_ColorSpaceMap.clear(); |
| 145 | 130 } |
| 146 for (auto& it : m_ColorSpaceMap) | 131 |
| 147 delete it.second; | 132 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) { |
| 148 m_ColorSpaceMap.clear(); | 133 m_bForceClear = bForceRelease; |
| 149 } | 134 |
| 150 | 135 for (auto& it : m_PatternMap) { |
| 151 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) | 136 CPDF_CountedPattern* ptData = it.second; |
| 152 { | 137 if (!ptData->get()) |
| 153 m_bForceClear = bForceRelease; | 138 continue; |
| 154 | 139 |
| 155 for (auto& it : m_PatternMap) { | 140 if (bForceRelease || ptData->use_count() < 2) { |
| 156 CPDF_CountedPattern* ptData = it.second; | 141 ptData->get()->SetForceClear(bForceRelease); |
| 157 if (!ptData->get()) | 142 ptData->clear(); |
| 158 continue; | 143 } |
| 159 | 144 } |
| 160 if (bForceRelease || ptData->use_count() < 2) { | 145 |
| 161 ptData->get()->SetForceClear(bForceRelease); | 146 for (auto& it : m_FontMap) { |
| 162 ptData->clear(); | 147 CPDF_CountedFont* fontData = it.second; |
| 148 if (!fontData->get()) |
| 149 continue; |
| 150 |
| 151 if (bForceRelease || fontData->use_count() < 2) { |
| 152 fontData->clear(); |
| 153 } |
| 154 } |
| 155 |
| 156 for (auto& it : m_ColorSpaceMap) { |
| 157 CPDF_CountedColorSpace* csData = it.second; |
| 158 if (!csData->get()) |
| 159 continue; |
| 160 |
| 161 if (bForceRelease || csData->use_count() < 2) { |
| 162 csData->get()->ReleaseCS(); |
| 163 csData->reset(nullptr); |
| 164 } |
| 165 } |
| 166 |
| 167 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) { |
| 168 auto curr_it = it++; |
| 169 CPDF_CountedIccProfile* ipData = curr_it->second; |
| 170 if (!ipData->get()) |
| 171 continue; |
| 172 |
| 173 if (bForceRelease || ipData->use_count() < 2) { |
| 174 CPDF_Stream* ipKey = curr_it->first; |
| 175 FX_POSITION pos2 = m_HashProfileMap.GetStartPosition(); |
| 176 while (pos2) { |
| 177 CFX_ByteString bsKey; |
| 178 CPDF_Stream* pFindStream = nullptr; |
| 179 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream); |
| 180 if (ipKey == pFindStream) { |
| 181 m_HashProfileMap.RemoveKey(bsKey); |
| 182 break; |
| 163 } | 183 } |
| 164 } | 184 } |
| 165 | 185 delete ipData->get(); |
| 166 for (auto& it : m_FontMap) { | 186 delete ipData; |
| 167 CPDF_CountedFont* fontData = it.second; | 187 m_IccProfileMap.erase(curr_it); |
| 168 if (!fontData->get()) | 188 } |
| 169 continue; | 189 } |
| 170 | 190 |
| 171 if (bForceRelease || fontData->use_count() < 2) { | 191 for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) { |
| 172 fontData->clear(); | 192 auto curr_it = it++; |
| 173 } | 193 CPDF_CountedStreamAcc* ftData = curr_it->second; |
| 174 } | 194 if (!ftData->get()) |
| 175 | 195 continue; |
| 176 for (auto& it : m_ColorSpaceMap) { | 196 |
| 177 CPDF_CountedColorSpace* csData = it.second; | 197 if (bForceRelease || ftData->use_count() < 2) { |
| 178 if (!csData->get()) | 198 delete ftData->get(); |
| 179 continue; | 199 delete ftData; |
| 180 | 200 m_FontFileMap.erase(curr_it); |
| 181 if (bForceRelease || csData->use_count() < 2) { | 201 } |
| 182 csData->get()->ReleaseCS(); | 202 } |
| 183 csData->reset(nullptr); | 203 |
| 184 } | 204 for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) { |
| 185 } | 205 auto curr_it = it++; |
| 186 | 206 CPDF_CountedImage* imageData = curr_it->second; |
| 187 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end();) { | 207 if (!imageData->get()) |
| 188 auto curr_it = it++; | 208 continue; |
| 189 CPDF_CountedIccProfile* ipData = curr_it->second; | 209 |
| 190 if (!ipData->get()) | 210 if (bForceRelease || imageData->use_count() < 2) { |
| 191 continue; | 211 delete imageData->get(); |
| 192 | 212 delete imageData; |
| 193 if (bForceRelease || ipData->use_count() < 2) { | 213 m_ImageMap.erase(curr_it); |
| 194 CPDF_Stream* ipKey = curr_it->first; | 214 } |
| 195 FX_POSITION pos2 = m_HashProfileMap.GetStartPosition(); | 215 } |
| 196 while (pos2) { | 216 } |
| 197 CFX_ByteString bsKey; | 217 |
| 198 CPDF_Stream* pFindStream = nullptr; | 218 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, |
| 199 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream); | 219 FX_BOOL findOnly) { |
| 200 if (ipKey == pFindStream) { | 220 if (!pFontDict) { |
| 201 m_HashProfileMap.RemoveKey(bsKey); | 221 return NULL; |
| 202 break; | 222 } |
| 203 } | 223 if (findOnly) { |
| 204 } | |
| 205 delete ipData->get(); | |
| 206 delete ipData; | |
| 207 m_IccProfileMap.erase(curr_it); | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 for (auto it = m_FontFileMap.begin(); it != m_FontFileMap.end();) { | |
| 212 auto curr_it = it++; | |
| 213 CPDF_CountedStreamAcc* ftData = curr_it->second; | |
| 214 if (!ftData->get()) | |
| 215 continue; | |
| 216 | |
| 217 if (bForceRelease || ftData->use_count() < 2) { | |
| 218 delete ftData->get(); | |
| 219 delete ftData; | |
| 220 m_FontFileMap.erase(curr_it); | |
| 221 } | |
| 222 } | |
| 223 | |
| 224 for (auto it = m_ImageMap.begin(); it != m_ImageMap.end();) { | |
| 225 auto curr_it = it++; | |
| 226 CPDF_CountedImage* imageData = curr_it->second; | |
| 227 if (!imageData->get()) | |
| 228 continue; | |
| 229 | |
| 230 if (bForceRelease || imageData->use_count() < 2) { | |
| 231 delete imageData->get(); | |
| 232 delete imageData; | |
| 233 m_ImageMap.erase(curr_it); | |
| 234 } | |
| 235 } | |
| 236 } | |
| 237 | |
| 238 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl
y) | |
| 239 { | |
| 240 if (!pFontDict) { | |
| 241 return NULL; | |
| 242 } | |
| 243 if (findOnly) { | |
| 244 auto it = m_FontMap.find(pFontDict); | |
| 245 if (it != m_FontMap.end() && it->second->get()) { | |
| 246 return it->second->AddRef(); | |
| 247 } | |
| 248 return nullptr; | |
| 249 } | |
| 250 | |
| 251 CPDF_CountedFont* fontData = nullptr; | |
| 252 auto it = m_FontMap.find(pFontDict); | 224 auto it = m_FontMap.find(pFontDict); |
| 253 if (it != m_FontMap.end()) { | 225 if (it != m_FontMap.end() && it->second->get()) { |
| 254 fontData = it->second; | 226 return it->second->AddRef(); |
| 255 if (fontData->get()) { | 227 } |
| 256 return fontData->AddRef(); | 228 return nullptr; |
| 257 } | 229 } |
| 258 } | 230 |
| 259 | 231 CPDF_CountedFont* fontData = nullptr; |
| 260 CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict); | 232 auto it = m_FontMap.find(pFontDict); |
| 261 if (!pFont) { | 233 if (it != m_FontMap.end()) { |
| 262 return nullptr; | 234 fontData = it->second; |
| 263 } | 235 if (fontData->get()) { |
| 264 if (!fontData) { | 236 return fontData->AddRef(); |
| 265 fontData = new CPDF_CountedFont(pFont); | 237 } |
| 266 m_FontMap[pFontDict] = fontData; | 238 } |
| 267 } else { | 239 |
| 268 fontData->reset(pFont); | 240 CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pFontDict); |
| 269 } | 241 if (!pFont) { |
| 242 return nullptr; |
| 243 } |
| 244 if (!fontData) { |
| 245 fontData = new CPDF_CountedFont(pFont); |
| 246 m_FontMap[pFontDict] = fontData; |
| 247 } else { |
| 248 fontData->reset(pFont); |
| 249 } |
| 250 return fontData->AddRef(); |
| 251 } |
| 252 |
| 253 CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, |
| 254 CPDF_FontEncoding* pEncoding) { |
| 255 if (fontName.IsEmpty()) |
| 256 return nullptr; |
| 257 |
| 258 for (auto& it : m_FontMap) { |
| 259 CPDF_CountedFont* fontData = it.second; |
| 260 CPDF_Font* pFont = fontData->get(); |
| 261 if (!pFont) |
| 262 continue; |
| 263 if (pFont->GetBaseFont() != fontName) |
| 264 continue; |
| 265 if (pFont->IsEmbedded()) |
| 266 continue; |
| 267 if (pFont->GetFontType() != PDFFONT_TYPE1) |
| 268 continue; |
| 269 if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) |
| 270 continue; |
| 271 |
| 272 CPDF_Type1Font* pT1Font = pFont->GetType1Font(); |
| 273 if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) |
| 274 continue; |
| 275 |
| 270 return fontData->AddRef(); | 276 return fontData->AddRef(); |
| 271 } | 277 } |
| 272 | 278 |
| 273 CPDF_Font* CPDF_DocPageData::GetStandardFont(const CFX_ByteStringC& fontName, CP
DF_FontEncoding* pEncoding) | 279 CPDF_Dictionary* pDict = new CPDF_Dictionary; |
| 274 { | 280 pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font")); |
| 275 if (fontName.IsEmpty()) | 281 pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1")); |
| 276 return nullptr; | 282 pDict->SetAtName(FX_BSTRC("BaseFont"), fontName); |
| 277 | 283 if (pEncoding) { |
| 278 for (auto& it : m_FontMap) { | 284 pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize()); |
| 279 CPDF_CountedFont* fontData = it.second; | 285 } |
| 280 CPDF_Font* pFont = fontData->get(); | 286 m_pPDFDoc->AddIndirectObject(pDict); |
| 281 if (!pFont) | 287 CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict); |
| 282 continue; | 288 if (!pFont) { |
| 283 if (pFont->GetBaseFont() != fontName) | 289 return nullptr; |
| 284 continue; | 290 } |
| 285 if (pFont->IsEmbedded()) | 291 CPDF_CountedFont* fontData = new CPDF_CountedFont(pFont); |
| 286 continue; | 292 m_FontMap[pDict] = fontData; |
| 287 if (pFont->GetFontType() != PDFFONT_TYPE1) | 293 return fontData->AddRef(); |
| 288 continue; | 294 } |
| 289 if (pFont->GetFontDict()->KeyExist(FX_BSTRC("Widths"))) | 295 |
| 290 continue; | 296 void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) { |
| 291 | 297 if (!pFontDict) |
| 292 CPDF_Type1Font* pT1Font = pFont->GetType1Font(); | 298 return; |
| 293 if (pEncoding && !pT1Font->GetEncoding()->IsIdentical(pEncoding)) | 299 |
| 294 continue; | 300 auto it = m_FontMap.find(pFontDict); |
| 295 | 301 if (it == m_FontMap.end()) |
| 296 return fontData->AddRef(); | 302 return; |
| 297 } | 303 |
| 298 | 304 CPDF_CountedFont* fontData = it->second; |
| 299 CPDF_Dictionary* pDict = new CPDF_Dictionary; | 305 if (fontData->get()) { |
| 300 pDict->SetAtName(FX_BSTRC("Type"), FX_BSTRC("Font")); | 306 fontData->RemoveRef(); |
| 301 pDict->SetAtName(FX_BSTRC("Subtype"), FX_BSTRC("Type1")); | 307 if (fontData->use_count() == 0) { |
| 302 pDict->SetAtName(FX_BSTRC("BaseFont"), fontName); | 308 fontData->clear(); |
| 303 if (pEncoding) { | 309 } |
| 304 pDict->SetAt(FX_BSTRC("Encoding"), pEncoding->Realize()); | 310 } |
| 305 } | 311 } |
| 306 m_pPDFDoc->AddIndirectObject(pDict); | 312 |
| 307 CPDF_Font* pFont = CPDF_Font::CreateFontF(m_pPDFDoc, pDict); | 313 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, |
| 308 if (!pFont) { | 314 CPDF_Dictionary* pResources) { |
| 309 return nullptr; | 315 if (!pCSObj) { |
| 310 } | 316 return NULL; |
| 311 CPDF_CountedFont* fontData = new CPDF_CountedFont(pFont); | 317 } |
| 312 m_FontMap[pDict] = fontData; | 318 if (pCSObj->GetType() == PDFOBJ_NAME) { |
| 313 return fontData->AddRef(); | 319 CFX_ByteString name = pCSObj->GetConstString(); |
| 314 } | 320 CPDF_ColorSpace* pCS = _CSFromName(name); |
| 315 | 321 if (!pCS && pResources) { |
| 316 void CPDF_DocPageData::ReleaseFont(CPDF_Dictionary* pFontDict) | 322 CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace")); |
| 317 { | 323 if (pList) { |
| 318 if (!pFontDict) | 324 pCSObj = pList->GetElementValue(name); |
| 319 return; | 325 return GetColorSpace(pCSObj, NULL); |
| 320 | 326 } |
| 321 auto it = m_FontMap.find(pFontDict); | 327 } |
| 322 if (it == m_FontMap.end()) | 328 if (pCS == NULL || pResources == NULL) { |
| 323 return; | 329 return pCS; |
| 324 | 330 } |
| 325 CPDF_CountedFont* fontData = it->second; | 331 CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace")); |
| 326 if (fontData->get()) { | 332 if (pColorSpaces == NULL) { |
| 327 fontData->RemoveRef(); | 333 return pCS; |
| 328 if (fontData->use_count() == 0) { | 334 } |
| 329 fontData->clear(); | 335 CPDF_Object* pDefaultCS = NULL; |
| 330 } | 336 switch (pCS->GetFamily()) { |
| 331 } | 337 case PDFCS_DEVICERGB: |
| 332 } | 338 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB")); |
| 333 | 339 break; |
| 334 CPDF_ColorSpace* CPDF_DocPageData::GetColorSpace(CPDF_Object* pCSObj, CPDF_Dicti
onary* pResources) | 340 case PDFCS_DEVICEGRAY: |
| 335 { | 341 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray")); |
| 336 if (!pCSObj) { | 342 break; |
| 337 return NULL; | 343 case PDFCS_DEVICECMYK: |
| 338 } | 344 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK")); |
| 339 if (pCSObj->GetType() == PDFOBJ_NAME) { | 345 break; |
| 340 CFX_ByteString name = pCSObj->GetConstString(); | 346 } |
| 341 CPDF_ColorSpace* pCS = _CSFromName(name); | 347 if (pDefaultCS == NULL) { |
| 342 if (!pCS && pResources) { | 348 return pCS; |
| 343 CPDF_Dictionary* pList = pResources->GetDict(FX_BSTRC("ColorSpace"))
; | 349 } |
| 344 if (pList) { | 350 return GetColorSpace(pDefaultCS, NULL); |
| 345 pCSObj = pList->GetElementValue(name); | 351 } |
| 346 return GetColorSpace(pCSObj, NULL); | 352 |
| 347 } | 353 if (pCSObj->GetType() != PDFOBJ_ARRAY) |
| 348 } | 354 return nullptr; |
| 349 if (pCS == NULL || pResources == NULL) { | 355 CPDF_Array* pArray = (CPDF_Array*)pCSObj; |
| 350 return pCS; | 356 if (pArray->GetCount() == 0) |
| 351 } | 357 return nullptr; |
| 352 CPDF_Dictionary* pColorSpaces = pResources->GetDict(FX_BSTRC("ColorSpace
")); | 358 if (pArray->GetCount() == 1) |
| 353 if (pColorSpaces == NULL) { | 359 return GetColorSpace(pArray->GetElementValue(0), pResources); |
| 354 return pCS; | 360 |
| 355 } | 361 CPDF_CountedColorSpace* csData = nullptr; |
| 356 CPDF_Object* pDefaultCS = NULL; | 362 auto it = m_ColorSpaceMap.find(pCSObj); |
| 357 switch (pCS->GetFamily()) { | 363 if (it != m_ColorSpaceMap.end()) { |
| 358 case PDFCS_DEVICERGB: | 364 csData = it->second; |
| 359 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultRGB"
)); | |
| 360 break; | |
| 361 case PDFCS_DEVICEGRAY: | |
| 362 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultGray
")); | |
| 363 break; | |
| 364 case PDFCS_DEVICECMYK: | |
| 365 pDefaultCS = pColorSpaces->GetElementValue(FX_BSTRC("DefaultCMYK
")); | |
| 366 break; | |
| 367 } | |
| 368 if (pDefaultCS == NULL) { | |
| 369 return pCS; | |
| 370 } | |
| 371 return GetColorSpace(pDefaultCS, NULL); | |
| 372 } | |
| 373 | |
| 374 if (pCSObj->GetType() != PDFOBJ_ARRAY) | |
| 375 return nullptr; | |
| 376 CPDF_Array* pArray = (CPDF_Array*)pCSObj; | |
| 377 if (pArray->GetCount() == 0) | |
| 378 return nullptr; | |
| 379 if (pArray->GetCount() == 1) | |
| 380 return GetColorSpace(pArray->GetElementValue(0), pResources); | |
| 381 | |
| 382 CPDF_CountedColorSpace* csData = nullptr; | |
| 383 auto it = m_ColorSpaceMap.find(pCSObj); | |
| 384 if (it != m_ColorSpaceMap.end()) { | |
| 385 csData = it->second; | |
| 386 if (csData->get()) { | |
| 387 return csData->AddRef(); | |
| 388 } | |
| 389 } | |
| 390 | |
| 391 CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray); | |
| 392 if (!pCS) | |
| 393 return nullptr; | |
| 394 | |
| 395 if (!csData) { | |
| 396 csData = new CPDF_CountedColorSpace(pCS); | |
| 397 m_ColorSpaceMap[pCSObj] = csData; | |
| 398 } else { | |
| 399 csData->reset(pCS); | |
| 400 } | |
| 401 return csData->AddRef(); | |
| 402 } | |
| 403 | |
| 404 CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) | |
| 405 { | |
| 406 if (!pCSObj) | |
| 407 return nullptr; | |
| 408 | |
| 409 auto it = m_ColorSpaceMap.find(pCSObj); | |
| 410 if (it != m_ColorSpaceMap.end()) | |
| 411 return it->second->AddRef(); | |
| 412 | |
| 413 return nullptr; | |
| 414 } | |
| 415 | |
| 416 void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace) | |
| 417 { | |
| 418 if (!pColorSpace) | |
| 419 return; | |
| 420 | |
| 421 auto it = m_ColorSpaceMap.find(pColorSpace); | |
| 422 if (it == m_ColorSpaceMap.end()) | |
| 423 return; | |
| 424 | |
| 425 CPDF_CountedColorSpace* csData = it->second; | |
| 426 if (csData->get()) { | 365 if (csData->get()) { |
| 427 csData->RemoveRef(); | 366 return csData->AddRef(); |
| 428 if (csData->use_count() == 0) { | 367 } |
| 429 csData->get()->ReleaseCS(); | 368 } |
| 430 csData->reset(nullptr); | 369 |
| 431 } | 370 CPDF_ColorSpace* pCS = CPDF_ColorSpace::Load(m_pPDFDoc, pArray); |
| 432 } | 371 if (!pCS) |
| 433 } | 372 return nullptr; |
| 434 | 373 |
| 435 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, FX_BOOL bSh
ading, const CFX_AffineMatrix* matrix) | 374 if (!csData) { |
| 436 { | 375 csData = new CPDF_CountedColorSpace(pCS); |
| 437 if (!pPatternObj) | 376 m_ColorSpaceMap[pCSObj] = csData; |
| 438 return nullptr; | 377 } else { |
| 439 | 378 csData->reset(pCS); |
| 440 CPDF_CountedPattern* ptData = nullptr; | 379 } |
| 441 auto it = m_PatternMap.find(pPatternObj); | 380 return csData->AddRef(); |
| 442 if (it != m_PatternMap.end()) { | 381 } |
| 443 ptData = it->second; | 382 |
| 444 if (ptData->get()) { | 383 CPDF_ColorSpace* CPDF_DocPageData::GetCopiedColorSpace(CPDF_Object* pCSObj) { |
| 445 return ptData->AddRef(); | 384 if (!pCSObj) |
| 446 } | 385 return nullptr; |
| 447 } | 386 |
| 448 CPDF_Pattern* pPattern = nullptr; | 387 auto it = m_ColorSpaceMap.find(pCSObj); |
| 449 if (bShading) { | 388 if (it != m_ColorSpaceMap.end()) |
| 450 pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, mat
rix); | 389 return it->second->AddRef(); |
| 451 } else { | 390 |
| 452 CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : nullptr; | 391 return nullptr; |
| 453 if (pDict) { | 392 } |
| 454 int type = pDict->GetInteger(FX_BSTRC("PatternType")); | 393 |
| 455 if (type == 1) { | 394 void CPDF_DocPageData::ReleaseColorSpace(CPDF_Object* pColorSpace) { |
| 456 pPattern = new CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix
); | 395 if (!pColorSpace) |
| 457 } else if (type == 2) { | 396 return; |
| 458 pPattern = new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE
, matrix); | 397 |
| 459 } | 398 auto it = m_ColorSpaceMap.find(pColorSpace); |
| 460 } | 399 if (it == m_ColorSpaceMap.end()) |
| 461 } | 400 return; |
| 462 if (!pPattern) | 401 |
| 463 return nullptr; | 402 CPDF_CountedColorSpace* csData = it->second; |
| 464 | 403 if (csData->get()) { |
| 465 if (!ptData) { | 404 csData->RemoveRef(); |
| 466 ptData = new CPDF_CountedPattern(pPattern); | 405 if (csData->use_count() == 0) { |
| 467 m_PatternMap[pPatternObj] = ptData; | 406 csData->get()->ReleaseCS(); |
| 468 } else { | 407 csData->reset(nullptr); |
| 469 ptData->reset(pPattern); | 408 } |
| 470 } | 409 } |
| 471 return ptData->AddRef(); | 410 } |
| 472 } | 411 |
| 473 | 412 CPDF_Pattern* CPDF_DocPageData::GetPattern(CPDF_Object* pPatternObj, |
| 474 void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) | 413 FX_BOOL bShading, |
| 475 { | 414 const CFX_AffineMatrix* matrix) { |
| 476 if (!pPatternObj) | 415 if (!pPatternObj) |
| 477 return; | 416 return nullptr; |
| 478 | 417 |
| 479 auto it = m_PatternMap.find(pPatternObj); | 418 CPDF_CountedPattern* ptData = nullptr; |
| 480 if (it == m_PatternMap.end()) | 419 auto it = m_PatternMap.find(pPatternObj); |
| 481 return; | 420 if (it != m_PatternMap.end()) { |
| 482 | 421 ptData = it->second; |
| 483 CPDF_CountedPattern* ptData = it->second; | |
| 484 if (ptData->get()) { | 422 if (ptData->get()) { |
| 485 ptData->RemoveRef(); | 423 return ptData->AddRef(); |
| 486 if (ptData->use_count() == 0) { | 424 } |
| 487 ptData->clear(); | 425 } |
| 488 } | 426 CPDF_Pattern* pPattern = nullptr; |
| 489 } | 427 if (bShading) { |
| 490 } | 428 pPattern = |
| 491 | 429 new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, bShading, matrix); |
| 492 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) | 430 } else { |
| 493 { | 431 CPDF_Dictionary* pDict = pPatternObj ? pPatternObj->GetDict() : nullptr; |
| 494 if (!pImageStream) | 432 if (pDict) { |
| 495 return nullptr; | 433 int type = pDict->GetInteger(FX_BSTRC("PatternType")); |
| 496 | 434 if (type == 1) { |
| 497 const FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); | 435 pPattern = new CPDF_TilingPattern(m_pPDFDoc, pPatternObj, matrix); |
| 498 auto it = m_ImageMap.find(dwImageObjNum); | 436 } else if (type == 2) { |
| 499 if (it != m_ImageMap.end()) { | 437 pPattern = |
| 500 return it->second->AddRef(); | 438 new CPDF_ShadingPattern(m_pPDFDoc, pPatternObj, FALSE, matrix); |
| 501 } | 439 } |
| 502 | 440 } |
| 503 CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc); | 441 } |
| 504 pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE); | 442 if (!pPattern) |
| 505 | 443 return nullptr; |
| 506 CPDF_CountedImage* imageData = new CPDF_CountedImage(pImage); | 444 |
| 507 m_ImageMap[dwImageObjNum] = imageData; | 445 if (!ptData) { |
| 508 return imageData->AddRef(); | 446 ptData = new CPDF_CountedPattern(pPattern); |
| 509 } | 447 m_PatternMap[pPatternObj] = ptData; |
| 510 | 448 } else { |
| 511 void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) | 449 ptData->reset(pPattern); |
| 512 { | 450 } |
| 513 if (!pImageStream || !pImageStream->GetObjNum()) | 451 return ptData->AddRef(); |
| 514 return; | 452 } |
| 515 | 453 |
| 516 auto it = m_ImageMap.find(pImageStream->GetObjNum()); | 454 void CPDF_DocPageData::ReleasePattern(CPDF_Object* pPatternObj) { |
| 517 if (it == m_ImageMap.end()) | 455 if (!pPatternObj) |
| 518 return; | 456 return; |
| 519 | 457 |
| 520 CPDF_CountedImage* image = it->second; | 458 auto it = m_PatternMap.find(pPatternObj); |
| 521 if (!image) | 459 if (it == m_PatternMap.end()) |
| 522 return; | 460 return; |
| 523 | 461 |
| 524 image->RemoveRef(); | 462 CPDF_CountedPattern* ptData = it->second; |
| 525 if (image->use_count() == 0) { | 463 if (ptData->get()) { |
| 526 delete image->get(); | 464 ptData->RemoveRef(); |
| 527 delete image; | 465 if (ptData->use_count() == 0) { |
| 528 m_ImageMap.erase(it); | 466 ptData->clear(); |
| 529 } | 467 } |
| 530 } | 468 } |
| 531 | 469 } |
| 532 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile(CPDF_Stream* pIccProfileStream) | 470 |
| 533 { | 471 CPDF_Image* CPDF_DocPageData::GetImage(CPDF_Object* pImageStream) { |
| 534 if (!pIccProfileStream) | 472 if (!pImageStream) |
| 535 return NULL; | 473 return nullptr; |
| 536 | 474 |
| 537 auto it = m_IccProfileMap.find(pIccProfileStream); | 475 const FX_DWORD dwImageObjNum = pImageStream->GetObjNum(); |
| 538 if (it != m_IccProfileMap.end()) { | 476 auto it = m_ImageMap.find(dwImageObjNum); |
| 539 return it->second->AddRef(); | 477 if (it != m_ImageMap.end()) { |
| 540 } | 478 return it->second->AddRef(); |
| 541 | 479 } |
| 542 CPDF_StreamAcc stream; | 480 |
| 543 stream.LoadAllData(pIccProfileStream, FALSE); | 481 CPDF_Image* pImage = new CPDF_Image(m_pPDFDoc); |
| 544 uint8_t digest[20]; | 482 pImage->LoadImageF((CPDF_Stream*)pImageStream, FALSE); |
| 545 CPDF_Stream* pCopiedStream = nullptr; | 483 |
| 546 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); | 484 CPDF_CountedImage* imageData = new CPDF_CountedImage(pImage); |
| 547 if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), (void*&)pCopiedStre
am)) { | 485 m_ImageMap[dwImageObjNum] = imageData; |
| 548 auto it_copied_stream = m_IccProfileMap.find(pCopiedStream); | 486 return imageData->AddRef(); |
| 549 return it_copied_stream->second->AddRef(); | 487 } |
| 550 } | 488 |
| 551 CPDF_IccProfile* pProfile = new CPDF_IccProfile(stream.GetData(), stream.Get
Size()); | 489 void CPDF_DocPageData::ReleaseImage(CPDF_Object* pImageStream) { |
| 552 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); | 490 if (!pImageStream || !pImageStream->GetObjNum()) |
| 553 m_IccProfileMap[pIccProfileStream] = ipData; | 491 return; |
| 554 m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); | 492 |
| 555 return ipData->AddRef(); | 493 auto it = m_ImageMap.find(pImageStream->GetObjNum()); |
| 556 } | 494 if (it == m_ImageMap.end()) |
| 557 | 495 return; |
| 558 void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) | 496 |
| 559 { | 497 CPDF_CountedImage* image = it->second; |
| 560 ASSERT(pIccProfile); | 498 if (!image) |
| 561 | 499 return; |
| 562 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { | 500 |
| 563 CPDF_CountedIccProfile* profile = it->second; | 501 image->RemoveRef(); |
| 564 if (profile->get() != pIccProfile) | 502 if (image->use_count() == 0) { |
| 565 continue; | 503 delete image->get(); |
| 566 | 504 delete image; |
| 567 profile->RemoveRef(); | 505 m_ImageMap.erase(it); |
| 568 if (profile->use_count() == 0) { | 506 } |
| 569 delete profile->get(); | 507 } |
| 570 delete profile; | 508 |
| 571 m_IccProfileMap.erase(it); | 509 CPDF_IccProfile* CPDF_DocPageData::GetIccProfile( |
| 572 return; | 510 CPDF_Stream* pIccProfileStream) { |
| 573 } | 511 if (!pIccProfileStream) |
| 574 } | 512 return NULL; |
| 575 } | 513 |
| 576 | 514 auto it = m_IccProfileMap.find(pIccProfileStream); |
| 577 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc(CPDF_Stream* pFontStream) | 515 if (it != m_IccProfileMap.end()) { |
| 578 { | 516 return it->second->AddRef(); |
| 579 ASSERT(pFontStream); | 517 } |
| 580 | 518 |
| 581 auto it = m_FontFileMap.find(pFontStream); | 519 CPDF_StreamAcc stream; |
| 582 if (it != m_FontFileMap.end()) | 520 stream.LoadAllData(pIccProfileStream, FALSE); |
| 583 return it->second->AddRef(); | 521 uint8_t digest[20]; |
| 584 | 522 CPDF_Stream* pCopiedStream = nullptr; |
| 585 CPDF_Dictionary* pFontDict = pFontStream->GetDict(); | 523 CRYPT_SHA1Generate(stream.GetData(), stream.GetSize(), digest); |
| 586 int32_t org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + | 524 if (m_HashProfileMap.Lookup(CFX_ByteStringC(digest, 20), |
| 587 pFontDict->GetInteger(FX_BSTRC("Length2")) + | 525 (void*&)pCopiedStream)) { |
| 588 pFontDict->GetInteger(FX_BSTRC("Length3")); | 526 auto it_copied_stream = m_IccProfileMap.find(pCopiedStream); |
| 589 if (org_size < 0) | 527 return it_copied_stream->second->AddRef(); |
| 590 org_size = 0; | 528 } |
| 591 | 529 CPDF_IccProfile* pProfile = |
| 592 CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc; | 530 new CPDF_IccProfile(stream.GetData(), stream.GetSize()); |
| 593 pFontFile->LoadAllData(pFontStream, FALSE, org_size); | 531 CPDF_CountedIccProfile* ipData = new CPDF_CountedIccProfile(pProfile); |
| 594 | 532 m_IccProfileMap[pIccProfileStream] = ipData; |
| 595 CPDF_CountedStreamAcc* ftData = new CPDF_CountedStreamAcc(pFontFile); | 533 m_HashProfileMap.SetAt(CFX_ByteStringC(digest, 20), pIccProfileStream); |
| 596 m_FontFileMap[pFontStream] = ftData; | 534 return ipData->AddRef(); |
| 597 return ftData->AddRef(); | 535 } |
| 598 } | 536 |
| 599 | 537 void CPDF_DocPageData::ReleaseIccProfile(CPDF_IccProfile* pIccProfile) { |
| 600 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO
L bForce) | 538 ASSERT(pIccProfile); |
| 601 { | 539 |
| 602 if (!pFontStream) | 540 for (auto it = m_IccProfileMap.begin(); it != m_IccProfileMap.end(); ++it) { |
| 603 return; | 541 CPDF_CountedIccProfile* profile = it->second; |
| 604 | 542 if (profile->get() != pIccProfile) |
| 605 auto it = m_FontFileMap.find(pFontStream); | 543 continue; |
| 606 if (it == m_FontFileMap.end()) | 544 |
| 607 return; | 545 profile->RemoveRef(); |
| 608 | 546 if (profile->use_count() == 0) { |
| 609 CPDF_CountedStreamAcc* findData = it->second; | 547 delete profile->get(); |
| 610 if (!findData) | 548 delete profile; |
| 611 return; | 549 m_IccProfileMap.erase(it); |
| 612 | 550 return; |
| 613 findData->RemoveRef(); | 551 } |
| 614 if (findData->use_count() == 0 || bForce) { | 552 } |
| 615 delete findData->get(); | 553 } |
| 616 delete findData; | 554 |
| 617 m_FontFileMap.erase(it); | 555 CPDF_StreamAcc* CPDF_DocPageData::GetFontFileStreamAcc( |
| 618 } | 556 CPDF_Stream* pFontStream) { |
| 619 } | 557 ASSERT(pFontStream); |
| 620 | 558 |
| 621 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj)
const | 559 auto it = m_FontFileMap.find(pFontStream); |
| 622 { | 560 if (it != m_FontFileMap.end()) |
| 623 if (!pCSObj) | 561 return it->second->AddRef(); |
| 624 return nullptr; | 562 |
| 625 | 563 CPDF_Dictionary* pFontDict = pFontStream->GetDict(); |
| 626 auto it = m_ColorSpaceMap.find(pCSObj); | 564 int32_t org_size = pFontDict->GetInteger(FX_BSTRC("Length1")) + |
| 627 return it != m_ColorSpaceMap.end() ? it->second : nullptr; | 565 pFontDict->GetInteger(FX_BSTRC("Length2")) + |
| 628 } | 566 pFontDict->GetInteger(FX_BSTRC("Length3")); |
| 629 | 567 if (org_size < 0) |
| 630 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj)
const | 568 org_size = 0; |
| 631 { | 569 |
| 632 if (!pPatternObj) | 570 CPDF_StreamAcc* pFontFile = new CPDF_StreamAcc; |
| 633 return nullptr; | 571 pFontFile->LoadAllData(pFontStream, FALSE, org_size); |
| 634 | 572 |
| 635 auto it = m_PatternMap.find(pPatternObj); | 573 CPDF_CountedStreamAcc* ftData = new CPDF_CountedStreamAcc(pFontFile); |
| 636 return it != m_PatternMap.end() ? it->second : nullptr; | 574 m_FontFileMap[pFontStream] = ftData; |
| 637 } | 575 return ftData->AddRef(); |
| 576 } |
| 577 |
| 578 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, |
| 579 FX_BOOL bForce) { |
| 580 if (!pFontStream) |
| 581 return; |
| 582 |
| 583 auto it = m_FontFileMap.find(pFontStream); |
| 584 if (it == m_FontFileMap.end()) |
| 585 return; |
| 586 |
| 587 CPDF_CountedStreamAcc* findData = it->second; |
| 588 if (!findData) |
| 589 return; |
| 590 |
| 591 findData->RemoveRef(); |
| 592 if (findData->use_count() == 0 || bForce) { |
| 593 delete findData->get(); |
| 594 delete findData; |
| 595 m_FontFileMap.erase(it); |
| 596 } |
| 597 } |
| 598 |
| 599 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr( |
| 600 CPDF_Object* pCSObj) const { |
| 601 if (!pCSObj) |
| 602 return nullptr; |
| 603 |
| 604 auto it = m_ColorSpaceMap.find(pCSObj); |
| 605 return it != m_ColorSpaceMap.end() ? it->second : nullptr; |
| 606 } |
| 607 |
| 608 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr( |
| 609 CPDF_Object* pPatternObj) const { |
| 610 if (!pPatternObj) |
| 611 return nullptr; |
| 612 |
| 613 auto it = m_PatternMap.find(pPatternObj); |
| 614 return it != m_PatternMap.end() ? it->second : nullptr; |
| 615 } |
| OLD | NEW |