Change TIFF_Predictor() to have a span parameter
Combine the pointer and size parameters into a span parameter. It is
still an in-out parameter. Use size_t more as a result.
Change-Id: Ibcf97ea53610b48f5bd891fdd1ba8f5d9fbddba7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/119213
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/flate/flatemodule.cpp b/core/fxcodec/flate/flatemodule.cpp
index 2bdf723..2d848f0 100644
--- a/core/fxcodec/flate/flatemodule.cpp
+++ b/core/fxcodec/flate/flatemodule.cpp
@@ -492,7 +492,7 @@
}
void TIFF_PredictLine(uint8_t* dest_buf,
- uint32_t row_size,
+ size_t row_size,
int BitsPerComponent,
int Colors,
int Columns) {
@@ -517,7 +517,7 @@
}
int BytesPerPixel = BitsPerComponent * Colors / 8;
if (BitsPerComponent == 16) {
- for (uint32_t i = BytesPerPixel; i + 1 < row_size; i += 2) {
+ for (size_t i = BytesPerPixel; i + 1 < row_size; i += 2) {
uint16_t pixel =
(dest_buf[i - BytesPerPixel] << 8) | dest_buf[i - BytesPerPixel + 1];
pixel += (dest_buf[i] << 8) | dest_buf[i + 1];
@@ -525,7 +525,7 @@
dest_buf[i + 1] = (uint8_t)pixel;
}
} else {
- for (uint32_t i = BytesPerPixel; i < row_size; i++) {
+ for (size_t i = BytesPerPixel; i < row_size; i++) {
dest_buf[i] += dest_buf[i - BytesPerPixel];
}
}
@@ -534,21 +534,20 @@
bool TIFF_Predictor(int Colors,
int BitsPerComponent,
int Columns,
- std::unique_ptr<uint8_t, FxFreeDeleter>* data_buf,
- uint32_t* data_size) {
- uint32_t row_size =
+ pdfium::span<uint8_t> data_span) {
+ const uint32_t row_size =
fxge::CalculatePitch8(BitsPerComponent, Colors, Columns).value_or(0);
- if (row_size == 0)
+ if (row_size == 0) {
return false;
+ }
- const uint32_t row_count = (*data_size + row_size - 1) / row_size;
- const uint32_t last_row_size = *data_size % row_size;
- for (uint32_t row = 0; row < row_count; row++) {
- uint8_t* scan_line = data_buf->get() + row * row_size;
- if ((row + 1) * row_size > *data_size) {
- row_size = last_row_size;
- }
- TIFF_PredictLine(scan_line, row_size, BitsPerComponent, Colors, Columns);
+ const size_t row_count = (data_span.size() + row_size - 1) / row_size;
+ const size_t last_row_size = data_span.size() % row_size;
+ for (size_t row = 0; row < row_count; row++) {
+ uint8_t* scan_line = data_span.subspan(row * row_size).data();
+ size_t scan_line_size = row + 1 < row_count ? row_size : last_row_size;
+ TIFF_PredictLine(scan_line, scan_line_size, BitsPerComponent, Colors,
+ Columns);
}
return true;
}
@@ -872,24 +871,23 @@
bytes_consumed = result.bytes_consumed;
}
- bool ret = false;
switch (predictor_type) {
- case PredictorType::kNone:
- ret = true;
- break;
- case PredictorType::kPng:
- ret = PNG_Predictor(Colors, BitsPerComponent, Columns, &dest_buf,
- &dest_size);
- break;
- case PredictorType::kFlate:
- ret = TIFF_Predictor(Colors, BitsPerComponent, Columns, &dest_buf,
- &dest_size);
- break;
+ case PredictorType::kNone: {
+ return {std::move(dest_buf), dest_size, bytes_consumed};
+ }
+ case PredictorType::kPng: {
+ bool ret = PNG_Predictor(Colors, BitsPerComponent, Columns, &dest_buf,
+ &dest_size);
+ return {std::move(dest_buf), dest_size,
+ ret ? bytes_consumed : FX_INVALID_OFFSET};
+ }
+ case PredictorType::kFlate: {
+ bool ret = TIFF_Predictor(Colors, BitsPerComponent, Columns,
+ pdfium::make_span(dest_buf.get(), dest_size));
+ return {std::move(dest_buf), dest_size,
+ ret ? bytes_consumed : FX_INVALID_OFFSET};
+ }
}
- if (!ret) {
- bytes_consumed = FX_INVALID_OFFSET;
- }
- return {std::move(dest_buf), dest_size, bytes_consumed};
}
// static