diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index d82edab..a870bb9 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -5621,7 +5621,6 @@
     uint8_t f_call_sequence;
     bool f_top_down;
     uint32_t f_pad_per_row;
-    uint64_t f_bytes_per_row;
     uint32_t f_src_pixfmt;
     uint32_t f_io_redirect_fourcc;
     uint64_t f_io_redirect_pos;
@@ -5646,7 +5645,6 @@
     uint32_t p_decode_image_config[1];
     uint32_t p_decode_frame_config[1];
     uint32_t p_decode_frame[1];
-    uint32_t p_skip_frame[1];
     uint32_t p_read_palette[1];
   } private_impl;
 
@@ -5662,10 +5660,6 @@
       uint64_t scratch;
     } s_decode_frame[1];
     struct {
-      uint32_t v_rle_state;
-      uint64_t scratch;
-    } s_skip_frame[1];
-    struct {
       uint32_t v_i;
       uint64_t scratch;
     } s_read_palette[1];
@@ -7788,7 +7782,6 @@
     uint32_t p_decode_image_config[1];
     uint32_t p_decode_frame_config[1];
     uint32_t p_decode_frame[1];
-    uint32_t p_skip_frame[1];
   } private_impl;
 
   struct {
@@ -7803,9 +7796,6 @@
       uint8_t v_src[1];
       uint8_t v_c;
     } s_decode_frame[1];
-    struct {
-      uint64_t scratch;
-    } s_skip_frame[1];
   } private_data;
 
 #ifdef __cplusplus
@@ -15870,11 +15860,6 @@
     wuffs_base__io_buffer* a_src);
 
 static wuffs_base__status
-wuffs_bmp__decoder__skip_frame(
-    wuffs_bmp__decoder* self,
-    wuffs_base__io_buffer* a_src);
-
-static wuffs_base__status
 wuffs_bmp__decoder__read_palette(
     wuffs_bmp__decoder* self,
     wuffs_base__io_buffer* a_src);
@@ -16866,27 +16851,20 @@
     }
     if (self->private_impl.f_bits_per_pixel == 1) {
       v_byte_width = ((self->private_impl.f_width >> 3) + (((self->private_impl.f_width & 7) + 7) >> 3));
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(v_byte_width)) * 1) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3);
     } else if (self->private_impl.f_bits_per_pixel == 2) {
       v_byte_width = ((self->private_impl.f_width >> 2) + (((self->private_impl.f_width & 3) + 3) >> 2));
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(v_byte_width)) * 1) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3);
     } else if (self->private_impl.f_bits_per_pixel == 4) {
       v_byte_width = ((self->private_impl.f_width >> 1) + (self->private_impl.f_width & 1));
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(v_byte_width)) * 1) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = ((4 - (v_byte_width & 3)) & 3);
     } else if (self->private_impl.f_bits_per_pixel == 8) {
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(self->private_impl.f_width)) * 1) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = ((4 - (self->private_impl.f_width & 3)) & 3);
     } else if (self->private_impl.f_bits_per_pixel == 16) {
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(self->private_impl.f_width)) * 2) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1) * 2);
     } else if (self->private_impl.f_bits_per_pixel == 24) {
-      self->private_impl.f_bytes_per_row = ((((((uint64_t)(self->private_impl.f_width)) * 3) + 3) >> 2) << 2);
       self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3);
     } else if (self->private_impl.f_bits_per_pixel == 32) {
-      self->private_impl.f_bytes_per_row = (((uint64_t)(self->private_impl.f_width)) * 4);
       self->private_impl.f_pad_per_row = 0;
     }
     self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add(a_src->meta.pos, ((uint64_t)(iop_a_src - io0_a_src)));
@@ -16993,17 +16971,7 @@
         goto exit;
       }
     } else if (self->private_impl.f_call_sequence == 2) {
-      if (a_src) {
-        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
-      }
-      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
-      status = wuffs_bmp__decoder__skip_frame(self, a_src);
-      if (a_src) {
-        iop_a_src = a_src->data.ptr + a_src->meta.ri;
-      }
-      if (status.repr) {
-        goto suspend;
-      }
+      self->private_impl.f_call_sequence = 3;
       status = wuffs_base__make_status(wuffs_base__note__end_of_data);
       goto ok;
     } else {
@@ -17914,227 +17882,6 @@
   return status;
 }
 
