Chromium Code Reviews| Index: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| index 3696bb13dbdcca595b6f5cd5d38fd298df1af95a..f2ade5708eb660ab10a253c66bb89aaedaae10c3 100644 |
| --- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| +++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp |
| @@ -36,10 +36,6 @@ struct SearchTagRecord { |
| FX_DWORD m_Offset; |
| }; |
| -int CompareFileSize(const void* p1, const void* p2) { |
| - return *(FX_FILESIZE*)p1 - *(FX_FILESIZE*)p2; |
| -} |
| - |
| int32_t GetHeaderOffset(IFX_FileRead* pFile) { |
| const FX_DWORD tag = FXDWORD_FROM_LSBFIRST(0x46445025); |
| const size_t kBufSize = 4; |
| @@ -179,7 +175,7 @@ void CPDF_Parser::CloseParser() { |
| m_ObjectStreamMap.clear(); |
| m_ObjCache.clear(); |
| - m_SortedOffset.RemoveAll(); |
| + m_SortedOffset.clear(); |
| m_ObjectInfo.clear(); |
| int32_t iLen = m_Trailers.GetSize(); |
| for (int32_t i = 0; i < iLen; ++i) { |
| @@ -226,13 +222,7 @@ CPDF_Parser::Error CPDF_Parser::StartParse(IFX_FileRead* pFileAccess) { |
| FX_BOOL bXRefRebuilt = FALSE; |
| if (m_Syntax.SearchWord("startxref", TRUE, FALSE, 4096)) { |
| - FX_FILESIZE startxref_offset = m_Syntax.SavePos(); |
| - void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(), |
| - m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
| - CompareFileSize); |
| - if (!pResult) |
| - m_SortedOffset.Add(startxref_offset); |
| - |
| + m_SortedOffset.insert(m_Syntax.SavePos()); |
| m_Syntax.GetKeyword(); |
| bool bNumber; |
| CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(&bNumber); |
| @@ -275,8 +265,6 @@ CPDF_Parser::Error CPDF_Parser::StartParse(IFX_FileRead* pFileAccess) { |
| if (!m_pDocument->GetRoot()) |
| return FORMAT_ERROR; |
| } |
| - FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| if (GetRootObjNum() == 0) { |
| ReleaseEncryptHandler(); |
| if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| @@ -366,13 +354,13 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) { |
| if (xrefsize > 0 && xrefsize <= kMaxXRefSize) |
| ShrinkObjectMap(xrefsize); |
| - CFX_FileSizeArray CrossRefList; |
| - CFX_FileSizeArray XRefStreamList; |
| - CrossRefList.Add(xrefpos); |
| - XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm")); |
| - |
| + std::vector<FX_FILESIZE> CrossRefList; |
| + std::vector<FX_FILESIZE> XRefStreamList; |
| std::set<FX_FILESIZE> seen_xrefpos; |
| + CrossRefList.push_back(xrefpos); |
| + XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm")); |
| seen_xrefpos.insert(xrefpos); |
| + |
| // When |m_pTrailer| doesn't have Prev entry or Prev entry value is not |
| // numerical, GetDirectInteger() returns 0. Loading will end. |
| xrefpos = GetDirectInteger(m_pTrailer, "Prev"); |
| @@ -381,18 +369,20 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV4(FX_FILESIZE xrefpos) { |
| if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) |
| return FALSE; |
| seen_xrefpos.insert(xrefpos); |
| - CrossRefList.InsertAt(0, xrefpos); |
| + // SLOW ... |
|
Lei Zhang
2016/02/05 19:22:20
You could push_back() and then iterate through the
Tom Sepez
2016/02/05 21:03:02
Nah, the fix is to make it a deque, if I can prove
Lei Zhang
2016/02/05 21:09:56
I was thinking about a deque too, but I realized w
|
| + CrossRefList.insert(CrossRefList.begin(), xrefpos); |
| LoadCrossRefV4(xrefpos, 0, TRUE); |
| std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
| LoadTrailerV4()); |
| if (!pDict) |
| return FALSE; |
| xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
| - |
| - XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm")); |
| + // SLOW ... |
| + XRefStreamList.insert(XRefStreamList.begin(), |
| + pDict->GetIntegerBy("XRefStm")); |
| m_Trailers.Add(pDict.release()); |
| } |
| - for (int32_t i = 0; i < CrossRefList.GetSize(); i++) { |
| + for (size_t i = 0; i < CrossRefList.size(); ++i) { |
| if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) |
| return FALSE; |
| } |
| @@ -411,19 +401,22 @@ FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, |
| if (xrefsize == 0) { |
| return FALSE; |
| } |
| - CFX_FileSizeArray CrossRefList, XRefStreamList; |
| - CrossRefList.Add(xrefpos); |
| - XRefStreamList.Add(GetDirectInteger(m_pTrailer, "XRefStm")); |
| + std::vector<FX_FILESIZE> CrossRefList; |
| + std::vector<FX_FILESIZE> XRefStreamList; |
| std::set<FX_FILESIZE> seen_xrefpos; |
| + CrossRefList.push_back(xrefpos); |
| + XRefStreamList.push_back(GetDirectInteger(m_pTrailer, "XRefStm")); |
| seen_xrefpos.insert(xrefpos); |
| + |
| xrefpos = GetDirectInteger(m_pTrailer, "Prev"); |
| while (xrefpos) { |
| // Check for circular references. |
| if (pdfium::ContainsKey(seen_xrefpos, xrefpos)) |
| return FALSE; |
| seen_xrefpos.insert(xrefpos); |
| - CrossRefList.InsertAt(0, xrefpos); |
| + // SLOW ... |
| + CrossRefList.insert(CrossRefList.begin(), xrefpos); |
| LoadCrossRefV4(xrefpos, 0, TRUE); |
| std::unique_ptr<CPDF_Dictionary, ReleaseDeleter<CPDF_Dictionary>> pDict( |
| LoadTrailerV4()); |
| @@ -431,11 +424,12 @@ FX_BOOL CPDF_Parser::LoadLinearizedAllCrossRefV4(FX_FILESIZE xrefpos, |
| return FALSE; |
| } |
| xrefpos = GetDirectInteger(pDict.get(), "Prev"); |
| - |
| - XRefStreamList.InsertAt(0, pDict->GetIntegerBy("XRefStm")); |
| + // SLOW ... |
| + XRefStreamList.insert(XRefStreamList.begin(), |
| + pDict->GetIntegerBy("XRefStm")); |
| m_Trailers.Add(pDict.release()); |
| } |
| - for (int32_t i = 1; i < CrossRefList.GetSize(); i++) |
| + for (size_t i = 1; i < CrossRefList.size(); ++i) |
| if (!LoadCrossRefV4(CrossRefList[i], XRefStreamList[i], FALSE)) { |
| return FALSE; |
| } |
| @@ -445,12 +439,7 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
| FX_DWORD dwObjCount) { |
| FX_FILESIZE dwStartPos = pos - m_Syntax.m_HeaderOffset; |
| m_Syntax.RestorePos(dwStartPos); |
| - void* pResult = |
| - FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(pos); |
| - } |
| + m_SortedOffset.insert(pos); |
| FX_DWORD start_objnum = 0; |
| FX_DWORD count = dwObjCount; |
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| @@ -489,12 +478,7 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
| } |
| m_ObjectInfo[objnum].gennum = version; |
| if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) { |
| - void* pResult = FXSYS_bsearch( |
| - &m_ObjectInfo[objnum].pos, m_SortedOffset.GetData(), |
| - m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(m_ObjectInfo[objnum].pos); |
| - } |
| + m_SortedOffset.insert(m_ObjectInfo[objnum].pos); |
| } |
| m_ObjectInfo[objnum].type = 1; |
| } |
| @@ -504,11 +488,6 @@ FX_BOOL CPDF_Parser::LoadLinearizedCrossRefV4(FX_FILESIZE pos, |
| return TRUE; |
| } |
| -bool CPDF_Parser::FindPosInOffsets(FX_FILESIZE pos) const { |
| - return FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| -} |
| - |
| bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
| FX_FILESIZE streampos, |
| FX_BOOL bSkip) { |
| @@ -516,11 +495,9 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
| if (m_Syntax.GetKeyword() != "xref") |
| return false; |
| - if (!FindPosInOffsets(pos)) |
| - m_SortedOffset.Add(pos); |
| - |
| - if (streampos && !FindPosInOffsets(streampos)) |
| - m_SortedOffset.Add(streampos); |
| + m_SortedOffset.insert(pos); |
| + if (streampos) |
| + m_SortedOffset.insert(streampos); |
| while (1) { |
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| @@ -570,9 +547,8 @@ bool CPDF_Parser::LoadCrossRefV4(FX_FILESIZE pos, |
| m_bVersionUpdated = TRUE; |
| } |
| m_ObjectInfo[objnum].gennum = version; |
| - if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen && |
| - !FindPosInOffsets(m_ObjectInfo[objnum].pos)) { |
| - m_SortedOffset.Add(m_ObjectInfo[objnum].pos); |
| + if (m_ObjectInfo[objnum].pos < m_Syntax.m_FileLen) { |
| + m_SortedOffset.insert(m_ObjectInfo[objnum].pos); |
| } |
| m_ObjectInfo[objnum].type = 1; |
| } |
| @@ -606,7 +582,7 @@ FX_BOOL CPDF_Parser::LoadAllCrossRefV5(FX_FILESIZE xrefpos) { |
| FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| m_ObjectInfo.clear(); |
| - m_SortedOffset.RemoveAll(); |
| + m_SortedOffset.clear(); |
| if (m_pTrailer) { |
| m_pTrailer->Release(); |
| m_pTrailer = NULL; |
| @@ -767,14 +743,8 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| break; |
| } |
| FX_FILESIZE obj_pos = start_pos - m_Syntax.m_HeaderOffset; |
| + m_SortedOffset.insert(obj_pos); |
| last_obj = start_pos; |
| - void* pResult = |
| - FXSYS_bsearch(&obj_pos, m_SortedOffset.GetData(), |
| - m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
| - CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(obj_pos); |
| - } |
| FX_FILESIZE obj_end = 0; |
| CPDF_Object* pObject = ParseIndirectObjectAtByStrict( |
| m_pDocument, obj_pos, objnum, &obj_end); |
| @@ -974,13 +944,7 @@ FX_BOOL CPDF_Parser::RebuildCrossRef() { |
| } else if (last_trailer == -1 || last_xref < last_obj) { |
| last_trailer = m_Syntax.m_FileLen; |
| } |
| - FX_FILESIZE offset = last_trailer - m_Syntax.m_HeaderOffset; |
| - void* pResult = |
| - FXSYS_bsearch(&offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(offset); |
| - } |
| + m_SortedOffset.insert(last_trailer - m_Syntax.m_HeaderOffset); |
| return m_pTrailer && !m_ObjectInfo.empty(); |
| } |
| @@ -1092,12 +1056,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { |
| FX_FILESIZE offset = |
| GetVarInt(entrystart + WidthArray[0], WidthArray[1]); |
| m_ObjectInfo[startnum + j].pos = offset; |
| - void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), |
| - m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(offset); |
| - } |
| + m_SortedOffset.insert(offset); |
| continue; |
| } |
| if (GetObjectType(startnum + j)) { |
| @@ -1111,12 +1070,7 @@ FX_BOOL CPDF_Parser::LoadCrossRefV5(FX_FILESIZE* pos, FX_BOOL bMainXRef) { |
| GetVarInt(entrystart + WidthArray[0], WidthArray[1]); |
| m_ObjectInfo[startnum + j].pos = offset; |
| if (type == 1) { |
| - void* pResult = FXSYS_bsearch(&offset, m_SortedOffset.GetData(), |
| - m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - m_SortedOffset.Add(offset); |
| - } |
| + m_SortedOffset.insert(offset); |
| } else { |
| if (offset < 0 || !IsValidObjectNumber(offset)) { |
| pStream->Release(); |
| @@ -1161,17 +1115,12 @@ FX_BOOL CPDF_Parser::IsFormStream(FX_DWORD objnum, FX_BOOL& bForm) { |
| if (GetObjectType(objnum) == 2) |
| return TRUE; |
| FX_FILESIZE pos = m_ObjectInfo[objnum].pos; |
| - void* pResult = |
| - FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| + auto it = m_SortedOffset.find(pos); |
| + if (it == m_SortedOffset.end()) |
| return TRUE; |
| - } |
| - if ((FX_FILESIZE*)pResult - (FX_FILESIZE*)m_SortedOffset.GetData() == |
| - m_SortedOffset.GetSize() - 1) { |
| + if (++it == m_SortedOffset.end()) |
| return FALSE; |
| - } |
| - FX_FILESIZE size = ((FX_FILESIZE*)pResult)[1] - pos; |
| + FX_FILESIZE size = *it - pos; |
| FX_FILESIZE SavedPos = m_Syntax.SavePos(); |
| m_Syntax.RestorePos(pos); |
| const char kFormStream[] = "/Form\0stream"; |
| @@ -1253,23 +1202,18 @@ FX_FILESIZE CPDF_Parser::GetObjectSize(FX_DWORD objnum) const { |
| if (GetObjectType(objnum) == 2) |
| objnum = GetObjectPositionOrZero(objnum); |
| - if (GetObjectType(objnum) == 1 || GetObjectType(objnum) == 255) { |
| - FX_FILESIZE offset = GetObjectPositionOrZero(objnum); |
| - if (offset == 0) |
| - return 0; |
| + if (GetObjectType(objnum) != 1 && GetObjectType(objnum) != 255) |
| + return 0; |
| - FX_FILESIZE* pResult = static_cast<FX_FILESIZE*>(FXSYS_bsearch( |
| - &offset, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize)); |
| - if (!pResult) |
| - return 0; |
| + FX_FILESIZE offset = GetObjectPositionOrZero(objnum); |
| + if (offset == 0) |
| + return 0; |
| - if (pResult - m_SortedOffset.GetData() == m_SortedOffset.GetSize() - 1) |
| - return 0; |
| + auto it = m_SortedOffset.find(offset); |
| + if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) |
| + return 0; |
| - return pResult[1] - offset; |
| - } |
| - return 0; |
| + return *it - offset; |
| } |
| void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, |
| @@ -1341,14 +1285,12 @@ void CPDF_Parser::GetIndirectBinary(FX_DWORD objnum, |
| m_Syntax.RestorePos(SavedPos); |
| return; |
| } |
| - void* pResult = |
| - FXSYS_bsearch(&pos, m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| + auto it = m_SortedOffset.find(pos); |
| + if (it == m_SortedOffset.end() || ++it == m_SortedOffset.end()) { |
| m_Syntax.RestorePos(SavedPos); |
| return; |
| } |
| - FX_FILESIZE nextoff = ((FX_FILESIZE*)pResult)[1]; |
| + FX_FILESIZE nextoff = *it; |
| FX_BOOL bNextOffValid = FALSE; |
| if (nextoff != pos) { |
| m_Syntax.RestorePos(nextoff); |
| @@ -1594,8 +1536,6 @@ CPDF_Parser::Error CPDF_Parser::StartAsyncParse(IFX_FileRead* pFileAccess) { |
| return FORMAT_ERROR; |
| } |
| } |
| - FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| if (GetRootObjNum() == 0) { |
| ReleaseEncryptHandler(); |
| if (!RebuildCrossRef() || GetRootObjNum() == 0) |
| @@ -1663,8 +1603,6 @@ CPDF_Parser::Error CPDF_Parser::LoadLinearizedMainXRefTable() { |
| m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| return FORMAT_ERROR; |
| } |
| - FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| m_Syntax.m_MetadataObjnum = dwSaveMetadataObjnum; |
| return SUCCESS; |
| } |
| @@ -2664,114 +2602,60 @@ class CPDF_DataAvail final : public IPDF_DataAvail { |
| IFX_DownloadHints* pHints); |
| CPDF_Parser m_parser; |
| - |
| CPDF_SyntaxParser m_syntaxParser; |
| - |
| CPDF_Object* m_pRoot; |
| - |
| FX_DWORD m_dwRootObjNum; |
| - |
| FX_DWORD m_dwInfoObjNum; |
| - |
| CPDF_Object* m_pLinearized; |
| - |
| CPDF_Object* m_pTrailer; |
| - |
| FX_BOOL m_bDocAvail; |
| - |
| FX_FILESIZE m_dwHeaderOffset; |
| - |
| FX_FILESIZE m_dwLastXRefOffset; |
| - |
| FX_FILESIZE m_dwXRefOffset; |
| - |
| FX_FILESIZE m_dwTrailerOffset; |
| - |
| FX_FILESIZE m_dwCurrentOffset; |
| - |
| PDF_DATAAVAIL_STATUS m_docStatus; |
| - |
| FX_FILESIZE m_dwFileLen; |
| - |
| CPDF_Document* m_pDocument; |
| - |
| std::set<FX_DWORD> m_ObjectSet; |
| - |
| CFX_ArrayTemplate<CPDF_Object*> m_objs_array; |
| - |
| FX_FILESIZE m_Pos; |
| - |
| FX_FILESIZE m_bufferOffset; |
| - |
| FX_DWORD m_bufferSize; |
| - |
| CFX_ByteString m_WordBuf; |
| - |
| uint8_t m_bufferData[512]; |
| - |
| - CFX_FileSizeArray m_CrossOffset; |
| - |
| + std::vector<FX_FILESIZE> m_CrossOffset; |
| CFX_DWordArray m_XRefStreamList; |
| - |
| CFX_DWordArray m_PageObjList; |
| - |
| FX_DWORD m_PagesObjNum; |
| - |
| FX_BOOL m_bLinearized; |
| - |
| FX_DWORD m_dwFirstPageNo; |
| - |
| FX_BOOL m_bLinearedDataOK; |
| - |
| FX_BOOL m_bMainXRefLoadTried; |
| - |
| FX_BOOL m_bMainXRefLoadedOK; |
| - |
| FX_BOOL m_bPagesTreeLoad; |
| - |
| FX_BOOL m_bPagesLoad; |
| - |
| CPDF_Parser* m_pCurrentParser; |
| - |
| FX_FILESIZE m_dwCurrentXRefSteam; |
| - |
| FX_BOOL m_bAnnotsLoad; |
| - |
| FX_BOOL m_bHaveAcroForm; |
| - |
| FX_DWORD m_dwAcroFormObjNum; |
| - |
| FX_BOOL m_bAcroFormLoad; |
| - |
| CPDF_Object* m_pAcroForm; |
| - |
| CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms; |
| - |
| CPDF_Dictionary* m_pPageDict; |
| - |
| CPDF_Object* m_pPageResource; |
| - |
| FX_BOOL m_bNeedDownLoadResource; |
| - |
| FX_BOOL m_bPageLoadedOK; |
| - |
| FX_BOOL m_bLinearizedFormParamLoad; |
| - |
| CFX_ArrayTemplate<CPDF_Object*> m_PagesArray; |
| - |
| FX_DWORD m_dwEncryptObjNum; |
| - |
| FX_FILESIZE m_dwPrevXRefOffset; |
| - |
| FX_BOOL m_bTotalLoadPageTree; |
| - |
| FX_BOOL m_bCurPageDictLoadOK; |
| - |
| CPDF_PageNode m_pageNodes; |
| - |
| std::set<FX_DWORD> m_pageMapCheckState; |
| std::set<FX_DWORD> m_pagesLoadState; |
| - |
| std::unique_ptr<CPDF_HintTables> m_pHintTables; |
| FX_BOOL m_bSupportHintTable; |
| }; |
| @@ -2865,26 +2749,21 @@ FX_DWORD CPDF_DataAvail::GetObjectSize(FX_DWORD objnum, FX_FILESIZE& offset) { |
| if (pParser->GetObjectType(objnum) == 2) |
| objnum = pParser->GetObjectPositionOrZero(objnum); |
| - if (pParser->GetObjectType(objnum) == 1 || |
| - pParser->GetObjectType(objnum) == 255) { |
| - offset = pParser->GetObjectPositionOrZero(objnum); |
| - if (offset == 0) { |
| - return 0; |
| - } |
| - void* pResult = FXSYS_bsearch(&offset, pParser->m_SortedOffset.GetData(), |
| - pParser->m_SortedOffset.GetSize(), |
| - sizeof(FX_FILESIZE), CompareFileSize); |
| - if (!pResult) { |
| - return 0; |
| - } |
| - if ((FX_FILESIZE*)pResult - |
| - (FX_FILESIZE*)pParser->m_SortedOffset.GetData() == |
| - pParser->m_SortedOffset.GetSize() - 1) { |
| - return 0; |
| - } |
| - return (FX_DWORD)(((FX_FILESIZE*)pResult)[1] - offset); |
| + if (pParser->GetObjectType(objnum) != 1 && |
| + pParser->GetObjectType(objnum) != 255) { |
| + return 0; |
| } |
| - return 0; |
| + |
| + offset = pParser->GetObjectPositionOrZero(objnum); |
| + if (offset == 0) |
| + return 0; |
| + |
| + auto it = pParser->m_SortedOffset.find(offset); |
| + if (it == pParser->m_SortedOffset.end() || |
| + ++it == pParser->m_SortedOffset.end()) { |
| + return 0; |
| + } |
| + return *it - offset; |
| } |
| FX_BOOL CPDF_DataAvail::IsObjectsAvail( |
| CFX_ArrayTemplate<CPDF_Object*>& obj_array, |
| @@ -3107,9 +2986,6 @@ FX_BOOL CPDF_DataAvail::LoadAllXref(IFX_DownloadHints* pHints) { |
| m_docStatus = PDF_DATAAVAIL_LOADALLFILE; |
| return FALSE; |
| } |
| - FXSYS_qsort(m_parser.m_SortedOffset.GetData(), |
| - m_parser.m_SortedOffset.GetSize(), sizeof(FX_FILESIZE), |
| - CompareFileSize); |
| m_dwRootObjNum = m_parser.GetRootObjNum(); |
| m_dwInfoObjNum = m_parser.GetInfoObjNum(); |
| m_pCurrentParser = &m_parser; |
| @@ -3810,7 +3686,8 @@ FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) { |
| return FALSE; |
| } |
| if (token == "xref") { |
| - m_CrossOffset.InsertAt(0, m_dwXRefOffset); |
| + // SLOW ... |
| + m_CrossOffset.insert(m_CrossOffset.begin(), m_dwXRefOffset); |
|
Lei Zhang
2016/02/05 19:22:20
BTW, we insert into |m_crossoffset| but never read
Tom Sepez
2016/02/05 21:03:02
Removed.
|
| while (1) { |
| if (!GetNextToken(token)) { |
| iSize = |
| @@ -4486,14 +4363,14 @@ CPDF_HintTables::~CPDF_HintTables() { |
| m_dwNSharedObjsArray.RemoveAll(); |
| m_dwSharedObjNumArray.RemoveAll(); |
| m_dwIdentifierArray.RemoveAll(); |
| - m_szPageOffsetArray.RemoveAll(); |
| - m_szSharedObjOffsetArray.RemoveAll(); |
| } |
| -FX_DWORD CPDF_HintTables::GetItemLength(int index, |
| - const CFX_FileSizeArray& szArray) { |
| - if (index < 0 || szArray.GetSize() < 2 || index > szArray.GetSize() - 2 || |
| - szArray[index] > szArray[index + 1]) |
| +FX_DWORD CPDF_HintTables::GetItemLength( |
| + int index, |
| + const std::vector<FX_FILESIZE>& szArray) { |
| + if (index < 0 || szArray.size() < 2 || index > szArray.size() - 2 || |
| + szArray[index] > szArray[index + 1]) { |
| return 0; |
| + } |
| return szArray[index + 1] - szArray[index]; |
| } |
| FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { |
| @@ -4583,26 +4460,26 @@ FX_BOOL CPDF_HintTables::ReadPageHintTable(CFX_BitStream* hStream) { |
| int nFirstPageNum = pFirstPageNum ? pFirstPageNum->GetInteger() : 0; |
| for (int i = 0; i < nPages; ++i) { |
| if (i == nFirstPageNum) { |
| - m_szPageOffsetArray.Add(m_szFirstPageObjOffset); |
| + m_szPageOffsetArray.push_back(m_szFirstPageObjOffset); |
| } else if (i == nFirstPageNum + 1) { |
| if (i == 1) { |
| - m_szPageOffsetArray.Add(nOffsetE); |
| + m_szPageOffsetArray.push_back(nOffsetE); |
| } else { |
| - m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 2] + |
| - dwPageLenArray[i - 2]); |
| + m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 2] + |
| + dwPageLenArray[i - 2]); |
| } |
| } else { |
| if (i == 0) { |
| - m_szPageOffsetArray.Add(nOffsetE); |
| + m_szPageOffsetArray.push_back(nOffsetE); |
| } else { |
| - m_szPageOffsetArray.Add(m_szPageOffsetArray[i - 1] + |
| - dwPageLenArray[i - 1]); |
| + m_szPageOffsetArray.push_back(m_szPageOffsetArray[i - 1] + |
| + dwPageLenArray[i - 1]); |
| } |
| } |
| } |
| if (nPages > 0) { |
| - m_szPageOffsetArray.Add(m_szPageOffsetArray[nPages - 1] + |
| - dwPageLenArray[nPages - 1]); |
| + m_szPageOffsetArray.push_back(m_szPageOffsetArray[nPages - 1] + |
| + dwPageLenArray[nPages - 1]); |
| } |
| hStream->ByteAlign(); |
| @@ -4704,7 +4581,7 @@ FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, |
| if (i < m_nFirstPageSharedObjs) { |
| m_dwSharedObjNumArray.Add(nFirstPageObjNum + i); |
| if (i == 0) |
| - m_szSharedObjOffsetArray.Add(m_szFirstPageObjOffset); |
| + m_szSharedObjOffsetArray.push_back(m_szFirstPageObjOffset); |
| } else { |
| FX_SAFE_DWORD safeObjNum = dwFirstSharedObjNum; |
| safeObjNum += i - m_nFirstPageSharedObjs; |
| @@ -4712,7 +4589,7 @@ FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, |
| return FALSE; |
| m_dwSharedObjNumArray.Add(safeObjNum.ValueOrDie()); |
| if (i == m_nFirstPageSharedObjs) |
| - m_szSharedObjOffsetArray.Add( |
| + m_szSharedObjOffsetArray.push_back( |
| pdfium::base::checked_cast<int32_t>(dwFirstSharedObjLoc)); |
| } |
| if (i != 0 && i != m_nFirstPageSharedObjs) { |
| @@ -4720,7 +4597,7 @@ FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, |
| safeLoc += m_szSharedObjOffsetArray[i - 1]; |
| if (!safeLoc.IsValid()) |
| return FALSE; |
| - m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie()); |
| + m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); |
| } |
| } |
| if (dwSharedObjTotal > 0) { |
| @@ -4728,7 +4605,7 @@ FX_BOOL CPDF_HintTables::ReadSharedObjHintTable(CFX_BitStream* hStream, |
| safeLoc += m_szSharedObjOffsetArray[dwSharedObjTotal - 1]; |
| if (!safeLoc.IsValid()) |
| return FALSE; |
| - m_szSharedObjOffsetArray.Add(safeLoc.ValueOrDie()); |
| + m_szSharedObjOffsetArray.push_back(safeLoc.ValueOrDie()); |
| } |
| hStream->ByteAlign(); |
| if (hStream->BitsRemaining() < dwSharedObjTotal) |