Remove CPDF_Creator friends

This CL removes the friend declarations from CPDF_Creator and adds
accessor methods instead.

Change-Id: I6d8f67b5944aed34af00ff6ea9d23fe7d17cec18
Reviewed-on: https://pdfium-review.googlesource.com/5112
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h
index 5695de1..9a15021 100644
--- a/core/fpdfapi/edit/cpdf_creator.h
+++ b/core/fpdfapi/edit/cpdf_creator.h
@@ -37,10 +37,29 @@
   int32_t Continue();
   bool SetFileVersion(int32_t fileVersion = 17);
 
- private:
-  friend class CPDF_ObjectStream;
-  friend class CPDF_XRefStream;
+  CFX_FileBufferArchive* GetFile() { return &m_File; }
 
+  FX_FILESIZE GetOffset() const { return m_Offset; }
+  void IncrementOffset(FX_FILESIZE inc);
+  uint32_t GetNextObjectNumber() { return ++m_dwLastObjNum; }
+  uint32_t GetLastObjectNumber() const { return m_dwLastObjNum; }
+  int32_t GetObjectStreamSize() const { return m_ObjectStreamSize; }
+  CPDF_CryptoHandler* GetCryptoHandler() { return m_pCryptoHandler.Get(); }
+  CPDF_Document* GetDocument() const { return m_pDocument; }
+  CPDF_Array* GetIDArray() const { return m_pIDArray.get(); }
+  CPDF_Dictionary* GetEncryptDict() const { return m_pEncryptDict; }
+  uint32_t GetEncryptObjectNumber() const { return m_dwEncryptObjNum; }
+
+  uint32_t GetObjectOffset(uint32_t objnum) { return m_ObjectOffsets[objnum]; }
+  bool HasObjectNumber(uint32_t objnum) {
+    return m_ObjectOffsets.find(objnum) != m_ObjectOffsets.end();
+  }
+  void SetObjectOffset(uint32_t objnum, FX_FILESIZE offset) {
+    m_ObjectOffsets[objnum] = offset;
+  }
+  bool IsIncremental() const { return !!(m_dwFlags & FPDFCREATE_INCREMENTAL); }
+
+ private:
   bool Create(uint32_t flags);
   void Clear();
 
@@ -72,6 +91,8 @@
                       uint32_t objnum,
                       CPDF_CryptoHandler* pCrypto);
 
+  bool IsXRefNeedEnd();
+
   CPDF_Document* const m_pDocument;
   CPDF_Parser* const m_pParser;
   bool m_bSecurityChanged;
diff --git a/core/fpdfapi/edit/fpdf_edit_create.cpp b/core/fpdfapi/edit/fpdf_edit_create.cpp
index 5b4c3ad..ecae681 100644
--- a/core/fpdfapi/edit/fpdf_edit_create.cpp
+++ b/core/fpdfapi/edit/fpdf_edit_create.cpp
@@ -26,6 +26,7 @@
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fxcrt/cfx_maybe_owned.h"
 #include "core/fxcrt/fx_extension.h"
+#include "third_party/base/numerics/safe_math.h"
 #include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 
@@ -180,17 +181,6 @@
   buffer.AppendByte(static_cast<uint8_t>(index));
 }
 
