Releases: mrpoundsign/InkAnim
Release list
v0.1.6-pre5
InkAnim v0.1.6-pre5 — Drop Shadows, Clipping Masks & 99.5%+ Vector Compliance
Note
Major Rendering Fidelity Milestone: v0.1.6-pre5 brings InkAnim to strict 99.5%+ vector rendering compliance across our 45-fixture integration suite validated against headless Inkscape 1.4. This release introduces support for SVG drop shadow filters (<feGaussianBlur>, <feOffset>), arbitrary clipping paths (<clipPath>), evenodd contour winding normalization, standard miter stroke joins, and a bulk differential scanner (cmd/dev scan).
🎨 Major SVG Vector Rendering Fidelity Overhaul
Our pure-Go in-memory SVG pre-processing and compositing pipeline intercepts and normalizes vector graphics before rasterization, preserving your files on disk without destructive flattening:
- SVG Drop Shadow Filter Compositing: Evaluates SVG drop shadow filter chains (
<filter>,<feGaussianBlur>,<feOffset>,<feFlood>,<feComposite>,<feDropShadow>), synthesizing Gaussian blurred drop shadows composited underneath shapes with 99.98% Inkscape pixel fidelity (#60). - SVG Standard
stroke-linejoin="miter"Defaulting: Injected defaultstroke-linejoin="miter"on stroked shapes per W3C SVG specification, overcoming upstreamoksvgdefaulting tobeveland restoring sharp 90° miter joins across drawings (#64). - SVG
<clipPath>andclip-pathMasking: Implemented dynamic alpha-mask extraction and layered raster compositing for arbitrary clipping paths defined in<defs>and referenced viaclip-path="url(#...)", resolving upstreamrasterx/oksvglack of path clipping and correctly restricting shapes to clipping boundaries (#63). - Vector Subpath Normalization for
fill-rule="evenodd": Evaluated subpath nesting hierarchies and signed polygon area (Shoelace formula) inPreprocessSVGto invert the contour winding of inner cutouts for paths specifyingfill-rule="evenodd", resolving upstreamrasterx/oksvgNonZero limitations and rendering interior cutouts and holes cleanly (#62). - Hidden Element & Group Pruning: Intercepted and pruned non-rendering shapes and container groups with
display="none"orstyle="display:none"duringPreprocessSVGwhile preserving Inkscape animation layers (inkscape:groupmode="layer"), preventing hidden elements, editor guides, and draft artwork from appearing in rendered frames and output GIFs (#61). - Root Viewport Transform Composition on
userSpaceOnUseGradients: Pre-composed the root viewport scaling and translation matrix ontogradientTransformattributes foruserSpaceOnUselinear and radial gradients inRenderSVGToRGBA, fixing severe color shifts, misalignment, and clamped rendering when SVGs are scaled to non-native preview and export dimensions (#58). - Implicit Repeated Arc Command Desugaring: Automatically desugars implicit repeated
aandApath commands into explicit consecutive arcs, completely circumventing upstream multi-arc indexing bugs and restoring missing curves (#57). - Group-Transformed
userSpaceOnUseGradients: Correctly composes ancestor group transforms ontogradientTransform, ensuring gradient fills stay perfectly locked to drawings authored with transformed groups (#56). - Color Gradients & Stop Inheritance: Full multi-level color stop inheritance across
<linearGradient>and<radialGradient>templates referencing shared palettes viaxlink:href/href. Promotes inline CSSstyleproperties (stop-color,stop-opacity) to explicit XML attributes, eliminating solid black gradient fallbacks (#49, #55). - Smooth LPE Fillet & Chamfer Vertices: Seamlessly evaluates Inkscape
fillet_chamferLive Path Effects on closed polygons, rounding all vertices including vertex 0 acrossZsubpaths with non-inverted closing tangent arcs (#41). - Embedded Raster Graphics (
<image>): Decodes and layers embedded base64 PNG, JPEG, and WebP raster images interleaved with vector paths with true z-ordering, affine transforms, and opacity (#47). - Reusable Symbol Clones (
<use>): Inlines and synthesizes<use>clones into transformed<g>groups that inherit downstream stroke scaling and styling (#46). - True Transform Stroke Scaling: Multiplies ancestor group scale factors by shape-level
transformattributes (matrix,scale), keeping outlines at their intended visual weight (#52). - Rect Corner Radius Zero Normalization: Mirrors non-zero corner radii when either
rxorryis zero, ensuring rounded rectangles render correctly (#53). - Physical Unit Conversion: Translates physical length units (
"in","mm","cm","pt","pc") to standard 96 DPI pixels (#45). - Canvas Background Colors: Honors
sodipodi:namedview pagecolorandinkscape:pageopacitycanvas backgrounds (#43). - Aspect-Preserving Letterbox Scaling: Implements SVG
preserveAspectRatio(defaulting toxMidYMid meet) inRenderSVGToRGBAto avoid distortion when rendering into square Twitch emote dimensions (#48). - System Font Fallbacks: Gracefully falls back to system sans-serif fonts (
DejaVu Sans,Segoe UI) for uninstalled font families, maintaining proper text layout (#54).
🧪 Automated Headless Inkscape Golden CI Gate & Dev CLI
- 45-Fixture Golden Integration Suite: Rendered outputs are automatically validated against reference images generated by headless Inkscape 1.4 using perceptual image comparison with strict ≤0.50% vector shape tolerance (#40).
- Bulk Differential Testing Scanner (
cmd/dev scan): Added a dedicatedscansubcommand tocmd/devthat recursively scans directories of SVGs, computes perceptual pixel differences against headless Inkscape ground truth, generates visual diff PNGs with neon magenta highlights on failures, and prints a comprehensive summary table with per-feature breakdown metrics (#59). - Continuous Integration Gate: Runs on every push and pull request via GitHub Actions to prevent visual regressions (#40).
- Developer CLI (
cmd/dev): Added subcommands for canonical golden generation and pixel visual diffs:(#51).go run ./cmd/dev scan testdata/fixtures go run ./cmd/dev golden --generate <fixture> go run ./cmd/dev inspect <image.png>
🎬 Studio UI & Animation Engine
-
"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 (
$2N-2$ sequence), ensuring seamless bouncing loops in external players like Twitch, Discord, and browsers (#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 (#34).
- 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 (#33).
- Optimized GIF Color Quantization: Up to 15.6x faster palette generation and quantization via flat pre-unpacked palette entries, scaled integer Euclidean distance math, and an L1 CPU color cache (#26).
-
Zero-Allocation GIF Streaming: Replaced duplicated buffer allocations with a direct
countingWriter(#28).
🌐 Web Studio & WebAssembly Edition
- In-Browser Studio: Access the full-featured WebAssembly studio directly from your browser at mrpoundsign.github.io/InkAnim/demo/.
- Sample Animations Toolbar: Easily test sample multi-layer SVGs (
hydrate.svg,character_walk.svg) with 1-click loading. - Twitch Chat Scale Preview: Real-time 112×112, 56×56, and 28×28 scale inspector and palette quantization preview.
- Zero-Install Workflow: Drop in any layered SVG to preview, adjust playback spee...
v0.1.6-pre4
InkAnim v0.1.6-pre4 — Major SVG Rendering Overhaul & Web Studio
Note
Major Rendering Fidelity Milestone: v0.1.6-pre4 delivers a massive vector rasterization overhaul, resolving critical rendering gaps across complex Inkscape SVGs. With automated golden image regression testing against headless Inkscape 1.4 across 19 atomic fixtures, this release brings near-identical desktop-grade rendering fidelity to both native desktop and WebAssembly.
🎨 Major SVG Vector Rendering Fidelity Overhaul
Our pure-Go in-memory SVG pre-processing pipeline (PreprocessSVG) intercepts and normalizes vector graphics before rasterization, preserving your files on disk without destructive flattening:
- Color Gradients & Stop Inheritance: Full multi-level color stop inheritance across
<linearGradient>and<radialGradient>templates referencing shared palettes viaxlink:href/href. Promotes inline CSSstyleproperties (stop-color,stop-opacity) to explicit XML attributes, eliminating solid black gradient fallbacks (#49, #55). - Group-Transformed
userSpaceOnUseGradients: Correctly composes ancestor group transforms ontogradientTransform, ensuring gradient fills stay perfectly locked to drawings authored with transformed groups (#56). - Smooth LPE Fillet & Chamfer Vertices: Seamlessly evaluates Inkscape
fillet_chamferLive Path Effects on closed polygons, rounding all vertices including vertex 0 acrossZsubpaths with non-inverted closing tangent arcs (#41). - Implicit Repeated Arc Desugaring: Automatically desugars implicit repeated
aandApath commands into explicit consecutive arcs, completely circumventing upstream multi-arc parsing bugs and restoring missing curves (#57). - Embedded Raster Graphics (
<image>): Decodes and layers embedded base64 PNG, JPEG, and WebP raster images interleaved with vector paths with true z-ordering, affine transforms, and opacity (#47). - Reusable Symbol Clones (
<use>): Inlines and synthesizes<use>clones into transformed<g>groups that inherit downstream stroke scaling and styling (#46). - True Transform Stroke Scaling: Multiplies ancestor group scale factors by shape-level
transformattributes (matrix,scale), keeping outlines at their intended visual weight (#52). - Rect Corner Radius Zero Normalization: Mirrors non-zero corner radii when either
rxorryis zero, ensuring rounded rectangles render correctly (#53). - Physical Unit Conversion: Translates physical length units (
"in","mm","cm","pt","pc") to standard 96 DPI pixels (#45). - Canvas Background Colors: Honors
sodipodi:namedview pagecolorandinkscape:pageopacitycanvas backgrounds (#43). - Aspect-Preserving Letterbox Scaling: Implements SVG
preserveAspectRatio(defaulting toxMidYMid meet) inRenderSVGToRGBAto avoid distortion when rendering into square Twitch emote dimensions (#48). - System Font Fallbacks: Gracefully falls back to system sans-serif fonts (
DejaVu Sans,Segoe UI) for uninstalled font families, maintaining proper text layout (#54).
🧪 Automated Headless Inkscape Golden CI Gate & Dev CLI
- 19-Fixture Golden Integration Suite: Rendered outputs are automatically validated against reference images generated by headless Inkscape 1.4 using perceptual image comparison with sub-pixel antialiasing tolerance (#40).
- Continuous Integration Gate: Runs on every push and pull request via GitHub Actions to prevent visual regressions (#40).
- Developer CLI (
cmd/dev): Added subcommands for canonical golden generation and pixel visual diffs:(#51).go run ./cmd/dev golden --generate go run ./cmd/dev diff -fixture=alert_icon
🌐 Web Studio & WebAssembly Edition
- In-Browser Studio: Access the full-featured WebAssembly studio directly from your browser at mrpoundsign.github.io/InkAnim/demo/.
- Sample Animations Toolbar: Easily test sample multi-layer SVGs (
hydrate.svg,character_walk.svg) with 1-click loading. - Twitch Chat Scale Preview: Real-time 112×112, 56×56, and 28×28 scale inspector and palette quantization preview.
- Zero-Install Workflow: Drop in any layered SVG to preview, adjust playback speeds, and export production-ready animated GIFs instantly.
📦 Downloads & Binaries
| Target | Platform | Archive |
|---|---|---|
| Desktop GUI | Windows (x64) | InkAnim_v0.1.6-pre4_windows_amd64.zip |
| Desktop GUI | Windows (ARM64) | InkAnim_v0.1.6-pre4_windows_arm64.zip |
| Desktop GUI | Linux (x64) | InkAnim_v0.1.6-pre4_linux_amd64.tar.xz |
| Desktop GUI | Linux (ARM64) | InkAnim_v0.1.6-pre4_linux_arm64.tar.xz |
| Headless CLI | Windows (x64) | inkanim-cli_0.1.6-pre4_windows_amd64.zip |
| Headless CLI | Windows (ARM64) | inkanim-cli_0.1.6-pre4_windows_arm64.zip |
| Headless CLI | Linux (x64) | inkanim-cli_0.1.6-pre4_linux_amd64.tar.gz |
| Headless CLI | Linux (ARM64) | inkanim-cli_0.1.6-pre4_linux_arm64.tar.gz |
| All Checksums | SHA-256 | checksums.txt |
v0.1.6-pre3
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).
v0.1.5
Added
- Dynamic Estimated GIF Size on Export Button: Display real-time estimated GIF export size directly on the primary export button (e.g.
Export Animated GIF (~23 KB)...). Uses an active-pixel compression model that factors in resolution, transparent padding, frame count, and color palette tiers (#32). - Integrated Profiling Flags: Added
-cpuprofile,-memprofile, and-pprofcommand-line flags across desktop GUI and CLI for in-depth profiling and diagnostics.
Changed
- Responsive Playback Controls Layout: Restructured playback controls into a centered transport row and a dedicated frame label row with ellipsis truncation, preventing right export sidebar clipping on smaller displays and browser viewports (#30).
Performance
- Parallelized Rasterization & Quantization Across CPU Cores: Multi-threaded preview frame rasterization, export vector rasterization, and GIF color quantization via a lightweight worker pool bounded by
runtime.GOMAXPROCS(0). Reduces export times by over 60% on multi-core CPUs (#27). - Preview Playback Optimization & Event-Driven Timing: Eliminated redundant software bilinear downscaling during live playback by pre-rendering scaled thumbnail caches, switched main canvas to
ImageScaleFastest, and replaced polling tickers with event-driventime.AfterFunctimers (#25). - Pause Playback on Modal Dialogs & Export: Automatically suspend preview playback during export generation and when modal dialogs are open, eliminating unnecessary thread contention and rendering load (#25).
- Eliminated Infinite Progress Bar Animation Leak: Removed
widget.ProgressBarInfinitefrom the export flow to resolve an upstream Fyne animation leak that continuously marked the canvas dirty at 60Hz+ and pegged CPU during and after modal dialogs (#27).
v0.1.4
Note
Major Rendering Milestone: Version 0.1.4 introduces an advanced in-memory SVG pre-processing pipeline and vector font engine that fixes many rendering issues across complex Inkscape SVGs. This release represents a significant improvement in rendering accuracy and visual fidelity—supporting text glyphs, unbaked Live Path Effects (fillets/chamfers), paint-order desugaring, transform stroke scaling, and resolution scaling without destructively modifying or flattening original SVG files on disk.
Changelog
- bede43a Fix: Apply path transform matrix when computing Drawing bounding box (Fix #18)
- ea908aa chore(release): bump version to v0.1.4
- e0a1712 feat(svg): automated golden image regression test harness and suite (Fix #23)
- 6eecd64 feat(svg): in-memory SVG text and tspan to path vector converter (#21)
- 14fe8c8 feat: deploy WebAssembly live demo and landing page to GitHub Pages (Fix #16)
- 12fcf1f feat: in-memory SVG pre-processor for fillet_chamfer LPE and paint-order (Fix #20)
- 0d14a00 fix(svg): scale stroke-width by viewBox-to-canvas factor in RenderSVGToRGBA (Fix #22)
- aa8a67c fix: include stroke width in drawing crop and fix viewBox offset rasterization (Fix #17)
- 56d5d1b test(svg): increase AlertIcon golden tolerance to 3.5% for Linux font fallbacks
- aee362b test(svg): skip Segoe UI Variable test on non-Windows platforms
v0.1.3
Changelog
- 534109a chore: prepare release v0.1.3
- a1023ac feat: add "About InkAnim" modal with version info, update checker, and GitHub links (Fix #12)
- f36dbbd feat: add "Drawing" crop boundary mode and include "Document" in page selection (Fix #15)
- 2ba6e85 feat: add boundary crop mode (Document vs Page) with preview crop guides (Fix #14)
- 3d625c0 feat: implement version update check against GitHub Releases API (Fix #10)
- 29b5d6c feat: scale vector rasterization to target export resolution (Fix #13)
- 191466f refactor: name CLI release archives "inkanim-cli" in GoReleaser (Fix #7)
v0.1.2
What's Changed in v0.1.2
🌐 WebAssembly (In-Browser) Support
- Full In-Browser Experience: Native browser file picker (
<input type="file">) and direct drag-and-drop onto the WebGL canvas. - Direct GIF Downloads: Exported animated GIFs download seamlessly in the browser via Blob URLs.
- Cross-Platform Abstraction: Isolated desktop native modal dialogs from WebAssembly web browser APIs with Go build tags.
🖥️ Native OS File Dialogs
- Native Windows & Linux Dialogs: Replaced small embedded canvas dialogs with native, resizable OS file dialogs for opening SVGs and saving GIFs (Fixes #1).
⏯️ Playback Engine & UI Improvements
- Clear Play / Pause States: Prominent red "Play" button when stopped and green "Pause" button when running.
- Non-Loop Playback Restart: When loop is disabled, playback plays to the end and pauses; pressing Play immediately restarts from the first frame (Fixes #5).
- UI Thread Safety: Wrapped background animation ticker callbacks in
fyne.Doto eliminate UI thread warning spam (Fixes #6).
NOTE: inkanim cli has been removed from this release for now.
v0.1.1
Changelog
- abfbcb5 Add gui-dist/ to .gitignore to prevent dirty git state in GoReleaser
- 212401f Auto-play animation preview when loading SVG files with multiple frames
- 82ab676 Ensure Refresh preserves pause state to avoid race condition with UI text layout
- 34354ab Fix #3: Guarantee pinned background layers render behind animation frame
- 2e3a998 Fix CI test step to target internal test suites and include wayland dev libraries
- 1604b32 Fix animation ticker cancellation race in UI tests
- 7088857 Release v0.1.1: Bump version and update sample animated GIF outputs
- 0c816c3 Strip macOS from build, add test pre-flight job, enable CI caching, and unify SHA256 checksums