Simplify ProgressiveDecoder now that many scale values are always 1
With many scale variables always set to 1, simplify code that now
multiplies by 1 or compares against 1. Then several methods used for
resampling can be deleted.
Change-Id: I4836cc57f678355dec41eaad4332035753529e26
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/122311
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@google.com>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcodec/progressive_decoder.cpp b/core/fxcodec/progressive_decoder.cpp
index f5ffcef..a4815b9 100644
--- a/core/fxcodec/progressive_decoder.cpp
+++ b/core/fxcodec/progressive_decoder.cpp
@@ -255,12 +255,10 @@
return true;
}
- double scale_y = 1;
- int32_t row = static_cast<int32_t>(line * scale_y);
*pSrcBuf = m_DecodeBuf.data();
int32_t src_Bpp = pDIBitmap->GetBPP() >> 3;
int32_t dest_Bpp = (m_SrcFormat & 0xff) >> 3;
- pdfium::span<const uint8_t> src_span = pDIBitmap->GetScanline(row);
+ pdfium::span<const uint8_t> src_span = pDIBitmap->GetScanline(line);
pdfium::span<uint8_t> dest_span = pdfium::make_span(m_DecodeBuf);
const uint8_t* src_scan = src_span.data();
uint8_t* dest_scan = dest_span.data();
@@ -316,20 +314,7 @@
RetainPtr<CFX_DIBitmap> pDIBitmap = m_pDeviceBitmap;
DCHECK(pDIBitmap);
if (line >= 0 && line < m_SrcHeight) {
- double scale_y = 1;
- int src_row = line;
- int dest_row = (int)(src_row * scale_y);
- if (dest_row >= m_SrcHeight) {
- return;
- }
- PngOneOneMapResampleHorz(pDIBitmap, dest_row, m_DecodeBuf, m_SrcFormat);
- if (m_SrcPassNumber == 1 && scale_y > 1.0) {
- ResampleVert(pDIBitmap, scale_y, dest_row);
- return;
- }
- if (pass == 6 && scale_y > 1.0) {
- ResampleVert(pDIBitmap, scale_y, dest_row);
- }
+ PngOneOneMapResampleHorz(pDIBitmap, line, m_DecodeBuf, m_SrcFormat);
}
}
#endif // PDF_ENABLE_XFA_PNG
@@ -442,40 +427,12 @@
fxcrt::Fill(decode_span.first(m_SrcWidth), pal_index);
fxcrt::Copy(row_buf.first(img_width), decode_span.subspan(left));
- bool bLastPass = (row_num % 2) == 1;
int32_t line = row_num + m_GifFrameRect.top;
if (line < 0 || line >= m_SrcHeight) {
return;
}
- double scale_y = 1;
- int src_row = line;
- int dest_row = (int)(src_row * scale_y);
- if (dest_row >= m_SrcHeight) {
- return;
- }
-
- ResampleScanline(pDIBitmap, dest_row, decode_span, m_SrcFormat);
- if (scale_y > 1.0 && m_SrcPassNumber == 1) {
- ResampleVert(pDIBitmap, scale_y, dest_row);
- return;
- }
- if (scale_y <= 1.0)
- return;
-
- int dest_bottom = m_SrcHeight;
- int dest_Bpp = pDIBitmap->GetBPP() >> 3;
- if (dest_row + (int)scale_y >= dest_bottom - 1) {
- const uint8_t* scan_src = pDIBitmap->GetScanline(dest_row).data();
- int cur_row = dest_row;
- while (++cur_row < dest_bottom) {
- uint8_t* scan_des = pDIBitmap->GetWritableScanline(cur_row).data();
- uint32_t size = m_SrcWidth * dest_Bpp;
- UNSAFE_TODO(FXSYS_memmove(scan_des, scan_src, size));
- }
- }
- if (bLastPass)
- GifDoubleLineResampleVert(pDIBitmap, scale_y, dest_row);
+ ResampleScanline(pDIBitmap, line, decode_span, m_SrcFormat);
}
#endif // PDF_ENABLE_XFA_GIF
@@ -497,95 +454,7 @@
return;
}
- double scale_y = 1;
- int src_row = row_num;
- int dest_row = (int)(src_row * scale_y);
- if (dest_row >= m_SrcHeight) {
- return;
- }
-
- ResampleScanline(pDIBitmap, dest_row, m_DecodeBuf, m_SrcFormat);
- if (scale_y <= 1.0)
- return;
-
- if (m_BmpIsTopBottom) {
- ResampleVert(pDIBitmap, scale_y, dest_row);
- return;
- }
- ResampleVertBT(pDIBitmap, scale_y, dest_row);
-}
-
-void ProgressiveDecoder::ResampleVertBT(
- const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row) {
- int dest_Bpp = pDeviceBitmap->GetBPP() >> 3;
- int dest_bottom = m_SrcHeight;
- FX_SAFE_INT32 check_dest_row_1 = dest_row;
- check_dest_row_1 += pdfium::checked_cast<int>(scale_y);
- int dest_row_1 = check_dest_row_1.ValueOrDie();
- if (dest_row_1 >= dest_bottom - 1) {
- const uint8_t* scan_src = pDeviceBitmap->GetScanline(dest_row).data();
- while (++dest_row < dest_bottom) {
- uint8_t* scan_des = pDeviceBitmap->GetWritableScanline(dest_row)
- .data();
- uint32_t size = m_SrcWidth * dest_Bpp;
- UNSAFE_TODO(FXSYS_memmove(scan_des, scan_src, size));
- }
- return;
- }
- UNSAFE_TODO({
- for (; dest_row_1 > dest_row; dest_row_1--) {
- uint8_t* scan_des = pDeviceBitmap->GetWritableScanline(dest_row_1)
- .data();
- PixelWeight* pWeight = m_WeightVert.GetPixelWeight(dest_row_1);
- const uint8_t* scan_src1 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcStart).data();
- const uint8_t* scan_src2 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcEnd).data();
- switch (pDeviceBitmap->GetFormat()) {
- case FXDIB_Format::kInvalid:
- case FXDIB_Format::k1bppMask:
- case FXDIB_Format::k1bppRgb:
- case FXDIB_Format::k8bppMask:
- case FXDIB_Format::k8bppRgb:
- NOTREACHED_NORETURN();
- case FXDIB_Format::kRgb:
- case FXDIB_Format::kRgb32:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- scan_src1 += dest_Bpp - 3;
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- scan_src2 += dest_Bpp - 3;
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- scan_des += dest_Bpp - 3;
- }
- break;
- case FXDIB_Format::kArgb:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_a = pWeight->m_Weights[0] * (*scan_src1++);
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- dest_a += pWeight->m_Weights[1] * (*scan_src2++);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_a);
- }
- break;
- }
- }
- });
+ ResampleScanline(pDIBitmap, row_num, m_DecodeBuf, m_SrcFormat);
}
bool ProgressiveDecoder::BmpDetectImageTypeInBuffer(
@@ -778,77 +647,6 @@
m_status = FXCODEC_STATUS::kError;
return m_status;
}
-
-void ProgressiveDecoder::GifDoubleLineResampleVert(
- const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row) {
- int dest_Bpp = pDeviceBitmap->GetBPP() >> 3;
- pdfium::CheckedNumeric<double> scale_y2 = scale_y;
- scale_y2 *= 2;
- FX_SAFE_INT32 check_dest_row_1 = dest_row;
- check_dest_row_1 -= scale_y2.ValueOrDie();
- int dest_row_1 = check_dest_row_1.ValueOrDie();
- dest_row_1 = std::max(dest_row_1, 0);
- UNSAFE_TODO({
- for (; dest_row_1 < dest_row; dest_row_1++) {
- uint8_t* scan_des = pDeviceBitmap->GetWritableScanline(dest_row_1)
- .data();
- PixelWeight* pWeight = m_WeightVert.GetPixelWeight(dest_row_1);
- const uint8_t* scan_src1 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcStart).data();
- const uint8_t* scan_src2 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcEnd).data();
- switch (pDeviceBitmap->GetFormat()) {
- case FXDIB_Format::kInvalid:
- case FXDIB_Format::k1bppMask:
- case FXDIB_Format::k1bppRgb:
- case FXDIB_Format::k8bppMask:
- case FXDIB_Format::k8bppRgb:
- NOTREACHED_NORETURN();
- case FXDIB_Format::kRgb:
- case FXDIB_Format::kRgb32:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- scan_src1 += dest_Bpp - 3;
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- scan_src2 += dest_Bpp - 3;
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- scan_des += dest_Bpp - 3;
- }
- break;
- case FXDIB_Format::kArgb:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_a = pWeight->m_Weights[0] * (*scan_src1++);
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- dest_a += pWeight->m_Weights[1] * (*scan_src2++);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_a);
- }
- break;
- }
- }
- int dest_bottom = m_SrcHeight - 1;
- if (dest_row + (int)(2 * scale_y) >= dest_bottom &&
- dest_row + (int)scale_y < dest_bottom) {
- GifDoubleLineResampleVert(pDeviceBitmap, scale_y,
- dest_row + (int)scale_y);
- }
- });
-}
#endif // PDF_ENABLE_XFA_GIF
bool ProgressiveDecoder::JpegReadMoreData(FXCODEC_STATUS* err_status) {
@@ -1650,103 +1448,15 @@
}
}
-void ProgressiveDecoder::ResampleVert(
- const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row) {
- int dest_Bpp = pDeviceBitmap->GetBPP() >> 3;
- FX_SAFE_INT32 check_dest_row_1 = dest_row;
- check_dest_row_1 -= pdfium::checked_cast<int>(scale_y);
- int dest_row_1 = check_dest_row_1.ValueOrDie();
- if (dest_row_1 < 0) {
- int dest_bottom = m_SrcHeight;
- if (dest_row + (int)scale_y >= dest_bottom - 1) {
- pdfium::span<const uint8_t> scan_src =
- pDeviceBitmap->GetScanline(dest_row).first(m_SrcWidth * dest_Bpp);
- while (++dest_row < dest_bottom) {
- fxcrt::spanmove(pDeviceBitmap->GetWritableScanline(dest_row), scan_src);
- }
- }
- return;
- }
- UNSAFE_TODO({
- for (; dest_row_1 < dest_row; dest_row_1++) {
- uint8_t* scan_des = pDeviceBitmap->GetWritableScanline(dest_row_1)
- .data();
- PixelWeight* pWeight = m_WeightVert.GetPixelWeight(dest_row_1);
- const uint8_t* scan_src1 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcStart).data();
- const uint8_t* scan_src2 =
- pDeviceBitmap->GetScanline(pWeight->m_SrcEnd).data();
- switch (pDeviceBitmap->GetFormat()) {
- case FXDIB_Format::kInvalid:
- case FXDIB_Format::k1bppMask:
- case FXDIB_Format::k1bppRgb:
- case FXDIB_Format::k8bppMask:
- case FXDIB_Format::k8bppRgb:
- NOTREACHED_NORETURN();
- case FXDIB_Format::kRgb:
- case FXDIB_Format::kRgb32:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- scan_src1 += dest_Bpp - 3;
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- scan_src2 += dest_Bpp - 3;
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- scan_des += dest_Bpp - 3;
- }
- break;
- case FXDIB_Format::kArgb:
- for (int dest_col = 0; dest_col < m_SrcWidth; dest_col++) {
- uint32_t dest_b = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_g = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_r = pWeight->m_Weights[0] * (*scan_src1++);
- uint32_t dest_a = pWeight->m_Weights[0] * (*scan_src1++);
- dest_b += pWeight->m_Weights[1] * (*scan_src2++);
- dest_g += pWeight->m_Weights[1] * (*scan_src2++);
- dest_r += pWeight->m_Weights[1] * (*scan_src2++);
- dest_a += pWeight->m_Weights[1] * (*scan_src2++);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_b);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_g);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_r);
- *scan_des++ = CStretchEngine::PixelFromFixed(dest_a);
- }
- break;
- }
- }
- });
- int dest_bottom = m_SrcHeight;
- if (dest_row + (int)scale_y >= dest_bottom - 1) {
- pdfium::span<const uint8_t> scan_src =
- pDeviceBitmap->GetScanline(dest_row).first(m_SrcWidth * dest_Bpp);
- while (++dest_row < dest_bottom) {
- fxcrt::spanmove(pDeviceBitmap->GetWritableScanline(dest_row), scan_src);
- }
- }
-}
-
void ProgressiveDecoder::Resample(const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
int32_t src_line,
uint8_t* src_scan,
FXCodec_Format src_format) {
- if (src_line >= 0) {
- double scale_y = 1;
- int src_row = src_line;
- int dest_row = (int)(src_row * scale_y);
- if (dest_row >= m_SrcHeight) {
- return;
- }
-
- ResampleScanline(pDeviceBitmap, dest_row, m_DecodeBuf, src_format);
- if (scale_y > 1.0)
- ResampleVert(pDeviceBitmap, scale_y, dest_row);
+ if (src_line < 0 || src_line >= m_SrcHeight) {
+ return;
}
+
+ ResampleScanline(pDeviceBitmap, src_line, m_DecodeBuf, src_format);
}
std::pair<FXCODEC_STATUS, size_t> ProgressiveDecoder::GetFrames() {
diff --git a/core/fxcodec/progressive_decoder.h b/core/fxcodec/progressive_decoder.h
index eccd97c..57d1b78 100644
--- a/core/fxcodec/progressive_decoder.h
+++ b/core/fxcodec/progressive_decoder.h
@@ -165,9 +165,6 @@
bool GifDetectImageTypeInBuffer();
FXCODEC_STATUS GifStartDecode();
FXCODEC_STATUS GifContinueDecode();
- void GifDoubleLineResampleVert(const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row);
#endif // PDF_ENABLE_XFA_GIF
#ifdef PDF_ENABLE_XFA_PNG
@@ -206,12 +203,6 @@
int32_t src_line,
uint8_t* src_scan,
FXCodec_Format src_format);
- void ResampleVert(const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row);
- void ResampleVertBT(const RetainPtr<CFX_DIBitmap>& pDeviceBitmap,
- double scale_y,
- int dest_row);
FXCODEC_STATUS m_status = FXCODEC_STATUS::kDecodeFinished;
FXCODEC_IMAGE_TYPE m_imageType = FXCODEC_IMAGE_UNKNOWN;