diff --git a/core/fxge/agg/fx_agg_driver.cpp b/core/fxge/agg/fx_agg_driver.cpp
index 88c99e1..dd44a4d 100644
--- a/core/fxge/agg/fx_agg_driver.cpp
+++ b/core/fxge/agg/fx_agg_driver.cpp
@@ -153,12 +153,12 @@
   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();
+  pdfium::span<uint8_t> dest_span =
+      pBitmap->GetBuffer().subspan(dest_y_offset).subspan(dest_x_offset);
   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 = dest_buf;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       if (Bpp == 4) {
@@ -176,7 +176,7 @@
           src_scan += 3;
         }
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -185,7 +185,7 @@
     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;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       for (int col = 0; col < width; col++) {
@@ -194,7 +194,7 @@
         *dest_scan++ = src_scan[0];
         src_scan += 4;
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -204,7 +204,7 @@
   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;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       for (int col = 0; col < width; col++) {
@@ -213,7 +213,7 @@
         dest_scan += 4;
         src_scan += 3;
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -222,7 +222,7 @@
   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;
+    uint8_t* dest_scan = dest_span.data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
     for (int col = 0; col < width; col++) {
@@ -231,7 +231,7 @@
       src_scan += 4;
       dest_scan += 4;
     }
-    dest_buf += dest_pitch;
+    dest_span = dest_span.subspan(dest_pitch);
   }
 }
 
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index eba69d7..39ffdae 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -108,12 +108,12 @@
   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();
+  pdfium::span<uint8_t> dest_span =
+      pBitmap->GetBuffer().subspan(dest_y_offset).subspan(dest_x_offset);
   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 = dest_buf;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       if (Bpp == 4) {
@@ -131,7 +131,7 @@
           src_scan += 3;
         }
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -140,7 +140,7 @@
     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;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       for (int col = 0; col < width; col++) {
@@ -149,7 +149,7 @@
         *dest_scan++ = src_scan[0];
         src_scan += 4;
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -159,7 +159,7 @@
   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;
+      uint8_t* dest_scan = dest_span.data();
       const uint8_t* src_scan =
           pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
       for (int col = 0; col < width; col++) {
@@ -168,7 +168,7 @@
         dest_scan += 4;
         src_scan += 3;
       }
-      dest_buf += dest_pitch;
+      dest_span = dest_span.subspan(dest_pitch);
     }
     return;
   }
@@ -177,7 +177,7 @@
   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;
+    uint8_t* dest_scan = dest_span.data();
     const uint8_t* src_scan =
         pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
     for (int col = 0; col < width; col++) {
@@ -186,7 +186,7 @@
       src_scan += 4;
       dest_scan += 4;
     }
-    dest_buf += dest_pitch;
+    dest_span = dest_span.subspan(dest_pitch);
   }
 }
 #endif  // defined(_SKIA_SUPPORT_PATHS_)
