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;