-// -------- func bmp.decoder.skip_frame
-
-static wuffs_base__status
-wuffs_bmp__decoder__skip_frame(
-    wuffs_bmp__decoder* self,
-    wuffs_base__io_buffer* a_src) {
-  wuffs_base__status status = wuffs_base__make_status(NULL);
-
-  uint8_t v_code = 0;
-  uint32_t v_rle_state = 0;
-
-  const uint8_t* iop_a_src = NULL;
-  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  if (a_src) {
-    io0_a_src = a_src->data.ptr;
-    io1_a_src = io0_a_src + a_src->meta.ri;
-    iop_a_src = io1_a_src;
-    io2_a_src = io0_a_src + a_src->meta.wi;
-  }
-
-  uint32_t coro_susp_point = self->private_impl.p_skip_frame[0];
-  if (coro_susp_point) {
-    v_rle_state = self->private_data.s_skip_frame[0].v_rle_state;
-  }
-  switch (coro_susp_point) {
-    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
-    self->private_data.s_skip_frame[0].scratch = self->private_impl.f_padding;
-    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
-    if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
-      self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
-      iop_a_src = io2_a_src;
-      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-      goto suspend;
-    }
-    iop_a_src += self->private_data.s_skip_frame[0].scratch;
-    if ((self->private_impl.f_compression != 1) && (self->private_impl.f_compression != 2)) {
-      self->private_data.s_skip_frame[0].scratch = (self->private_impl.f_bytes_per_row * ((uint64_t)(self->private_impl.f_height)));
-      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
-      if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
-        self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
-        iop_a_src = io2_a_src;
-        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-        goto suspend;
-      }
-      iop_a_src += self->private_data.s_skip_frame[0].scratch;
-    } else {
-      label__loop__continue:;
-      while (true) {
-        if (v_rle_state == 0) {
-          {
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
-            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            uint8_t t_0 = *iop_a_src++;
-            v_code = t_0;
-          }
-          if (v_code == 0) {
-            v_rle_state = 2;
-            goto label__loop__continue;
-          }
-          self->private_impl.f_rle_length = ((uint32_t)(v_code));
-          v_rle_state = 1;
-          goto label__loop__continue;
-        } else if (v_rle_state == 1) {
-          {
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
-            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            uint8_t t_1 = *iop_a_src++;
-            v_code = t_1;
-          }
-          wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
-          v_rle_state = 0;
-          goto label__loop__continue;
-        } else if (v_rle_state == 2) {
-          {
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
-            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            uint8_t t_2 = *iop_a_src++;
-            v_code = t_2;
-          }
-          if (v_code < 2) {
-            if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0)) {
-              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
-              goto exit;
-            }
-            self->private_impl.f_dst_x = 0;
-            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
-            if (v_code > 0) {
-              goto label__loop__break;
-            }
-            v_rle_state = 0;
-            goto label__loop__continue;
-          } else if (v_code == 2) {
-            v_rle_state = 4;
-            goto label__loop__continue;
-          }
-          self->private_impl.f_rle_length = ((uint32_t)(v_code));
-          v_rle_state = 3;
-          goto label__loop__continue;
-        } else if (v_rle_state == 3) {
-          if (self->private_impl.f_bits_per_pixel == 8) {
-            self->private_data.s_skip_frame[0].scratch = (((self->private_impl.f_rle_length + 1) / 2) * 2);
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
-            if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
-              self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
-              iop_a_src = io2_a_src;
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            iop_a_src += self->private_data.s_skip_frame[0].scratch;
-          } else {
-            self->private_data.s_skip_frame[0].scratch = (((self->private_impl.f_rle_length + 3) / 4) * 2);
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
-            if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
-              self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
-              iop_a_src = io2_a_src;
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            iop_a_src += self->private_data.s_skip_frame[0].scratch;
-          }
-          wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
-          self->private_impl.f_rle_length = 0;
-          v_rle_state = 0;
-          goto label__loop__continue;
-        } else if (v_rle_state == 4) {
-          {
-            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
-            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-              goto suspend;
-            }
-            uint8_t t_3 = *iop_a_src++;
-            self->private_impl.f_rle_delta_x = t_3;
-          }
-          v_rle_state = 5;
-          goto label__loop__continue;
-        }
-        {
-          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
-          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
-            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-            goto suspend;
-          }
-          uint8_t t_4 = *iop_a_src++;
-          v_code = t_4;
-        }
-        if (self->private_impl.f_rle_delta_x > 0) {
-          wuffs_base__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
-          self->private_impl.f_rle_delta_x = 0;
-          if (self->private_impl.f_dst_x > self->private_impl.f_width) {
-            status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
-            goto exit;
-          }
-        }
-        if (v_code > 0) {
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
-          v_code -= 1;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-          while (true) {
-            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
-            if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
-              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
-              goto exit;
-            }
-            if (v_code <= 0) {
-              goto label__0__break;
-            }
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
-            v_code -= 1;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-          }
-          label__0__break:;
-        }
-        v_rle_state = 0;
-      }
-      label__loop__break:;
-    }
-    self->private_impl.f_call_sequence = 3;
-
-    goto ok;
-    ok:
-    self->private_impl.p_skip_frame[0] = 0;
-    goto exit;
-  }
-
-  goto suspend;
-  suspend:
-  self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-  self->private_data.s_skip_frame[0].v_rle_state = v_rle_state;
-
-  goto exit;
-  exit:
-  if (a_src) {
-    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
-  }
-
-  return status;
-}
-
 // -------- func bmp.decoder.frame_dirty_rect
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
@@ -27645,11 +27392,6 @@
 
 // ---------------- Private Function Prototypes
 