-bool IsXRefNeedEnd(CPDF_XRefStream* pXRef, uint32_t flag) {
-  if (!(flag & FPDFCREATE_INCREMENTAL))
-    return false;
-
-  uint32_t iCount = 0;
-  for (const auto& pair : pXRef->m_IndexArray)
-    iCount += pair.count;
-
-  return iCount >= kXRefStreamMaxSize;
-}
-
 int32_t OutputIndex(CFX_FileBufferArchive* pFile, FX_FILESIZE offset) {
   if (pFile->AppendByte(static_cast<uint8_t>(offset >> 24)) < 0)
     return -1;
@@ -348,30 +338,29 @@
   if (m_Items.empty())
     return 0;
 
-  CFX_FileBufferArchive* pFile = &pCreator->m_File;
-  FX_FILESIZE ObjOffset = pCreator->m_Offset;
+  CFX_FileBufferArchive* pFile = pCreator->GetFile();
+  FX_FILESIZE ObjOffset = pCreator->GetOffset();
   if (!m_dwObjNum)
-    m_dwObjNum = ++pCreator->m_dwLastObjNum;
+    m_dwObjNum = pCreator->GetNextObjectNumber();
 
   CFX_ByteTextBuf tempBuffer;
   for (const auto& pair : m_Items)
     tempBuffer << pair.objnum << " " << pair.offset << " ";
 
-  FX_FILESIZE& offset = pCreator->m_Offset;
   int32_t len = pFile->AppendDWord(m_dwObjNum);
   if (len < 0)
     return -1;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if ((len = pFile->AppendString(" 0 obj\r\n<</Type /ObjStm /N ")) < 0)
     return -1;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   uint32_t iCount = pdfium::CollectionSize<uint32_t>(m_Items);
   if ((len = pFile->AppendDWord(iCount)) < 0)
     return -1;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if (pFile->AppendString("/First ") < 0)
     return -1;
   if ((len = pFile->AppendDWord((uint32_t)tempBuffer.GetLength())) < 0)
@@ -379,31 +368,31 @@
   if (pFile->AppendString("/Length ") < 0)
     return -1;
 
-  offset += len + 15;
+  pCreator->IncrementOffset(len + 15);
 
   tempBuffer << m_Buffer;
   CPDF_FlateEncoder encoder(tempBuffer.GetBuffer(), tempBuffer.GetLength(),
                             true, false);
-  CPDF_Encryptor encryptor(pCreator->m_pCryptoHandler.Get(), m_dwObjNum,
+  CPDF_Encryptor encryptor(pCreator->GetCryptoHandler(), m_dwObjNum,
                            encoder.m_pData.Get(), encoder.m_dwSize);
   if ((len = pFile->AppendDWord(encryptor.m_dwSize)) < 0)
     return -1;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if (pFile->AppendString("/Filter /FlateDecode") < 0)
     return -1;
 
-  offset += 20;
+  pCreator->IncrementOffset(20);
   if ((len = pFile->AppendString(">>stream\r\n")) < 0)
     return -1;
   if (pFile->AppendBlock(encryptor.m_pData, encryptor.m_dwSize) < 0)
     return -1;
 
-  offset += len + encryptor.m_dwSize;
+  pCreator->IncrementOffset(len + encryptor.m_dwSize);
   if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0)
     return -1;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   return ObjOffset;
 }
 
@@ -427,7 +416,7 @@
 
   m_ObjStream.CompressIndirectObject(dwObjNum, pObj);
   if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) <
-          pCreator->m_ObjectStreamSize &&
+          pCreator->GetObjectStreamSize() &&
       m_ObjStream.m_Buffer.GetLength() < kObjectStreamMaxLength) {
     return 1;
   }
@@ -443,7 +432,7 @@
 
   m_ObjStream.CompressIndirectObject(dwObjNum, pBuffer, dwSize);
   if (pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items) <
-          pCreator->m_ObjectStreamSize &&
+          pCreator->GetObjectStreamSize() &&
       m_ObjStream.m_Buffer.GetLength() < kObjectStreamMaxLength) {
     return 1;
   }
@@ -460,11 +449,11 @@
 
   uint32_t& dwObjStmNum = m_ObjStream.m_dwObjNum;
   if (!dwObjStmNum)
-    dwObjStmNum = ++pCreator->m_dwLastObjNum;
+    dwObjStmNum = pCreator->GetNextObjectNumber();
 
   int32_t iSize = pdfium::CollectionSize<int32_t>(m_ObjStream.m_Items);
   size_t iSeg = m_IndexArray.size();
