Implement bmp.decoder.decode_image_config
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index cadbd74..693f3e4 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -3132,6 +3132,7 @@
 // ---------------- Status Codes
 
 extern const char* wuffs_bmp__error__bad_header;
+extern const char* wuffs_bmp__error__unsupported_bmp_file;
 
 // ---------------- Public Consts
 
@@ -3247,13 +3248,27 @@
     uint32_t f_width;
     uint32_t f_height;
     uint8_t f_call_sequence;
+    uint8_t f_bits_per_pixel;
+    bool f_top_down;
+    uint32_t f_padding;
     uint64_t f_frame_config_io_position;
     wuffs_base__pixel_swizzler f_swizzler;
 
+    uint32_t p_decode_image_config[1];
     uint32_t p_decode_frame_config[1];
     uint32_t p_decode_frame[1];
   } private_impl;
 
+  struct {
+    struct {
+      uint32_t v_bitmapInfoLen;
+      uint64_t scratch;
+    } s_decode_image_config[1];
+    struct {
+      uint64_t scratch;
+    } s_decode_frame[1];
+  } private_data;
+
 #ifdef __cplusplus
 #if (__cplusplus >= 201103L) && !defined(WUFFS_IMPLEMENTATION)
   // Disallow constructing or copying an object via standard C++ mechanisms,
@@ -7349,6 +7364,8 @@
 // ---------------- Status Codes Implementations
 
 const char* wuffs_bmp__error__bad_header = "#bmp: bad header";
+const char* wuffs_bmp__error__unsupported_bmp_file =
+    "#bmp: unsupported BMP file";
 
 // ---------------- Private Consts
 
@@ -7482,6 +7499,12 @@
   self->private_impl.active_coroutine = 0;
   wuffs_base__status status = wuffs_base__make_status(NULL);
 
+  uint32_t v_magic = 0;
+  uint32_t v_bitmapInfoLen = 0;
+  uint32_t v_planes = 0;
+  uint32_t v_bits_per_pixel = 0;
+  uint32_t v_compression = 0;
+
   uint8_t* iop_a_src = NULL;
   uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
   uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
@@ -7493,24 +7516,355 @@
     io2_a_src = io0_a_src + a_src->meta.wi;
   }
 