-static wuffs_base__status
-wuffs_wbmp__decoder__skip_frame(
-    wuffs_wbmp__decoder* self,
-    wuffs_base__io_buffer* a_src);
-
 // ---------------- VTables
 
 const wuffs_base__image_decoder__func_ptrs
@@ -27971,17 +27713,7 @@
         goto exit;
       }
     } else if (self->private_impl.f_call_sequence == 2) {
-      if (a_src) {
-        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
-      }
-      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
-      status = wuffs_wbmp__decoder__skip_frame(self, a_src);
-      if (a_src) {
-        iop_a_src = a_src->data.ptr + a_src->meta.ri;
-      }
-      if (status.repr) {
-        goto suspend;
-      }
+      self->private_impl.f_call_sequence = 3;
       status = wuffs_base__make_status(wuffs_base__note__end_of_data);
       goto ok;
     } else {
@@ -28199,64 +27931,6 @@
   return status;
 }
 
-// -------- func wbmp.decoder.skip_frame
-
-static wuffs_base__status
-wuffs_wbmp__decoder__skip_frame(
-    wuffs_wbmp__decoder* self,
-    wuffs_base__io_buffer* a_src) {
-  wuffs_base__status status = wuffs_base__make_status(NULL);
-
-  uint64_t v_bytes_per_row = 0;
-  uint64_t v_total_bytes = 0;
-
-  const uint8_t* iop_a_src = NULL;
-  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
-  if (a_src) {
-    io0_a_src = a_src->data.ptr;
-    io1_a_src = io0_a_src + a_src->meta.ri;
-    iop_a_src = io1_a_src;
-    io2_a_src = io0_a_src + a_src->meta.wi;
-  }
-
-  uint32_t coro_susp_point = self->private_impl.p_skip_frame[0];
-  switch (coro_susp_point) {
-    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
-
-    v_bytes_per_row = ((((uint64_t)(self->private_impl.f_width)) + 7) / 8);
-    v_total_bytes = (v_bytes_per_row * ((uint64_t)(self->private_impl.f_height)));
-    self->private_data.s_skip_frame[0].scratch = v_total_bytes;
-    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
-    if (self->private_data.s_skip_frame[0].scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
-      self->private_data.s_skip_frame[0].scratch -= ((uint64_t)(io2_a_src - iop_a_src));
-      iop_a_src = io2_a_src;
-      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
-      goto suspend;
-    }
-    iop_a_src += self->private_data.s_skip_frame[0].scratch;
-    self->private_impl.f_call_sequence = 3;
-
-    goto ok;
-    ok:
-    self->private_impl.p_skip_frame[0] = 0;
-    goto exit;
-  }
-
-  goto suspend;
-  suspend:
-  self->private_impl.p_skip_frame[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
-
-  goto exit;
-  exit:
-  if (a_src) {
-    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
-  }
-
-  return status;
-}
-
 // -------- func wbmp.decoder.frame_dirty_rect
 
 WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
diff --git a/std/bmp/decode_bmp.wuffs b/std/bmp/decode_bmp.wuffs
index f0a8467..96f91f0 100644
--- a/std/bmp/decode_bmp.wuffs
+++ b/std/bmp/decode_bmp.wuffs
@@ -35,10 +35,9 @@
 
 	call_sequence : base.u8,
 
-	top_down      : base.bool,
-	pad_per_row   : base.u32[..= 3],
-	bytes_per_row : base.u64[..= 0x0000_0001_FFFF_FFFC],  // 4 * 0x7FFF_FFFF
-	src_pixfmt    : base.u32,
+	top_down    : base.bool,
+	pad_per_row : base.u32[..= 3],
+	src_pixfmt  : base.u32,
 
 	io_redirect_fourcc : base.u32,
 	io_redirect_pos    : base.u64,
@@ -326,29 +325,22 @@
 	if this.bits_per_pixel == 1 {
 		// byte_width is this.width divided by 8, rounding up.
 		byte_width = (this.width >> 3) + (((this.width & 7) + 7) >> 3)
-		this.bytes_per_row = ((((byte_width as base.u64) * 1) + 3) >> 2) << 2
 		this.pad_per_row = (4 - (byte_width & 3)) & 3
 	} else if this.bits_per_pixel == 2 {
 		// byte_width is this.width divided by 4, rounding up.
 		byte_width = (this.width >> 2) + (((this.width & 3) + 3) >> 2)
-		this.bytes_per_row = ((((byte_width as base.u64) * 1) + 3) >> 2) << 2
 		this.pad_per_row = (4 - (byte_width & 3)) & 3
 	} else if this.bits_per_pixel == 4 {
 		// byte_width is this.width divided by 2, rounding up.
 		byte_width = (this.width >> 1) + (this.width & 1)
-		this.bytes_per_row = ((((byte_width as base.u64) * 1) + 3) >> 2) << 2
 		this.pad_per_row = (4 - (byte_width & 3)) & 3
 	} else if this.bits_per_pixel == 8 {
-		this.bytes_per_row = ((((this.width as base.u64) * 1) + 3) >> 2) << 2
 		this.pad_per_row = (4 - (this.width & 3)) & 3
 	} else if this.bits_per_pixel == 16 {
-		this.bytes_per_row = ((((this.width as base.u64) * 2) + 3) >> 2) << 2
 		this.pad_per_row = (this.width & 1) * 2
 	} else if this.bits_per_pixel == 24 {
-		this.bytes_per_row = ((((this.width as base.u64) * 3) + 3) >> 2) << 2
 		this.pad_per_row = this.width & 3
 	} else if this.bits_per_pixel == 32 {
-		this.bytes_per_row = (this.width as base.u64) * 4
 		this.pad_per_row = 0
 	}
 
@@ -383,7 +375,7 @@
 			return base."#bad restart"
 		}
 	} else if this.call_sequence == 2 {
-		this.skip_frame?(src: args.src)
+		this.call_sequence = 3
 		return base."@end of data"
 	} else {
 		return base."@end of data"
@@ -1086,102 +1078,6 @@
 	return ok
 }
 
