Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(846)

Side by Side Diff: core/src/fpdfapi/fpdf_page/fpdf_page_doc.cpp

Issue 656753002: Store the address of the page data map's value for proper referencing. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Store counted objects as member Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 m_ColorSpaceMap.InitHashTable(32); 140 m_ColorSpaceMap.InitHashTable(32);
141 m_PatternMap.InitHashTable(16); 141 m_PatternMap.InitHashTable(16);
142 m_ImageMap.InitHashTable(64); 142 m_ImageMap.InitHashTable(64);
143 m_IccProfileMap.InitHashTable(16); 143 m_IccProfileMap.InitHashTable(16);
144 m_FontFileMap.InitHashTable(32); 144 m_FontFileMap.InitHashTable(32);
145 } 145 }
146 CPDF_DocPageData::~CPDF_DocPageData() 146 CPDF_DocPageData::~CPDF_DocPageData()
147 { 147 {
148 Clear(FALSE); 148 Clear(FALSE);
149 Clear(TRUE); 149 Clear(TRUE);
150 FX_POSITION pos = NULL;
Tom Sepez 2014/10/14 23:07:44 nit: no need to initialize since we assign in the
151 pos = m_PatternMap.GetStartPosition();
Tom Sepez 2014/10/14 23:07:44 nit: for future cleanup, there should be a method
152 while (pos)
153 {
154 CPDF_Object* ptObj;
155 CPDF_CountedObject<CPDF_Pattern*>* ptData;
156 m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
157 delete ptData;
158 }
159 m_PatternMap.RemoveAll();
160 pos = m_FontMap.GetStartPosition();
161 while (pos)
162 {
163 CPDF_Dictionary* fontDict;
164 CPDF_CountedObject<CPDF_Font*>* fontData;
165 m_FontMap.GetNextAssoc(pos, fontDict, fontData);
166 delete fontData;
167 }
168 m_FontMap.RemoveAll();
169 pos = m_ColorSpaceMap.GetStartPosition();
170 while (pos)
171 {
172 CPDF_Object* csKey;
173 CPDF_CountedObject<CPDF_ColorSpace*>* csData;
174 m_ColorSpaceMap.GetNextAssoc(pos, csKey, csData);
175 delete csData;
176 }
177 m_ColorSpaceMap.RemoveAll();
150 } 178 }
151 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease) 179 void CPDF_DocPageData::Clear(FX_BOOL bForceRelease)
152 { 180 {
153 FX_POSITION pos; 181 FX_POSITION pos;
154
155 m_bForceClear = bForceRelease; 182 m_bForceClear = bForceRelease;
156 183 pos = m_PatternMap.GetStartPosition();
157 // Release objects saved in the resource maps like font map and color space map. 184 while (pos) {
Tom Sepez 2014/10/14 23:07:44 nit: for future cleanup, again this should be a me
158 // The compound objects shall be released before simple ones. 185 CPDF_Object* ptObj;
186 CPDF_CountedObject<CPDF_Pattern*>* ptData;
187 m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
188 if (!ptData->m_Obj) {
189 continue;
190 }
191 if (bForceRelease || ptData->m_nCount < 2) {
192 ptData->m_Obj->SetForceClear(bForceRelease);
193 delete ptData->m_Obj;
194 ptData->m_Obj = NULL;
195 }
196 }
159 pos = m_FontMap.GetStartPosition(); 197 pos = m_FontMap.GetStartPosition();
160 while (pos) { 198 while (pos) {
161 CPDF_Dictionary* fontDict; 199 CPDF_Dictionary* fontDict;
162 CPDF_CountedObject<CPDF_Font*>* fontData; 200 CPDF_CountedObject<CPDF_Font*>* fontData;
163 m_FontMap.GetNextAssoc(pos, fontDict, fontData); 201 m_FontMap.GetNextAssoc(pos, fontDict, fontData);
164 if (!fontData->m_Obj) { 202 if (!fontData->m_Obj) {
165 continue; 203 continue;
166 } 204 }
167 if (bForceRelease || fontData->m_nCount < 2) { 205 if (bForceRelease || fontData->m_nCount < 2) {
168 delete fontData->m_Obj; 206 delete fontData->m_Obj;
(...skipping 27 matching lines...) Expand all
196 while (pos2) { 234 while (pos2) {
197 CFX_ByteString bsKey; 235 CFX_ByteString bsKey;
198 CPDF_Stream* pFindStream = NULL; 236 CPDF_Stream* pFindStream = NULL;
199 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream); 237 m_HashProfileMap.GetNextAssoc(pos2, bsKey, (void*&)pFindStream);
200 if (ipKey == pFindStream) { 238 if (ipKey == pFindStream) {
201 m_HashProfileMap.RemoveKey(bsKey); 239 m_HashProfileMap.RemoveKey(bsKey);
202 break; 240 break;
203 } 241 }
204 } 242 }
205 delete ipData->m_Obj; 243 delete ipData->m_Obj;
206 ipData->m_Obj = NULL;
207 delete ipData; 244 delete ipData;
Tom Sepez 2014/10/14 23:07:44 Not clear to me why some of these delete their cou
Bo Xu 2014/10/14 23:37:49 For colorspace, pattern and font which are managed
208 m_IccProfileMap.RemoveKey(ipKey); 245 m_IccProfileMap.RemoveKey(ipKey);
209 } 246 }
210 } 247 }
211 pos = m_FontFileMap.GetStartPosition(); 248 pos = m_FontFileMap.GetStartPosition();
212 while (pos) { 249 while (pos) {
213 CPDF_Stream* ftKey; 250 CPDF_Stream* ftKey;
214 CPDF_CountedObject<CPDF_StreamAcc*>* ftData; 251 CPDF_CountedObject<CPDF_StreamAcc*>* ftData;
215 m_FontFileMap.GetNextAssoc(pos, ftKey, ftData); 252 m_FontFileMap.GetNextAssoc(pos, ftKey, ftData);
216 if (!ftData->m_Obj) { 253 if (!ftData->m_Obj) {
217 continue; 254 continue;
218 } 255 }
219 if (bForceRelease || ftData->m_nCount < 2) { 256 if (bForceRelease || ftData->m_nCount < 2) {
220 delete ftData->m_Obj; 257 delete ftData->m_Obj;
221 ftData->m_Obj = NULL;
222 delete ftData; 258 delete ftData;
223 m_FontFileMap.RemoveKey(ftKey); 259 m_FontFileMap.RemoveKey(ftKey);
224 } 260 }
225 } 261 }
226 pos = m_PatternMap.GetStartPosition();
227 while (pos) {
228 CPDF_Object* ptObj;
229 CPDF_CountedObject<CPDF_Pattern*>* ptData;
230 m_PatternMap.GetNextAssoc(pos, ptObj, ptData);
231 if (!ptData->m_Obj) {
232 continue;
233 }
234 if (bForceRelease || ptData->m_nCount < 2) {
235 ptData->m_Obj->SetForceClear(bForceRelease);
236 delete ptData->m_Obj;
237 ptData->m_Obj = NULL;
238 }
239 }
240 pos = m_ImageMap.GetStartPosition(); 262 pos = m_ImageMap.GetStartPosition();
241 while (pos) { 263 while (pos) {
242 FX_DWORD objNum; 264 FX_DWORD objNum;
243 CPDF_CountedObject<CPDF_Image*>* imageData; 265 CPDF_CountedObject<CPDF_Image*>* imageData;
244 m_ImageMap.GetNextAssoc(pos, objNum, imageData); 266 m_ImageMap.GetNextAssoc(pos, objNum, imageData);
245 if (!imageData->m_Obj) { 267 if (!imageData->m_Obj) {
246 continue; 268 continue;
247 } 269 }
248 if (bForceRelease || imageData->m_nCount < 2) { 270 if (bForceRelease || imageData->m_nCount < 2) {
249 delete imageData->m_Obj; 271 delete imageData->m_Obj;
250 imageData->m_Obj = NULL;
251 delete imageData; 272 delete imageData;
252 m_ImageMap.RemoveKey(objNum); 273 m_ImageMap.RemoveKey(objNum);
253 } 274 }
254 } 275 }
255 } 276 }
256 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl y) 277 CPDF_Font* CPDF_DocPageData::GetFont(CPDF_Dictionary* pFontDict, FX_BOOL findOnl y)
257 { 278 {
258 if (!pFontDict) { 279 if (!pFontDict) {
259 return NULL; 280 return NULL;
260 } 281 }
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 m_FontFileMap.SetAt(pFontStream, ftData); 668 m_FontFileMap.SetAt(pFontStream, ftData);
648 return pFontFile; 669 return pFontFile;
649 } 670 }
650 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO L bForce) 671 void CPDF_DocPageData::ReleaseFontFileStreamAcc(CPDF_Stream* pFontStream, FX_BOO L bForce)
651 { 672 {
652 if (!pFontStream) { 673 if (!pFontStream) {
653 return; 674 return;
654 } 675 }
655 PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontS tream, NULL, bForce); 676 PDF_DocPageData_Release<CPDF_Stream*, CPDF_StreamAcc*>(m_FontFileMap, pFontS tream, NULL, bForce);
656 } 677 }
678 CPDF_CountedColorSpace* CPDF_DocPageData::FindColorSpacePtr(CPDF_Object* pCSObj) const
Tom Sepez 2014/10/14 23:07:44 nit: Again, this might be a method of the templat
679 {
680 if (!pCSObj) return NULL;
681 CPDF_CountedObject<CPDF_ColorSpace*>* csData;
682 if (m_ColorSpaceMap.Lookup(pCSObj, csData))
683 {
684 return csData;
685 }
686 return NULL;
687 }
688 CPDF_CountedPattern* CPDF_DocPageData::FindPatternPtr(CPDF_Object* pPatternObj) const
689 {
690 if (!pPatternObj) return NULL;
691 CPDF_CountedObject<CPDF_Pattern*>* ptData;
692 if (m_PatternMap.Lookup(pPatternObj, ptData))
693 {
694 return ptData;
695 }
696 return NULL;
697 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698