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 = [...@@ -501,6 +501,12 @@ dependencies = [
501 "unicode-width",501 "unicode-width",
502]502]
503503
504[[package]]
505name = "color_quant"
506version = "1.1.0"
507source = "registry+https://github.com/rust-lang/crates.io-index"
508checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
509
504[[package]]510[[package]]
505name = "combine"511name = "combine"
506version = "4.6.8"512version = "4.6.8"
...@@ -912,6 +918,16 @@ dependencies = [...@@ -912,6 +918,16 @@ dependencies = [
912 "polyval",918 "polyval",
913]919]
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
915[[package]]931[[package]]
916name = "gl_generator"932name = "gl_generator"
917version = "0.14.0"933version = "0.14.0"
...@@ -1172,6 +1188,8 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"...@@ -1172,6 +1188,8 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
1172dependencies = [1188dependencies = [
1173 "bytemuck",1189 "bytemuck",
1174 "byteorder-lite",1190 "byteorder-lite",
1191 "color_quant",
1192 "gif",
1175 "moxcms",1193 "moxcms",
1176 "num-traits",1194 "num-traits",
1177 "png",1195 "png",
...@@ -3160,6 +3178,12 @@ dependencies = [...@@ -3160,6 +3178,12 @@ dependencies = [
3160 "wasm-bindgen",3178 "wasm-bindgen",
3161]3179]
31623180
3181[[package]]
3182name = "weezl"
3183version = "0.1.12"
3184source = "registry+https://github.com/rust-lang/crates.io-index"
3185checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
3186
3163[[package]]3187[[package]]
3164name = "wgpu"3188name = "wgpu"
3165version = "30.0.1"3189version = "30.0.1"
crates/canvas/Cargo.toml+1-1
...@@ -17,7 +17,7 @@ skrifa = "0.44.0"...@@ -17,7 +17,7 @@ skrifa = "0.44.0"
17bytemuck = { version = "1.25", features = ["derive"], optional = true }17bytemuck = { version = "1.25", features = ["derive"], optional = true }
18swash = { version = "0.2.10", optional = true }18swash = { version = "0.2.10", optional = true }
19wgpu = { workspace = true, optional = true }19wgpu = { 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 }
21roxmltree = { version = "0.21", optional = true }21roxmltree = { version = "0.21", optional = true }
2222
23[[bin]]23[[bin]]
crates/canvas/src/gpu/mod.rs+8
...@@ -1051,6 +1051,14 @@ mod tests {...@@ -1051,6 +1051,14 @@ mod tests {
1051 assert_eq!(decoded.size, [4, 4]);1051 assert_eq!(decoded.size, [4, 4]);
1052 assert_eq!(decoded.pixels.as_ref(), [255; 4 * 4 * 4]);1052 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
1054 for size in [[8192, 8192], [16_385, 1]] {1062 for size in [[8192, 8192], [16_385, 1]] {
1055 let mut header = Vec::new();1063 let mut header = Vec::new();
1056 let mut encoder = png::Encoder::new(&mut header, size[0], size[1]);1064 let mut encoder = png::Encoder::new(&mut header, size[0], size[1]);