Repository navigation
Conversation
Frames record per-layer visibility, opacity and position offset. The live layers are the current frame; offsets are mirrored in render_offset. Every frame operation is one undoable edit (EditOp::TimelineSet plus the layer property changes it implies). The Move tool keeps a frame's offset. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Layers are referenced by tree-walk index with their names as a check, so files edited elsewhere fall back to unique-name matching. Unknown block versions and Photoshop's own animation resources stay verbatim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Magick Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AI translations for all 149 non-English locales (no/sh generated by tools/sync-i18n.py); strict audit passes, human review pending. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rt tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IAmJSD
force-pushed
the
feat/frame-animation
branch
from
October 4, 2026 17:48
8057359 to
bc966a6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Photoshop/Aseprite-style frame animation for layered documents:
schist_core::animation): each frame records per-layer visibility, opacity and an integer position offset; delays, loop count (once / N / forever) and Photoshop's "New layers visible in all frames". Create, New (duplicate) Frame, Delete, reorder, reverse, select/step, per-frame or all-frames delay, loop, per-frame layer offset, Make Frames From Layers, Flatten Frames Into Layers, Delete Animation. Every operation is one undoable edit (EditOp::TimelineSetplus the layer-property changes it implies).timelinein the dock, draggable/resizable/hideable and saved in workspace presets like the others; shown when the document has an animation): frame thumbnails (click to select, drag to reorder), transport (first/prev/play-pause/next/last), new/delete frame, delay + apply to all, loop count, onion skin controls, the active layer's offset in this frame, new-layer rule.image-webp's VP8L output). New crateschist-animation.ScAnPSD/PSB block (JSON), following theScInpattern. Layers referenced by tree-walk index with name check, falling back to unique-name match, dropping rather than guessing. The current frame is also the layers' normal visibility/opacity. Photoshop's own animation resources are preserved verbatim (not interpreted, no reverse engineering).animation.*commands registered through the shared registry (so they appear ascmd_animation_*MCP tools and in Spotlight), allowed in recorded actions. Layer ▸ Animation submenu.Design notes
Timeline::syncedreads the live layers back before switching frames, saving or rendering. New layers are materialised into other frames on the next sync using the new-layer rule.render_offsetmirrors the current frame's offsets (re-derived wheneverTimelineSetis applied, including undo/redo). The Move tool now previews on top of an existing render offset and restores it, so moving pixels in an animated document keeps the frame offset.gif,png,image-webp,color_quant— all pure Rust, MIT/Apache-2.0 (color_quant MIT), already inCargo.lockviaimage, build offline and for wasm. Small binary impact (gif + color_quant are the only newly compiled ones).Verification done
cargo testfor schist-core (frame ops + undo/redo, offsets through undo, new-layer rule, frame keys), schist-codec-psd (tests/animation.rs: PSD and PSB round trip, re-save, unmatched/renamed layers, unknown block versions and a stand-in Photoshop resource preserved verbatim), schist-commands-core (commands, refusals, everything undoes), schist-animation (encode → decode with thegif,png,image-webpdecoders: frame count, delays, loop count, disposal, transparency, lossless pixels), schist-tools-basic (Move keeps the frame offset), schist-app-settings, schist-editor.ffprobereports 24×16 / 3 frames for GIF and APNG (codecapng); ImageMagickidentifyreports delays 10/25/4 cs for GIF and WebP and decodes 3 WebP frames (libwebp, independent of our writer).cargo clippy -D warningsandcargo fmton touched crates;make check-i18n.animation.lang+command.animation.*keys in all 150 locales (AI translations, strict audit passes; human review pending;no/shgenerated bytools/sync-i18n.py).Not verified
No headless GUI check. Disk on the build box was down to ~11 GB, so the app binary was not built and the Timeline panel, playback, onion skins and the export dialog have not been exercised in a running window. They are covered only by
cargo check/clippy and the editor unit tests (424 pass). This is the main thing to try by hand: open a layered document, Layer ▸ Animation ▸ Make Frames From Layers, play, toggle onion skin, drag a frame, File ▸ Export ▸ Animation… (cargo test -p schist-animationalso writesanim.psdto$SCHIST_ANIMATION_ARTIFACT_DIRas a ready-made sample).Not tested in a real browser build (
make check-app-webnot run); the code paths are shared and the encoders are pure Rust, but the wasm export path is untested.No interactive test of Photoshop opening a Schist-animated PSD (Photoshop shows the selected frame as plain layers; its own timeline is not written).
Limits (documented in docs/frame-animation.md)
🤖 Generated with Claude Code