-pri func decoder.skip_frame?(src: base.io_reader) {
-	var code      : base.u8
-	var rle_state : base.u32
-
-	args.src.skip_u32?(n: this.padding)
-
-	if (this.compression <> COMPRESSION_RLE8) and
-		(this.compression <> COMPRESSION_RLE4) {
-		args.src.skip?(n: this.bytes_per_row * (this.height as base.u64))
-
-	} else {
-		while.loop true {
-			if rle_state == RLE_STATE_NEUTRAL {
-				code = args.src.read_u8?()
-				if code == 0 {
-					rle_state = RLE_STATE_ESCAPE
-					continue.loop
-				}
-				this.rle_length = code as base.u32
-				rle_state = RLE_STATE_RUN
-				continue.loop
-
-			} else if rle_state == RLE_STATE_RUN {
-				code = args.src.read_u8?()
-				this.dst_x ~sat+= this.rle_length
-				rle_state = RLE_STATE_NEUTRAL
-				continue.loop
-
-			} else if rle_state == RLE_STATE_ESCAPE {
-				code = args.src.read_u8?()
-				if code < 2 {  // 0=EOL, 1=EOF.
-					if (this.dst_y >= this.height) and (code == 0) {
-						return "#bad RLE compression"
-					}
-					this.dst_x = 0
-					this.dst_y ~mod+= this.dst_y_inc
-					if code > 0 {
-						break.loop
-					}
-					rle_state = RLE_STATE_NEUTRAL
-					continue.loop
-				} else if code == 2 {  // 2=DELTA.
-					rle_state = RLE_STATE_DELTA_X
-					continue.loop
-				}
-				this.rle_length = code as base.u32
-				rle_state = RLE_STATE_LITERAL
-				continue.loop
-
-			} else if rle_state == RLE_STATE_LITERAL {
-				if this.bits_per_pixel == 8 {
-					args.src.skip_u32?(n: ((this.rle_length + 1) / 2) * 2)
-				} else {
-					args.src.skip_u32?(n: ((this.rle_length + 3) / 4) * 2)
-				}
-				this.dst_x ~sat+= this.rle_length
-				this.rle_length = 0
-				rle_state = RLE_STATE_NEUTRAL
-				continue.loop
-
-			} else if rle_state == RLE_STATE_DELTA_X {
-				this.rle_delta_x = args.src.read_u8?()
-				rle_state = RLE_STATE_DELTA_Y
-				continue.loop
-
-			}  // else (rle_state == RLE_STATE_DELTA_Y).
-			code = args.src.read_u8?()
-			if this.rle_delta_x > 0 {
-				this.dst_x ~sat+= this.rle_delta_x as base.u32
-				this.rle_delta_x = 0
-				if this.dst_x > this.width {
-					return "#bad RLE compression"
-				}
-			}
-
-			if code > 0 {
-				code -= 1
-				while true {
-					this.dst_y ~mod+= this.dst_y_inc
-					if this.dst_y >= this.height {
-						return "#bad RLE compression"
-					}
-					if code <= 0 {
-						break
-					}
-					code -= 1
-				} endwhile
-			}
-
-			rle_state = RLE_STATE_NEUTRAL
-		} endwhile.loop
-	}
-
-	this.call_sequence = 3
-}
-
 pub func decoder.frame_dirty_rect() base.rect_ie_u32 {
 	return this.util.make_rect_ie_u32(
 		min_incl_x: 0,
diff --git a/std/wbmp/decode_wbmp.wuffs b/std/wbmp/decode_wbmp.wuffs
index 931461d..caff601 100644
--- a/std/wbmp/decode_wbmp.wuffs
+++ b/std/wbmp/decode_wbmp.wuffs
@@ -102,7 +102,7 @@
 			return base."#bad restart"
 		}
 	} else if this.call_sequence == 2 {
-		this.skip_frame?(src: args.src)
+		this.call_sequence = 3
 		return base."@end of data"
 	} else {
 		return base."@end of data"
@@ -224,18 +224,6 @@
 	this.call_sequence = 3
 }
 
