What's Changed
- svg: bound raster surfaces and handle duplicate gradient stops by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2190
- ui: bound queued synthetic input gestures by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2197
- text: bound layout and variable font metadata by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2193
- pdf: bound image sample and mask allocations by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2191
- roto: bound frozen matte decoding and serialization by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2194
- expr: bound rewrite expansion and preserve assignment targets by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2195
- fix: validate the CLI path in the AE ease checker (SonarCloud jssecurity:S8705) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2214
- fix: put the NOSONAR marker on the spawnSync line (SonarCloud follow-up) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2215
- fix: document the AE checker's operator-supplied CLI path (SonarCloud) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2217
- fix: suppress the stat check's taint finding (SonarCloud) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2218
- segment: bound checkpoint tensors and pickle work by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2192
- xtask: use unique temporary directories for bench tests by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2196
- packaging: use [[ tests, named locals and explicit returns (SonarCloud S7688/S7679/S7682) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2187
- Use chrono instead of hand-rolled UTC conversion by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2023
- CI: dev-profile gate, one test binary per crate, nextest, line tables only by @aiongg in https://github.com/storytold/effectcraft/pull/2235
- Packaging: pin the signing client and appimagetool, and check their hashes by @aiongg in https://github.com/storytold/effectcraft/pull/1976
- Footage, Lottie and models: resolve stored paths with craft-docpath's resolve_absolute by @aiongg in https://github.com/storytold/effectcraft/pull/1975
- GPU tests: pass on Mesa lavapipe (boundary flips, skip the Reshape case that crashes it); cargo fmt by @aiongg in https://github.com/storytold/effectcraft/pull/2239
- CI: shared gate workflow; FreeBSD nightly and on release by @aiongg in https://github.com/storytold/effectcraft/pull/2204
- security: move the release workflow's write permission to the job level (SonarCloud githubactions:S8233) by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2241
- Translations: missing strings show in English and are listed by a report, not failed by tests by @aiongg in https://github.com/storytold/effectcraft/pull/2244
- ci(sonar): stop cancelling main-branch runs so coverage is published by @dylanmtaylor in https://github.com/storytold/effectcraft/pull/2249
- Integration batch 1: 18 contributor PRs (CJK fonts, timeline, preview caches, interface languages) by @aiongg in https://github.com/storytold/effectcraft/pull/2257
- Preview: keep rendering past the cached frames after a loop or restart by @ded-achtung in https://github.com/storytold/effectcraft/pull/1920
- Layer: replace a layer's source with Alt-drag and Ctrl+Alt+/ (#991) by @ki2pixel in https://github.com/storytold/effectcraft/pull/1929
- Layer: Reveal Layer Source in Project from the context menus (#1809) by @ki2pixel in https://github.com/storytold/effectcraft/pull/1931
- Timeline: the disk-cache bar checks only the visible frames by @arnav-hiwarkar in https://github.com/storytold/effectcraft/pull/2048
- engine: split layers above the original by default (#2083) by @gmrmad1 in https://github.com/storytold/effectcraft/pull/2114
- ui: Spacebar hand pans timeline rows vertically (#2083) by @gmrmad1 in https://github.com/storytold/effectcraft/pull/2116
- ui: the interface prefers the platform's UI faces, rendered text keeps the print ones by @FeiLiuEM in https://github.com/storytold/effectcraft/pull/1322
- Preview: replaced browser media gets a new disk-cache key (#1253) by @vbasky in https://github.com/storytold/effectcraft/pull/1699
- Text: draw Faux Bold and synthetic bold (#1676) by @HEOJUNFO in https://github.com/storytold/effectcraft/pull/1837
- i18n: tab titles, workspaces and Project/Timeline column headers reach the catalogs; web language follows ?lang= and the browser by @devius in https://github.com/storytold/effectcraft/pull/1842
- i18n: Georgian (ka) interface language by @devius in https://github.com/storytold/effectcraft/pull/1843
- Timeline: layer switches, labels and modes act on the whole selection (#1849) by @ki2pixel in https://github.com/storytold/effectcraft/pull/1850
- Text Range Selector: Start, End and Offset show as counts with Units = Index (#1814) by @SBaksa in https://github.com/storytold/effectcraft/pull/1865
- fix(text): isolate CJK fallback language and cache entries by @TimotheusG in https://github.com/storytold/effectcraft/pull/1907
- [#1812]: stills at reduced resolution are resampled once, and their layers cached by @ded-achtung in https://github.com/storytold/effectcraft/pull/1917
- [#1812]: workers that render a layer at once share the cached buffer by @ded-achtung in https://github.com/storytold/effectcraft/pull/1928
- Fix incomplete system font coverage in the Chinese interface by @yuraizmailov in https://github.com/storytold/effectcraft/pull/1973
- Preview: a zoom or resolution change evicts the other sizes' frames first by @arnav-hiwarkar in https://github.com/storytold/effectcraft/pull/2046
- Translations report: count repeated menu entries once; list panel strings no catalog has yet by @aiongg in https://github.com/storytold/effectcraft/pull/2252
- Integration batch 2: 18 contributor PRs (SVG, engine, colour effects, effects, settings, tests) by @aiongg in https://github.com/storytold/effectcraft/pull/2259
- Color effects and keys render as in After Effects (Tint, Tritone, Black & White, Exposure, Levels, Brightness & Contrast, Curves, Luma Key, Extract, 4-Color Gradient, Fill) by @vangel76 in https://github.com/storytold/effectcraft/pull/1872
- Resolve SVG font-size percentages against the parent font size by @Silvertree2010 in https://github.com/storytold/effectcraft/pull/1901
- engine: a keyframe on the out point no longer warns (#2084) by @gmrmad1 in https://github.com/storytold/effectcraft/pull/2106
- svg: share CSS declaration blocks and cap <style> work (#2140) by @Barzabel in <a href="https://github.com/storytold/effectcraft/pull/2159" rel="nofollow">https://github.com/storytold/effectcraft/pull/2159</a></li> <li>i18n(ja): AE says 縦横比, not アスペクト比 by @zitann2020 in <a href="https://github.com/storytold/effectcraft/pull/2166" rel="nofollow">https://github.com/storytold/effectcraft/pull/2166</a></li> <li>Project Settings: Frame Count, Start at 0 or Start at 1 by @marcoarnulfo in <a href="https://github.com/storytold/effectcraft/pull/2185" rel="nofollow">https://github.com/storytold/effectcraft/pull/2185</a></li> <li>[#2094] (adv): crisp cast shadows so diffusion only softens by @ChristopherLinnett in <a href="https://github.com/storytold/effectcraft/pull/2211" rel="nofollow">https://github.com/storytold/effectcraft/pull/2211</a></li> <li>Composition Settings: Resolution menu with the frame size and memory at that resolution by @marcoarnulfo in <a href="https://github.com/storytold/effectcraft/pull/2223" rel="nofollow">https://github.com/storytold/effectcraft/pull/2223</a></li> <li>UI: native press-and-browse menus, with edge auto-scroll by @elZanco in <a href="https://github.com/storytold/effectcraft/pull/1653" rel="nofollow">https://github.com/storytold/effectcraft/pull/1653</a></li> <li>Tests: serialise disk-cache-opening tests with the roto tests by @iannitram in <a href="https://github.com/storytold/effectcraft/pull/1833" rel="nofollow">https://github.com/storytold/effectcraft/pull/1833</a></li> <li>Cryptomatte: pick the ID under a point into the Selection (<code>effect.pickCryptomatte</code>) by @MatejKozlovsky in <a href="https://github.com/storytold/effectcraft/pull/1841" rel="nofollow">https://github.com/storytold/effectcraft/pull/1841</a></li> <li>Make Fractal Noise evolution progress linearly by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/1846" rel="nofollow">https://github.com/storytold/effectcraft/pull/1846</a></li> <li>xtask bench: run on Windows (scenario commands from an args file, os error 206) by @ded-achtung in <a href="https://github.com/storytold/effectcraft/pull/1906" rel="nofollow">https://github.com/storytold/effectcraft/pull/1906</a></li> <li>test(render): make automatic backend checks independent of timing by @TimotheusG in <a href="https://github.com/storytold/effectcraft/pull/1915" rel="nofollow">https://github.com/storytold/effectcraft/pull/1915</a></li> <li>Motion Tile's Output size works on adjustment layers (#1727) by @ded-achtung in <a href="https://github.com/storytold/effectcraft/pull/2003" rel="nofollow">https://github.com/storytold/effectcraft/pull/2003</a></li> <li>3D: add a New 3D Primitive dialog to Layer > New by @tylerjenningsw in <a href="https://github.com/storytold/effectcraft/pull/2050" rel="nofollow">https://github.com/storytold/effectcraft/pull/2050</a></li> <li>engine: resolve effect match-name paths in prop_ref (#2064) by @gmrmad1 in <a href="https://github.com/storytold/effectcraft/pull/2108" rel="nofollow">https://github.com/storytold/effectcraft/pull/2108</a></li> <li>Regression tests for [#354], [#382], [#979] and [#1497] by @skylartaylor in <a href="https://github.com/storytold/effectcraft/pull/2182" rel="nofollow">https://github.com/storytold/effectcraft/pull/2182</a></li> <li>Integration batch 3: 19 contributor PRs (interface, engine, effects, GPU, PDF and EPS import) by @aiongg in <a href="https://github.com/storytold/effectcraft/pull/2260" rel="nofollow">https://github.com/storytold/effectcraft/pull/2260</a></li> <li>effects: CC Radial Fast Blur grows its buffer so streaks pass the layer edge (#2095) by @mercuryVM in <a href="https://github.com/storytold/effectcraft/pull/2206" rel="nofollow">https://github.com/storytold/effectcraft/pull/2206</a></li> <li>Cryptomatte: skip the ID colours unless Colors shows them, key the layer in place, and cache each rank's last ID colour by @MatejKozlovsky in <a href="https://github.com/storytold/effectcraft/pull/1604" rel="nofollow">https://github.com/storytold/effectcraft/pull/1604</a></li> <li>Shift Channels: After Effects' Take … From menu order, so 10 is Full Off (#1797) by @Anubhav-Rai in <a href="https://github.com/storytold/effectcraft/pull/1810" rel="nofollow">https://github.com/storytold/effectcraft/pull/1810</a></li> <li>Hold position between identical auto-Bézier spatial keys by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/1847" rel="nofollow">https://github.com/storytold/effectcraft/pull/1847</a></li> <li>EPS: Illustrator EPS files draw their artwork (#955) by @JWesCampbell in <a href="https://github.com/storytold/effectcraft/pull/1909" rel="nofollow">https://github.com/storytold/effectcraft/pull/1909</a></li> <li>[#1926]: an edit no longer stamps every image-sequence frame for the disk cache by @ded-achtung in <a href="https://github.com/storytold/effectcraft/pull/1946" rel="nofollow">https://github.com/storytold/effectcraft/pull/1946</a></li> <li>script: comp.width and comp.height resize the frame without moving the layers (#1942) by @Anubhav-Rai in <a href="https://github.com/storytold/effectcraft/pull/1958" rel="nofollow">https://github.com/storytold/effectcraft/pull/1958</a></li> <li>Make Gaussian Blur and Fast Box Blur continuous at small values (#1939) by @MarekSpodBiedry in <a href="https://github.com/storytold/effectcraft/pull/1968" rel="nofollow">https://github.com/storytold/effectcraft/pull/1968</a></li> <li>Fix [#1708]: calibrate CC Blobbylize from the AE oracle by @ki2pixel in <a href="https://github.com/storytold/effectcraft/pull/2027" rel="nofollow">https://github.com/storytold/effectcraft/pull/2027</a></li> <li>Fractal Noise: resolve the Blending Mode once per layer, not per pixel by @arnav-hiwarkar in <a href="https://github.com/storytold/effectcraft/pull/2040" rel="nofollow">https://github.com/storytold/effectcraft/pull/2040</a></li> <li>Save: check the file's values without reparsing it in release builds by @arnav-hiwarkar in <a href="https://github.com/storytold/effectcraft/pull/2041" rel="nofollow">https://github.com/storytold/effectcraft/pull/2041</a></li> <li>GPU: devices favour memory use, so Purge and Close give video memory back by @arnav-hiwarkar in <a href="https://github.com/storytold/effectcraft/pull/2045" rel="nofollow">https://github.com/storytold/effectcraft/pull/2045</a></li> <li>Light Settings: expose and preserve Environment lights by @tylerjenningsw in <a href="https://github.com/storytold/effectcraft/pull/2049" rel="nofollow">https://github.com/storytold/effectcraft/pull/2049</a></li> <li>Timeline: pick layer-valued properties from a layer drop-down (#2093) by @ChristopherLinnett in <a href="https://github.com/storytold/effectcraft/pull/2155" rel="nofollow">https://github.com/storytold/effectcraft/pull/2155</a></li> <li>Fix u32 overflows in PDF CID width tables and CMap ranges (#2147) by @MarekSpodBiedry in <a href="https://github.com/storytold/effectcraft/pull/2163" rel="nofollow">https://github.com/storytold/effectcraft/pull/2163</a></li> <li>engine: deleting a layer clears the references to it (#2153) by @Anubhav-Rai in <a href="https://github.com/storytold/effectcraft/pull/2177" rel="nofollow">https://github.com/storytold/effectcraft/pull/2177</a></li> <li>Reject malformed thumbnail text without crashing (#2135) by @Maokus in <a href="https://github.com/storytold/effectcraft/pull/2178" rel="nofollow">https://github.com/storytold/effectcraft/pull/2178</a></li> <li>Reload a numbered still as its own file (#2074) by @HEOJUNFO in <a href="https://github.com/storytold/effectcraft/pull/2184" rel="nofollow">https://github.com/storytold/effectcraft/pull/2184</a></li> <li>fix(ui): expose Duplicate in the Project panel context menu (#2207) by @Zaxaerith in <a href="https://github.com/storytold/effectcraft/pull/2221" rel="nofollow">https://github.com/storytold/effectcraft/pull/2221</a></li> <li>Integration batch 4: 15 contributor PRs (interface, scripting, hardening, docs) by @aiongg in <a href="https://github.com/storytold/effectcraft/pull/2264" rel="nofollow">https://github.com/storytold/effectcraft/pull/2264</a></li> <li>Reject non-hex characters such as '+' in Rgba::from_hex by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/1945" rel="nofollow">https://github.com/storytold/effectcraft/pull/1945</a></li> <li>CLI: preserve template composition names when rendering by @tylerjenningsw in <a href="https://github.com/storytold/effectcraft/pull/1948" rel="nofollow">https://github.com/storytold/effectcraft/pull/1948</a></li> <li>Keep rgb_to_hsv and rgb_to_hsl hue within 0..1 by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/1997" rel="nofollow">https://github.com/storytold/effectcraft/pull/1997</a></li> <li>docs: escape the backtick in the twirlSelected shortcut (#2025) by @gmrmad1 in <a href="https://github.com/storytold/effectcraft/pull/2033" rel="nofollow">https://github.com/storytold/effectcraft/pull/2033</a></li> <li>Return None from Mat4::inverse for non-finite input by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/2156" rel="nofollow">https://github.com/storytold/effectcraft/pull/2156</a></li> <li>Settings: fit translated page names in the sidebar (#2034) by @Maokus in <a href="https://github.com/storytold/effectcraft/pull/2171" rel="nofollow">https://github.com/storytold/effectcraft/pull/2171</a></li> <li>End an open text edit when Deselect All runs (#2096) by @ChristopherLinnett in <a href="https://github.com/storytold/effectcraft/pull/2228" rel="nofollow">https://github.com/storytold/effectcraft/pull/2228</a></li> <li>Timeline: focus newly added expressions after Alt-click (refs [#1072]) by @tylerjenningsw in <a href="https://github.com/storytold/effectcraft/pull/1327" rel="nofollow">https://github.com/storytold/effectcraft/pull/1327</a></li> <li>Timeline: a shape group's inner Contents draws no row, as After Effects elides it by @elZanco in <a href="https://github.com/storytold/effectcraft/pull/1761" rel="nofollow">https://github.com/storytold/effectcraft/pull/1761</a></li> <li>Fix scheduled ScriptUI tasks in host sessions by @dorfee in <a href="https://github.com/storytold/effectcraft/pull/1867" rel="nofollow">https://github.com/storytold/effectcraft/pull/1867</a></li> <li>Reject non-finite numbers in CSS colour parsing by @Silvertree2010 in <a href="https://github.com/storytold/effectcraft/pull/1881" rel="nofollow">https://github.com/storytold/effectcraft/pull/1881</a></li> <li>fix(script): interrupt blocked socket writes on close by @TimotheusG in <a href="https://github.com/storytold/effectcraft/pull/1891" rel="nofollow">https://github.com/storytold/effectcraft/pull/1891</a></li> <li>Viewer: keep hidden AV layers' controls visible (#1769) by @ki2pixel in <a href="https://github.com/storytold/effectcraft/pull/1933" rel="nofollow">https://github.com/storytold/effectcraft/pull/1933</a></li> <li>Settings: list the languages alphabetically by their own name by @nikolainyegaard in <a href="https://github.com/storytold/effectcraft/pull/2016" rel="nofollow">https://github.com/storytold/effectcraft/pull/2016</a></li> <li>ui: scrub hot text from the slider range (#2097) by @gmrmad1 in <a href="https://github.com/storytold/effectcraft/pull/2110" rel="nofollow">https://github.com/storytold/effectcraft/pull/2110</a></li> <li>PDF: repin the shared reader to craft-libs 9f75d3dc (xref, object-stream, graphics-state and JBIG2 input bounds) by @aiongg in <a href="https://github.com/storytold/effectcraft/pull/2265" rel="nofollow">https://github.com/storytold/effectcraft/pull/2265</a></li> <li>Preview: an edit keeps the cached frames outside the layers it changes (#1641) by @arnav-hiwarkar in <a href="https://github.com/storytold/effectcraft/pull/1643" rel="nofollow">https://github.com/storytold/effectcraft/pull/1643</a></li> </ul> <h2 id="new-contributors">New Contributors</h2> <ul> <li>@aiongg made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2235" rel="nofollow">https://github.com/storytold/effectcraft/pull/2235</a></li> <li>@ded-achtung made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1920" rel="nofollow">https://github.com/storytold/effectcraft/pull/1920</a></li> <li>@ki2pixel made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1929" rel="nofollow">https://github.com/storytold/effectcraft/pull/1929</a></li> <li>@devius made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1842" rel="nofollow">https://github.com/storytold/effectcraft/pull/1842</a></li> <li>@SBaksa made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1865" rel="nofollow">https://github.com/storytold/effectcraft/pull/1865</a></li> <li>@TimotheusG made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1907" rel="nofollow">https://github.com/storytold/effectcraft/pull/1907</a></li> <li>@yuraizmailov made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1973" rel="nofollow">https://github.com/storytold/effectcraft/pull/1973</a></li> <li>@Barzabel made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2159" rel="nofollow">https://github.com/storytold/effectcraft/pull/2159</a></li> <li>@ChristopherLinnett made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2211" rel="nofollow">https://github.com/storytold/effectcraft/pull/2211</a></li> <li>@mercuryVM made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2206" rel="nofollow">https://github.com/storytold/effectcraft/pull/2206</a></li> <li>@JWesCampbell made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1909" rel="nofollow">https://github.com/storytold/effectcraft/pull/1909</a></li> <li>@Maokus made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2178" rel="nofollow">https://github.com/storytold/effectcraft/pull/2178</a></li> <li>@Zaxaerith made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2221" rel="nofollow">https://github.com/storytold/effectcraft/pull/2221</a></li> <li>@dorfee made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/1867" rel="nofollow">https://github.com/storytold/effectcraft/pull/1867</a></li> <li>@nikolainyegaard made their first contribution in <a href="https://github.com/storytold/effectcraft/pull/2016" rel="nofollow">https://github.com/storytold/effectcraft/pull/2016</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/storytold/effectcraft/compare/v0.16.0...v0.17.0" rel="nofollow">https://github.com/storytold/effectcraft/compare/v0.16.0...v0.17.0</a></p>