Index: core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
diff --git a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
index 95d23ba5011e89343fd37f2626bb06027c2bfa32..e8bd55ed8bb4b63557218133e2ad16a5e5178a9e 100644 |
--- a/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
+++ b/core/src/fpdfapi/fpdf_edit/fpdf_edit_create.cpp |
@@ -341,10 +341,10 @@ bool IsXRefNeedEnd(CPDF_XRefStream* pXRef, FX_DWORD flag) { |
if (!(flag & FPDFCREATE_INCREMENTAL)) |
return false; |
- int32_t iSize = pXRef->m_IndexArray.GetSize() / 2; |
- int32_t iCount = 0; |
- for (int32_t i = 0; i < iSize; ++i) |
- iCount += pXRef->m_IndexArray.ElementAt(i * 2 + 1); |
+ FX_DWORD iCount = 0; |
+ for (const auto& pair : pXRef->m_IndexArray) |
+ iCount += pair.count; |
+ |
return iCount >= PDF_XREFSTREAM_MAXSIZE; |
} |
@@ -624,7 +624,7 @@ FX_FILESIZE CPDF_ObjectStream::End(CPDF_Creator* pCreator) { |
CPDF_XRefStream::CPDF_XRefStream() |
: m_PrevOffset(0), m_dwTempObjNum(0), m_iSeg(0) {} |
FX_BOOL CPDF_XRefStream::Start() { |
- m_IndexArray.RemoveAll(); |
+ m_IndexArray.clear(); |
m_Buffer.Clear(); |
m_iSeg = 0; |
return TRUE; |
@@ -670,14 +670,13 @@ int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, FX_BOOL bEOF) { |
dwObjStmNum = ++pCreator->m_dwLastObjNum; |
} |
int32_t iSize = m_ObjStream.m_ObjNumArray.GetSize(); |
- int32_t iSeg = m_IndexArray.GetSize() / 2; |
+ size_t iSeg = m_IndexArray.size(); |
if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) { |
if (m_dwTempObjNum == 0) { |
AppendIndex0(m_Buffer, true); |
m_dwTempObjNum++; |
} |
- FX_DWORD end_num = m_IndexArray.GetAt((iSeg - 1) * 2) + |
- m_IndexArray.GetAt((iSeg - 1) * 2 + 1); |
+ FX_DWORD end_num = m_IndexArray.back().objnum + m_IndexArray.back().count; |
int index = 0; |
for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) { |
FX_FILESIZE* offset = pCreator->m_ObjectOffset.GetPtrAt(m_dwTempObjNum); |
@@ -702,22 +701,20 @@ int32_t CPDF_XRefStream::EndObjectStream(CPDF_Creator* pCreator, FX_BOOL bEOF) { |
} |
return 1; |
} |
- int32_t& j = m_ObjStream.m_index; |
- for (int i = m_iSeg; i < iSeg; i++) { |
- FX_DWORD start = m_IndexArray.ElementAt(i * 2); |
- FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start; |
- for (FX_DWORD m = start; m < end; m++) { |
- if (j >= iSize || m != m_ObjStream.m_ObjNumArray.ElementAt(j)) { |
+ for (auto it = m_IndexArray.begin() + m_iSeg; it != m_IndexArray.end(); |
+ ++it) { |
+ for (FX_DWORD m = it->objnum; m < it->objnum + it->count; ++m) { |
+ if (m_ObjStream.m_index >= iSize || |
+ m != m_ObjStream.m_ObjNumArray.ElementAt(it - m_IndexArray.begin())) { |
AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[m]); |
} else { |
- AppendIndex2(m_Buffer, dwObjStmNum, j++); |
+ AppendIndex2(m_Buffer, dwObjStmNum, m_ObjStream.m_index++); |
} |
} |
} |
if (iSize > 0 && bEOF) { |
AppendIndex1(m_Buffer, objOffset); |
- m_IndexArray.Add(dwObjStmNum); |
- m_IndexArray.Add(1); |
+ m_IndexArray.push_back({dwObjStmNum, 1}); |
iSeg += 1; |
} |
m_iSeg = iSeg; |
@@ -769,16 +766,15 @@ FX_BOOL CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, |
} |
offset += len; |
} else { |
- int32_t iSeg = m_IndexArray.GetSize() / 2; |
- for (int32_t i = 0; i < iSeg; i++) { |
- if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2))) < 0) { |
+ for (const auto& pair : m_IndexArray) { |
+ if ((len = pFile->AppendDWord(pair.objnum)) < 0) { |
return FALSE; |
} |
if (pFile->AppendString(" ") < 0) { |
return FALSE; |
} |
offset += len + 1; |
- if ((len = pFile->AppendDWord(m_IndexArray.ElementAt(i * 2 + 1))) < 0) { |
+ if ((len = pFile->AppendDWord(pair.count)) < 0) { |
return FALSE; |
} |
if (pFile->AppendString(" ") < 0) { |
@@ -882,34 +878,23 @@ FX_BOOL CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) { |
} |
} |
} else { |
- int32_t iSeg = m_IndexArray.GetSize() / 2; |
- for (int i = 0; i < iSeg; i++) { |
- FX_DWORD start = m_IndexArray.ElementAt(i * 2); |
- FX_DWORD end = m_IndexArray.ElementAt(i * 2 + 1) + start; |
- for (FX_DWORD j = start; j < end; j++) { |
+ for (const auto& pair : m_IndexArray) { |
+ for (FX_DWORD j = pair.objnum; j < pair.objnum + pair.count; ++j) |
AppendIndex1(m_Buffer, pCreator->m_ObjectOffset[j]); |
- } |
} |
} |
return GenerateXRefStream(pCreator, FALSE); |
} |
-FX_BOOL CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum) { |
- int32_t iSize = m_IndexArray.GetSize(); |
- if (iSize == 0) { |
- m_IndexArray.Add(objnum); |
- m_IndexArray.Add(1); |
- } else { |
- FXSYS_assert(iSize > 1); |
- FX_DWORD startobjnum = m_IndexArray.ElementAt(iSize - 2); |
- int32_t iCount = m_IndexArray.ElementAt(iSize - 1); |
- if (objnum == startobjnum + iCount) { |
- m_IndexArray[iSize - 1] = iCount + 1; |
- } else { |
- m_IndexArray.Add(objnum); |
- m_IndexArray.Add(1); |
- } |
+void CPDF_XRefStream::AddObjectNumberToIndexArray(FX_DWORD objnum) { |
+ if (m_IndexArray.empty()) { |
+ m_IndexArray.push_back({objnum, 1}); |
+ return; |
} |
- return TRUE; |
+ FX_DWORD next_objnum = m_IndexArray.back().objnum + m_IndexArray.back().count; |
+ if (objnum == next_objnum) |
+ m_IndexArray.back().count += 1; |
+ else |
+ m_IndexArray.push_back({objnum, 1}); |
} |
CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc) { |
m_pDocument = pDoc; |