Skip to content

Releases: mrpoundsign/InkAnim

v0.1.6-pre5

v0.1.6-pre5 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 09 Sep 01:54

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 default stroke-linejoin="miter" on stroked shapes per W3C SVG specification, overcoming upstream oksvg defaulting to bevel and restoring sharp 90° miter joins across drawings (#64).
  • SVG <clipPath> and clip-path Masking: Implemented dynamic alpha-mask extraction and layered raster compositing for arbitrary clipping paths defined in <defs> and referenced via clip-path="url(#...)", resolving upstream rasterx/oksvg lack 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) in PreprocessSVG to invert the contour winding of inner cutouts for paths specifying fill-rule="evenodd", resolving upstream rasterx/oksvg NonZero 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" or style="display:none" during PreprocessSVG while 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 userSpaceOnUse Gradients: Pre-composed the root viewport scaling and translation matrix onto gradientTransform attributes for userSpaceOnUse linear and radial gradients in RenderSVGToRGBA, 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 a and A path commands into explicit consecutive arcs, completely circumventing upstream multi-arc indexing bugs and restoring missing curves (#57).
  • Group-Transformed userSpaceOnUse Gradients: Correctly composes ancestor group transforms onto gradientTransform, 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 via xlink:href/href. Promotes inline CSS style properties (stop-color, stop-opacity) to explicit XML attributes, eliminating solid black gradient fallbacks (#49, #55).
  • Smooth LPE Fillet & Chamfer Vertices: Seamlessly evaluates Inkscape fillet_chamfer Live Path Effects on closed polygons, rounding all vertices including vertex 0 across Z subpaths 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 transform attributes (matrix, scale), keeping outlines at their intended visual weight (#52).
  • Rect Corner Radius Zero Normalization: Mirrors non-zero corner radii when either rx or ry is 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 pagecolor and inkscape:pageopacity canvas backgrounds (#43).
  • Aspect-Preserving Letterbox Scaling: Implements SVG preserveAspectRatio (defaulting to xMidYMid meet) in RenderSVGToRGBA to 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 dedicated scan subcommand to cmd/dev that 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:
    go run ./cmd/dev scan testdata/fixtures
    go run ./cmd/dev golden --generate <fixture>
    go run ./cmd/dev inspect <image.png>
    (#51).

🎬 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...
Read more

v0.1.6-pre4

v0.1.6-pre4 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Sep 17:10

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 via xlink:href/href. Promotes inline CSS style properties (stop-color, stop-opacity) to explicit XML attributes, eliminating solid black gradient fallbacks (#49, #55).
  • Group-Transformed userSpaceOnUse Gradients: Correctly composes ancestor group transforms onto gradientTransform, ensuring gradient fills stay perfectly locked to drawings authored with transformed groups (#56).
  • Smooth LPE Fillet & Chamfer Vertices: Seamlessly evaluates Inkscape fillet_chamfer Live Path Effects on closed polygons, rounding all vertices including vertex 0 across Z subpaths with non-inverted closing tangent arcs (#41).
  • Implicit Repeated Arc Desugaring: Automatically desugars implicit repeated a and A path 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 transform attributes (matrix, scale), keeping outlines at their intended visual weight (#52).
  • Rect Corner Radius Zero Normalization: Mirrors non-zero corner radii when either rx or ry is 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 pagecolor and inkscape:pageopacity canvas backgrounds (#43).
  • Aspect-Preserving Letterbox Scaling: Implements SVG preserveAspectRatio (defaulting to xMidYMid meet) in RenderSVGToRGBA to 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:
    go run ./cmd/dev golden --generate
    go run ./cmd/dev diff -fixture=alert_icon
    (#51).

🌐 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

v0.1.6-pre3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 08 Sep 07:10

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).

v0.1.5

Choose a tag to compare

@github-actions github-actions released this 07 Sep 16:06

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 -pprof command-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-driven time.AfterFunc timers (#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.ProgressBarInfinite from 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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 05:26

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

Choose a tag to compare

@github-actions github-actions released this 06 Sep 22:27

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

Choose a tag to compare

@mrpoundsign mrpoundsign released this 06 Sep 08:57

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.Do to eliminate UI thread warning spam (Fixes #6).

NOTE: inkanim cli has been removed from this release for now.

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 06 Sep 06:35

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