Convert most calls to CPDF_Stream::InitStream() to use a ctor.

Add a new CPDF_Stream ctor that takes the same parameters as
InitStream(). Then just create a new CPDF_Stream instead of initializing
an existing CPDF_Stream, which is oftentimes just created.

Change-Id: Id52d9be354c1dbe5ba3a9df025f595208e0e7008
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/85972
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_dib.cpp b/core/fpdfapi/page/cpdf_dib.cpp
index c87e196..586c8af 100644
--- a/core/fpdfapi/page/cpdf_dib.cpp
+++ b/core/fpdfapi/page/cpdf_dib.cpp
@@ -784,9 +784,8 @@
     dict->SetNewFor<CPDF_Number>("Height", m_JpxInlineData.height);
     dict->SetNewFor<CPDF_Number>("BitsPerComponent", 8);
 
-    auto mask_in_data = pdfium::MakeRetain<CPDF_Stream>();
-    mask_in_data->InitStream(m_JpxInlineData.data, dict);
-    return StartLoadMaskDIB(std::move(mask_in_data));
+    return StartLoadMaskDIB(
+        pdfium::MakeRetain<CPDF_Stream>(m_JpxInlineData.data, std::move(dict)));
   }
 
   RetainPtr<const CPDF_Stream> mask(m_pDict->GetStreamFor("SMask"));
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index 10fe87f..6f2190e 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -161,7 +161,7 @@
   if (!pDict)
     return;
 
-  m_pStream->InitStream(data, std::move(pDict));
+  m_pStream = pdfium::MakeRetain<CPDF_Stream>(data, std::move(pDict));
 }
 
 void CPDF_Image::SetImage(const RetainPtr<CFX_DIBitmap>& pBitmap) {
@@ -317,10 +317,8 @@
       dest_span_offset += dest_pitch;
     }
   }
-  if (!m_pStream)
-    m_pStream = pdfium::MakeRetain<CPDF_Stream>();
 
-  m_pStream->InitStream(dest_span, std::move(pDict));
+  m_pStream = pdfium::MakeRetain<CPDF_Stream>(dest_span, std::move(pDict));
   m_bIsMask = pBitmap->IsMaskFormat();
   m_Width = BitmapWidth;
   m_Height = BitmapHeight;
diff --git a/core/fpdfapi/parser/cpdf_object_unittest.cpp b/core/fpdfapi/parser/cpdf_object_unittest.cpp
index 3356b05..8c3d599 100644
--- a/core/fpdfapi/parser/cpdf_object_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_object_unittest.cpp
@@ -841,8 +841,8 @@
 
 TEST(PDFStreamTest, SetData) {
   std::vector<uint8_t, FxAllocAllocator<uint8_t>> data(100);
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->InitStream(data, pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream = pdfium::MakeRetain<CPDF_Stream>(
+      data, pdfium::MakeRetain<CPDF_Dictionary>());
   EXPECT_EQ(static_cast<int>(data.size()),
             stream->GetDict()->GetIntegerFor(pdfium::stream::kLength));
 
@@ -867,8 +867,8 @@
 
 TEST(PDFStreamTest, SetDataAndRemoveFilter) {
   std::vector<uint8_t, FxAllocAllocator<uint8_t>> data(100);
-  auto stream = pdfium::MakeRetain<CPDF_Stream>();
-  stream->InitStream(data, pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream = pdfium::MakeRetain<CPDF_Stream>(
+      data, pdfium::MakeRetain<CPDF_Dictionary>());
   EXPECT_EQ(static_cast<int>(data.size()),
             stream->GetDict()->GetIntegerFor(pdfium::stream::kLength));
 
diff --git a/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
index 9ac893e..9b9be20 100644
--- a/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream_unittest.cpp
@@ -34,17 +34,15 @@
 
 TEST(CXFAFileReadTest, NormalStreams) {
   std::vector<const CPDF_Stream*> streams;
-  auto stream1 = pdfium::MakeRetain<CPDF_Stream>();
-  auto stream2 = pdfium::MakeRetain<CPDF_Stream>();
-  auto stream3 = pdfium::MakeRetain<CPDF_Stream>();
-
   // 16 chars total.
-  stream1->InitStream(ByteStringView("one t").raw_span(),
-                      pdfium::MakeRetain<CPDF_Dictionary>());
-  stream2->InitStream(ByteStringView("wo ").raw_span(),
-                      pdfium::MakeRetain<CPDF_Dictionary>());
-  stream3->InitStream(ByteStringView("three!!!").raw_span(),
-                      pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream1 =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView("one t").raw_span(),
+                                      pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream2 = pdfium::MakeRetain<CPDF_Stream>(
+      ByteStringView("wo ").raw_span(), pdfium::MakeRetain<CPDF_Dictionary>());
+  auto stream3 =
+      pdfium::MakeRetain<CPDF_Stream>(ByteStringView("three!!!").raw_span(),
+                                      pdfium::MakeRetain<CPDF_Dictionary>());
 
   streams.push_back(stream1.Get());
   streams.push_back(stream2.Get());
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index c655b95..a98ba2e 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -33,6 +33,12 @@
 
 CPDF_Stream::CPDF_Stream() = default;
 
+CPDF_Stream::CPDF_Stream(pdfium::span<const uint8_t> pData,
+                         RetainPtr<CPDF_Dictionary> pDict)
+    : m_pDict(std::move(pDict)) {
+  SetData(pData);
+}
+
 CPDF_Stream::CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
                          uint32_t size,
                          RetainPtr<CPDF_Dictionary> pDict)
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index 3971097..37d2854 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -63,6 +63,8 @@
 
  private:
   CPDF_Stream();
+  CPDF_Stream(pdfium::span<const uint8_t> pData,
+              RetainPtr<CPDF_Dictionary> pDict);
   CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
               uint32_t size,
               RetainPtr<CPDF_Dictionary> pDict);
diff --git a/core/fpdfapi/parser/cpdf_syntax_parser.cpp b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
index 601d2ad..d29b8ce 100644
--- a/core/fpdfapi/parser/cpdf_syntax_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_syntax_parser.cpp
@@ -789,12 +789,14 @@
     }
   }
 
-  auto pStream = pdfium::MakeRetain<CPDF_Stream>();
+  RetainPtr<CPDF_Stream> pStream;
   if (data) {
+    pStream = pdfium::MakeRetain<CPDF_Stream>();
     pStream->InitStreamFromFile(data, std::move(pDict));
   } else {
     DCHECK(!len);
-    pStream->InitStream({}, std::move(pDict));  // Empty stream
+    pStream = pdfium::MakeRetain<CPDF_Stream>(pdfium::span<const uint8_t>(),
+                                              std::move(pDict));
   }
   const FX_FILESIZE end_stream_offset = GetPos();
   memset(m_WordBuffer, 0, kEndObjStr.GetLength() + 1);