deckcraft/crates/render/src
Dmytro Smaha 3985d768e6
feat(pictures): animated GIFs play, with pause (media.gifPlay) (#39)
* feat(pictures): animated GIFs play, with pause (media.gifPlay)

GIF pictures used to show only their first frame. The renderer now decodes every frame (cached, capped at 256 MB and 1024 px a side) and draws the frame for each GIF's play time, passed in RenderOpts::gif_times; exports and thumbnails pass none and keep frame 1. The editor canvas and the slide show redraw only when a GIF reaches its next frame. A corner button on hover (or selection) pauses and resumes a GIF from the same frame, through the new media.gifPlay command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(pictures): animated GIFs play, with pause (media.gifPlay)

GIF pictures used to show only their first frame. The renderer now decodes every frame (cached, capped at 256 MB and 1024 px a side) and draws the frame for each GIF's play time, passed in RenderOpts::gif_times; exports and thumbnails pass none and keep frame 1. The editor canvas and the slide show redraw only when a GIF reaches its next frame. A corner button on hover (or selection) pauses and resumes a GIF from the same frame, through the new media.gifPlay command.

Also adds my entry to contributors/people.toml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Animated GIFs: cap frames (1000), canvas (4096²), per-GIF (64 MB) and cache (192 MB) memory

A few MB of hostile GIF could decode to millions of tiny frames or a 100 Mpx canvas per frame,
and eight cached GIFs could hold 2 GB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-10 06:21:29 -04:00
..
chart.rs Rename SlideCraft to DeckCraft: crates, apps, binaries, app id, file extension (.deckcraft; .slidecraft files still open), packaging, docs; ROADMAP alpha and parity estimates 2026-10-06 01:46:40 -04:00
images.rs feat(pictures): animated GIFs play, with pause (media.gifPlay) (#39) 2026-10-10 06:21:29 -04:00
lib.rs feat(pictures): animated GIFs play, with pause (media.gifPlay) (#39) 2026-10-10 06:21:29 -04:00
morph_path.rs Morph: a changed geometry morphs its outline (a circle turns into a star) (#27) 2026-10-10 06:19:32 -04:00
morph_text.rs Shapes: flipped shapes keep their text readable (#35) 2026-10-10 06:18:46 -04:00
paint.rs feat(pictures): animated GIFs play, with pause (media.gifPlay) (#39) 2026-10-10 06:21:29 -04:00
placed.rs Shapes: flipped shapes keep their text readable (#35) 2026-10-10 06:18:46 -04:00
table.rs Tables: rows grow to fit their text, cell text in the PDF text layer (#13) (#14) 2026-10-09 10:40:13 -04:00
tests.rs feat(pictures): animated GIFs play, with pause (media.gifPlay) (#39) 2026-10-10 06:21:29 -04:00