-pri func decoder.skip_frame?(src: base.io_reader) {
-	var bytes_per_row : base.u64[..= 0x2000_0000]
-	var total_bytes   : base.u64
-
-	bytes_per_row = ((this.width as base.u64) + 7) / 8
-	total_bytes = bytes_per_row * (this.height as base.u64)
-
-	args.src.skip?(n: total_bytes)
-
-	this.call_sequence = 3
-}
-
 pub func decoder.frame_dirty_rect() base.rect_ie_u32 {
 	return this.util.make_rect_ie_u32(
 		min_incl_x: 0,
diff --git a/test/c/std/bmp.c b/test/c/std/bmp.c
index 96975cf..3eeb652 100644
--- a/test/c/std/bmp.c
+++ b/test/c/std/bmp.c
@@ -122,10 +122,6 @@
     RETURN_FAIL("decode_frame_config #1: have \"%s\", want \"%s\"", status.repr,
                 wuffs_base__note__end_of_data);
   }
-  if (src.meta.ri != src.meta.wi) {
-    RETURN_FAIL("at end of data: ri (%zu) doesn't equal wi (%zu)", src.meta.ri,
-                src.meta.wi);
-  }
   return NULL;
 }
 
diff --git a/test/c/std/wbmp.c b/test/c/std/wbmp.c
index bef5ff0..3b58ae8 100644
--- a/test/c/std/wbmp.c
+++ b/test/c/std/wbmp.c
@@ -307,10 +307,6 @@
     RETURN_FAIL("decode_frame_config #1: have \"%s\", want \"%s\"", status.repr,
                 wuffs_base__note__end_of_data);
   }
-  if (src.meta.ri != src.meta.wi) {
-    RETURN_FAIL("at end of data: ri (%zu) doesn't equal wi (%zu)", src.meta.ri,
-                src.meta.wi);
-  }
   return NULL;
 }
 