-  if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+  if (!pCreator->IsIncremental()) {
     if (m_dwTempObjNum == 0) {
       AppendIndex0(m_Buffer, true);
       m_dwTempObjNum++;
@@ -472,11 +461,10 @@
     uint32_t end_num = m_IndexArray.back().objnum + m_IndexArray.back().count;
     int index = 0;
     for (; m_dwTempObjNum < end_num; m_dwTempObjNum++) {
-      auto it = pCreator->m_ObjectOffsets.find(m_dwTempObjNum);
-      if (it != pCreator->m_ObjectOffsets.end()) {
+      if (pCreator->HasObjectNumber(m_dwTempObjNum)) {
         if (index >= iSize ||
             m_dwTempObjNum != m_ObjStream.m_Items[index].objnum) {
-          AppendIndex1(m_Buffer, it->second);
+          AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m_dwTempObjNum));
         } else {
           AppendIndex2(m_Buffer, dwObjStmNum, index++);
         }
@@ -485,7 +473,7 @@
       }
     }
     if (iSize > 0 && bEOF)
-      pCreator->m_ObjectOffsets[dwObjStmNum] = objOffset;
+      pCreator->SetObjectOffset(dwObjStmNum, objOffset);
 
     m_iSeg = iSeg;
     if (bEOF)
@@ -498,7 +486,7 @@
     for (uint32_t m = it->objnum; m < it->objnum + it->count; ++m) {
       if (m_ObjStream.m_index >= iSize ||
           m != m_ObjStream.m_Items[it - m_IndexArray.begin()].objnum) {
-        AppendIndex1(m_Buffer, pCreator->m_ObjectOffsets[m]);
+        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m));
       } else {
         AppendIndex2(m_Buffer, dwObjStmNum, m_ObjStream.m_index++);
       }
