Update SkiaPaths RgbByteOrderTransferBitmap() implementation.

It is meant to be a duplicate of AGG's function of the same name. Update
it keep them in sync.

Bug: chromium:1386123
Change-Id: Ib8fb75e2e65e3d3b178015dcd80df1335511d4c6
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/101671
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Nigi <nigi@chromium.org>
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 4187348..eba69d7 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -84,8 +84,6 @@
 
 #if defined(_SKIA_SUPPORT_PATHS_)
 void RgbByteOrderTransferBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap,
-                                int dest_left,
-                                int dest_top,
                                 int width,
                                 int height,
                                 const RetainPtr<CFX_DIBBase>& pSrcBitmap,
@@ -94,26 +92,34 @@
   if (!pBitmap)
     return;
 
+  int dest_left = 0;
+  int dest_top = 0;
   if (!pBitmap->GetOverlapRect(dest_left, dest_top, width, height,
                                pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
                                src_left, src_top, nullptr)) {
     return;
   }
 
-  int Bpp = pBitmap->GetBPP() / 8;
-  FXDIB_Format dest_format = pBitmap->GetFormat();
-  FXDIB_Format src_format = pSrcBitmap->GetFormat();
-  int pitch = pBitmap->GetPitch();
-  uint8_t* buffer = pBitmap->GetBuffer().data();
+  const int Bpp = pBitmap->GetBPP() / 8;
+  const FXDIB_Format dest_format = pBitmap->GetFormat();
+  const FXDIB_Format src_format = pSrcBitmap->GetFormat();
+  const int dest_pitch = pBitmap->GetPitch();
+
+  const size_t dest_x_offset = Fx2DSizeOrDie(dest_left, Bpp);
+  const size_t dest_y_offset = Fx2DSizeOrDie(dest_top, dest_pitch);
+
+  uint8_t* dest_buf =
+      pBitmap->GetBuffer().subspan(dest_y_offset).subspan(dest_x_offset).data();
   if (dest_format == src_format) {
+    const size_t src_x_offset = Fx2DSizeOrDie(src_left, Bpp);
     for (int row = 0; row < height; row++) {
-      uint8_t* dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
+      uint8_t* dest_scan = dest_buf;
       const uint8_t* src_scan =
-          pSrcBitmap->GetScanline(src_top + row).subspan(src_left * Bpp).data();
+          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       if (Bpp == 4) {
         for (int col = 0; col < width; col++) {
-          FXARGB_SETDIB(dest_scan, ArgbEncode(src_scan[3], src_scan[0],
-                                              src_scan[1], src_scan[2]));
+          FXARGB_SETRGBORDERDIB(dest_scan,
+                                *reinterpret_cast<const uint32_t*>(src_scan));
           dest_scan += 4;
           src_scan += 4;
         }
@@ -125,64 +131,64 @@
           src_scan += 3;
         }
       }
+      dest_buf += dest_pitch;
     }
     return;
   }
 
-  uint8_t* dest_buf = buffer + dest_top * pitch + dest_left * Bpp;
   if (dest_format == FXDIB_Format::kRgb) {
-    if (src_format == FXDIB_Format::kRgb32) {
-      for (int row = 0; row < height; row++) {
-        uint8_t* dest_scan = dest_buf + row * pitch;
-        const uint8_t* src_scan =
-            pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 4).data();
-        for (int col = 0; col < width; col++) {
-          *dest_scan++ = src_scan[2];
-          *dest_scan++ = src_scan[1];
-          *dest_scan++ = src_scan[0];
-          src_scan += 4;
-        }
+    DCHECK_EQ(src_format, FXDIB_Format::kRgb32);
+    const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
+    for (int row = 0; row < height; row++) {
+      uint8_t* dest_scan = dest_buf;
+      const uint8_t* src_scan =
+          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+      for (int col = 0; col < width; col++) {
+        *dest_scan++ = src_scan[2];
+        *dest_scan++ = src_scan[1];
+        *dest_scan++ = src_scan[0];
+        src_scan += 4;
       }
-    } else {
-      NOTREACHED();
+      dest_buf += dest_pitch;
     }
     return;
   }
 
-  if (dest_format == FXDIB_Format::kArgb ||
-      dest_format == FXDIB_Format::kRgb32) {
-    if (src_format == FXDIB_Format::kRgb) {
-      for (int row = 0; row < height; row++) {
-        uint8_t* dest_scan = (uint8_t*)(dest_buf + row * pitch);
-        const uint8_t* src_scan =
-            pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 3).data();
-        for (int col = 0; col < width; col++) {
-          FXARGB_SETDIB(dest_scan, ArgbEncode(0xff, src_scan[0], src_scan[1],
-                                              src_scan[2]));
-          dest_scan += 4;
-          src_scan += 3;
-        }
+  DCHECK(dest_format == FXDIB_Format::kArgb ||
+         dest_format == FXDIB_Format::kRgb32);
+  if (src_format == FXDIB_Format::kRgb) {
+    const size_t src_x_offset = Fx2DSizeOrDie(src_left, 3);
+    for (int row = 0; row < height; row++) {
+      uint8_t* dest_scan = dest_buf;
+      const uint8_t* src_scan =
+          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+      for (int col = 0; col < width; col++) {
+        FXARGB_SETDIB(dest_scan,
+                      ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
+        dest_scan += 4;
+        src_scan += 3;
       }
-    } else if (src_format == FXDIB_Format::kRgb32) {
-      DCHECK_EQ(dest_format, FXDIB_Format::kArgb);
-      for (int row = 0; row < height; row++) {
-        uint8_t* dest_scan = dest_buf + row * pitch;
-        const uint8_t* src_scan =
-            pSrcBitmap->GetScanline(src_top + row).subspan(src_left * 4).data();
-        for (int col = 0; col < width; col++) {
-          FXARGB_SETDIB(dest_scan, ArgbEncode(0xff, src_scan[0], src_scan[1],
-                                              src_scan[2]));
-          src_scan += 4;
-          dest_scan += 4;
-        }
-      }
+      dest_buf += dest_pitch;
     }
     return;
   }
-
-  NOTREACHED();
+  if (src_format != FXDIB_Format::kRgb32)
+    return;
+  DCHECK_EQ(dest_format, FXDIB_Format::kArgb);
+  const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
+  for (int row = 0; row < height; row++) {
+    uint8_t* dest_scan = dest_buf;
+    const uint8_t* src_scan =
+        pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
+    for (int col = 0; col < width; col++) {
+      FXARGB_SETDIB(dest_scan,
+                    ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
+      src_scan += 4;
+      dest_scan += 4;
+    }
+    dest_buf += dest_pitch;
+  }
 }
-
 #endif  // defined(_SKIA_SUPPORT_PATHS_)
 
 #define SHOW_SKIA_PATH 0  // set to 1 to print the path contents
@@ -2516,8 +2522,8 @@
   left = std::min(left, 0);
   top = std::min(top, 0);
   if (m_bRgbByteOrder) {
-    RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(),
-                               pBack, left, top);
+    RgbByteOrderTransferBitmap(pBitmap, rect.Width(), rect.Height(), pBack,
+                               left, top);
   } else {
     bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack,
                                    left, top);