-  if (self->private_impl.f_call_sequence != 0) {
-    status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
+  uint32_t coro_susp_point = self->private_impl.p_decode_image_config[0];
+  if (coro_susp_point) {
+    v_bitmapInfoLen =
+        self->private_data.s_decode_image_config[0].v_bitmapInfoLen;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_call_sequence != 0) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      uint32_t t_0;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
+        t_0 = ((uint32_t)(wuffs_base__load_u16le(iop_a_src)));
+        iop_a_src += 2;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
+          if (num_bits_0 == 8) {
+            t_0 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_0 += 8;
+          *scratch |= ((uint64_t)(num_bits_0)) << 56;
+        }
+      }
+      v_magic = t_0;
+    }
+    if (v_magic != 19778) {
+      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
+      goto exit;
+    }
+    self->private_data.s_decode_image_config[0].scratch = 8;
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+    if (self->private_data.s_decode_image_config[0].scratch >
+        ((uint64_t)(io2_a_src - iop_a_src))) {
+      self->private_data.s_decode_image_config[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_decode_image_config[0].scratch;
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+      uint32_t t_1;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_1 = wuffs_base__load_u32le(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
+          if (num_bits_1 == 24) {
+            t_1 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_1 += 8;
+          *scratch |= ((uint64_t)(num_bits_1)) << 56;
+        }
+      }
+      self->private_impl.f_padding = t_1;
+    }
+    if (self->private_impl.f_padding < 14) {
+      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
+      goto exit;
+    }
+    self->private_impl.f_padding -= 14;
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+      uint32_t t_2;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_2 = wuffs_base__load_u32le(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
+          if (num_bits_2 == 24) {
+            t_2 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_2 += 8;
+          *scratch |= ((uint64_t)(num_bits_2)) << 56;
+        }
+      }
+      v_bitmapInfoLen = t_2;
+    }
+    if (v_bitmapInfoLen != 124) {
+      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
+      goto exit;
+    }
+    if (self->private_impl.f_padding < v_bitmapInfoLen) {
+      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
+      goto exit;
+    }
+    self->private_impl.f_padding -= v_bitmapInfoLen;
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
+      uint32_t t_3;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_3 = wuffs_base__load_u32le(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
+          if (num_bits_3 == 24) {
+            t_3 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_3 += 8;
+          *scratch |= ((uint64_t)(num_bits_3)) << 56;
+        }
+      }
+      self->private_impl.f_width = t_3;
+    }
+    if (self->private_impl.f_width >= 2147483648) {
+      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
+      uint32_t t_4;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_4 = wuffs_base__load_u32le(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
+          if (num_bits_4 == 24) {
+            t_4 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_4 += 8;
+          *scratch |= ((uint64_t)(num_bits_4)) << 56;
+        }
+      }
+      self->private_impl.f_height = t_4;
+    }
+    if (self->private_impl.f_height == 2147483648) {
+      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
+      goto exit;
+    } else if (self->private_impl.f_height > 2147483648) {
+      self->private_impl.f_height = (0 - self->private_impl.f_height);
+      self->private_impl.f_top_down = true;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
+      uint32_t t_5;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
+        t_5 = ((uint32_t)(wuffs_base__load_u16le(iop_a_src)));
+        iop_a_src += 2;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
+          if (num_bits_5 == 8) {
+            t_5 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_5 += 8;
+          *scratch |= ((uint64_t)(num_bits_5)) << 56;
+        }
+      }
+      v_planes = t_5;
+    }
+    if (v_planes != 1) {
+      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
+      uint32_t t_6;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
+        t_6 = ((uint32_t)(wuffs_base__load_u16le(iop_a_src)));
+        iop_a_src += 2;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
+          if (num_bits_6 == 8) {
+            t_6 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_6 += 8;
+          *scratch |= ((uint64_t)(num_bits_6)) << 56;
+        }
+      }
+      v_bits_per_pixel = t_6;
+    }
+    if (v_bits_per_pixel != 24) {
+      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
+      goto exit;
+    }
+    self->private_impl.f_bits_per_pixel = ((uint8_t)((v_bits_per_pixel & 255)));
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
+      uint32_t t_7;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_7 = wuffs_base__load_u32le(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_decode_image_config[0].scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status =
+                wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch =
+              &self->private_data.s_decode_image_config[0].scratch;
+          uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
+          if (num_bits_7 == 24) {
+            t_7 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_7 += 8;
+          *scratch |= ((uint64_t)(num_bits_7)) << 56;
+        }
+      }
+      v_compression = t_7;
+    }
+    if (v_compression != 0) {
+      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
+      goto exit;
+    }
+    self->private_data.s_decode_image_config[0].scratch =
+        (v_bitmapInfoLen - 20);
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
+    if (self->private_data.s_decode_image_config[0].scratch >
+        ((uint64_t)(io2_a_src - iop_a_src))) {
+      self->private_data.s_decode_image_config[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_decode_image_config[0].scratch;
+    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)));
+    if (a_dst != NULL) {
+      wuffs_base__image_config__set(
+          a_dst, 1157662856, 0, self->private_impl.f_width,
+          self->private_impl.f_height,
+          self->private_impl.f_frame_config_io_position, true);
+    }
+    self->private_impl.f_call_sequence = 1;
+
+    goto ok;
+  ok:
+    self->private_impl.p_decode_image_config[0] = 0;
     goto exit;
   }
-  self->private_impl.f_width = 1;
-  self->private_impl.f_height = 1;
-  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)));
-  if (a_dst != NULL) {
-    wuffs_base__image_config__set(
-        a_dst, 1157662856, 0, self->private_impl.f_width,
-        self->private_impl.f_height,
-        self->private_impl.f_frame_config_io_position, true);
-  }
-  self->private_impl.f_call_sequence = 1;
 
