* craft-aep: a flat read-only tree index, borrowed text documents, fewer allocations
The container part of storytold/effectcraft#3302:
- `TreeIndex`: the chunk tree as one flat array in depth-first order,
borrowed from the input, for readers that only look. Same chunks counted
against the same limits and the same errors as `parse`. An `.aepx` is
indexed by `index_aepx` into one buffer. The typed view reads through
either tree (`Node`, `Root`, `Project::from_index`).
- Chunk parser: each list of siblings is counted, then reserved once.
`.aepx`: hex decoded into an output sized once, attribute values without
an entity borrowed. `write` reserves the exact output size.
- Text documents are parsed into a tree that borrows from the body; the
style and paragraph defaults are built once.
- Layer markers and Source Text are read where they are stored instead of
searched for.
- Container accessors that only tests used are removed.
What the importer and exporter in EffectCraft reach across the crate
boundary is public here: `Root`, `Draft`, `AepxDrafts`, `index_aepx`,
`TreeIndex::from_drafts`, `Project::of`, `ProjectSettings::of`,
`Node::marker_list`, `Root::file_version` and `saved_by_version`,
`StyleRun::SAMPLED`. `TimeBase::NTSC` holds the rates as plain
numerator and denominator instead of an EffectCraft type.
* craft-aep: one decoder for an effect parameter definition (`Pard`)
The container part of storytold/effectcraft#3319: the fields of a `pard`
record (type code, name, default, valid range, slider range, popup item
count) are read by one type, `Pard`, which `EffectParam` now reads
through. It is public so that an exporter's tests can read back what
they encode instead of keeping a second decoder.
The rest of that PR (import and export bounds, loss reports) is in
EffectCraft's importer and exporter.
---------
Co-authored-by: vangel76 <vangel1976@googlemail.com>
* Add craft-aep: After Effects project container and typed view from EffectCraft
The .aep (RIFX 'Egg!') and .aepx container as a lossless chunk tree that
writes back byte for byte, and the typed, read-only view over it:
compositions, layers, properties, keyframes, effects and their settings
data, masks, shapes, text documents, markers, cameras, track mattes,
footage, project settings and the saving version.
Moved from effectcraft crates/aep/src/container at f6b4da0a with its unit
tests, the container integration tests, the aepdump and stubicc tools and
docs/aep-format.md. The match-name tables (effect_map, style_map), the
importer and the exporter are written against EffectCraft's model and
stay there. ExtractorChannels::sources takes the caller's name for a
copied channel instead of an EffectCraft constant.
* craft-aep: read the Photoshop layer a footage item shows
A footage item made from one layer of a .psd stores the layer in its
`opti` (tag `8BPS`): the layer record's index (big-endian i32 at 14, -1
for the merged image), the document's two sides (little-endian u32 at 32
and 36), the layer's bounds (little-endian i32 at 78, 82, 86, 90) and its
name (UTF-8 from 344). `Footage::psd_layer` reads them as `PsdLayer`.
The format part of storytold/effectcraft#3449; the importer's use of it
stays in EffectCraft.
---------
Co-authored-by: arnav-hiwarkar <asharnav2008@gmail.com>