| 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..6489b1ed980fd6fbe147226fc78dd54a7b7d6c6d 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 ...
|
| + 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,59 @@ 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;
|
| -
|
| 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 +2748,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 +2985,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 +3685,6 @@ FX_BOOL CPDF_DataAvail::CheckCrossRef(IFX_DownloadHints* pHints) {
|
| return FALSE;
|
| }
|
| if (token == "xref") {
|
| - m_CrossOffset.InsertAt(0, m_dwXRefOffset);
|
| while (1) {
|
| if (!GetNextToken(token)) {
|
| iSize =
|
| @@ -4486,14 +4360,15 @@ 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 ||
|
| + static_cast<size_t>(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 +4458,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 +4579,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 +4587,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 +4595,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 +4603,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)
|
|
|