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

Side by Side Diff: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp

Issue 1566553002: Replace CPDF_SortObjNumArray with a std::set. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Created 4 years, 11 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
« no previous file with comments | « core/include/fpdfapi/fpdf_parser.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "parser_int.h" 7 #include "parser_int.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 2799 matching lines...) Expand 10 before | Expand all | Expand 10 after
2810 FX_FILESIZE m_dwTrailerOffset; 2810 FX_FILESIZE m_dwTrailerOffset;
2811 2811
2812 FX_FILESIZE m_dwCurrentOffset; 2812 FX_FILESIZE m_dwCurrentOffset;
2813 2813
2814 PDF_DATAAVAIL_STATUS m_docStatus; 2814 PDF_DATAAVAIL_STATUS m_docStatus;
2815 2815
2816 FX_FILESIZE m_dwFileLen; 2816 FX_FILESIZE m_dwFileLen;
2817 2817
2818 CPDF_Document* m_pDocument; 2818 CPDF_Document* m_pDocument;
2819 2819
2820 CPDF_SortObjNumArray m_objnum_array; 2820 std::set<FX_DWORD> m_objnum_set;
Tom Sepez 2016/01/06 00:49:56 nit: the naming convention for a class that is dir
Lei Zhang 2016/01/06 00:52:26 m_ObjectSet it is.
2821 2821
2822 CFX_ArrayTemplate<CPDF_Object*> m_objs_array; 2822 CFX_ArrayTemplate<CPDF_Object*> m_objs_array;
2823 2823
2824 FX_FILESIZE m_Pos; 2824 FX_FILESIZE m_Pos;
2825 2825
2826 FX_FILESIZE m_bufferOffset; 2826 FX_FILESIZE m_bufferOffset;
2827 2827
2828 FX_DWORD m_bufferSize; 2828 FX_DWORD m_bufferSize;
2829 2829
2830 CFX_ByteString m_WordBuf; 2830 CFX_ByteString m_WordBuf;
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
3052 CPDF_Reference* pRef = pObj->AsReference(); 3052 CPDF_Reference* pRef = pObj->AsReference();
3053 FX_DWORD dwNum = pRef->GetRefObjNum(); 3053 FX_DWORD dwNum = pRef->GetRefObjNum();
3054 FX_FILESIZE offset; 3054 FX_FILESIZE offset;
3055 FX_DWORD size = GetObjectSize(dwNum, offset); 3055 FX_DWORD size = GetObjectSize(dwNum, offset);
3056 if (size == 0 || offset < 0 || offset >= m_dwFileLen) { 3056 if (size == 0 || offset < 0 || offset >= m_dwFileLen) {
3057 break; 3057 break;
3058 } 3058 }
3059 if (!IsDataAvail(offset, size, pHints)) { 3059 if (!IsDataAvail(offset, size, pHints)) {
3060 ret_array.Add(pObj); 3060 ret_array.Add(pObj);
3061 count++; 3061 count++;
3062 } else if (!m_objnum_array.Find(dwNum)) { 3062 } else if (!pdfium::ContainsKey(m_objnum_set, dwNum)) {
3063 m_objnum_array.AddObjNum(dwNum); 3063 m_objnum_set.insert(dwNum);
3064 CPDF_Object* pReferred = 3064 CPDF_Object* pReferred =
3065 m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL); 3065 m_pDocument->GetIndirectObject(pRef->GetRefObjNum(), NULL);
3066 if (pReferred) { 3066 if (pReferred) {
3067 new_obj_array.Add(pReferred); 3067 new_obj_array.Add(pReferred);
3068 } 3068 }
3069 } 3069 }
3070 } break; 3070 } break;
3071 } 3071 }
3072 } 3072 }
3073 if (count > 0) { 3073 if (count > 0) {
3074 int32_t iSize = new_obj_array.GetSize(); 3074 int32_t iSize = new_obj_array.GetSize();
3075 for (i = 0; i < iSize; ++i) { 3075 for (i = 0; i < iSize; ++i) {
3076 CPDF_Object* pObj = new_obj_array[i]; 3076 CPDF_Object* pObj = new_obj_array[i];
3077 if (CPDF_Reference* pRef = pObj->AsReference()) { 3077 if (CPDF_Reference* pRef = pObj->AsReference()) {
3078 FX_DWORD dwNum = pRef->GetRefObjNum(); 3078 FX_DWORD dwNum = pRef->GetRefObjNum();
3079 if (!m_objnum_array.Find(dwNum)) 3079 if (!pdfium::ContainsKey(m_objnum_set, dwNum))
3080 ret_array.Add(pObj); 3080 ret_array.Add(pObj);
3081 } else { 3081 } else {
3082 ret_array.Add(pObj); 3082 ret_array.Add(pObj);
3083 } 3083 }
3084 } 3084 }
3085 return FALSE; 3085 return FALSE;
3086 } 3086 }
3087 obj_array.RemoveAll(); 3087 obj_array.RemoveAll();
3088 obj_array.Append(new_obj_array); 3088 obj_array.Append(new_obj_array);
3089 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array); 3089 return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);
(...skipping 11 matching lines...) Expand all
3101 if (!CheckDocStatus(pHints)) { 3101 if (!CheckDocStatus(pHints)) {
3102 return DataNotAvailable; 3102 return DataNotAvailable;
3103 } 3103 }
3104 } 3104 }
3105 return DataAvailable; 3105 return DataAvailable;
3106 } 3106 }
3107 3107
3108 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) { 3108 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(IFX_DownloadHints* pHints) {
3109 if (!m_objs_array.GetSize()) { 3109 if (!m_objs_array.GetSize()) {
3110 m_objs_array.RemoveAll(); 3110 m_objs_array.RemoveAll();
3111 m_objnum_array.RemoveAll(); 3111 m_objnum_set.clear();
3112 CFX_ArrayTemplate<CPDF_Object*> obj_array; 3112 CFX_ArrayTemplate<CPDF_Object*> obj_array;
3113 obj_array.Append(m_arrayAcroforms); 3113 obj_array.Append(m_arrayAcroforms);
3114 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array); 3114 FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
3115 if (bRet) { 3115 if (bRet) {
3116 m_objs_array.RemoveAll(); 3116 m_objs_array.RemoveAll();
3117 } 3117 }
3118 return bRet; 3118 return bRet;
3119 } 3119 }
3120 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; 3120 CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
3121 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 3121 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
(...skipping 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after
4307 m_bMainXRefLoadedOK = TRUE; 4307 m_bMainXRefLoadedOK = TRUE;
4308 m_bLinearedDataOK = TRUE; 4308 m_bLinearedDataOK = TRUE;
4309 } 4309 }
4310 4310
4311 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable; 4311 return m_bLinearedDataOK ? DataAvailable : DataNotAvailable;
4312 } 4312 }
4313 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage, 4313 FX_BOOL CPDF_DataAvail::CheckPageAnnots(int32_t iPage,
4314 IFX_DownloadHints* pHints) { 4314 IFX_DownloadHints* pHints) {
4315 if (!m_objs_array.GetSize()) { 4315 if (!m_objs_array.GetSize()) {
4316 m_objs_array.RemoveAll(); 4316 m_objs_array.RemoveAll();
4317 m_objnum_array.RemoveAll(); 4317 m_objnum_set.clear();
4318 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage); 4318 CPDF_Dictionary* pPageDict = m_pDocument->GetPage(iPage);
4319 if (!pPageDict) { 4319 if (!pPageDict) {
4320 return TRUE; 4320 return TRUE;
4321 } 4321 }
4322 CPDF_Object* pAnnots = pPageDict->GetElement("Annots"); 4322 CPDF_Object* pAnnots = pPageDict->GetElement("Annots");
4323 if (!pAnnots) { 4323 if (!pAnnots) {
4324 return TRUE; 4324 return TRUE;
4325 } 4325 }
4326 CFX_ArrayTemplate<CPDF_Object*> obj_array; 4326 CFX_ArrayTemplate<CPDF_Object*> obj_array;
4327 obj_array.Add(pAnnots); 4327 obj_array.Add(pAnnots);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4377 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) { 4377 int CPDF_DataAvail::IsPageAvail(int32_t iPage, IFX_DownloadHints* pHints) {
4378 if (!m_pDocument) { 4378 if (!m_pDocument) {
4379 return DataError; 4379 return DataError;
4380 } 4380 }
4381 if (IsFirstCheck(iPage)) { 4381 if (IsFirstCheck(iPage)) {
4382 m_bCurPageDictLoadOK = FALSE; 4382 m_bCurPageDictLoadOK = FALSE;
4383 m_bPageLoadedOK = FALSE; 4383 m_bPageLoadedOK = FALSE;
4384 m_bAnnotsLoad = FALSE; 4384 m_bAnnotsLoad = FALSE;
4385 m_bNeedDownLoadResource = FALSE; 4385 m_bNeedDownLoadResource = FALSE;
4386 m_objs_array.RemoveAll(); 4386 m_objs_array.RemoveAll();
4387 m_objnum_array.RemoveAll(); 4387 m_objnum_set.clear();
4388 } 4388 }
4389 if (pdfium::ContainsKey(m_pagesLoadState, iPage)) 4389 if (pdfium::ContainsKey(m_pagesLoadState, iPage))
4390 return DataAvailable; 4390 return DataAvailable;
4391 4391
4392 if (m_bLinearized) { 4392 if (m_bLinearized) {
4393 if ((FX_DWORD)iPage == m_dwFirstPageNo) { 4393 if ((FX_DWORD)iPage == m_dwFirstPageNo) {
4394 if (!CheckLinearizedFirstPage(iPage, pHints)) 4394 if (!CheckLinearizedFirstPage(iPage, pHints))
4395 return DataNotAvailable; 4395 return DataNotAvailable;
4396 m_pagesLoadState.insert(iPage); 4396 m_pagesLoadState.insert(iPage);
4397 return DataAvailable; 4397 return DataAvailable;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4434 } 4434 }
4435 if (m_bHaveAcroForm && !m_bAcroFormLoad) { 4435 if (m_bHaveAcroForm && !m_bAcroFormLoad) {
4436 if (!CheckAcroFormSubObject(pHints)) { 4436 if (!CheckAcroFormSubObject(pHints)) {
4437 return DataNotAvailable; 4437 return DataNotAvailable;
4438 } 4438 }
4439 m_bAcroFormLoad = TRUE; 4439 m_bAcroFormLoad = TRUE;
4440 } 4440 }
4441 if (!m_bPageLoadedOK) { 4441 if (!m_bPageLoadedOK) {
4442 if (!m_objs_array.GetSize()) { 4442 if (!m_objs_array.GetSize()) {
4443 m_objs_array.RemoveAll(); 4443 m_objs_array.RemoveAll();
4444 m_objnum_array.RemoveAll(); 4444 m_objnum_set.clear();
4445 m_pPageDict = m_pDocument->GetPage(iPage); 4445 m_pPageDict = m_pDocument->GetPage(iPage);
4446 if (!m_pPageDict) { 4446 if (!m_pPageDict) {
4447 ResetFirstCheck(iPage); 4447 ResetFirstCheck(iPage);
4448 return DataAvailable; 4448 return DataAvailable;
4449 } 4449 }
4450 CFX_ArrayTemplate<CPDF_Object*> obj_array; 4450 CFX_ArrayTemplate<CPDF_Object*> obj_array;
4451 obj_array.Add(m_pPageDict); 4451 obj_array.Add(m_pPageDict);
4452 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array); 4452 FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
4453 if (bRet) { 4453 if (bRet) {
4454 m_objs_array.RemoveAll(); 4454 m_objs_array.RemoveAll();
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
4588 } 4588 }
4589 CFX_ArrayTemplate<CPDF_Object*> new_objs_array; 4589 CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
4590 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array); 4590 FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
4591 m_objs_array.RemoveAll(); 4591 m_objs_array.RemoveAll();
4592 if (!bRet) { 4592 if (!bRet) {
4593 m_objs_array.Append(new_objs_array); 4593 m_objs_array.Append(new_objs_array);
4594 return FormNotAvailable; 4594 return FormNotAvailable;
4595 } 4595 }
4596 return FormAvailable; 4596 return FormAvailable;
4597 } 4597 }
4598 void CPDF_SortObjNumArray::AddObjNum(FX_DWORD dwObjNum) { 4598
4599 int32_t iNext = 0;
4600 if (BinarySearch(dwObjNum, iNext)) {
4601 return;
4602 }
4603 m_number_array.InsertAt(iNext, dwObjNum);
4604 }
4605 FX_BOOL CPDF_SortObjNumArray::Find(FX_DWORD dwObjNum) {
4606 int32_t iNext = 0;
4607 return BinarySearch(dwObjNum, iNext);
4608 }
4609 FX_BOOL CPDF_SortObjNumArray::BinarySearch(FX_DWORD value, int32_t& iNext) {
4610 int32_t iLow = 0;
4611 int32_t iHigh = m_number_array.GetSize() - 1;
4612 while (iLow <= iHigh) {
4613 int32_t iMid = (iLow + iHigh) / 2;
4614 if (m_number_array.GetAt(iMid) == value) {
4615 iNext = iMid;
4616 return TRUE;
4617 }
4618 if (m_number_array.GetAt(iMid) > value) {
4619 iHigh = iMid - 1;
4620 } else if (m_number_array.GetAt(iMid) < value) {
4621 iLow = iMid + 1;
4622 }
4623 }
4624 iNext = iLow;
4625 return FALSE;
4626 }
4627 CPDF_PageNode::~CPDF_PageNode() { 4599 CPDF_PageNode::~CPDF_PageNode() {
4628 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) { 4600 for (int32_t i = 0; i < m_childNode.GetSize(); ++i) {
4629 delete m_childNode[i]; 4601 delete m_childNode[i];
4630 } 4602 }
4631 m_childNode.RemoveAll(); 4603 m_childNode.RemoveAll();
4632 } 4604 }
4633 CPDF_HintTables::~CPDF_HintTables() { 4605 CPDF_HintTables::~CPDF_HintTables() {
4634 m_dwDeltaNObjsArray.RemoveAll(); 4606 m_dwDeltaNObjsArray.RemoveAll();
4635 m_dwNSharedObjsArray.RemoveAll(); 4607 m_dwNSharedObjsArray.RemoveAll();
4636 m_dwSharedObjNumArray.RemoveAll(); 4608 m_dwSharedObjNumArray.RemoveAll();
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
4997 if (!m_pLinearizedDict) 4969 if (!m_pLinearizedDict)
4998 return -1; 4970 return -1;
4999 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H"); 4971 CPDF_Array* pRange = m_pLinearizedDict->GetArray("H");
5000 if (!pRange) 4972 if (!pRange)
5001 return -1; 4973 return -1;
5002 CPDF_Object* pStreamLen = pRange->GetElementValue(1); 4974 CPDF_Object* pStreamLen = pRange->GetElementValue(1);
5003 if (!pStreamLen) 4975 if (!pStreamLen)
5004 return -1; 4976 return -1;
5005 return pStreamLen->GetInteger(); 4977 return pStreamLen->GetInteger();
5006 } 4978 }
OLDNEW
« no previous file with comments | « core/include/fpdfapi/fpdf_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698