v0.1.6-pre3
Pre-release
Pre-release
·
43 commits
to main
since this release
Changelog
[0.1.6-pre3] - 2026-09-07
Added
-
"Ping-Pong" (Bounce / Reverse) Loop Playback & GIF Export: Added support for Ping-Pong looping across both the live preview playback engine and the exported GIF encoding pipeline. When enabled on animations with 3 or more frames, playback cycles from the first to last frame and reverses back down without repeating turnaround frames (
$2N-2$ total sequence), ensuring seamless bouncing loops in external players like Twitch, Discord, and browsers. Automatically disabled for documents with fewer than 3 frames (#2). -
CLI Ping-Pong Flag: Added
-pingpongcommand-line flag toinkanim-clifor batch exporting bounced loop animations (#2). - WYSIWYG Palette Quantization & Dithering Preview: Live animation preview canvas and Twitch scale thumbnails reflect the active color palette quantization (2–256 colors) and Floyd-Steinberg dithering in real time. Added a "WYSIWYG" toggle in playback controls to effortlessly compare color-quantized GIF frames against the unquantized 32-bit true-color rasterization (#34).
- Reusable NumericCommitInput Component: Created a numeric-only input component with bounds checking and commit via an "OK" button or Enter key (#33).
- Custom Palette Color Limit: Added a "Custom" option to the palette dropdown supporting any color count between 2 and 256.
Changed
- Streamlined Animation to Layers-Only: Simplified frame extraction exclusively to Inkscape layers (
inkscape:groupmode="layer"), eliminating confusing dual-rendering modes while retaining full support for multi-page SVGs (<inkscape:page>) as artboard and camera crop boundaries (#39). - Unified Right-Side Tabbed Sidebar: Consolidated Left Frames panel and Right Export panel into a single tabbed sidebar ("Frames" and "Export" tabs) on the right side of the window, freeing up ~240px of horizontal space for a much larger, more immersive animation preview canvas (#35).
- Collapsible Bottom Scale Inspector: Added a "Scale Inspector" checkbox toggle in playback controls to hide/show the bottom Twitch chat-scale preview dock, allowing the main animation canvas to expand to full window height (#35).
- Clean Export & Speed Preset Visibility: Resolution, Dimensions, and Global Speed text inputs are hidden by default and only revealed when choosing "Custom", preventing UI clutter and partial-keystroke re-calculations (#33).
- Updated Landing Page Copy & Simplified Downloads: Clarified animation capabilities, added Discord emote support, and consolidated desktop downloads to direct GitHub Releases links.
Fixed
- WebAssembly Text Entry Deadlock: Intercepted canvas blur event when Fyne focuses hidden
#dummyEntryelement, preventing upstreamglfw-jsfocus lost callback from deadlocking the WebAssembly runtime (#33).
Performance & Tooling
- Optimized GIF Color Quantization & Hot Path Lookups: Overhauled color quantization and palette generation in
internal/gif/quantizer.gowith flat pre-unpacked palette entries, scaled integer squared Euclidean distance math, a 4096-entry direct-mapped L1 CPU color cache (32 KB), Goslices.SortFunc(pdqsort), and direct linear byte slice scanning (Pix). (#26)QuantizeFrame (No Dither): 134.6 ms -> 8.63 ms (15.6x faster, -93.6% latency).GeneratePalette: 47.2 ms -> 38.4 ms (1.23x faster, -18.6% latency).EncodeAnimatedGIF (No Dither): 245.7 ms -> 195.4 ms (1.26x faster, -20.4% latency).
- Eliminated Redundant In-Memory GIF Buffering: Replaced
bytes.Bufferandio.MultiWriterwith a zero-allocationcountingWriterinWriteGIFToWriter, eliminating duplicated in-memory payload buffering during GIF export (#28). - Performance Linters & Go Modernization: Enabled
prealloc,perfsprint,gocritic, andmakezeroingolangci-lint-v2. Modernized codebase with Go sequence iterators (strings.SplitSeq), integer range loops (for range n), built-inmin/max, preallocated slice capacities, and optimized string/error formatting (#29).