Avoid a copy in CPDF_Image::SetJpegImageInline().

When CPDF_Image passes data to CPDF_Stream, move the data instead of
copying it. CPDF_Stream still copies the data internally, but that copy
can be removed later.

Bug: pdfium:1872
Change-Id: I194a798e2da6c7af7d182a40e4be70726211f3ae
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96193
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index 19d2bf9..710cc00 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -161,7 +161,8 @@
   if (!pDict)
     return;
 
-  m_pStream = pdfium::MakeRetain<CPDF_Stream>(data, std::move(pDict));
+  m_pStream =
+      pdfium::MakeRetain<CPDF_Stream>(std::move(data), std::move(pDict));
 }
 
 void CPDF_Image::SetImage(const RetainPtr<CFX_DIBitmap>& pBitmap) {
diff --git a/core/fpdfapi/parser/cpdf_stream.cpp b/core/fpdfapi/parser/cpdf_stream.cpp
index 87e67d0..f240f25 100644
--- a/core/fpdfapi/parser/cpdf_stream.cpp
+++ b/core/fpdfapi/parser/cpdf_stream.cpp
@@ -41,6 +41,13 @@
   SetData(pData);
 }
 
+CPDF_Stream::CPDF_Stream(std::vector<uint8_t, FxAllocAllocator<uint8_t>> pData,
+                         RetainPtr<CPDF_Dictionary> pDict)
+    : m_pDict(std::move(pDict)) {
+  // TODO(crbug.com/pdfium/1872): Avoid copying.
+  SetData(pData);
+}
+
 CPDF_Stream::CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
                          size_t size,
                          RetainPtr<CPDF_Dictionary> pDict)
diff --git a/core/fpdfapi/parser/cpdf_stream.h b/core/fpdfapi/parser/cpdf_stream.h
index e7a2a64..c38fa88 100644
--- a/core/fpdfapi/parser/cpdf_stream.h
+++ b/core/fpdfapi/parser/cpdf_stream.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 #include <set>
+#include <vector>
 
 #include "core/fpdfapi/parser/cpdf_object.h"
 #include "core/fxcrt/fx_memory_wrappers.h"
@@ -42,6 +43,7 @@
   void SetData(pdfium::span<const uint8_t> pData);
   void SetDataFromStringstream(fxcrt::ostringstream* stream);
 
+  // TODO(crbug.com/pdfium/1872): Replace with vector version.
   void TakeData(std::unique_ptr<uint8_t, FxFreeDeleter> pData, size_t size);
 
   // Set data and remove "Filter" and "DecodeParms" fields from stream
@@ -63,6 +65,9 @@
   CPDF_Stream();
   CPDF_Stream(pdfium::span<const uint8_t> pData,
               RetainPtr<CPDF_Dictionary> pDict);
+  CPDF_Stream(std::vector<uint8_t, FxAllocAllocator<uint8_t>> pData,
+              RetainPtr<CPDF_Dictionary> pDict);
+  // TODO(crbug.com/pdfium/1872): Replace with vector version above.
   CPDF_Stream(std::unique_ptr<uint8_t, FxFreeDeleter> pData,
               size_t size,
               RetainPtr<CPDF_Dictionary> pDict);