@@ -517,45 +505,43 @@
 }
 
 bool CPDF_XRefStream::GenerateXRefStream(CPDF_Creator* pCreator, bool bEOF) {
-  FX_FILESIZE offset_tmp = pCreator->m_Offset;
-  uint32_t objnum = ++pCreator->m_dwLastObjNum;
-  CFX_FileBufferArchive* pFile = &pCreator->m_File;
-  bool bIncremental = (pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
-  if (bIncremental) {
+  FX_FILESIZE offset_tmp = pCreator->GetOffset();
+  uint32_t objnum = pCreator->GetNextObjectNumber();
+  CFX_FileBufferArchive* pFile = pCreator->GetFile();
+  if (pCreator->IsIncremental()) {
     AddObjectNumberToIndexArray(objnum);
   } else {
-    for (; m_dwTempObjNum < pCreator->m_dwLastObjNum; m_dwTempObjNum++) {
-      auto it = pCreator->m_ObjectOffsets.find(m_dwTempObjNum);
-      if (it != pCreator->m_ObjectOffsets.end())
-        AppendIndex1(m_Buffer, it->second);
+    for (; m_dwTempObjNum < pCreator->GetLastObjectNumber(); m_dwTempObjNum++) {
+      if (pCreator->HasObjectNumber(m_dwTempObjNum))
+        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(m_dwTempObjNum));
       else
         AppendIndex0(m_Buffer, false);
     }
   }
 
   AppendIndex1(m_Buffer, offset_tmp);
-  FX_FILESIZE& offset = pCreator->m_Offset;
+
   int32_t len = pFile->AppendDWord(objnum);
   if (len < 0)
     return false;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if ((len = pFile->AppendString(" 0 obj\r\n<</Type /XRef/W[1 4 2]/Index[")) <
       0) {
     return false;
   }
-  offset += len;
-  if (!bIncremental) {
+  pCreator->IncrementOffset(len);
+  if (!pCreator->IsIncremental()) {
     if ((len = pFile->AppendDWord(0)) < 0)
       return false;
     if ((len = pFile->AppendString(" ")) < 0)
       return false;
 
-    offset += len + 1;
+    pCreator->IncrementOffset(len + 1);
     if ((len = pFile->AppendDWord(objnum + 1)) < 0)
       return false;
 
-    offset += len;
+    pCreator->IncrementOffset(len);
   } else {
     for (const auto& pair : m_IndexArray) {
       if ((len = pFile->AppendDWord(pair.objnum)) < 0)
@@ -563,13 +549,13 @@
       if (pFile->AppendString(" ") < 0)
         return false;
 
-      offset += len + 1;
+      pCreator->IncrementOffset(len + 1);
       if ((len = pFile->AppendDWord(pair.count)) < 0)
         return false;
       if (pFile->AppendString(" ") < 0)
         return false;
 
-      offset += len + 1;
+      pCreator->IncrementOffset(len + 1);
     }
   }
   if (pFile->AppendString("]/Size ") < 0)
@@ -577,7 +563,7 @@
   if ((len = pFile->AppendDWord(objnum + 1)) < 0)
     return false;
 
-  offset += len + 7;
+  pCreator->IncrementOffset(len + 7);
   if (m_PrevOffset > 0) {
     if (pFile->AppendString("/Prev ") < 0)
       return false;
@@ -589,7 +575,7 @@
     if (pFile->AppendBlock(offset_buf, offset_len) < 0)
       return false;
 
-    offset += offset_len + 6;
+    pCreator->IncrementOffset(offset_len + 6);
   }
 
   CPDF_FlateEncoder encoder(m_Buffer.GetBuffer(), m_Buffer.GetLength(), true,
@@ -597,45 +583,45 @@
   if (pFile->AppendString("/Filter /FlateDecode") < 0)
     return false;
 
-  offset += 20;
+  pCreator->IncrementOffset(20);
   if ((len = pFile->AppendString("/DecodeParms<</Columns 7/Predictor 12>>")) <
       0) {
     return false;
   }
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if (pFile->AppendString("/Length ") < 0)
     return false;
   if ((len = pFile->AppendDWord(encoder.m_dwSize)) < 0)
     return false;
 
-  offset += len + 8;
+  pCreator->IncrementOffset(len + 8);
   if (bEOF) {
-    if ((len = WriteTrailer(pCreator->m_pDocument, pFile,
-                            pCreator->m_pIDArray.get())) < 0) {
+    if ((len = WriteTrailer(pCreator->GetDocument(), pFile,
+                            pCreator->GetIDArray())) < 0) {
       return false;
     }
-    offset += len;
-    if (pCreator->m_pEncryptDict) {
-      uint32_t dwEncryptObjNum = pCreator->m_pEncryptDict->GetObjNum();
+    pCreator->IncrementOffset(len);
+
+    if (CPDF_Dictionary* encryptDict = pCreator->GetEncryptDict()) {
+      uint32_t dwEncryptObjNum = encryptDict->GetObjNum();
       if (dwEncryptObjNum == 0)
-        dwEncryptObjNum = pCreator->m_dwEncryptObjNum;
-      if ((len = WriteEncryptDictObjectReference(dwEncryptObjNum, pFile)) < 0) {
+        dwEncryptObjNum = pCreator->GetEncryptObjectNumber();
+      if ((len = WriteEncryptDictObjectReference(dwEncryptObjNum, pFile)) < 0)
         return false;
-      }
-      offset += len;
+      pCreator->IncrementOffset(len);
     }
   }
   if ((len = pFile->AppendString(">>stream\r\n")) < 0)
     return false;
 
-  offset += len;
+  pCreator->IncrementOffset(len);
   if (pFile->AppendBlock(encoder.m_pData.Get(), encoder.m_dwSize) < 0)
     return false;
   if ((len = pFile->AppendString("\r\nendstream\r\nendobj\r\n")) < 0)
     return false;
 
-  offset += encoder.m_dwSize + len;
+  pCreator->IncrementOffset(encoder.m_dwSize + len);
   m_PrevOffset = offset_tmp;
   return true;
 }
@@ -647,19 +633,18 @@
 }
 
 bool CPDF_XRefStream::EndXRefStream(CPDF_Creator* pCreator) {
-  if (!(pCreator->m_dwFlags & FPDFCREATE_INCREMENTAL)) {
+  if (!pCreator->IsIncremental()) {
     AppendIndex0(m_Buffer, true);
-    for (uint32_t i = 1; i < pCreator->m_dwLastObjNum + 1; i++) {
-      auto it = pCreator->m_ObjectOffsets.find(i);
-      if (it != pCreator->m_ObjectOffsets.end())
-        AppendIndex1(m_Buffer, it->second);
+    for (uint32_t i = 1; i < pCreator->GetLastObjectNumber() + 1; i++) {
+      if (pCreator->HasObjectNumber(i))
+        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(i));
       else
         AppendIndex0(m_Buffer, false);
     }
   } else {
     for (const auto& pair : m_IndexArray) {
       for (uint32_t j = pair.objnum; j < pair.objnum + pair.count; ++j)
-        AppendIndex1(m_Buffer, pCreator->m_ObjectOffsets[j]);
+        AppendIndex1(m_Buffer, pCreator->GetObjectOffset(j));
     }
   }
   return GenerateXRefStream(pCreator, false);
@@ -701,6 +686,17 @@
   Clear();
 }
 
+bool CPDF_Creator::IsXRefNeedEnd() {
+  if (!IsIncremental())
+    return false;
+
+  uint32_t iCount = 0;
+  for (const auto& pair : m_pXRefStream->m_IndexArray)
+    iCount += pair.count;
+
+  return iCount >= kXRefStreamMaxSize;
+}
+
 int32_t CPDF_Creator::WriteIndirectObjectToStream(const CPDF_Object* pObj) {
   if (!m_pXRefStream)
     return 1;
@@ -730,7 +726,7 @@
   m_pXRefStream->AddObjectNumberToIndexArray(objnum);
   if (m_pXRefStream->CompressIndirectObject(objnum, pObj, this) < 0)
     return -1;
-  if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags))
+  if (!IsXRefNeedEnd())
     return 0;
   if (!m_pXRefStream->End(this))
     return -1;
@@ -749,7 +745,7 @@
       m_pXRefStream->CompressIndirectObject(objnum, pBuffer, dwSize, this);
   if (iRet < 1)
     return iRet;
-  if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags))
+  if (!IsXRefNeedEnd())
     return 0;
   if (!m_pXRefStream->End(this))
     return -1;
@@ -763,7 +759,7 @@
     return 1;
 
   m_pXRefStream->AddObjectNumberToIndexArray(objnum);
-  if (!IsXRefNeedEnd(m_pXRefStream.get(), m_dwFlags))
+  if (!IsXRefNeedEnd())
     return 0;
   if (!m_pXRefStream->End(this))
     return -1;
@@ -1105,11 +1101,10 @@
 }
 
 void CPDF_Creator::InitNewObjNumOffsets() {
-  bool bIncremental = (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0;
   for (const auto& pair : *m_pDocument) {
     const uint32_t objnum = pair.first;
     const CPDF_Object* pObj = pair.second.get();
-    if (bIncremental || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum)
+    if (IsIncremental() || pObj->GetObjNum() == CPDF_Object::kInvalidObjNum)
       continue;
     if (m_pParser && m_pParser->IsValidObjectNumber(objnum) &&
         m_pParser->GetObjectType(objnum)) {
@@ -1134,7 +1129,7 @@
     if (m_dwFlags & FPDFCREATE_OBJECTSTREAM) {
       m_pXRefStream = pdfium::MakeUnique<CPDF_XRefStream>();
       m_pXRefStream->Start();
-      if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser) {
+      if (IsIncremental() && m_pParser) {
         FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
         m_pXRefStream->m_PrevOffset = prev;
       }
@@ -1142,7 +1137,7 @@
     m_iStage = 10;
   }
   if (m_iStage == 10) {
-    if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0) {
+    if (!IsIncremental()) {
       if (m_File.AppendString("%PDF-1.") < 0)
         return -1;
 
@@ -1217,7 +1212,7 @@
 int32_t CPDF_Creator::WriteDoc_Stage2() {
   ASSERT(m_iStage >= 20 || m_iStage < 30);
   if (m_iStage == 20) {
-    if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 && m_pParser) {
+    if (!IsIncremental() && m_pParser) {
       m_CurObjNum = 0;
       m_iStage = 21;
     } else {
@@ -1236,7 +1231,7 @@
     m_iStage = 26;
   }
   if (m_iStage == 26) {
-    int32_t iRet = WriteNewObjs((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0);
+    int32_t iRet = WriteNewObjs(IsIncremental());
     if (iRet)
       return iRet;
 
@@ -1251,7 +1246,7 @@
 
       m_ObjectOffsets[m_dwLastObjNum] = saveOffset;
       m_dwEncryptObjNum = m_dwLastObjNum;
-      if (m_dwFlags & FPDFCREATE_INCREMENTAL)
+      if (IsIncremental())
         m_NewObjNumArray.push_back(m_dwLastObjNum);
     }
     m_iStage = 80;
@@ -1268,10 +1263,8 @@
       m_pXRefStream->End(this, true);
       m_XrefStart = m_pXRefStream->m_PrevOffset;
       m_iStage = 90;
-    } else if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 ||
-               !m_pParser->IsXRefStream()) {
-      if ((m_dwFlags & FPDFCREATE_INCREMENTAL) == 0 ||
-          m_pParser->GetLastXRefOffset() == 0) {
+    } else if (!IsIncremental() || !m_pParser->IsXRefStream()) {
+      if (!IsIncremental() || m_pParser->GetLastXRefOffset() == 0) {
         CFX_ByteString str;
         str = pdfium::ContainsKey(m_ObjectOffsets, 1)
                   ? "xref\r\n"
@@ -1364,8 +1357,7 @@
 int32_t CPDF_Creator::WriteDoc_Stage4() {
   ASSERT(m_iStage >= 90);
   if ((m_dwFlags & FPDFCREATE_OBJECTSTREAM) == 0) {
-    bool bXRefStream =
-        (m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser->IsXRefStream();
+    bool bXRefStream = IsIncremental() && m_pParser->IsXRefStream();
     if (!bXRefStream) {
       if (m_File.AppendString("trailer\r\n<<") < 0)
         return -1;
@@ -1439,7 +1431,7 @@
       return -1;
     if (m_File.AppendDWord(m_dwLastObjNum + (bXRefStream ? 2 : 1)) < 0)
       return -1;
-    if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0) {
+    if (IsIncremental()) {
       FX_FILESIZE prev = m_pParser->GetLastXRefOffset();
       if (prev) {
         if (m_File.AppendString("/Prev ") < 0)
@@ -1466,8 +1458,7 @@
     } else {
       if (m_File.AppendString("/W[0 4 1]/Index[") < 0)
         return -1;
-      if ((m_dwFlags & FPDFCREATE_INCREMENTAL) != 0 && m_pParser &&
-          m_pParser->GetLastXRefOffset() == 0) {
+      if (IsIncremental() && m_pParser && m_pParser->GetLastXRefOffset() == 0) {
         uint32_t i = 0;
         for (i = 0; i < m_dwLastObjNum; i++) {
           if (!pdfium::ContainsKey(m_ObjectOffsets, i))
@@ -1573,7 +1564,7 @@
 
   if (pOldIDArray) {
     CPDF_Object* pID2 = pOldIDArray->GetObjectAt(1);
-    if ((m_dwFlags & FPDFCREATE_INCREMENTAL) && m_pEncryptDict && pID2) {
+    if (IsIncremental() && m_pEncryptDict && pID2) {
       m_pIDArray->Add(pID2->Clone());
       return;
     }
@@ -1634,6 +1625,12 @@
   return true;
 }
 
+void CPDF_Creator::IncrementOffset(FX_FILESIZE inc) {
+  pdfium::base::CheckedNumeric<FX_FILESIZE> size = m_Offset;
+  size += inc;
+  m_Offset = size.ValueOrDie();
+}
+
 void CPDF_Creator::RemoveSecurity() {
   m_pCryptoHandler.Reset();
   m_bSecurityChanged = true;