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);