-  goto ok;
-ok:
+  goto suspend;
+suspend:
+  self->private_impl.p_decode_image_config[0] =
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_impl.active_coroutine =
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
+  self->private_data.s_decode_image_config[0].v_bitmapInfoLen = v_bitmapInfoLen;
+
   goto exit;
 exit:
   if (a_src) {
@@ -7672,6 +8026,17 @@
   self->private_impl.active_coroutine = 0;
   wuffs_base__status status = wuffs_base__make_status(NULL);
 
+  uint8_t* iop_a_src = NULL;
+  uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  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_decode_frame[0];
   if (coro_susp_point) {
   }
@@ -7679,8 +8044,14 @@
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
     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(1);
       status = wuffs_bmp__decoder__decode_frame_config(self, NULL, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
       if (status.repr) {
         goto suspend;
       }
@@ -7689,6 +8060,17 @@
       status = wuffs_base__make_status(wuffs_base__note__end_of_data);
       goto ok;
     }
+    self->private_data.s_decode_frame[0].scratch = self->private_impl.f_padding;
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+    if (self->private_data.s_decode_frame[0].scratch >
+        ((uint64_t)(io2_a_src - iop_a_src))) {
+      self->private_data.s_decode_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_decode_frame[0].scratch;
     self->private_impl.f_call_sequence = 3;
 
     goto ok;
@@ -7706,6 +8088,10 @@
 
   goto exit;
 exit:
+  if (a_src) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
   if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
diff --git a/std/bmp/decode_bmp.wuffs b/std/bmp/decode_bmp.wuffs
index 448915f..7f9319d 100644
--- a/std/bmp/decode_bmp.wuffs
+++ b/std/bmp/decode_bmp.wuffs
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 pub status "#bad header"
+pub status "#unsupported BMP file"
 
 pub const decoder_workbuf_len_max_incl_worst_case base.u64 = 0
 
@@ -22,6 +23,11 @@
 
 	call_sequence : base.u8,
 
+	bits_per_pixel : base.u8,
+	top_down       : base.bool,
+
+	padding : base.u32,
+
 	frame_config_io_position : base.u64,
 
 	swizzler : base.pixel_swizzler,
@@ -29,13 +35,78 @@
 )
 
 pub func decoder.decode_image_config?(dst: nptr base.image_config, src: base.io_reader) {
+	var magic          : base.u32
+	var bitmapInfoLen  : base.u32
+	var planes         : base.u32
+	var bits_per_pixel : base.u32
+	var compression    : base.u32
+
 	if this.call_sequence <> 0 {
 		return base."#bad call sequence"
 	}
 
-	// TODO.
-	this.width = 1
-	this.height = 1
+	// Read the BITMAPFILEHEADER (14 bytes).
+
+	magic = args.src.read_u16le_as_u32?()
+	if magic <> 0x4D42 {  // "BM" little-endian.
+		return "#bad header"
+	}
+
+	args.src.skip32?(n: 8)
+
+	this.padding = args.src.read_u32le?()
+	if this.padding < 14 {
+		return "#bad header"
+	}
+	this.padding -= 14
+
+	// Read the BITMAPINFOHEADER (version 5 is 124 bytes).
+	//
+	// TODO: support other versions.
+
+	bitmapInfoLen = args.src.read_u32le?()
+	if bitmapInfoLen <> 124 {
+		return "#unsupported BMP file"
+	}
+	if this.padding < bitmapInfoLen {
+		return "#bad header"
+	}
+	this.padding -= bitmapInfoLen
+
+	this.width = args.src.read_u32le?()
+	if this.width >= 0x80000000 {
+		return "#bad header"
+	}
+
+	this.height = args.src.read_u32le?()
+	if this.height == 0x80000000 {
+		return "#bad header"
+	} else if this.height > 0x80000000 {
+		this.height = 0 ~mod- this.height
+		this.top_down = true
+	}
+
+	planes = args.src.read_u16le_as_u32?()
+	if planes <> 1 {
+		return "#unsupported BMP file"
+	}
+
+	bits_per_pixel = args.src.read_u16le_as_u32?()
+	if bits_per_pixel <> 24 {
+		// TODO: support 8bpp, 32bpp, possibly more.
+		return "#unsupported BMP file"
+	}
+	this.bits_per_pixel = (bits_per_pixel & 0xFF) as base.u8
+
+	compression = args.src.read_u32le?()
+	if compression <> 0 {
+		// TODO: support compression.
+		return "#unsupported BMP file"
+	}
+
+	// We've already read 20 bytes from the BITMAPINFOHEADER: size (4), width
+	// (4), height (4), planes (2), bpp (2), compression (4). Skip the rest.
+	args.src.skip32?(n: bitmapInfoLen - 20)
 
 	this.frame_config_io_position = args.src.position()
 
@@ -95,6 +166,8 @@
 		return base."@end of data"
 	}
 
+	args.src.skip32?(n: this.padding)
+
 	// TODO.
 
 	this.call_sequence = 3
diff --git a/test/c/std/bmp.c b/test/c/std/bmp.c
index 1800703..5fc011c 100644
--- a/test/c/std/bmp.c
+++ b/test/c/std/bmp.c
@@ -78,7 +78,7 @@
                    WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
   return do_test__wuffs_base__image_decoder(
       wuffs_bmp__decoder__upcast_as__wuffs_base__image_decoder(&dec),
-      "test/data/hippopotamus.bmp", 0, SIZE_MAX, 1, 1, 0x00000000);
+      "test/data/hippopotamus.bmp", 0, SIZE_MAX, 36, 28, 0x00000000);
 }
 
   // ---------------- Mimic Tests