authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-24 02:10:48-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-25 20:26:21-07:00
log4960c06d9ae353c4c2379730578d6105b3e8da4d
treece3db5a56e66dc196c9b8b2e1e1bde4d3bb72828
parentb5d8955327de829054dd337a86eed6fc6582be62
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

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

3 files changed, 33 insertions(+), 1 deletions(-)

Cargo.lock+24
......@@ -501,6 +501,12 @@ dependencies = [
501501 "unicode-width",
502502]
503503
504[[package]]
505name = "color_quant"
506version = "1.1.0"
507source = "registry+https://github.com/rust-lang/crates.io-index"
508checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
509
504510[[package]]
505511name = "combine"
506512version = "4.6.8"
......@@ -912,6 +918,16 @@ dependencies = [
912918 "polyval",
913919]
914920
921[[package]]
922name = "gif"
923version = "0.14.2"
924source = "registry+https://github.com/rust-lang/crates.io-index"
925checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159"
926dependencies = [
927 "color_quant",
928 "weezl",
929]
930
915931[[package]]
916932name = "gl_generator"
917933version = "0.14.0"
......@@ -1172,6 +1188,8 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
11721188dependencies = [
11731189 "bytemuck",
11741190 "byteorder-lite",
1191 "color_quant",
1192 "gif",
11751193 "moxcms",
11761194 "num-traits",
11771195 "png",
......@@ -3160,6 +3178,12 @@ dependencies = [
31603178 "wasm-bindgen",
31613179]
31623180
3181[[package]]
3182name = "weezl"
3183version = "0.1.12"
3184source = "registry+https://github.com/rust-lang/crates.io-index"
3185checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
3186
31633187[[package]]
31643188name = "wgpu"
31653189version = "30.0.1"
crates/canvas/Cargo.toml+1-1
......@@ -17,7 +17,7 @@ skrifa = "0.44.0"
1717bytemuck = { version = "1.25", features = ["derive"], optional = true }
1818swash = { version = "0.2.10", optional = true }
1919wgpu = { workspace = true, optional = true }
20image = { version = "0.25", default-features = false, features = ["png", "jpeg"], optional = true }
20image = { version = "0.25", default-features = false, features = ["gif", "jpeg", "png"], optional = true }
2121roxmltree = { version = "0.21", optional = true }
2222
2323[[bin]]
crates/canvas/src/gpu/mod.rs+8
......@@ -1051,6 +1051,14 @@ mod tests {
10511051 assert_eq!(decoded.size, [4, 4]);
10521052 assert_eq!(decoded.pixels.as_ref(), [255; 4 * 4 * 4]);
10531053
1054 let mut gif = Vec::new();
1055 image::codecs::gif::GifEncoder::new(&mut gif)
1056 .encode(&[255; 2 * 2 * 4], 2, 2, image::ExtendedColorType::Rgba8)
1057 .unwrap();
1058 let decoded = RasterImage::decode(&gif).unwrap();
1059 assert_eq!(decoded.size, [2, 2]);
1060 assert_eq!(decoded.pixels.as_ref(), [255; 2 * 2 * 4]);
1061
10541062 for size in [[8192, 8192], [16_385, 1]] {
10551063 let mut header = Vec::new();
10561064 let mut encoder = png::Encoder::new(&mut header, size[0], size[1]);