Add contains_range and contains_rect methods
diff --git a/cmd/wuffs-c/internal/cgen/base/range-public.h b/cmd/wuffs-c/internal/cgen/base/range-public.h
index 6802736..7b4a5c4 100644
--- a/cmd/wuffs-c/internal/cgen/base/range-public.h
+++ b/cmd/wuffs-c/internal/cgen/base/range-public.h
@@ -54,11 +54,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ii_u32__struct s);
-  inline bool contains(uint32_t x);
   inline wuffs_base__range_ii_u32__struct intersect(
       wuffs_base__range_ii_u32__struct s);
   inline wuffs_base__range_ii_u32__struct unite(
       wuffs_base__range_ii_u32__struct s);
+  inline bool contains(uint32_t x);
+  inline bool contains_range(wuffs_base__range_ii_u32__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__range_ii_u32;
@@ -76,11 +77,6 @@
           wuffs_base__range_ii_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {
-  return (r->min_incl <= x) && (x <= r->max_incl);
-}
-
 static inline wuffs_base__range_ii_u32  //
 wuffs_base__range_ii_u32__intersect(wuffs_base__range_ii_u32* r,
                                     wuffs_base__range_ii_u32 s) {
@@ -105,6 +101,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {
+  return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool  //
+wuffs_base__range_ii_u32__contains_range(wuffs_base__range_ii_u32* r,
+                                         wuffs_base__range_ii_u32 s) {
+  return wuffs_base__range_ii_u32__equals(
+      &s, wuffs_base__range_ii_u32__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -117,11 +125,6 @@
   return wuffs_base__range_ii_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ii_u32::contains(uint32_t x) {
-  return wuffs_base__range_ii_u32__contains(this, x);
-}
-
 inline wuffs_base__range_ii_u32  //
 wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) {
   return wuffs_base__range_ii_u32__intersect(this, s);
@@ -132,6 +135,16 @@
   return wuffs_base__range_ii_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ii_u32::contains(uint32_t x) {
+  return wuffs_base__range_ii_u32__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) {
+  return wuffs_base__range_ii_u32__contains_range(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -143,11 +156,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ie_u32__struct s);
-  inline bool contains(uint32_t x);
   inline wuffs_base__range_ie_u32__struct intersect(
       wuffs_base__range_ie_u32__struct s);
   inline wuffs_base__range_ie_u32__struct unite(
       wuffs_base__range_ie_u32__struct s);
+  inline bool contains(uint32_t x);
+  inline bool contains_range(wuffs_base__range_ie_u32__struct s);
   inline uint32_t length();
 #endif  // __cplusplus
 
@@ -166,11 +180,6 @@
           wuffs_base__range_ie_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ie_u32__contains(wuffs_base__range_ie_u32* r, uint32_t x) {
-  return (r->min_incl <= x) && (x < r->max_excl);
-}
-
 static inline wuffs_base__range_ie_u32  //
 wuffs_base__range_ie_u32__intersect(wuffs_base__range_ie_u32* r,
                                     wuffs_base__range_ie_u32 s) {
@@ -195,6 +204,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ie_u32__contains(wuffs_base__range_ie_u32* r, uint32_t x) {
+  return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool  //
+wuffs_base__range_ie_u32__contains_range(wuffs_base__range_ie_u32* r,
+                                         wuffs_base__range_ie_u32 s) {
+  return wuffs_base__range_ie_u32__equals(
+      &s, wuffs_base__range_ie_u32__intersect(r, s));
+}
+
 static inline uint32_t  //
 wuffs_base__range_ie_u32__length(wuffs_base__range_ie_u32* r) {
   return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
@@ -212,11 +233,6 @@
   return wuffs_base__range_ie_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ie_u32::contains(uint32_t x) {
-  return wuffs_base__range_ie_u32__contains(this, x);
-}
-
 inline wuffs_base__range_ie_u32  //
 wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) {
   return wuffs_base__range_ie_u32__intersect(this, s);
@@ -227,6 +243,16 @@
   return wuffs_base__range_ie_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ie_u32::contains(uint32_t x) {
+  return wuffs_base__range_ie_u32__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) {
+  return wuffs_base__range_ie_u32__contains_range(this, s);
+}
+
 inline uint32_t  //
 wuffs_base__range_ie_u32::length() {
   return wuffs_base__range_ie_u32__length(this);
@@ -243,11 +269,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ii_u64__struct s);
-  inline bool contains(uint64_t x);
   inline wuffs_base__range_ii_u64__struct intersect(
       wuffs_base__range_ii_u64__struct s);
   inline wuffs_base__range_ii_u64__struct unite(
       wuffs_base__range_ii_u64__struct s);
+  inline bool contains(uint64_t x);
+  inline bool contains_range(wuffs_base__range_ii_u64__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__range_ii_u64;
@@ -265,11 +292,6 @@
           wuffs_base__range_ii_u64__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, uint64_t x) {
-  return (r->min_incl <= x) && (x <= r->max_incl);
-}
-
 static inline wuffs_base__range_ii_u64  //
 wuffs_base__range_ii_u64__intersect(wuffs_base__range_ii_u64* r,
                                     wuffs_base__range_ii_u64 s) {
@@ -294,6 +316,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, uint64_t x) {
+  return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool  //
+wuffs_base__range_ii_u64__contains_range(wuffs_base__range_ii_u64* r,
+                                         wuffs_base__range_ii_u64 s) {
+  return wuffs_base__range_ii_u64__equals(
+      &s, wuffs_base__range_ii_u64__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -306,11 +340,6 @@
   return wuffs_base__range_ii_u64__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ii_u64::contains(uint64_t x) {
-  return wuffs_base__range_ii_u64__contains(this, x);
-}
-
 inline wuffs_base__range_ii_u64  //
 wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) {
   return wuffs_base__range_ii_u64__intersect(this, s);
@@ -321,6 +350,16 @@
   return wuffs_base__range_ii_u64__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ii_u64::contains(uint64_t x) {
+  return wuffs_base__range_ii_u64__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) {
+  return wuffs_base__range_ii_u64__contains_range(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -332,11 +371,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ie_u64__struct s);
-  inline bool contains(uint64_t x);
   inline wuffs_base__range_ie_u64__struct intersect(
       wuffs_base__range_ie_u64__struct s);
   inline wuffs_base__range_ie_u64__struct unite(
       wuffs_base__range_ie_u64__struct s);
+  inline bool contains(uint64_t x);
+  inline bool contains_range(wuffs_base__range_ie_u64__struct s);
   inline uint64_t length();
 #endif  // __cplusplus
 
@@ -355,11 +395,6 @@
           wuffs_base__range_ie_u64__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ie_u64__contains(wuffs_base__range_ie_u64* r, uint64_t x) {
-  return (r->min_incl <= x) && (x < r->max_excl);
-}
-
 static inline wuffs_base__range_ie_u64  //
 wuffs_base__range_ie_u64__intersect(wuffs_base__range_ie_u64* r,
                                     wuffs_base__range_ie_u64 s) {
@@ -384,6 +419,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ie_u64__contains(wuffs_base__range_ie_u64* r, uint64_t x) {
+  return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool  //
+wuffs_base__range_ie_u64__contains_range(wuffs_base__range_ie_u64* r,
+                                         wuffs_base__range_ie_u64 s) {
+  return wuffs_base__range_ie_u64__equals(
+      &s, wuffs_base__range_ie_u64__intersect(r, s));
+}
+
 static inline uint64_t  //
 wuffs_base__range_ie_u64__length(wuffs_base__range_ie_u64* r) {
   return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
@@ -401,11 +448,6 @@
   return wuffs_base__range_ie_u64__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ie_u64::contains(uint64_t x) {
-  return wuffs_base__range_ie_u64__contains(this, x);
-}
-
 inline wuffs_base__range_ie_u64  //
 wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) {
   return wuffs_base__range_ie_u64__intersect(this, s);
@@ -416,6 +458,16 @@
   return wuffs_base__range_ie_u64__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ie_u64::contains(uint64_t x) {
+  return wuffs_base__range_ie_u64__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) {
+  return wuffs_base__range_ie_u64__contains_range(this, s);
+}
+
 inline uint64_t  //
 wuffs_base__range_ie_u64::length() {
   return wuffs_base__range_ie_u64__length(this);
@@ -443,11 +495,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__rect_ii_u32__struct s);
-  inline bool contains(uint32_t x, uint32_t y);
   inline wuffs_base__rect_ii_u32__struct intersect(
       wuffs_base__rect_ii_u32__struct s);
   inline wuffs_base__rect_ii_u32__struct unite(
       wuffs_base__rect_ii_u32__struct s);
+  inline bool contains(uint32_t x, uint32_t y);
+  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__rect_ii_u32;
@@ -466,14 +519,6 @@
           wuffs_base__rect_ii_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,
-                                  uint32_t x,
-                                  uint32_t y) {
-  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
-         (y <= r->max_incl_y);
-}
-
 static inline wuffs_base__rect_ii_u32  //
 wuffs_base__rect_ii_u32__intersect(wuffs_base__rect_ii_u32* r,
                                    wuffs_base__rect_ii_u32 s) {
@@ -502,6 +547,21 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,
+                                  uint32_t x,
+                                  uint32_t y) {
+  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
+         (y <= r->max_incl_y);
+}
+
+static inline bool  //
+wuffs_base__rect_ii_u32__contains_rect(wuffs_base__rect_ii_u32* r,
+                                       wuffs_base__rect_ii_u32 s) {
+  return wuffs_base__rect_ii_u32__equals(
+      &s, wuffs_base__rect_ii_u32__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -514,11 +574,6 @@
   return wuffs_base__rect_ii_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {
-  return wuffs_base__rect_ii_u32__contains(this, x, y);
-}
-
 inline wuffs_base__rect_ii_u32  //
 wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) {
   return wuffs_base__rect_ii_u32__intersect(this, s);
@@ -529,6 +584,16 @@
   return wuffs_base__rect_ii_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {
+  return wuffs_base__rect_ii_u32__contains(this, x, y);
+}
+
+inline bool  //
+wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) {
+  return wuffs_base__rect_ii_u32__contains_rect(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -552,11 +617,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__rect_ie_u32__struct s);
-  inline bool contains(uint32_t x, uint32_t y);
   inline wuffs_base__rect_ie_u32__struct intersect(
       wuffs_base__rect_ie_u32__struct s);
   inline wuffs_base__rect_ie_u32__struct unite(
       wuffs_base__rect_ie_u32__struct s);
+  inline bool contains(uint32_t x, uint32_t y);
+  inline bool contains_rect(wuffs_base__rect_ie_u32__struct s);
   inline uint32_t width();
   inline uint32_t height();
 #endif  // __cplusplus
@@ -577,14 +643,6 @@
           wuffs_base__rect_ie_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,
-                                  uint32_t x,
-                                  uint32_t y) {
-  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
-         (y < r->max_excl_y);
-}
-
 static inline wuffs_base__rect_ie_u32  //
 wuffs_base__rect_ie_u32__intersect(wuffs_base__rect_ie_u32* r,
                                    wuffs_base__rect_ie_u32 s) {
@@ -613,6 +671,21 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,
+                                  uint32_t x,
+                                  uint32_t y) {
+  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
+         (y < r->max_excl_y);
+}
+
+static inline bool  //
+wuffs_base__rect_ie_u32__contains_rect(wuffs_base__rect_ie_u32* r,
+                                       wuffs_base__rect_ie_u32 s) {
+  return wuffs_base__rect_ie_u32__equals(
+      &s, wuffs_base__rect_ie_u32__intersect(r, s));
+}
+
 static inline uint32_t  //
 wuffs_base__rect_ie_u32__width(wuffs_base__rect_ie_u32* r) {
   return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
@@ -635,11 +708,6 @@
   return wuffs_base__rect_ie_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {
-  return wuffs_base__rect_ie_u32__contains(this, x, y);
-}
-
 inline wuffs_base__rect_ie_u32  //
 wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) {
   return wuffs_base__rect_ie_u32__intersect(this, s);
@@ -650,6 +718,16 @@
   return wuffs_base__rect_ie_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {
+  return wuffs_base__rect_ie_u32__contains(this, x, y);
+}
+
+inline bool  //
+wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) {
+  return wuffs_base__rect_ie_u32__contains_rect(this, s);
+}
+
 inline uint32_t  //
 wuffs_base__rect_ie_u32::width() {
   return wuffs_base__rect_ie_u32__width(this);
@@ -671,28 +749,33 @@
 static inline void
 wuffs_base__acknowledge_potentially_unused_functions__range_public() {
   (void)(wuffs_base__range_ie_u32__contains);
+  (void)(wuffs_base__range_ie_u32__contains_range);
   (void)(wuffs_base__range_ie_u32__equals);
   (void)(wuffs_base__range_ie_u32__intersect);
   (void)(wuffs_base__range_ie_u32__is_empty);
   (void)(wuffs_base__range_ie_u32__length);
   (void)(wuffs_base__range_ie_u32__unite);
   (void)(wuffs_base__range_ie_u64__contains);
+  (void)(wuffs_base__range_ie_u64__contains_range);
   (void)(wuffs_base__range_ie_u64__equals);
   (void)(wuffs_base__range_ie_u64__intersect);
   (void)(wuffs_base__range_ie_u64__is_empty);
   (void)(wuffs_base__range_ie_u64__length);
   (void)(wuffs_base__range_ie_u64__unite);
   (void)(wuffs_base__range_ii_u32__contains);
+  (void)(wuffs_base__range_ii_u32__contains_range);
   (void)(wuffs_base__range_ii_u32__equals);
   (void)(wuffs_base__range_ii_u32__intersect);
   (void)(wuffs_base__range_ii_u32__is_empty);
   (void)(wuffs_base__range_ii_u32__unite);
   (void)(wuffs_base__range_ii_u64__contains);
+  (void)(wuffs_base__range_ii_u64__contains_range);
   (void)(wuffs_base__range_ii_u64__equals);
   (void)(wuffs_base__range_ii_u64__intersect);
   (void)(wuffs_base__range_ii_u64__is_empty);
   (void)(wuffs_base__range_ii_u64__unite);
   (void)(wuffs_base__rect_ie_u32__contains);
+  (void)(wuffs_base__rect_ie_u32__contains_rect);
   (void)(wuffs_base__rect_ie_u32__equals);
   (void)(wuffs_base__rect_ie_u32__height);
   (void)(wuffs_base__rect_ie_u32__intersect);
@@ -700,6 +783,7 @@
   (void)(wuffs_base__rect_ie_u32__unite);
   (void)(wuffs_base__rect_ie_u32__width);
   (void)(wuffs_base__rect_ii_u32__contains);
+  (void)(wuffs_base__rect_ie_u32__contains_rect);
   (void)(wuffs_base__rect_ii_u32__equals);
   (void)(wuffs_base__rect_ii_u32__intersect);
   (void)(wuffs_base__rect_ii_u32__is_empty);
diff --git a/cmd/wuffs-c/internal/cgen/data.go b/cmd/wuffs-c/internal/cgen/data.go
index 48e0353..f7f2c35 100644
--- a/cmd/wuffs-c/internal/cgen/data.go
+++ b/cmd/wuffs-c/internal/cgen/data.go
@@ -198,36 +198,41 @@
 
 const baseRangePublicH = "" +
 	"// ---------------- Ranges and Rects\n\n// Ranges are either inclusive (\"range_ii\") or exclusive (\"range_ie\") on the\n// high end. Both the \"ii\" and \"ie\" flavors are useful in practice.\n//\n// The \"ei\" and \"ee\" flavors also exist in theory, but aren't widely used. In\n// Wuffs, the low end is always inclusive.\n//\n// The \"ii\" (closed interval) flavor is useful when refining e.g. \"the set of\n// all uint32_t values\" to a contiguous subset: \"uint32_t values in the closed\n// interval [M, N]\", for uint32_t values M and N. An unrefined type (in other\n// words, the set of all uint32_t values) is not representable in the \"ie\"\n// flavor because if N equals ((1<<32) - 1) then (N + 1) will overflow.\n//\n// On the other hand, the \"ie\" (half-open interval) flavor is recommended by\n// Dijkstra's \"Why numbering should start at zero\" at\n// http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF and a further\n// discussion of motivating rationale is at\n// https://www.quora.com/Why-are-Python-ranges-half-open-exclusive-instead-of-close" +
-	"d-inclusive\n//\n// For example, with \"ie\", the number of elements in \"uint32_t values in the\n// half-open interval [M, N)\" is equal to max(0, N-M). Furthermore, that number\n// of elements (in one dimension, a length, in two dimensions, a width or\n// height) is itself representable as a uint32_t without overflow, again for\n// uint32_t values M and N. In the contrasting \"ii\" flavor, the length of the\n// closed interval [0, (1<<32) - 1] is 1<<32, which cannot be represented as a\n// uint32_t. In Wuffs, because of this potential overflow, the \"ie\" flavor has\n// length / width / height methods, but the \"ii\" flavor does not.\n//\n// It is valid for min > max (for range_ii) or for min >= max (for range_ie),\n// in which case the range is empty. There are multiple representations of an\n// empty range.\n\ntypedef struct wuffs_base__range_ii_u32__struct {\n  uint32_t min_incl;\n  uint32_t max_incl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ii_u32__struct s);\n  inline bool contains(uint" +
-	"32_t x);\n  inline wuffs_base__range_ii_u32__struct intersect(\n      wuffs_base__range_ii_u32__struct s);\n  inline wuffs_base__range_ii_u32__struct unite(\n      wuffs_base__range_ii_u32__struct s);\n#endif  // __cplusplus\n\n} wuffs_base__range_ii_u32;\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__is_empty(wuffs_base__range_ii_u32* r) {\n  return r->min_incl > r->max_incl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__equals(wuffs_base__range_ii_u32* r,\n                                 wuffs_base__range_ii_u32 s) {\n  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||\n         (wuffs_base__range_ii_u32__is_empty(r) &&\n          wuffs_base__range_ii_u32__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {\n  return (r->min_incl <= x) && (x <= r->max_incl);\n}\n\nstatic inline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32__intersect(wuffs_base__range_ii_u32* r,\n                                    wuffs_base__range_ii_u32 " +
-	"s) {\n  wuffs_base__range_ii_u32 t;\n  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32__unite(wuffs_base__range_ii_u32* r,\n                                wuffs_base__range_ii_u32 s) {\n  if (wuffs_base__range_ii_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ii_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ii_u32 t;\n  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);\n  return t;\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ii_u32::is_empty() {\n  return wuffs_base__range_ii_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ii_u32::contains(uint32_t x) {\n  return wuffs_base__range_ii_u32__contains(this, x);\n}" +
-	"\n\ninline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__intersect(this, s);\n}\n\ninline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__unite(this, s);\n}\n\n#endif  // __cplusplus\n\n" +
+	"d-inclusive\n//\n// For example, with \"ie\", the number of elements in \"uint32_t values in the\n// half-open interval [M, N)\" is equal to max(0, N-M). Furthermore, that number\n// of elements (in one dimension, a length, in two dimensions, a width or\n// height) is itself representable as a uint32_t without overflow, again for\n// uint32_t values M and N. In the contrasting \"ii\" flavor, the length of the\n// closed interval [0, (1<<32) - 1] is 1<<32, which cannot be represented as a\n// uint32_t. In Wuffs, because of this potential overflow, the \"ie\" flavor has\n// length / width / height methods, but the \"ii\" flavor does not.\n//\n// It is valid for min > max (for range_ii) or for min >= max (for range_ie),\n// in which case the range is empty. There are multiple representations of an\n// empty range.\n\ntypedef struct wuffs_base__range_ii_u32__struct {\n  uint32_t min_incl;\n  uint32_t max_incl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ii_u32__struct s);\n  inline wuffs_base__range_" +
+	"ii_u32__struct intersect(\n      wuffs_base__range_ii_u32__struct s);\n  inline wuffs_base__range_ii_u32__struct unite(\n      wuffs_base__range_ii_u32__struct s);\n  inline bool contains(uint32_t x);\n  inline bool contains_range(wuffs_base__range_ii_u32__struct s);\n#endif  // __cplusplus\n\n} wuffs_base__range_ii_u32;\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__is_empty(wuffs_base__range_ii_u32* r) {\n  return r->min_incl > r->max_incl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__equals(wuffs_base__range_ii_u32* r,\n                                 wuffs_base__range_ii_u32 s) {\n  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||\n         (wuffs_base__range_ii_u32__is_empty(r) &&\n          wuffs_base__range_ii_u32__is_empty(&s));\n}\n\nstatic inline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32__intersect(wuffs_base__range_ii_u32* r,\n                                    wuffs_base__range_ii_u32 s) {\n  wuffs_base__range_ii_u32 t;\n  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min" +
+	"_incl);\n  t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32__unite(wuffs_base__range_ii_u32* r,\n                                wuffs_base__range_ii_u32 s) {\n  if (wuffs_base__range_ii_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ii_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ii_u32 t;\n  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {\n  return (r->min_incl <= x) && (x <= r->max_incl);\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u32__contains_range(wuffs_base__range_ii_u32* r,\n                                         wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__equals(\n      &s, wuffs_base__range_ii_u32__intersect(r, s));\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range" +
+	"_ii_u32::is_empty() {\n  return wuffs_base__range_ii_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__equals(this, s);\n}\n\ninline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__intersect(this, s);\n}\n\ninline wuffs_base__range_ii_u32  //\nwuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ii_u32::contains(uint32_t x) {\n  return wuffs_base__range_ii_u32__contains(this, x);\n}\n\ninline bool  //\nwuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) {\n  return wuffs_base__range_ii_u32__contains_range(this, s);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// --------\n\ntypedef struct wuffs_base__range_ie_u32__struct {\n  uint32_t min_incl;\n  uint32_t max_excl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ie_u32__struct s);\n  inline bool contains(uint32_t x);\n  inline wuffs_base__range_ie_u32__struct intersect(\n      wuffs_base__range_ie_u32__struct s);\n  inline wuffs_base__range_ie_u32__struct unite(\n      wuffs_base__range_ie_u32__struct s);\n  inline uint32_t length();\n#endif  // __cplusplus\n\n} wuffs_base__range_ie_u32;\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__is_empty(wuffs_base__range_ie_u32* r) {\n  return r->min_incl >= r->max_excl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__equals(wuffs_base__range_ie_u32* r,\n                                 wuffs_base__range_ie_u32 s) {\n  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||\n         (wuffs_base__range_ie_u32__is_empty(r) &&\n          wuffs_base__range_ie_u32__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__contains(w" +
-	"uffs_base__range_ie_u32* r, uint32_t x) {\n  return (r->min_incl <= x) && (x < r->max_excl);\n}\n\nstatic inline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32__intersect(wuffs_base__range_ie_u32* r,\n                                    wuffs_base__range_ie_u32 s) {\n  wuffs_base__range_ie_u32 t;\n  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32__unite(wuffs_base__range_ie_u32* r,\n                                wuffs_base__range_ie_u32 s) {\n  if (wuffs_base__range_ie_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ie_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ie_u32 t;\n  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline uint32_t  //\nwuffs_base__range_ie_u32__length(wuffs_base__range_ie_u32* r) {\n  return wuffs_base__u32__sa" +
-	"t_sub(r->max_excl, r->min_incl);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ie_u32::is_empty() {\n  return wuffs_base__range_ie_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ie_u32::contains(uint32_t x) {\n  return wuffs_base__range_ie_u32__contains(this, x);\n}\n\ninline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__intersect(this, s);\n}\n\ninline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__unite(this, s);\n}\n\ninline uint32_t  //\nwuffs_base__range_ie_u32::length() {\n  return wuffs_base__range_ie_u32__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
+	"// --------\n\ntypedef struct wuffs_base__range_ie_u32__struct {\n  uint32_t min_incl;\n  uint32_t max_excl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ie_u32__struct s);\n  inline wuffs_base__range_ie_u32__struct intersect(\n      wuffs_base__range_ie_u32__struct s);\n  inline wuffs_base__range_ie_u32__struct unite(\n      wuffs_base__range_ie_u32__struct s);\n  inline bool contains(uint32_t x);\n  inline bool contains_range(wuffs_base__range_ie_u32__struct s);\n  inline uint32_t length();\n#endif  // __cplusplus\n\n} wuffs_base__range_ie_u32;\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__is_empty(wuffs_base__range_ie_u32* r) {\n  return r->min_incl >= r->max_excl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__equals(wuffs_base__range_ie_u32* r,\n                                 wuffs_base__range_ie_u32 s) {\n  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||\n         (wuffs_base__range_ie_u32__is_empty(r) &&\n          wuffs_base__range_ie_u32__is_empty(&s" +
+	"));\n}\n\nstatic inline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32__intersect(wuffs_base__range_ie_u32* r,\n                                    wuffs_base__range_ie_u32 s) {\n  wuffs_base__range_ie_u32 t;\n  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32__unite(wuffs_base__range_ie_u32* r,\n                                wuffs_base__range_ie_u32 s) {\n  if (wuffs_base__range_ie_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ie_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ie_u32 t;\n  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__contains(wuffs_base__range_ie_u32* r, uint32_t x) {\n  return (r->min_incl <= x) && (x < r->max_excl);\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u32__cont" +
+	"ains_range(wuffs_base__range_ie_u32* r,\n                                         wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__equals(\n      &s, wuffs_base__range_ie_u32__intersect(r, s));\n}\n\nstatic inline uint32_t  //\nwuffs_base__range_ie_u32__length(wuffs_base__range_ie_u32* r) {\n  return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ie_u32::is_empty() {\n  return wuffs_base__range_ie_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__equals(this, s);\n}\n\ninline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__intersect(this, s);\n}\n\ninline wuffs_base__range_ie_u32  //\nwuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ie_u32::contains(uint32_t x) {\n  return wuffs_bas" +
+	"e__range_ie_u32__contains(this, x);\n}\n\ninline bool  //\nwuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) {\n  return wuffs_base__range_ie_u32__contains_range(this, s);\n}\n\ninline uint32_t  //\nwuffs_base__range_ie_u32::length() {\n  return wuffs_base__range_ie_u32__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// --------\n\ntypedef struct wuffs_base__range_ii_u64__struct {\n  uint64_t min_incl;\n  uint64_t max_incl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ii_u64__struct s);\n  inline bool contains(uint64_t x);\n  inline wuffs_base__range_ii_u64__struct intersect(\n      wuffs_base__range_ii_u64__struct s);\n  inline wuffs_base__range_ii_u64__struct unite(\n      wuffs_base__range_ii_u64__struct s);\n#endif  // __cplusplus\n\n} wuffs_base__range_ii_u64;\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__is_empty(wuffs_base__range_ii_u64* r) {\n  return r->min_incl > r->max_incl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__equals(wuffs_base__range_ii_u64* r,\n                                 wuffs_base__range_ii_u64 s) {\n  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||\n         (wuffs_base__range_ii_u64__is_empty(r) &&\n          wuffs_base__range_ii_u64__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, u" +
-	"int64_t x) {\n  return (r->min_incl <= x) && (x <= r->max_incl);\n}\n\nstatic inline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64__intersect(wuffs_base__range_ii_u64* r,\n                                    wuffs_base__range_ii_u64 s) {\n  wuffs_base__range_ii_u64 t;\n  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64__unite(wuffs_base__range_ii_u64* r,\n                                wuffs_base__range_ii_u64 s) {\n  if (wuffs_base__range_ii_u64__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ii_u64__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ii_u64 t;\n  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);\n  return t;\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ii_u64::is_empty() {\n  return wuffs_base__range_ii_u64__is_empty(this);\n}\n\ninline bool  //\nwu" +
-	"ffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ii_u64::contains(uint64_t x) {\n  return wuffs_base__range_ii_u64__contains(this, x);\n}\n\ninline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__intersect(this, s);\n}\n\ninline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__unite(this, s);\n}\n\n#endif  // __cplusplus\n\n" +
+	"// --------\n\ntypedef struct wuffs_base__range_ii_u64__struct {\n  uint64_t min_incl;\n  uint64_t max_incl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ii_u64__struct s);\n  inline wuffs_base__range_ii_u64__struct intersect(\n      wuffs_base__range_ii_u64__struct s);\n  inline wuffs_base__range_ii_u64__struct unite(\n      wuffs_base__range_ii_u64__struct s);\n  inline bool contains(uint64_t x);\n  inline bool contains_range(wuffs_base__range_ii_u64__struct s);\n#endif  // __cplusplus\n\n} wuffs_base__range_ii_u64;\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__is_empty(wuffs_base__range_ii_u64* r) {\n  return r->min_incl > r->max_incl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__equals(wuffs_base__range_ii_u64* r,\n                                 wuffs_base__range_ii_u64 s) {\n  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||\n         (wuffs_base__range_ii_u64__is_empty(r) &&\n          wuffs_base__range_ii_u64__is_empty(&s));\n}\n\nstatic inline wuffs_ba" +
+	"se__range_ii_u64  //\nwuffs_base__range_ii_u64__intersect(wuffs_base__range_ii_u64* r,\n                                    wuffs_base__range_ii_u64 s) {\n  wuffs_base__range_ii_u64 t;\n  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64__unite(wuffs_base__range_ii_u64* r,\n                                wuffs_base__range_ii_u64 s) {\n  if (wuffs_base__range_ii_u64__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ii_u64__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ii_u64 t;\n  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);\n  t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, uint64_t x) {\n  return (r->min_incl <= x) && (x <= r->max_incl);\n}\n\nstatic inline bool  //\nwuffs_base__range_ii_u64__contains_range(wuffs_base__range" +
+	"_ii_u64* r,\n                                         wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__equals(\n      &s, wuffs_base__range_ii_u64__intersect(r, s));\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ii_u64::is_empty() {\n  return wuffs_base__range_ii_u64__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__equals(this, s);\n}\n\ninline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__intersect(this, s);\n}\n\ninline wuffs_base__range_ii_u64  //\nwuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ii_u64::contains(uint64_t x) {\n  return wuffs_base__range_ii_u64__contains(this, x);\n}\n\ninline bool  //\nwuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) {\n  return wuffs_base__range_ii_u64__contains_range(this, s" +
+	");\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// --------\n\ntypedef struct wuffs_base__range_ie_u64__struct {\n  uint64_t min_incl;\n  uint64_t max_excl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ie_u64__struct s);\n  inline bool contains(uint64_t x);\n  inline wuffs_base__range_ie_u64__struct intersect(\n      wuffs_base__range_ie_u64__struct s);\n  inline wuffs_base__range_ie_u64__struct unite(\n      wuffs_base__range_ie_u64__struct s);\n  inline uint64_t length();\n#endif  // __cplusplus\n\n} wuffs_base__range_ie_u64;\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__is_empty(wuffs_base__range_ie_u64* r) {\n  return r->min_incl >= r->max_excl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__equals(wuffs_base__range_ie_u64* r,\n                                 wuffs_base__range_ie_u64 s) {\n  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||\n         (wuffs_base__range_ie_u64__is_empty(r) &&\n          wuffs_base__range_ie_u64__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__contains(w" +
-	"uffs_base__range_ie_u64* r, uint64_t x) {\n  return (r->min_incl <= x) && (x < r->max_excl);\n}\n\nstatic inline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64__intersect(wuffs_base__range_ie_u64* r,\n                                    wuffs_base__range_ie_u64 s) {\n  wuffs_base__range_ie_u64 t;\n  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64__unite(wuffs_base__range_ie_u64* r,\n                                wuffs_base__range_ie_u64 s) {\n  if (wuffs_base__range_ie_u64__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ie_u64__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ie_u64 t;\n  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline uint64_t  //\nwuffs_base__range_ie_u64__length(wuffs_base__range_ie_u64* r) {\n  return wuffs_base__u64__sa" +
-	"t_sub(r->max_excl, r->min_incl);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ie_u64::is_empty() {\n  return wuffs_base__range_ie_u64__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ie_u64::contains(uint64_t x) {\n  return wuffs_base__range_ie_u64__contains(this, x);\n}\n\ninline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__intersect(this, s);\n}\n\ninline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__unite(this, s);\n}\n\ninline uint64_t  //\nwuffs_base__range_ie_u64::length() {\n  return wuffs_base__range_ie_u64__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
+	"// --------\n\ntypedef struct wuffs_base__range_ie_u64__struct {\n  uint64_t min_incl;\n  uint64_t max_excl;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__range_ie_u64__struct s);\n  inline wuffs_base__range_ie_u64__struct intersect(\n      wuffs_base__range_ie_u64__struct s);\n  inline wuffs_base__range_ie_u64__struct unite(\n      wuffs_base__range_ie_u64__struct s);\n  inline bool contains(uint64_t x);\n  inline bool contains_range(wuffs_base__range_ie_u64__struct s);\n  inline uint64_t length();\n#endif  // __cplusplus\n\n} wuffs_base__range_ie_u64;\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__is_empty(wuffs_base__range_ie_u64* r) {\n  return r->min_incl >= r->max_excl;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__equals(wuffs_base__range_ie_u64* r,\n                                 wuffs_base__range_ie_u64 s) {\n  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||\n         (wuffs_base__range_ie_u64__is_empty(r) &&\n          wuffs_base__range_ie_u64__is_empty(&s" +
+	"));\n}\n\nstatic inline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64__intersect(wuffs_base__range_ie_u64* r,\n                                    wuffs_base__range_ie_u64 s) {\n  wuffs_base__range_ie_u64 t;\n  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64__unite(wuffs_base__range_ie_u64* r,\n                                wuffs_base__range_ie_u64 s) {\n  if (wuffs_base__range_ie_u64__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__range_ie_u64__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__range_ie_u64 t;\n  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);\n  t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__contains(wuffs_base__range_ie_u64* r, uint64_t x) {\n  return (r->min_incl <= x) && (x < r->max_excl);\n}\n\nstatic inline bool  //\nwuffs_base__range_ie_u64__cont" +
+	"ains_range(wuffs_base__range_ie_u64* r,\n                                         wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__equals(\n      &s, wuffs_base__range_ie_u64__intersect(r, s));\n}\n\nstatic inline uint64_t  //\nwuffs_base__range_ie_u64__length(wuffs_base__range_ie_u64* r) {\n  return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__range_ie_u64::is_empty() {\n  return wuffs_base__range_ie_u64__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__equals(this, s);\n}\n\ninline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__intersect(this, s);\n}\n\ninline wuffs_base__range_ie_u64  //\nwuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__range_ie_u64::contains(uint64_t x) {\n  return wuffs_bas" +
+	"e__range_ie_u64__contains(this, x);\n}\n\ninline bool  //\nwuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) {\n  return wuffs_base__range_ie_u64__contains_range(this, s);\n}\n\ninline uint64_t  //\nwuffs_base__range_ie_u64::length() {\n  return wuffs_base__range_ie_u64__length(this);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// --------\n\n// wuffs_base__rect_ii_u32 is a rectangle (a 2-dimensional range) on the\n// integer grid. The \"ii\" means that the bounds are inclusive on the low end\n// and inclusive on the high end. It contains all points (x, y) such that\n// ((min_incl_x <= x) && (x <= max_incl_x)) and likewise for y.\n//\n// It is valid for min > max, in which case the rectangle is empty. There are\n// multiple representations of an empty rectangle.\n//\n// The X and Y axes increase right and down.\ntypedef struct wuffs_base__rect_ii_u32__struct {\n  uint32_t min_incl_x;\n  uint32_t min_incl_y;\n  uint32_t max_incl_x;\n  uint32_t max_incl_y;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__rect_ii_u32__struct s);\n  inline bool contains(uint32_t x, uint32_t y);\n  inline wuffs_base__rect_ii_u32__struct intersect(\n      wuffs_base__rect_ii_u32__struct s);\n  inline wuffs_base__rect_ii_u32__struct unite(\n      wuffs_base__rect_ii_u32__struct s);\n#endif  // __cplusplus\n\n} wuffs_base__rect_ii_u32;\n\nstatic inline b" +
-	"ool  //\nwuffs_base__rect_ii_u32__is_empty(wuffs_base__rect_ii_u32* r) {\n  return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32__equals(wuffs_base__rect_ii_u32* r,\n                                wuffs_base__rect_ii_u32 s) {\n  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&\n          r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||\n         (wuffs_base__rect_ii_u32__is_empty(r) &&\n          wuffs_base__rect_ii_u32__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,\n                                  uint32_t x,\n                                  uint32_t y) {\n  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&\n         (y <= r->max_incl_y);\n}\n\nstatic inline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32__intersect(wuffs_base__rect_ii_u32* r,\n                                   wuffs_base__rect_ii_u32 s) {\n  wuffs_b" +
-	"ase__rect_ii_u32 t;\n  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);\n  t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);\n  t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);\n  return t;\n}\n\nstatic inline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32__unite(wuffs_base__rect_ii_u32* r,\n                               wuffs_base__rect_ii_u32 s) {\n  if (wuffs_base__rect_ii_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__rect_ii_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__rect_ii_u32 t;\n  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);\n  t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);\n  t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);\n  return t;\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__rect_ii_u32::is_empty() {\n  return wuffs_base__rect_ii_u32__is" +
-	"_empty(this);\n}\n\ninline bool  //\nwuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {\n  return wuffs_base__rect_ii_u32__contains(this, x, y);\n}\n\ninline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__intersect(this, s);\n}\n\ninline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__unite(this, s);\n}\n\n#endif  // __cplusplus\n\n" +
+	"// --------\n\n// wuffs_base__rect_ii_u32 is a rectangle (a 2-dimensional range) on the\n// integer grid. The \"ii\" means that the bounds are inclusive on the low end\n// and inclusive on the high end. It contains all points (x, y) such that\n// ((min_incl_x <= x) && (x <= max_incl_x)) and likewise for y.\n//\n// It is valid for min > max, in which case the rectangle is empty. There are\n// multiple representations of an empty rectangle.\n//\n// The X and Y axes increase right and down.\ntypedef struct wuffs_base__rect_ii_u32__struct {\n  uint32_t min_incl_x;\n  uint32_t min_incl_y;\n  uint32_t max_incl_x;\n  uint32_t max_incl_y;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__rect_ii_u32__struct s);\n  inline wuffs_base__rect_ii_u32__struct intersect(\n      wuffs_base__rect_ii_u32__struct s);\n  inline wuffs_base__rect_ii_u32__struct unite(\n      wuffs_base__rect_ii_u32__struct s);\n  inline bool contains(uint32_t x, uint32_t y);\n  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s);\n#en" +
+	"dif  // __cplusplus\n\n} wuffs_base__rect_ii_u32;\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32__is_empty(wuffs_base__rect_ii_u32* r) {\n  return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32__equals(wuffs_base__rect_ii_u32* r,\n                                wuffs_base__rect_ii_u32 s) {\n  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&\n          r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||\n         (wuffs_base__rect_ii_u32__is_empty(r) &&\n          wuffs_base__rect_ii_u32__is_empty(&s));\n}\n\nstatic inline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32__intersect(wuffs_base__rect_ii_u32* r,\n                                   wuffs_base__rect_ii_u32 s) {\n  wuffs_base__rect_ii_u32 t;\n  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);\n  t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);\n  t.ma" +
+	"x_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);\n  return t;\n}\n\nstatic inline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32__unite(wuffs_base__rect_ii_u32* r,\n                               wuffs_base__rect_ii_u32 s) {\n  if (wuffs_base__rect_ii_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__rect_ii_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__rect_ii_u32 t;\n  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);\n  t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);\n  t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,\n                                  uint32_t x,\n                                  uint32_t y) {\n  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&\n         (y <= r->max_incl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ii_u32" +
+	"__contains_rect(wuffs_base__rect_ii_u32* r,\n                                       wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__equals(\n      &s, wuffs_base__rect_ii_u32__intersect(r, s));\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__rect_ii_u32::is_empty() {\n  return wuffs_base__rect_ii_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__equals(this, s);\n}\n\ninline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__intersect(this, s);\n}\n\ninline wuffs_base__rect_ii_u32  //\nwuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {\n  return wuffs_base__rect_ii_u32__contains(this, x, y);\n}\n\ninline bool  //\nwuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) {\n  return wuffs_base__rect_ii_u32_" +
+	"_contains_rect(this, s);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// --------\n\n// wuffs_base__rect_ie_u32 is a rectangle (a 2-dimensional range) on the\n// integer grid. The \"ie\" means that the bounds are inclusive on the low end\n// and exclusive on the high end. It contains all points (x, y) such that\n// ((min_incl_x <= x) && (x < max_excl_x)) and likewise for y.\n//\n// It is valid for min >= max, in which case the rectangle is empty. There are\n// multiple representations of an empty rectangle, including a value with all\n// fields zero.\n//\n// The X and Y axes increase right and down.\ntypedef struct wuffs_base__rect_ie_u32__struct {\n  uint32_t min_incl_x;\n  uint32_t min_incl_y;\n  uint32_t max_excl_x;\n  uint32_t max_excl_y;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__rect_ie_u32__struct s);\n  inline bool contains(uint32_t x, uint32_t y);\n  inline wuffs_base__rect_ie_u32__struct intersect(\n      wuffs_base__rect_ie_u32__struct s);\n  inline wuffs_base__rect_ie_u32__struct unite(\n      wuffs_base__rect_ie_u32__struct s);\n  inline uint32_t width(" +
-	");\n  inline uint32_t height();\n#endif  // __cplusplus\n\n} wuffs_base__rect_ie_u32;\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__is_empty(wuffs_base__rect_ie_u32* r) {\n  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__equals(wuffs_base__rect_ie_u32* r,\n                                wuffs_base__rect_ie_u32 s) {\n  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&\n          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||\n         (wuffs_base__rect_ie_u32__is_empty(r) &&\n          wuffs_base__rect_ie_u32__is_empty(&s));\n}\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,\n                                  uint32_t x,\n                                  uint32_t y) {\n  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&\n         (y < r->max_excl_y);\n}\n\nstatic inline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32__intersect(wuf" +
-	"fs_base__rect_ie_u32* r,\n                                   wuffs_base__rect_ie_u32 s) {\n  wuffs_base__rect_ie_u32 t;\n  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);\n  t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);\n  t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);\n  return t;\n}\n\nstatic inline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32__unite(wuffs_base__rect_ie_u32* r,\n                               wuffs_base__rect_ie_u32 s) {\n  if (wuffs_base__rect_ie_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__rect_ie_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__rect_ie_u32 t;\n  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);\n  t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);\n  t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);\n  return t;\n}\n\nstatic inlin" +
-	"e uint32_t  //\nwuffs_base__rect_ie_u32__width(wuffs_base__rect_ie_u32* r) {\n  return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);\n}\n\nstatic inline uint32_t  //\nwuffs_base__rect_ie_u32__height(wuffs_base__rect_ie_u32* r) {\n  return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__rect_ie_u32::is_empty() {\n  return wuffs_base__rect_ie_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__equals(this, s);\n}\n\ninline bool  //\nwuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {\n  return wuffs_base__rect_ie_u32__contains(this, x, y);\n}\n\ninline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__intersect(this, s);\n}\n\ninline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__unite(this, s);\n}\n\ninline uint32_t  //\nwuffs_" +
-	"base__rect_ie_u32::width() {\n  return wuffs_base__rect_ie_u32__width(this);\n}\n\ninline uint32_t  //\nwuffs_base__rect_ie_u32::height() {\n  return wuffs_base__rect_ie_u32__height(this);\n}\n\n#endif  // __cplusplus\n\n" +
+	"// --------\n\n// wuffs_base__rect_ie_u32 is a rectangle (a 2-dimensional range) on the\n// integer grid. The \"ie\" means that the bounds are inclusive on the low end\n// and exclusive on the high end. It contains all points (x, y) such that\n// ((min_incl_x <= x) && (x < max_excl_x)) and likewise for y.\n//\n// It is valid for min >= max, in which case the rectangle is empty. There are\n// multiple representations of an empty rectangle, including a value with all\n// fields zero.\n//\n// The X and Y axes increase right and down.\ntypedef struct wuffs_base__rect_ie_u32__struct {\n  uint32_t min_incl_x;\n  uint32_t min_incl_y;\n  uint32_t max_excl_x;\n  uint32_t max_excl_y;\n\n#ifdef __cplusplus\n  inline bool is_empty();\n  inline bool equals(wuffs_base__rect_ie_u32__struct s);\n  inline wuffs_base__rect_ie_u32__struct intersect(\n      wuffs_base__rect_ie_u32__struct s);\n  inline wuffs_base__rect_ie_u32__struct unite(\n      wuffs_base__rect_ie_u32__struct s);\n  inline bool contains(uint32_t x, uint32_t y);\n  inline bool contains_r" +
+	"ect(wuffs_base__rect_ie_u32__struct s);\n  inline uint32_t width();\n  inline uint32_t height();\n#endif  // __cplusplus\n\n} wuffs_base__rect_ie_u32;\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__is_empty(wuffs_base__rect_ie_u32* r) {\n  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__equals(wuffs_base__rect_ie_u32* r,\n                                wuffs_base__rect_ie_u32 s) {\n  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&\n          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||\n         (wuffs_base__rect_ie_u32__is_empty(r) &&\n          wuffs_base__rect_ie_u32__is_empty(&s));\n}\n\nstatic inline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32__intersect(wuffs_base__rect_ie_u32* r,\n                                   wuffs_base__rect_ie_u32 s) {\n  wuffs_base__rect_ie_u32 t;\n  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__max(r->m" +
+	"in_incl_y, s.min_incl_y);\n  t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);\n  t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);\n  return t;\n}\n\nstatic inline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32__unite(wuffs_base__rect_ie_u32* r,\n                               wuffs_base__rect_ie_u32 s) {\n  if (wuffs_base__rect_ie_u32__is_empty(r)) {\n    return s;\n  }\n  if (wuffs_base__rect_ie_u32__is_empty(&s)) {\n    return *r;\n  }\n  wuffs_base__rect_ie_u32 t;\n  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);\n  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);\n  t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);\n  t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);\n  return t;\n}\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,\n                                  uint32_t x,\n                                  uint32_t y) {\n  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->m" +
+	"in_incl_y <= y) &&\n         (y < r->max_excl_y);\n}\n\nstatic inline bool  //\nwuffs_base__rect_ie_u32__contains_rect(wuffs_base__rect_ie_u32* r,\n                                       wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__equals(\n      &s, wuffs_base__rect_ie_u32__intersect(r, s));\n}\n\nstatic inline uint32_t  //\nwuffs_base__rect_ie_u32__width(wuffs_base__rect_ie_u32* r) {\n  return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);\n}\n\nstatic inline uint32_t  //\nwuffs_base__rect_ie_u32__height(wuffs_base__rect_ie_u32* r) {\n  return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__rect_ie_u32::is_empty() {\n  return wuffs_base__rect_ie_u32__is_empty(this);\n}\n\ninline bool  //\nwuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__equals(this, s);\n}\n\ninline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__intersect(th" +
+	"is, s);\n}\n\ninline wuffs_base__rect_ie_u32  //\nwuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__unite(this, s);\n}\n\ninline bool  //\nwuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {\n  return wuffs_base__rect_ie_u32__contains(this, x, y);\n}\n\ninline bool  //\nwuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) {\n  return wuffs_base__rect_ie_u32__contains_rect(this, s);\n}\n\ninline uint32_t  //\nwuffs_base__rect_ie_u32::width() {\n  return wuffs_base__rect_ie_u32__width(this);\n}\n\ninline uint32_t  //\nwuffs_base__rect_ie_u32::height() {\n  return wuffs_base__rect_ie_u32__height(this);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
-	"// ---------------- Bureaucracy re -Wunused-function\n\nstatic inline void\nwuffs_base__acknowledge_potentially_unused_functions__range_public()\n    WUFFS_BASE__POTENTIALLY_UNUSED;\n\nstatic inline void\nwuffs_base__acknowledge_potentially_unused_functions__range_public() {\n  (void)(wuffs_base__range_ie_u32__contains);\n  (void)(wuffs_base__range_ie_u32__equals);\n  (void)(wuffs_base__range_ie_u32__intersect);\n  (void)(wuffs_base__range_ie_u32__is_empty);\n  (void)(wuffs_base__range_ie_u32__length);\n  (void)(wuffs_base__range_ie_u32__unite);\n  (void)(wuffs_base__range_ie_u64__contains);\n  (void)(wuffs_base__range_ie_u64__equals);\n  (void)(wuffs_base__range_ie_u64__intersect);\n  (void)(wuffs_base__range_ie_u64__is_empty);\n  (void)(wuffs_base__range_ie_u64__length);\n  (void)(wuffs_base__range_ie_u64__unite);\n  (void)(wuffs_base__range_ii_u32__contains);\n  (void)(wuffs_base__range_ii_u32__equals);\n  (void)(wuffs_base__range_ii_u32__intersect);\n  (void)(wuffs_base__range_ii_u32__is_empty);\n  (void)(wuffs_base__range_ii_u3" +
-	"2__unite);\n  (void)(wuffs_base__range_ii_u64__contains);\n  (void)(wuffs_base__range_ii_u64__equals);\n  (void)(wuffs_base__range_ii_u64__intersect);\n  (void)(wuffs_base__range_ii_u64__is_empty);\n  (void)(wuffs_base__range_ii_u64__unite);\n  (void)(wuffs_base__rect_ie_u32__contains);\n  (void)(wuffs_base__rect_ie_u32__equals);\n  (void)(wuffs_base__rect_ie_u32__height);\n  (void)(wuffs_base__rect_ie_u32__intersect);\n  (void)(wuffs_base__rect_ie_u32__is_empty);\n  (void)(wuffs_base__rect_ie_u32__unite);\n  (void)(wuffs_base__rect_ie_u32__width);\n  (void)(wuffs_base__rect_ii_u32__contains);\n  (void)(wuffs_base__rect_ii_u32__equals);\n  (void)(wuffs_base__rect_ii_u32__intersect);\n  (void)(wuffs_base__rect_ii_u32__is_empty);\n  (void)(wuffs_base__rect_ii_u32__unite);\n}\n" +
+	"// ---------------- Bureaucracy re -Wunused-function\n\nstatic inline void\nwuffs_base__acknowledge_potentially_unused_functions__range_public()\n    WUFFS_BASE__POTENTIALLY_UNUSED;\n\nstatic inline void\nwuffs_base__acknowledge_potentially_unused_functions__range_public() {\n  (void)(wuffs_base__range_ie_u32__contains);\n  (void)(wuffs_base__range_ie_u32__contains_range);\n  (void)(wuffs_base__range_ie_u32__equals);\n  (void)(wuffs_base__range_ie_u32__intersect);\n  (void)(wuffs_base__range_ie_u32__is_empty);\n  (void)(wuffs_base__range_ie_u32__length);\n  (void)(wuffs_base__range_ie_u32__unite);\n  (void)(wuffs_base__range_ie_u64__contains);\n  (void)(wuffs_base__range_ie_u64__contains_range);\n  (void)(wuffs_base__range_ie_u64__equals);\n  (void)(wuffs_base__range_ie_u64__intersect);\n  (void)(wuffs_base__range_ie_u64__is_empty);\n  (void)(wuffs_base__range_ie_u64__length);\n  (void)(wuffs_base__range_ie_u64__unite);\n  (void)(wuffs_base__range_ii_u32__contains);\n  (void)(wuffs_base__range_ii_u32__contains_range);\n  (void)(wuff" +
+	"s_base__range_ii_u32__equals);\n  (void)(wuffs_base__range_ii_u32__intersect);\n  (void)(wuffs_base__range_ii_u32__is_empty);\n  (void)(wuffs_base__range_ii_u32__unite);\n  (void)(wuffs_base__range_ii_u64__contains);\n  (void)(wuffs_base__range_ii_u64__contains_range);\n  (void)(wuffs_base__range_ii_u64__equals);\n  (void)(wuffs_base__range_ii_u64__intersect);\n  (void)(wuffs_base__range_ii_u64__is_empty);\n  (void)(wuffs_base__range_ii_u64__unite);\n  (void)(wuffs_base__rect_ie_u32__contains);\n  (void)(wuffs_base__rect_ie_u32__contains_rect);\n  (void)(wuffs_base__rect_ie_u32__equals);\n  (void)(wuffs_base__rect_ie_u32__height);\n  (void)(wuffs_base__rect_ie_u32__intersect);\n  (void)(wuffs_base__rect_ie_u32__is_empty);\n  (void)(wuffs_base__rect_ie_u32__unite);\n  (void)(wuffs_base__rect_ie_u32__width);\n  (void)(wuffs_base__rect_ii_u32__contains);\n  (void)(wuffs_base__rect_ie_u32__contains_rect);\n  (void)(wuffs_base__rect_ii_u32__equals);\n  (void)(wuffs_base__rect_ii_u32__intersect);\n  (void)(wuffs_base__rect_ii_u32__is_em" +
+	"pty);\n  (void)(wuffs_base__rect_ii_u32__unite);\n}\n" +
 	""
 
 const baseCopyright = "" +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 41b1667..764ec51 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -455,11 +455,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ii_u32__struct s);
-  inline bool contains(uint32_t x);
   inline wuffs_base__range_ii_u32__struct intersect(
       wuffs_base__range_ii_u32__struct s);
   inline wuffs_base__range_ii_u32__struct unite(
       wuffs_base__range_ii_u32__struct s);
+  inline bool contains(uint32_t x);
+  inline bool contains_range(wuffs_base__range_ii_u32__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__range_ii_u32;
@@ -477,11 +478,6 @@
           wuffs_base__range_ii_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {
-  return (r->min_incl <= x) && (x <= r->max_incl);
-}
-
 static inline wuffs_base__range_ii_u32  //
 wuffs_base__range_ii_u32__intersect(wuffs_base__range_ii_u32* r,
                                     wuffs_base__range_ii_u32 s) {
@@ -506,6 +502,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ii_u32__contains(wuffs_base__range_ii_u32* r, uint32_t x) {
+  return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool  //
+wuffs_base__range_ii_u32__contains_range(wuffs_base__range_ii_u32* r,
+                                         wuffs_base__range_ii_u32 s) {
+  return wuffs_base__range_ii_u32__equals(
+      &s, wuffs_base__range_ii_u32__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -518,11 +526,6 @@
   return wuffs_base__range_ii_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ii_u32::contains(uint32_t x) {
-  return wuffs_base__range_ii_u32__contains(this, x);
-}
-
 inline wuffs_base__range_ii_u32  //
 wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) {
   return wuffs_base__range_ii_u32__intersect(this, s);
@@ -533,6 +536,16 @@
   return wuffs_base__range_ii_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ii_u32::contains(uint32_t x) {
+  return wuffs_base__range_ii_u32__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) {
+  return wuffs_base__range_ii_u32__contains_range(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -544,11 +557,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ie_u32__struct s);
-  inline bool contains(uint32_t x);
   inline wuffs_base__range_ie_u32__struct intersect(
       wuffs_base__range_ie_u32__struct s);
   inline wuffs_base__range_ie_u32__struct unite(
       wuffs_base__range_ie_u32__struct s);
+  inline bool contains(uint32_t x);
+  inline bool contains_range(wuffs_base__range_ie_u32__struct s);
   inline uint32_t length();
 #endif  // __cplusplus
 
@@ -567,11 +581,6 @@
           wuffs_base__range_ie_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ie_u32__contains(wuffs_base__range_ie_u32* r, uint32_t x) {
-  return (r->min_incl <= x) && (x < r->max_excl);
-}
-
 static inline wuffs_base__range_ie_u32  //
 wuffs_base__range_ie_u32__intersect(wuffs_base__range_ie_u32* r,
                                     wuffs_base__range_ie_u32 s) {
@@ -596,6 +605,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ie_u32__contains(wuffs_base__range_ie_u32* r, uint32_t x) {
+  return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool  //
+wuffs_base__range_ie_u32__contains_range(wuffs_base__range_ie_u32* r,
+                                         wuffs_base__range_ie_u32 s) {
+  return wuffs_base__range_ie_u32__equals(
+      &s, wuffs_base__range_ie_u32__intersect(r, s));
+}
+
 static inline uint32_t  //
 wuffs_base__range_ie_u32__length(wuffs_base__range_ie_u32* r) {
   return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
@@ -613,11 +634,6 @@
   return wuffs_base__range_ie_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ie_u32::contains(uint32_t x) {
-  return wuffs_base__range_ie_u32__contains(this, x);
-}
-
 inline wuffs_base__range_ie_u32  //
 wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) {
   return wuffs_base__range_ie_u32__intersect(this, s);
@@ -628,6 +644,16 @@
   return wuffs_base__range_ie_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ie_u32::contains(uint32_t x) {
+  return wuffs_base__range_ie_u32__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) {
+  return wuffs_base__range_ie_u32__contains_range(this, s);
+}
+
 inline uint32_t  //
 wuffs_base__range_ie_u32::length() {
   return wuffs_base__range_ie_u32__length(this);
@@ -644,11 +670,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ii_u64__struct s);
-  inline bool contains(uint64_t x);
   inline wuffs_base__range_ii_u64__struct intersect(
       wuffs_base__range_ii_u64__struct s);
   inline wuffs_base__range_ii_u64__struct unite(
       wuffs_base__range_ii_u64__struct s);
+  inline bool contains(uint64_t x);
+  inline bool contains_range(wuffs_base__range_ii_u64__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__range_ii_u64;
@@ -666,11 +693,6 @@
           wuffs_base__range_ii_u64__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, uint64_t x) {
-  return (r->min_incl <= x) && (x <= r->max_incl);
-}
-
 static inline wuffs_base__range_ii_u64  //
 wuffs_base__range_ii_u64__intersect(wuffs_base__range_ii_u64* r,
                                     wuffs_base__range_ii_u64 s) {
@@ -695,6 +717,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ii_u64__contains(wuffs_base__range_ii_u64* r, uint64_t x) {
+  return (r->min_incl <= x) && (x <= r->max_incl);
+}
+
+static inline bool  //
+wuffs_base__range_ii_u64__contains_range(wuffs_base__range_ii_u64* r,
+                                         wuffs_base__range_ii_u64 s) {
+  return wuffs_base__range_ii_u64__equals(
+      &s, wuffs_base__range_ii_u64__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -707,11 +741,6 @@
   return wuffs_base__range_ii_u64__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ii_u64::contains(uint64_t x) {
-  return wuffs_base__range_ii_u64__contains(this, x);
-}
-
 inline wuffs_base__range_ii_u64  //
 wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) {
   return wuffs_base__range_ii_u64__intersect(this, s);
@@ -722,6 +751,16 @@
   return wuffs_base__range_ii_u64__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ii_u64::contains(uint64_t x) {
+  return wuffs_base__range_ii_u64__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) {
+  return wuffs_base__range_ii_u64__contains_range(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -733,11 +772,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__range_ie_u64__struct s);
-  inline bool contains(uint64_t x);
   inline wuffs_base__range_ie_u64__struct intersect(
       wuffs_base__range_ie_u64__struct s);
   inline wuffs_base__range_ie_u64__struct unite(
       wuffs_base__range_ie_u64__struct s);
+  inline bool contains(uint64_t x);
+  inline bool contains_range(wuffs_base__range_ie_u64__struct s);
   inline uint64_t length();
 #endif  // __cplusplus
 
@@ -756,11 +796,6 @@
           wuffs_base__range_ie_u64__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__range_ie_u64__contains(wuffs_base__range_ie_u64* r, uint64_t x) {
-  return (r->min_incl <= x) && (x < r->max_excl);
-}
-
 static inline wuffs_base__range_ie_u64  //
 wuffs_base__range_ie_u64__intersect(wuffs_base__range_ie_u64* r,
                                     wuffs_base__range_ie_u64 s) {
@@ -785,6 +820,18 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__range_ie_u64__contains(wuffs_base__range_ie_u64* r, uint64_t x) {
+  return (r->min_incl <= x) && (x < r->max_excl);
+}
+
+static inline bool  //
+wuffs_base__range_ie_u64__contains_range(wuffs_base__range_ie_u64* r,
+                                         wuffs_base__range_ie_u64 s) {
+  return wuffs_base__range_ie_u64__equals(
+      &s, wuffs_base__range_ie_u64__intersect(r, s));
+}
+
 static inline uint64_t  //
 wuffs_base__range_ie_u64__length(wuffs_base__range_ie_u64* r) {
   return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
@@ -802,11 +849,6 @@
   return wuffs_base__range_ie_u64__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__range_ie_u64::contains(uint64_t x) {
-  return wuffs_base__range_ie_u64__contains(this, x);
-}
-
 inline wuffs_base__range_ie_u64  //
 wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) {
   return wuffs_base__range_ie_u64__intersect(this, s);
@@ -817,6 +859,16 @@
   return wuffs_base__range_ie_u64__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__range_ie_u64::contains(uint64_t x) {
+  return wuffs_base__range_ie_u64__contains(this, x);
+}
+
+inline bool  //
+wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) {
+  return wuffs_base__range_ie_u64__contains_range(this, s);
+}
+
 inline uint64_t  //
 wuffs_base__range_ie_u64::length() {
   return wuffs_base__range_ie_u64__length(this);
@@ -844,11 +896,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__rect_ii_u32__struct s);
-  inline bool contains(uint32_t x, uint32_t y);
   inline wuffs_base__rect_ii_u32__struct intersect(
       wuffs_base__rect_ii_u32__struct s);
   inline wuffs_base__rect_ii_u32__struct unite(
       wuffs_base__rect_ii_u32__struct s);
+  inline bool contains(uint32_t x, uint32_t y);
+  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s);
 #endif  // __cplusplus
 
 } wuffs_base__rect_ii_u32;
@@ -867,14 +920,6 @@
           wuffs_base__rect_ii_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,
-                                  uint32_t x,
-                                  uint32_t y) {
-  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
-         (y <= r->max_incl_y);
-}
-
 static inline wuffs_base__rect_ii_u32  //
 wuffs_base__rect_ii_u32__intersect(wuffs_base__rect_ii_u32* r,
                                    wuffs_base__rect_ii_u32 s) {
@@ -903,6 +948,21 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__rect_ii_u32__contains(wuffs_base__rect_ii_u32* r,
+                                  uint32_t x,
+                                  uint32_t y) {
+  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
+         (y <= r->max_incl_y);
+}
+
+static inline bool  //
+wuffs_base__rect_ii_u32__contains_rect(wuffs_base__rect_ii_u32* r,
+                                       wuffs_base__rect_ii_u32 s) {
+  return wuffs_base__rect_ii_u32__equals(
+      &s, wuffs_base__rect_ii_u32__intersect(r, s));
+}
+
 #ifdef __cplusplus
 
 inline bool  //
@@ -915,11 +975,6 @@
   return wuffs_base__rect_ii_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {
-  return wuffs_base__rect_ii_u32__contains(this, x, y);
-}
-
 inline wuffs_base__rect_ii_u32  //
 wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) {
   return wuffs_base__rect_ii_u32__intersect(this, s);
@@ -930,6 +985,16 @@
   return wuffs_base__rect_ii_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) {
+  return wuffs_base__rect_ii_u32__contains(this, x, y);
+}
+
+inline bool  //
+wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) {
+  return wuffs_base__rect_ii_u32__contains_rect(this, s);
+}
+
 #endif  // __cplusplus
 
 // --------
@@ -953,11 +1018,12 @@
 #ifdef __cplusplus
   inline bool is_empty();
   inline bool equals(wuffs_base__rect_ie_u32__struct s);
-  inline bool contains(uint32_t x, uint32_t y);
   inline wuffs_base__rect_ie_u32__struct intersect(
       wuffs_base__rect_ie_u32__struct s);
   inline wuffs_base__rect_ie_u32__struct unite(
       wuffs_base__rect_ie_u32__struct s);
+  inline bool contains(uint32_t x, uint32_t y);
+  inline bool contains_rect(wuffs_base__rect_ie_u32__struct s);
   inline uint32_t width();
   inline uint32_t height();
 #endif  // __cplusplus
@@ -978,14 +1044,6 @@
           wuffs_base__rect_ie_u32__is_empty(&s));
 }
 
-static inline bool  //
-wuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,
-                                  uint32_t x,
-                                  uint32_t y) {
-  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
-         (y < r->max_excl_y);
-}
-
 static inline wuffs_base__rect_ie_u32  //
 wuffs_base__rect_ie_u32__intersect(wuffs_base__rect_ie_u32* r,
                                    wuffs_base__rect_ie_u32 s) {
@@ -1014,6 +1072,21 @@
   return t;
 }
 
+static inline bool  //
+wuffs_base__rect_ie_u32__contains(wuffs_base__rect_ie_u32* r,
+                                  uint32_t x,
+                                  uint32_t y) {
+  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
+         (y < r->max_excl_y);
+}
+
+static inline bool  //
+wuffs_base__rect_ie_u32__contains_rect(wuffs_base__rect_ie_u32* r,
+                                       wuffs_base__rect_ie_u32 s) {
+  return wuffs_base__rect_ie_u32__equals(
+      &s, wuffs_base__rect_ie_u32__intersect(r, s));
+}
+
 static inline uint32_t  //
 wuffs_base__rect_ie_u32__width(wuffs_base__rect_ie_u32* r) {
   return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
@@ -1036,11 +1109,6 @@
   return wuffs_base__rect_ie_u32__equals(this, s);
 }
 
-inline bool  //
-wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {
-  return wuffs_base__rect_ie_u32__contains(this, x, y);
-}
-
 inline wuffs_base__rect_ie_u32  //
 wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) {
   return wuffs_base__rect_ie_u32__intersect(this, s);
@@ -1051,6 +1119,16 @@
   return wuffs_base__rect_ie_u32__unite(this, s);
 }
 
+inline bool  //
+wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) {
+  return wuffs_base__rect_ie_u32__contains(this, x, y);
+}
+
+inline bool  //
+wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) {
+  return wuffs_base__rect_ie_u32__contains_rect(this, s);
+}
+
 inline uint32_t  //
 wuffs_base__rect_ie_u32::width() {
   return wuffs_base__rect_ie_u32__width(this);
@@ -1072,28 +1150,33 @@
 static inline void
 wuffs_base__acknowledge_potentially_unused_functions__range_public() {
   (void)(wuffs_base__range_ie_u32__contains);
+  (void)(wuffs_base__range_ie_u32__contains_range);
   (void)(wuffs_base__range_ie_u32__equals);
   (void)(wuffs_base__range_ie_u32__intersect);
   (void)(wuffs_base__range_ie_u32__is_empty);
   (void)(wuffs_base__range_ie_u32__length);
   (void)(wuffs_base__range_ie_u32__unite);
   (void)(wuffs_base__range_ie_u64__contains);
+  (void)(wuffs_base__range_ie_u64__contains_range);
   (void)(wuffs_base__range_ie_u64__equals);
   (void)(wuffs_base__range_ie_u64__intersect);
   (void)(wuffs_base__range_ie_u64__is_empty);
   (void)(wuffs_base__range_ie_u64__length);
   (void)(wuffs_base__range_ie_u64__unite);
   (void)(wuffs_base__range_ii_u32__contains);
+  (void)(wuffs_base__range_ii_u32__contains_range);
   (void)(wuffs_base__range_ii_u32__equals);
   (void)(wuffs_base__range_ii_u32__intersect);
   (void)(wuffs_base__range_ii_u32__is_empty);
   (void)(wuffs_base__range_ii_u32__unite);
   (void)(wuffs_base__range_ii_u64__contains);
+  (void)(wuffs_base__range_ii_u64__contains_range);
   (void)(wuffs_base__range_ii_u64__equals);
   (void)(wuffs_base__range_ii_u64__intersect);
   (void)(wuffs_base__range_ii_u64__is_empty);
   (void)(wuffs_base__range_ii_u64__unite);
   (void)(wuffs_base__rect_ie_u32__contains);
+  (void)(wuffs_base__rect_ie_u32__contains_rect);
   (void)(wuffs_base__rect_ie_u32__equals);
   (void)(wuffs_base__rect_ie_u32__height);
   (void)(wuffs_base__rect_ie_u32__intersect);
@@ -1101,6 +1184,7 @@
   (void)(wuffs_base__rect_ie_u32__unite);
   (void)(wuffs_base__rect_ie_u32__width);
   (void)(wuffs_base__rect_ii_u32__contains);
+  (void)(wuffs_base__rect_ie_u32__contains_rect);
   (void)(wuffs_base__rect_ii_u32__equals);
   (void)(wuffs_base__rect_ii_u32__intersect);
   (void)(wuffs_base__rect_ii_u32__is_empty);