Since #2604 a picked numbered still imports as itself unless the import
asks for a sequence, as in After Effects. The compositing and tracking QA
scenarios import a PNG run, so they pass `sequence: true`; docs/agents.md
describes the new default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An EXR's display window sizes a plane per channel, so 60000² over a 1×1 data window
was a multi-gigabyte allocation per channel; past 16384² (the vector footage limit)
the file is refused. An audio header's sample rate scales the samples read, so
0xFFFFFFFF Hz made one conform chunk about 47 GB; rates outside 1–768 kHz are an
error, and the audio reads as silence as for any unreadable source.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A project can name /dev/zero, a FIFO or a folder as footage; reading those whole
never ended (or ran out of memory). The media layer's whole-file reads (probe,
pool, model side files) and the engine's FsServices::read_file now open the file,
refuse a non-regular one, and reserve its length fallibly, so a sparse file that
claims more than memory is an error too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An SVG or PDF declaring up to 30000×30000 was drawn into one 14 GB image whose failed
allocation aborted the app. Decoding now refuses sizes past what Continuously Rasterize
draws (16384 a side, shared as MAX_VECTOR_SIDE) with an error naming the size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gesture::Vertices took the raw drag delta; it now goes through one_axis, as a
Shift-dragged layer's move does, before snapping.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
file.import without the flag (scripts, agents, files opened from the command line,
the CLI's templates) turned `lockin_line1.png` into a one-frame image sequence.
ImportOptions.sequence defaults to false in After Effects, so picked and dropped files
now import as stills unless `sequence: true`; folders' numbered runs still import as
sequences, and the Import dialog's Sequence checkbox is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Timeline's comp tabs had a × on the shown comp only, so closing another
comp meant showing it first. A comp tab the Timeline does not show now shows
its × while the pointer is over it, and clicking it closes that comp without
showing it. Every comp tab keeps the ×'s room, so a tab keeps its width when
it is shown or hovered. Automation: `panel.tab.Timeline.<comp>.close` for
each comp's ×; `panel.tab.Timeline.close` stays for the shown comp's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Composition and Layer viewers took every scroll as a zoom, so a trackpad
could not pan. A trackpad's two-finger scroll now pans; a pinch,
Ctrl/Cmd+scroll, a mouse wheel and Alt + a trackpad scroll zoom around the
pointer.
Where the platform names the device (egui's MouseWheelSource, macOS), that
decides. Elsewhere browsers and some high-resolution wheels report a mouse
wheel in points, as a trackpad does, so the unit alone doesn't decide. A
scroll in points pans only once it has shown it is a trackpad: a touch phase,
movement on both axes at once, or a pinch. That holds until a wheel scrolls
in lines. Until then the vertical part zooms and the horizontal part pans.
ui.scroll gains unit (point|line), source (wheel|trackpad) and pinch so
agents can drive both gestures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>