diff options
Diffstat (limited to 'core/fpdfapi')
-rw-r--r-- | core/fpdfapi/edit/cpdf_creator.h | 3 | ||||
-rw-r--r-- | core/fpdfapi/edit/fpdf_edit_create.cpp | 107 | ||||
-rw-r--r-- | core/fpdfapi/font/cpdf_cidfont.cpp | 42 | ||||
-rw-r--r-- | core/fpdfapi/font/cpdf_cidfont.h | 7 | ||||
-rw-r--r-- | core/fpdfapi/font/font_int.h | 3 | ||||
-rw-r--r-- | core/fpdfapi/font/fpdf_font_cid.cpp | 10 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_data_avail.cpp | 61 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_data_avail.h | 4 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_document.cpp | 44 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_document.h | 2 | ||||
-rw-r--r-- | core/fpdfapi/parser/cpdf_document_unittest.cpp | 4 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_rendercontext.cpp | 26 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_rendercontext.h | 8 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_renderstatus.cpp | 15 | ||||
-rw-r--r-- | core/fpdfapi/render/cpdf_renderstatus.h | 3 |
15 files changed, 151 insertions, 188 deletions
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h index aeb7d6675c..0840e4b7a6 100644 --- a/core/fpdfapi/edit/cpdf_creator.h +++ b/core/fpdfapi/edit/cpdf_creator.h @@ -8,6 +8,7 @@ #define CORE_FPDFAPI_EDIT_CPDF_CREATOR_H_ #include <memory> +#include <vector> #include "core/fxcrt/cfx_retain_ptr.h" #include "core/fxcrt/fx_basic.h" @@ -94,7 +95,7 @@ class CPDF_Creator { FX_POSITION m_Pos; FX_FILESIZE m_XrefStart; CFX_FileSizeListArray m_ObjectOffset; - CFX_ArrayTemplate<uint32_t> m_NewObjNumArray; + std::vector<uint32_t> m_NewObjNumArray; // Sorted, ascending. std::unique_ptr<CPDF_Array> m_pIDArray; int32_t m_FileVersion; }; diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp index 7b38883ef8..fec0de9512 100644 --- a/core/fpdfapi/edit/fpdf_edit_create.cpp +++ b/core/fpdfapi/edit/fpdf_edit_create.cpp @@ -1313,11 +1313,12 @@ int32_t CPDF_Creator::WriteOldObjs(IFX_Pause* pPause) { } return 0; } + int32_t CPDF_Creator::WriteNewObjs(bool bIncremental, IFX_Pause* pPause) { - int32_t iCount = m_NewObjNumArray.GetSize(); - int32_t index = (int32_t)(uintptr_t)m_Pos; + size_t iCount = m_NewObjNumArray.size(); + size_t index = (size_t)(uintptr_t)m_Pos; while (index < iCount) { - uint32_t objnum = m_NewObjNumArray.ElementAt(index); + uint32_t objnum = m_NewObjNumArray[index]; CPDF_Object* pObj = m_pDocument->GetIndirectObject(objnum); if (!pObj) { ++index; @@ -1335,6 +1336,7 @@ int32_t CPDF_Creator::WriteNewObjs(bool bIncremental, IFX_Pause* pPause) { } return 0; } + void CPDF_Creator::InitOldObjNumOffsets() { if (!m_pParser) { return; @@ -1373,15 +1375,15 @@ void CPDF_Creator::InitNewObjNumOffsets() { AppendNewObjNum(objnum); } - int32_t iCount = m_NewObjNumArray.GetSize(); + size_t iCount = m_NewObjNumArray.size(); if (iCount == 0) return; - int32_t i = 0; + size_t i = 0; uint32_t dwStartObjNum = 0; bool bCrossRefValid = m_pParser && m_pParser->GetLastXRefOffset() > 0; while (i < iCount) { - dwStartObjNum = m_NewObjNumArray.ElementAt(i); + dwStartObjNum = m_NewObjNumArray[i]; if ((bIncremental && (bNoOriginal || bCrossRefValid)) || !m_ObjectOffset.GetPtrAt(dwStartObjNum)) { break; @@ -1395,7 +1397,7 @@ void CPDF_Creator::InitNewObjNumOffsets() { i++; bool bNewStart = false; for (; i < iCount; i++) { - uint32_t dwCurObjNum = m_NewObjNumArray.ElementAt(i); + uint32_t dwCurObjNum = m_NewObjNumArray[i]; bool bExist = m_pParser && m_pParser->IsValidObjectNumber(dwCurObjNum) && m_ObjectOffset.GetPtrAt(dwCurObjNum); if (bExist || dwCurObjNum - dwLastObjNum > 1) { @@ -1412,29 +1414,12 @@ void CPDF_Creator::InitNewObjNumOffsets() { m_ObjectOffset.Add(dwStartObjNum, dwLastObjNum - dwStartObjNum + 1); } -void CPDF_Creator::AppendNewObjNum(uint32_t objbum) { - int32_t iStart = 0, iFind = 0; - int32_t iEnd = m_NewObjNumArray.GetUpperBound(); - while (iStart <= iEnd) { - int32_t iMid = (iStart + iEnd) / 2; - uint32_t dwMid = m_NewObjNumArray.ElementAt(iMid); - if (objbum < dwMid) { - iEnd = iMid - 1; - } else { - if (iMid == iEnd) { - iFind = iMid + 1; - break; - } - uint32_t dwNext = m_NewObjNumArray.ElementAt(iMid + 1); - if (objbum < dwNext) { - iFind = iMid + 1; - break; - } - iStart = iMid + 1; - } - } - m_NewObjNumArray.InsertAt(iFind, objbum); +void CPDF_Creator::AppendNewObjNum(uint32_t objnum) { + m_NewObjNumArray.insert(std::lower_bound(m_NewObjNumArray.begin(), + m_NewObjNumArray.end(), objnum), + objnum); } + int32_t CPDF_Creator::WriteDoc_Stage1(IFX_Pause* pPause) { ASSERT(m_iStage > -1 || m_iStage < 20); if (m_iStage == 0) { @@ -1565,15 +1550,14 @@ int32_t CPDF_Creator::WriteDoc_Stage2(IFX_Pause* pPause) { if (m_pEncryptDict && m_pEncryptDict->IsInline()) { m_dwLastObjNum += 1; FX_FILESIZE saveOffset = m_Offset; - if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) { + if (WriteIndirectObj(m_dwLastObjNum, m_pEncryptDict) < 0) return -1; - } + m_ObjectOffset.Add(m_dwLastObjNum, 1); m_ObjectOffset[m_dwLastObjNum] = saveOffset; m_dwEncryptObjNum = m_dwLastObjNum; - if (m_dwFlags & FPDFCREATE_INCREMENTAL) { - m_NewObjNumArray.Add(m_dwLastObjNum); - } + if (m_dwFlags & FPDFCREATE_INCREMENTAL) + m_NewObjNumArray.push_back(m_dwLastObjNum); } m_iStage = 80; } @@ -1652,22 +1636,20 @@ int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { } if (m_iStage == 82) { CFX_ByteString str; - int32_t iCount = m_NewObjNumArray.GetSize(); - int32_t i = (int32_t)(uintptr_t)m_Pos; + size_t iCount = m_NewObjNumArray.size(); + size_t i = (size_t)(uintptr_t)m_Pos; while (i < iCount) { - int32_t j = i; - uint32_t objnum = m_NewObjNumArray.ElementAt(i); + size_t j = i; + uint32_t objnum = m_NewObjNumArray[i]; while (j < iCount) { - if (++j == iCount) { + if (++j == iCount) break; - } - uint32_t dwCurrent = m_NewObjNumArray.ElementAt(j); - if (dwCurrent - objnum > 1) { + uint32_t dwCurrent = m_NewObjNumArray[j]; + if (dwCurrent - objnum > 1) break; - } objnum = dwCurrent; } - objnum = m_NewObjNumArray.ElementAt(i); + objnum = m_NewObjNumArray[i]; if (objnum == 1) { str.Format("0 %d\r\n0000000000 65535 f\r\n", j - i + 1); } else { @@ -1677,11 +1659,10 @@ int32_t CPDF_Creator::WriteDoc_Stage3(IFX_Pause* pPause) { return -1; } while (i < j) { - objnum = m_NewObjNumArray.ElementAt(i++); + objnum = m_NewObjNumArray[i++]; str.Format("%010d 00000 n\r\n", m_ObjectOffset[objnum]); - if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) { + if (m_File.AppendBlock(str.c_str(), str.GetLength()) < 0) return -1; - } } if (pPause && (i % 100) == 0 && pPause->NeedToPauseNow()) { m_Pos = (void*)(uintptr_t)i; @@ -1847,41 +1828,33 @@ int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { } for (i = 0; i < m_dwLastObjNum; i++) { FX_FILESIZE* offset = m_ObjectOffset.GetPtrAt(i); - if (!offset) { + if (!offset) continue; - } OutputIndex(&m_File, *offset); } } else { - int count = m_NewObjNumArray.GetSize(); - int32_t i = 0; + size_t count = m_NewObjNumArray.size(); + size_t i = 0; for (i = 0; i < count; i++) { - uint32_t objnum = m_NewObjNumArray.ElementAt(i); - if (m_File.AppendDWord(objnum) < 0) { + if (m_File.AppendDWord(m_NewObjNumArray[i]) < 0) return -1; - } - if (m_File.AppendString(" 1 ") < 0) { + if (m_File.AppendString(" 1 ") < 0) return -1; - } } - if (m_File.AppendString("]/Length ") < 0) { + if (m_File.AppendString("]/Length ") < 0) return -1; - } - if (m_File.AppendDWord(count * 5) < 0) { + if (m_File.AppendDWord(count * 5) < 0) return -1; - } - if (m_File.AppendString(">>stream\r\n") < 0) { + if (m_File.AppendString(">>stream\r\n") < 0) return -1; - } for (i = 0; i < count; i++) { - uint32_t objnum = m_NewObjNumArray.ElementAt(i); + uint32_t objnum = m_NewObjNumArray[i]; FX_FILESIZE offset = m_ObjectOffset[objnum]; OutputIndex(&m_File, offset); } } - if (m_File.AppendString("\r\nendstream") < 0) { + if (m_File.AppendString("\r\nendstream") < 0) return -1; - } } } if (m_File.AppendString("\r\nstartxref\r\n") < 0) { @@ -1903,7 +1876,7 @@ int32_t CPDF_Creator::WriteDoc_Stage4(IFX_Pause* pPause) { void CPDF_Creator::Clear() { m_pXRefStream.reset(); m_File.Clear(); - m_NewObjNumArray.RemoveAll(); + m_NewObjNumArray.clear(); m_pIDArray.reset(); } @@ -1919,7 +1892,7 @@ bool CPDF_Creator::Create(uint32_t flags) { m_Offset = 0; m_dwLastObjNum = m_pDocument->GetLastObjNum(); m_ObjectOffset.Clear(); - m_NewObjNumArray.RemoveAll(); + m_NewObjNumArray.clear(); InitID(); if (flags & FPDFCREATE_PROGRESSIVE) return true; diff --git a/core/fpdfapi/font/cpdf_cidfont.cpp b/core/fpdfapi/font/cpdf_cidfont.cpp index 91df025e0f..c6c6992562 100644 --- a/core/fpdfapi/font/cpdf_cidfont.cpp +++ b/core/fpdfapi/font/cpdf_cidfont.cpp @@ -391,7 +391,7 @@ bool CPDF_CIDFont::Load() { m_DefaultWidth = pCIDFontDict->GetIntegerFor("DW", 1000); CPDF_Array* pWidthArray = pCIDFontDict->GetArrayFor("W"); if (pWidthArray) - LoadMetricsArray(pWidthArray, m_WidthList, 1); + LoadMetricsArray(pWidthArray, &m_WidthList, 1); if (!IsEmbedded()) LoadSubstFont(); @@ -416,7 +416,7 @@ bool CPDF_CIDFont::Load() { if (IsVertWriting()) { pWidthArray = pCIDFontDict->GetArrayFor("W2"); if (pWidthArray) - LoadMetricsArray(pWidthArray, m_VertMetrics, 3); + LoadMetricsArray(pWidthArray, &m_VertMetrics, 3); CPDF_Array* pDefaultArray = pCIDFontDict->GetArrayFor("DW2"); if (pDefaultArray) { m_DefaultVY = pDefaultArray->GetIntegerAt(0); @@ -505,9 +505,9 @@ int CPDF_CIDFont::GetCharWidthF(uint32_t charcode) { return (charcode >= 32 && charcode < 127) ? 500 : 0; uint16_t cid = CIDFromCharCode(charcode); - int size = m_WidthList.GetSize(); - const uint32_t* pList = m_WidthList.GetData(); - for (int i = 0; i < size; i += 3) { + size_t size = m_WidthList.size(); + const uint32_t* pList = m_WidthList.data(); + for (size_t i = 0; i < size; i += 3) { const uint32_t* pEntry = pList + i; if (IsMetricForCID(pEntry, cid)) return static_cast<int>(pEntry[2]); @@ -516,10 +516,10 @@ int CPDF_CIDFont::GetCharWidthF(uint32_t charcode) { } short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { - uint32_t vertsize = m_VertMetrics.GetSize() / 5; + size_t vertsize = m_VertMetrics.size() / 5; if (vertsize) { - const uint32_t* pTable = m_VertMetrics.GetData(); - for (uint32_t i = 0; i < vertsize; i++) { + const uint32_t* pTable = m_VertMetrics.data(); + for (size_t i = 0; i < vertsize; i++) { const uint32_t* pEntry = pTable + (i * 5); if (IsMetricForCID(pEntry, CID)) return static_cast<short>(pEntry[2]); @@ -529,10 +529,10 @@ short CPDF_CIDFont::GetVertWidth(uint16_t CID) const { } void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { - uint32_t vertsize = m_VertMetrics.GetSize() / 5; + size_t vertsize = m_VertMetrics.size() / 5; if (vertsize) { - const uint32_t* pTable = m_VertMetrics.GetData(); - for (uint32_t i = 0; i < vertsize; i++) { + const uint32_t* pTable = m_VertMetrics.data(); + for (size_t i = 0; i < vertsize; i++) { const uint32_t* pEntry = pTable + (i * 5); if (IsMetricForCID(pEntry, CID)) { vx = static_cast<short>(pEntry[3]); @@ -542,9 +542,9 @@ void CPDF_CIDFont::GetVertOrigin(uint16_t CID, short& vx, short& vy) const { } } uint32_t dwWidth = m_DefaultWidth; - int size = m_WidthList.GetSize(); - const uint32_t* pList = m_WidthList.GetData(); - for (int i = 0; i < size; i += 3) { + size_t size = m_WidthList.size(); + const uint32_t* pList = m_WidthList.data(); + for (size_t i = 0; i < size; i += 3) { const uint32_t* pEntry = pList + i; if (IsMetricForCID(pEntry, CID)) { dwWidth = pEntry[2]; @@ -771,7 +771,7 @@ void CPDF_CIDFont::LoadSubstFont() { } void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, - CFX_ArrayTemplate<uint32_t>& result, + std::vector<uint32_t>* result, int nElements) { int width_status = 0; int iCurElement = 0; @@ -787,10 +787,10 @@ void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, return; for (size_t j = 0; j < pObjArray->GetCount(); j += nElements) { - result.Add(first_code); - result.Add(first_code); + result->push_back(first_code); + result->push_back(first_code); for (int k = 0; k < nElements; k++) - result.Add(pObjArray->GetIntegerAt(j + k)); + result->push_back(pObjArray->GetIntegerAt(j + k)); first_code++; } width_status = 0; @@ -804,10 +804,10 @@ void CPDF_CIDFont::LoadMetricsArray(CPDF_Array* pArray, iCurElement = 0; } else { if (!iCurElement) { - result.Add(first_code); - result.Add(last_code); + result->push_back(first_code); + result->push_back(last_code); } - result.Add(pObj->GetInteger()); + result->push_back(pObj->GetInteger()); iCurElement++; if (iCurElement == nElements) width_status = 0; diff --git a/core/fpdfapi/font/cpdf_cidfont.h b/core/fpdfapi/font/cpdf_cidfont.h index a2d16ed14c..ae3be3908f 100644 --- a/core/fpdfapi/font/cpdf_cidfont.h +++ b/core/fpdfapi/font/cpdf_cidfont.h @@ -8,6 +8,7 @@ #define CORE_FPDFAPI_FONT_CPDF_CIDFONT_H_ #include <memory> +#include <vector> #include "core/fpdfapi/font/cpdf_font.h" #include "core/fxcrt/fx_string.h" @@ -65,7 +66,7 @@ class CPDF_CIDFont : public CPDF_Font { int GetGlyphIndex(uint32_t unicodeb, bool* pVertGlyph); int GetVerticalGlyph(int index, bool* pVertGlyph); void LoadMetricsArray(CPDF_Array* pArray, - CFX_ArrayTemplate<uint32_t>& result, + std::vector<uint32_t>* result, int nElements); void LoadSubstFont(); FX_WCHAR GetUnicodeFromCharCode(uint32_t charcode) const; @@ -80,10 +81,10 @@ class CPDF_CIDFont : public CPDF_Font { std::unique_ptr<CPDF_StreamAcc> m_pStreamAcc; bool m_bAnsiWidthsFixed; FX_RECT m_CharBBox[256]; - CFX_ArrayTemplate<uint32_t> m_WidthList; + std::vector<uint32_t> m_WidthList; short m_DefaultVY; short m_DefaultW1; - CFX_ArrayTemplate<uint32_t> m_VertMetrics; + std::vector<uint32_t> m_VertMetrics; bool m_bAdobeCourierStd; std::unique_ptr<CFX_CTTGSUBTable> m_pTTGSUBTable; }; diff --git a/core/fpdfapi/font/font_int.h b/core/fpdfapi/font/font_int.h index 02131eb67c..2410741e53 100644 --- a/core/fpdfapi/font/font_int.h +++ b/core/fpdfapi/font/font_int.h @@ -9,6 +9,7 @@ #include <map> #include <memory> +#include <vector> #include "core/fpdfapi/font/cpdf_cidfont.h" #include "core/fxcrt/fx_basic.h" @@ -107,7 +108,7 @@ class CPDF_CMapParser { int m_Status; int m_CodeSeq; uint32_t m_CodePoints[4]; - CFX_ArrayTemplate<CMap_CodeRange> m_CodeRanges; + std::vector<CMap_CodeRange> m_CodeRanges; CFX_ByteString m_LastWord; }; diff --git a/core/fpdfapi/font/fpdf_font_cid.cpp b/core/fpdfapi/font/fpdf_font_cid.cpp index 02f8f7f058..010c94ced2 100644 --- a/core/fpdfapi/font/fpdf_font_cid.cpp +++ b/core/fpdfapi/font/fpdf_font_cid.cpp @@ -15,6 +15,7 @@ #include "core/fpdfapi/parser/cpdf_simple_parser.h" #include "core/fxcrt/fx_ext.h" #include "core/fxge/fx_freetype.h" +#include "third_party/base/stl_util.h" namespace { @@ -403,14 +404,14 @@ void CPDF_CMapParser::ParseWord(const CFX_ByteStringC& word) { m_Status = 0; } else if (m_Status == 7) { if (word == "endcodespacerange") { - int nSegs = m_CodeRanges.GetSize(); + uint32_t nSegs = pdfium::CollectionSize<uint32_t>(m_CodeRanges); if (nSegs > 1) { m_pCMap->m_CodingScheme = CPDF_CMap::MixedFourBytes; m_pCMap->m_nCodeRanges = nSegs; FX_Free(m_pCMap->m_pLeadingBytes); m_pCMap->m_pLeadingBytes = FX_Alloc2D(uint8_t, nSegs, sizeof(CMap_CodeRange)); - FXSYS_memcpy(m_pCMap->m_pLeadingBytes, m_CodeRanges.GetData(), + FXSYS_memcpy(m_pCMap->m_pLeadingBytes, m_CodeRanges.data(), nSegs * sizeof(CMap_CodeRange)); } else if (nSegs == 1) { m_pCMap->m_CodingScheme = (m_CodeRanges[0].m_CharSize == 2) @@ -424,9 +425,8 @@ void CPDF_CMapParser::ParseWord(const CFX_ByteStringC& word) { } if (m_CodeSeq % 2) { CMap_CodeRange range; - if (CMap_GetCodeRange(range, m_LastWord.AsStringC(), word)) { - m_CodeRanges.Add(range); - } + if (CMap_GetCodeRange(range, m_LastWord.AsStringC(), word)) + m_CodeRanges.push_back(range); } m_CodeSeq++; } diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp index d94ef2c69c..4205ed2456 100644 --- a/core/fpdfapi/parser/cpdf_data_avail.cpp +++ b/core/fpdfapi/parser/cpdf_data_avail.cpp @@ -453,24 +453,21 @@ void CPDF_DataAvail::ResetFirstCheck(uint32_t dwPage) { } bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { - uint32_t iPageObjs = m_PageObjList.GetSize(); - CFX_ArrayTemplate<uint32_t> UnavailObjList; - for (uint32_t i = 0; i < iPageObjs; ++i) { - uint32_t dwPageObjNum = m_PageObjList.GetAt(i); - bool bExist = false; + std::vector<uint32_t> UnavailObjList; + for (uint32_t dwPageObjNum : m_PageObjList) { + bool bExists = false; std::unique_ptr<CPDF_Object> pObj = - GetObject(dwPageObjNum, pHints, &bExist); + GetObject(dwPageObjNum, pHints, &bExists); if (!pObj) { - if (bExist) - UnavailObjList.Add(dwPageObjNum); + if (bExists) + UnavailObjList.push_back(dwPageObjNum); continue; } - CPDF_Array* pArray = ToArray(pObj.get()); if (pArray) { for (const auto& pArrayObj : *pArray) { if (CPDF_Reference* pRef = ToReference(pArrayObj.get())) - UnavailObjList.Add(pRef->GetRefObjNum()); + UnavailObjList.push_back(pRef->GetRefObjNum()); } } if (!pObj->IsDictionary()) @@ -482,15 +479,13 @@ bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { continue; } } - - m_PageObjList.RemoveAll(); - if (UnavailObjList.GetSize()) { - m_PageObjList.Append(UnavailObjList); + m_PageObjList.clear(); + if (!UnavailObjList.empty()) { + m_PageObjList = std::move(UnavailObjList); return false; } - - uint32_t iPages = m_PagesArray.size(); - for (uint32_t i = 0; i < iPages; i++) { + size_t iPages = m_PagesArray.size(); + for (size_t i = 0; i < iPages; ++i) { std::unique_ptr<CPDF_Object> pPages = std::move(m_PagesArray[i]); if (pPages && !GetPageKids(m_pCurrentParser, pPages.get())) { m_PagesArray.clear(); @@ -499,7 +494,7 @@ bool CPDF_DataAvail::CheckPage(DownloadHints* pHints) { } } m_PagesArray.clear(); - if (!m_PageObjList.GetSize()) + if (m_PageObjList.empty()) m_docStatus = PDF_DATAAVAIL_DONE; return true; @@ -518,13 +513,13 @@ bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { switch (pKids->GetType()) { case CPDF_Object::REFERENCE: - m_PageObjList.Add(pKids->AsReference()->GetRefObjNum()); + m_PageObjList.push_back(pKids->AsReference()->GetRefObjNum()); break; case CPDF_Object::ARRAY: { CPDF_Array* pKidsArray = pKids->AsArray(); for (size_t i = 0; i < pKidsArray->GetCount(); ++i) { if (CPDF_Reference* pRef = ToReference(pKidsArray->GetObjectAt(i))) - m_PageObjList.Add(pRef->GetRefObjNum()); + m_PageObjList.push_back(pRef->GetRefObjNum()); } } break; default: @@ -535,10 +530,10 @@ bool CPDF_DataAvail::GetPageKids(CPDF_Parser* pParser, CPDF_Object* pPages) { } bool CPDF_DataAvail::CheckPages(DownloadHints* pHints) { - bool bExist = false; + bool bExists = false; std::unique_ptr<CPDF_Object> pPages = - GetObject(m_PagesObjNum, pHints, &bExist); - if (!bExist) { + GetObject(m_PagesObjNum, pHints, &bExists); + if (!bExists) { m_docStatus = PDF_DATAAVAIL_LOADALLFILE; return true; } @@ -1121,9 +1116,9 @@ bool CPDF_DataAvail::CheckPage(uint32_t dwPage, DownloadHints* pHints) { bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, PageNode* pPageNode, DownloadHints* pHints) { - bool bExist = false; - std::unique_ptr<CPDF_Object> pPages = GetObject(dwPageNo, pHints, &bExist); - if (!bExist) { + bool bExists = false; + std::unique_ptr<CPDF_Object> pPages = GetObject(dwPageNo, pHints, &bExists); + if (!bExists) { m_docStatus = PDF_DATAAVAIL_ERROR; return false; } @@ -1158,9 +1153,9 @@ bool CPDF_DataAvail::CheckArrayPageNode(uint32_t dwPageNo, bool CPDF_DataAvail::CheckUnknownPageNode(uint32_t dwPageNo, PageNode* pPageNode, DownloadHints* pHints) { - bool bExist = false; - std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExist); - if (!bExist) { + bool bExists = false; + std::unique_ptr<CPDF_Object> pPage = GetObject(dwPageNo, pHints, &bExists); + if (!bExists) { m_docStatus = PDF_DATAAVAIL_ERROR; return false; } @@ -1292,14 +1287,13 @@ bool CPDF_DataAvail::LoadDocPage(uint32_t dwPage, DownloadHints* pHints) { } bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { - bool bExist = false; + bool bExists = false; std::unique_ptr<CPDF_Object> pPages = - GetObject(m_PagesObjNum, pHints, &bExist); - if (!bExist) { + GetObject(m_PagesObjNum, pHints, &bExists); + if (!bExists) { m_docStatus = PDF_DATAAVAIL_ERROR; return false; } - if (!pPages) return false; @@ -1308,7 +1302,6 @@ bool CPDF_DataAvail::CheckPageCount(DownloadHints* pHints) { m_docStatus = PDF_DATAAVAIL_ERROR; return false; } - if (!pPagesDict->KeyExist("Kids")) return true; diff --git a/core/fpdfapi/parser/cpdf_data_avail.h b/core/fpdfapi/parser/cpdf_data_avail.h index 42013e93ec..65638cff0b 100644 --- a/core/fpdfapi/parser/cpdf_data_avail.h +++ b/core/fpdfapi/parser/cpdf_data_avail.h @@ -221,8 +221,8 @@ class CPDF_DataAvail final { uint32_t m_bufferSize; CFX_ByteString m_WordBuf; uint8_t m_bufferData[512]; - CFX_ArrayTemplate<uint32_t> m_XRefStreamList; - CFX_ArrayTemplate<uint32_t> m_PageObjList; + std::vector<uint32_t> m_XRefStreamList; + std::vector<uint32_t> m_PageObjList; uint32_t m_PagesObjNum; bool m_bLinearedDataOK; bool m_bMainXRefLoadTried; diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp index 4ac0aa6aa9..9e60aaa882 100644 --- a/core/fpdfapi/parser/cpdf_document.cpp +++ b/core/fpdfapi/parser/cpdf_document.cpp @@ -381,20 +381,20 @@ void CPDF_Document::LoadDocInternal() { void CPDF_Document::LoadDoc() { LoadDocInternal(); - m_PageList.SetSize(RetrievePageCount()); + LoadPages(); } void CPDF_Document::LoadLinearizedDoc( const CPDF_LinearizedHeader* pLinearizationParams) { m_bLinearized = true; LoadDocInternal(); - m_PageList.SetSize(pLinearizationParams->GetPageCount()); + m_PageList.resize(pLinearizationParams->GetPageCount()); m_iFirstPageNo = pLinearizationParams->GetFirstPageNo(); m_dwFirstPageObjNum = pLinearizationParams->GetFirstPageObjNum(); } void CPDF_Document::LoadPages() { - m_PageList.SetSize(RetrievePageCount()); + m_PageList.resize(RetrievePageCount()); } CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage, @@ -402,21 +402,20 @@ CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage, size_t level) { if (*nPagesToGo < 0 || m_bReachedMaxPageLevel) return nullptr; + CPDF_Dictionary* pPages = m_pTreeTraversal[level].first; CPDF_Array* pKidList = pPages->GetArrayFor("Kids"); if (!pKidList) { if (*nPagesToGo != 1) return nullptr; - m_PageList.SetAt(iPage, pPages->GetObjNum()); + m_PageList[iPage] = pPages->GetObjNum(); return pPages; } - if (level >= FX_MAX_PAGE_LEVEL) { m_pTreeTraversal.pop_back(); m_bReachedMaxPageLevel = true; return nullptr; } - CPDF_Dictionary* page = nullptr; for (size_t i = m_pTreeTraversal[level].second; i < pKidList->GetCount(); i++) { @@ -433,7 +432,7 @@ CPDF_Dictionary* CPDF_Document::TraversePDFPages(int iPage, continue; } if (!pKid->KeyExist("Kids")) { - m_PageList.SetAt(iPage - (*nPagesToGo) + 1, pKid->GetObjNum()); + m_PageList[iPage - (*nPagesToGo) + 1] = pKid->GetObjNum(); (*nPagesToGo)--; m_pTreeTraversal[level].second++; if (*nPagesToGo == 0) { @@ -474,11 +473,11 @@ CPDF_Dictionary* CPDF_Document::GetPagesDict() const { } bool CPDF_Document::IsPageLoaded(int iPage) const { - return !!m_PageList.GetAt(iPage); + return !!m_PageList[iPage]; } CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { - if (iPage < 0 || iPage >= m_PageList.GetSize()) + if (iPage < 0 || iPage >= pdfium::CollectionSize<int>(m_PageList)) return nullptr; if (m_bLinearized && (iPage == m_iFirstPageNo)) { @@ -487,13 +486,9 @@ CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { return pDict; } } - - int objnum = m_PageList.GetAt(iPage); - if (objnum) { - if (CPDF_Dictionary* pDict = ToDictionary(GetOrParseIndirectObject(objnum))) - return pDict; - return nullptr; - } + uint32_t objnum = m_PageList[iPage]; + if (objnum) + return ToDictionary(GetOrParseIndirectObject(objnum)); CPDF_Dictionary* pPages = GetPagesDict(); if (!pPages) @@ -517,7 +512,7 @@ CPDF_Dictionary* CPDF_Document::GetPage(int iPage) { } void CPDF_Document::SetPageObjNum(int iPage, uint32_t objNum) { - m_PageList.SetAt(iPage, objNum); + m_PageList[iPage] = objNum; } int CPDF_Document::FindPageIndex(CPDF_Dictionary* pNode, @@ -554,7 +549,7 @@ int CPDF_Document::FindPageIndex(CPDF_Dictionary* pNode, for (size_t i = 0; i < count; i++) { if (CPDF_Reference* pKid = ToReference(pKidList->GetObjectAt(i))) { if (pKid->GetRefObjNum() == objnum) { - m_PageList.SetAt(index + i, objnum); + m_PageList[index + i] = objnum; return static_cast<int>(index + i); } } @@ -574,15 +569,14 @@ int CPDF_Document::FindPageIndex(CPDF_Dictionary* pNode, } int CPDF_Document::GetPageIndex(uint32_t objnum) { - uint32_t nPages = m_PageList.GetSize(); + uint32_t nPages = m_PageList.size(); uint32_t skip_count = 0; bool bSkipped = false; for (uint32_t i = 0; i < nPages; i++) { - uint32_t objnum1 = m_PageList.GetAt(i); - if (objnum1 == objnum) + if (m_PageList[i] == objnum) return i; - if (!bSkipped && objnum1 == 0) { + if (!bSkipped && m_PageList[i] == 0) { skip_count = i; bSkipped = true; } @@ -596,7 +590,7 @@ int CPDF_Document::GetPageIndex(uint32_t objnum) { } int CPDF_Document::GetPageCount() const { - return m_PageList.GetSize(); + return pdfium::CollectionSize<int>(m_PageList); } int CPDF_Document::RetrievePageCount() const { @@ -747,7 +741,7 @@ bool CPDF_Document::InsertNewPage(int iPage, CPDF_Dictionary* pPageDict) { if (!InsertDeletePDFPage(pPages, iPage, pPageDict, true, &stack)) return false; } - m_PageList.InsertAt(iPage, pPageDict->GetObjNum()); + m_PageList.insert(m_PageList.begin() + iPage, pPageDict->GetObjNum()); return true; } @@ -764,7 +758,7 @@ void CPDF_Document::DeletePage(int iPage) { if (!InsertDeletePDFPage(pPages, iPage, nullptr, false, &stack)) return; - m_PageList.RemoveAt(iPage); + m_PageList.erase(m_PageList.begin() + iPage); } CPDF_Font* CPDF_Document::AddStandardFont(const FX_CHAR* font, diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h index 0da6577360..65455480a4 100644 --- a/core/fpdfapi/parser/cpdf_document.h +++ b/core/fpdfapi/parser/cpdf_document.h @@ -147,7 +147,7 @@ class CPDF_Document : public CPDF_IndirectObjectHolder { std::unique_ptr<CPDF_DocRenderData> m_pDocRender; std::unique_ptr<JBig2_DocumentContext> m_pCodecContext; std::unique_ptr<CPDF_LinkList> m_pLinksContext; - CFX_ArrayTemplate<uint32_t> m_PageList; + std::vector<uint32_t> m_PageList; }; #endif // CORE_FPDFAPI_PARSER_CPDF_DOCUMENT_H_ diff --git a/core/fpdfapi/parser/cpdf_document_unittest.cpp b/core/fpdfapi/parser/cpdf_document_unittest.cpp index 91beba3a6b..4815ffba52 100644 --- a/core/fpdfapi/parser/cpdf_document_unittest.cpp +++ b/core/fpdfapi/parser/cpdf_document_unittest.cpp @@ -88,7 +88,7 @@ class CPDF_TestDocumentForPages : public CPDF_Document { m_pOwnedRootDict->SetNewFor<CPDF_Reference>("Pages", this, pagesDict->GetObjNum()); m_pRootDict = m_pOwnedRootDict.get(); - m_PageList.SetSize(7); + m_PageList.resize(7); } private: @@ -112,7 +112,7 @@ class CPDF_TestDocumentWithPageWithoutPageNum : public CPDF_Document { m_pOwnedRootDict->SetNewFor<CPDF_Reference>("Pages", this, pagesDict->GetObjNum()); m_pRootDict = m_pOwnedRootDict.get(); - m_PageList.SetSize(3); + m_PageList.resize(3); } private: diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp index 2efdb81f8a..d74f729858 100644 --- a/core/fpdfapi/render/cpdf_rendercontext.cpp +++ b/core/fpdfapi/render/cpdf_rendercontext.cpp @@ -44,12 +44,12 @@ void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, void CPDF_RenderContext::AppendLayer(CPDF_PageObjectHolder* pObjectHolder, const CFX_Matrix* pObject2Device) { - Layer* pLayer = m_Layers.AddSpace(); - pLayer->m_pObjectHolder = pObjectHolder; + m_Layers.emplace_back(); + m_Layers.back().m_pObjectHolder = pObjectHolder; if (pObject2Device) - pLayer->m_Matrix = *pObject2Device; + m_Layers.back().m_Matrix = *pObject2Device; else - pLayer->m_Matrix.SetIdentity(); + m_Layers.back().m_Matrix.SetIdentity(); } void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, @@ -62,18 +62,16 @@ void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, const CPDF_PageObject* pStopObj, const CPDF_RenderOptions* pOptions, const CFX_Matrix* pLastMatrix) { - int count = m_Layers.GetSize(); - for (int j = 0; j < count; j++) { + for (auto& layer : m_Layers) { pDevice->SaveState(); - Layer* pLayer = m_Layers.GetDataPtr(j); if (pLastMatrix) { - CFX_Matrix FinalMatrix = pLayer->m_Matrix; + CFX_Matrix FinalMatrix = layer.m_Matrix; FinalMatrix.Concat(*pLastMatrix); CPDF_RenderStatus status; status.Initialize(this, pDevice, pLastMatrix, pStopObj, nullptr, nullptr, - pOptions, pLayer->m_pObjectHolder->m_Transparency, - false, nullptr); - status.RenderObjectList(pLayer->m_pObjectHolder, &FinalMatrix); + pOptions, layer.m_pObjectHolder->m_Transparency, false, + nullptr); + status.RenderObjectList(layer.m_pObjectHolder, &FinalMatrix); if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); if (status.m_bStopped) { @@ -83,9 +81,9 @@ void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, } else { CPDF_RenderStatus status; status.Initialize(this, pDevice, nullptr, pStopObj, nullptr, nullptr, - pOptions, pLayer->m_pObjectHolder->m_Transparency, - false, nullptr); - status.RenderObjectList(pLayer->m_pObjectHolder, &pLayer->m_Matrix); + pOptions, layer.m_pObjectHolder->m_Transparency, false, + nullptr); + status.RenderObjectList(layer.m_pObjectHolder, &layer.m_Matrix); if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); if (status.m_bStopped) { diff --git a/core/fpdfapi/render/cpdf_rendercontext.h b/core/fpdfapi/render/cpdf_rendercontext.h index 676b89a4f4..a9fd2db78b 100644 --- a/core/fpdfapi/render/cpdf_rendercontext.h +++ b/core/fpdfapi/render/cpdf_rendercontext.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ #define CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ +#include <vector> + #include "core/fxcrt/fx_basic.h" #include "core/fxcrt/fx_coordinates.h" @@ -50,8 +52,8 @@ class CPDF_RenderContext { const CPDF_RenderOptions* pOptions, CFX_Matrix* pFinalMatrix); - uint32_t CountLayers() const { return m_Layers.GetSize(); } - Layer* GetLayer(uint32_t index) { return m_Layers.GetDataPtr(index); } + size_t CountLayers() const { return m_Layers.size(); } + Layer* GetLayer(uint32_t index) { return &m_Layers[index]; } CPDF_Document* GetDocument() const { return m_pDocument; } CPDF_Dictionary* GetPageResources() const { return m_pPageResources; } @@ -61,7 +63,7 @@ class CPDF_RenderContext { CPDF_Document* const m_pDocument; CPDF_Dictionary* m_pPageResources; CPDF_PageRenderCache* m_pPageCache; - CFX_ArrayTemplate<Layer> m_Layers; + std::vector<Layer> m_Layers; }; #endif // CORE_FPDFAPI_RENDER_CPDF_RENDERCONTEXT_H_ diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp index 01026f44a9..35d061616b 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.cpp +++ b/core/fpdfapi/render/cpdf_renderstatus.cpp @@ -55,6 +55,7 @@ #include "core/fxge/ifx_renderdevicedriver.h" #include "third_party/base/numerics/safe_math.h" #include "third_party/base/ptr_util.h" +#include "third_party/base/stl_util.h" #ifdef _SKIA_SUPPORT_ #include "core/fxge/skia/fx_skia_device.h" @@ -1782,10 +1783,8 @@ CPDF_Type3Cache* CPDF_RenderStatus::GetCachedType3(CPDF_Type3Font* pFont) { bool CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj, const CFX_Matrix* pObj2Device) { CPDF_Type3Font* pType3Font = textobj->m_TextState.GetFont()->AsType3Font(); - for (int i = 0; i < m_Type3FontCache.GetSize(); ++i) { - if (m_Type3FontCache.GetAt(i) == pType3Font) - return true; - } + if (pdfium::ContainsValue(m_Type3FontCache, pType3Font)) + return true; CFX_Matrix dCTM = m_pDevice->GetCTM(); FX_FLOAT sa = FXSYS_fabs(dCTM.a); @@ -1851,8 +1850,8 @@ bool CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj, pStates, &Options, pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, false, pType3Char, fill_argb); - status.m_Type3FontCache.Append(m_Type3FontCache); - status.m_Type3FontCache.Add(pType3Font); + status.m_Type3FontCache = m_Type3FontCache; + status.m_Type3FontCache.push_back(pType3Font); m_pDevice->SaveState(); status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); m_pDevice->RestoreState(false); @@ -1872,8 +1871,8 @@ bool CPDF_RenderStatus::ProcessType3Text(CPDF_TextObject* textobj, pStates, &Options, pType3Char->m_pForm->m_Transparency, m_bDropObjects, pFormResource, false, pType3Char, fill_argb); - status.m_Type3FontCache.Append(m_Type3FontCache); - status.m_Type3FontCache.Add(pType3Font); + status.m_Type3FontCache = m_Type3FontCache; + status.m_Type3FontCache.push_back(pType3Font); matrix.TranslateI(-rect.left, -rect.top); matrix.Scale(sa, sd); status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); diff --git a/core/fpdfapi/render/cpdf_renderstatus.h b/core/fpdfapi/render/cpdf_renderstatus.h index abc8458d9e..25ddfb06c3 100644 --- a/core/fpdfapi/render/cpdf_renderstatus.h +++ b/core/fpdfapi/render/cpdf_renderstatus.h @@ -8,6 +8,7 @@ #define CORE_FPDFAPI_RENDER_CPDF_RENDERSTATUS_H_ #include <memory> +#include <vector> #include "core/fpdfapi/page/cpdf_clippath.h" #include "core/fpdfapi/page/cpdf_graphicstates.h" @@ -69,7 +70,7 @@ class CPDF_RenderStatus { CPDF_RenderOptions m_Options; CPDF_Dictionary* m_pFormResource; CPDF_Dictionary* m_pPageResource; - CFX_ArrayTemplate<CPDF_Type3Font*> m_Type3FontCache; + std::vector<CPDF_Type3Font*> m_Type3FontCache; private: friend class CPDF_ImageRenderer; |