From 4960c06d9ae353c4c2379730578d6105b3e8da4d Mon Sep 17 00:00:00 2001 From: clover caruso Date: Thu, 24 Sep 2026 02:10:48 -0700 Subject: [PATCH] fix: decode GIF pictures so pages holding them open "s: fire" and "m: winter" stopped the app at launch: their pictures are GIFs, which OneNote keeps as inserted and the image decoder was built without. Assisted-by: claude-opus-5.5 --- Cargo.lock | 24 ++++++++++++++++++++++++ crates/canvas/Cargo.toml | 2 +- crates/canvas/src/gpu/mod.rs | 8 ++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 24516b7ede164bf84a339556872b17e9ed28f497..8bb1847e9dfc59f9b63727ec255fedaded0d1bdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -501,6 +501,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "combine" version = "4.6.8" @@ -912,6 +918,16 @@ dependencies = [ "polyval", ] +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gl_generator" version = "0.14.0" @@ -1172,6 +1188,8 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "gif", "moxcms", "num-traits", "png", @@ -3160,6 +3178,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + [[package]] name = "wgpu" version = "30.0.1" diff --git a/crates/canvas/Cargo.toml b/crates/canvas/Cargo.toml index 98f08ba1a83c6c927efa737fa8ce84c5fce0219e..66ff45704b09d662434b21a8866b626e3fdf3de9 100644 --- a/crates/canvas/Cargo.toml +++ b/crates/canvas/Cargo.toml @@ -17,7 +17,7 @@ skrifa = "0.44.0" bytemuck = { version = "1.25", features = ["derive"], optional = true } swash = { version = "0.2.10", optional = true } wgpu = { workspace = true, optional = true } -image = { version = "0.25", default-features = false, features = ["png", "jpeg"], optional = true } +image = { version = "0.25", default-features = false, features = ["gif", "jpeg", "png"], optional = true } roxmltree = { version = "0.21", optional = true } [[bin]] diff --git a/crates/canvas/src/gpu/mod.rs b/crates/canvas/src/gpu/mod.rs index ca06713db9022348150b8d027b9f052a991c582f..b4c3792dc55992c4cc58e4585f414869a6fa1c6f 100644 --- a/crates/canvas/src/gpu/mod.rs +++ b/crates/canvas/src/gpu/mod.rs @@ -1051,6 +1051,14 @@ mod tests { assert_eq!(decoded.size, [4, 4]); assert_eq!(decoded.pixels.as_ref(), [255; 4 * 4 * 4]); + let mut gif = Vec::new(); + image::codecs::gif::GifEncoder::new(&mut gif) + .encode(&[255; 2 * 2 * 4], 2, 2, image::ExtendedColorType::Rgba8) + .unwrap(); + let decoded = RasterImage::decode(&gif).unwrap(); + assert_eq!(decoded.size, [2, 2]); + assert_eq!(decoded.pixels.as_ref(), [255; 2 * 2 * 4]); + for size in [[8192, 8192], [16_385, 1]] { let mut header = Vec::new(); let mut encoder = png::Encoder::new(&mut header, size[0], size[1]); -- 2.54.0