Skip to content

v0.1.6-pre3

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Sep 07:10
· 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 -pingpong command-line flag to inkanim-cli for 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 #dummyEntry element, preventing upstream glfw-js focus 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.go with flat pre-unpacked palette entries, scaled integer squared Euclidean distance math, a 4096-entry direct-mapped L1 CPU color cache (32 KB), Go slices.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.Buffer and io.MultiWriter with a zero-allocation countingWriter in WriteGIFToWriter, eliminating duplicated in-memory payload buffering during GIF export (#28).
  • Performance Linters & Go Modernization: Enabled prealloc, perfsprint, gocritic, and makezero in golangci-lint-v2. Modernized codebase with Go sequence iterators (strings.SplitSeq), integer range loops (for range n), built-in min/max, preallocated slice capacities, and optimized string/error formatting (#29).