Skip to content

Releases: thorvg/thorvg

ThorVG 1.0.0-pre29

25 Sep 14:36
Compare
Choose a tag to compare
ThorVG 1.0.0-pre29 Pre-release
Pre-release

This release improves ThorVG’s engines with stabilized DropShadow and Clipping on CPU, and adds Hit-Detection for GL/WGPU. WGPU rendering issues were fixed by correcting missing transforms, and text rendering is now faster thanks to a new Glyph Cache. Lottie support was enhanced with Layer Effects quality options, masking fixes, and an Asset Resolver, while MSVC build compatibility was also improved.

🚀 Engines

  • [cpu] Improved stability for DropShadow and Clipping features.
  • [gl/wgpu] Added Hit-Detection support.#3746
  • [wgpu] Fixed a shape rendering issue caused by missing transform information. #3762

✨Lottie

  • Added a Layer Effects quality option, allowing users to balance rendering quality and performance. #3795
  • Improved support for a few Mask Inversion options that were previously omitted. #3302
  • Introduced an Asset Resolver for flexible external asset handling. #3533

🔤 TTF

  • Introduced a Glyph Cache to optimize rendering performance for repeated text drawing. #3397

🛠️ Portability

🧩 API Updates

  • C++ API
+ Result LottieAnimation::quality(uint8_t value)
+ Result Picture::resolver(std::function<bool(Paint* paint, const char* src, void* data)> func, void* data)
  • C API
+ Tvg_Result tvg_lottie_animation_set_quality(Tvg_Animation animation, uint8_t value)
+ Tvg_Result tvg_picture_set_asset_resolver(Tvg_Paint picture, Tvg_Picture_Asset_Resolver resolver, void* data)

ThorVG 1.0.0-pre28

11 Sep 17:05
Compare
Choose a tag to compare
ThorVG 1.0.0-pre28 Pre-release
Pre-release

This release enhances text layout handling and extends Paint::duplicate() functionality. CPU engine improvements include memory safety fixes and scalable CLAA logic. Lottie performance was optimized, with better Repeater handling and corrected Track Matte behavior.
C API now uses opaque pointer types, introducing potential breaking changes.

🔧 Core

  • Enhanced text bounding box logic to improve layout accuracy.
  • Enabled Canvas::target() calls during paint object push/remove operations. (See Additional Notes)
  • Added support for previously missing properties in Paint::duplicate().

🚀 Engines

  • [cpu] Resolved memory violation in DropShadow. #3764
  • [cpu] Enhanced to support scalable CLAA logic. #3307

✨Lottie

  • Fixed memory violation related to color stops in slot overriding. #3766
  • Optimized Repeater with memory pooling, improving performance by approximately 2.3% FPS in Lottie examples.
  • Improved parsing logic to correctly handle ty properties, even in deferred scenarios. #3611 #3562
  • Corrected Track Matte behavior to ensure matte is applied only to the immediate target, preventing unintended chaining.

🖼️ Jpeg

  • Fine-tuned jpg decoder with size and performance.
  • Fixed MCU block offset handling. #3699

🔤 TTF

  • Refined codepoint conversion logic for improved efficiency.

🧩 API Updates

  • C++ API
+ enum EngineOption [None, Default, SmartRender]
* Result Picture::load(uint32_t* data, uint32_t w, uint32_t h, ColorSpace cs, bool copy = false)
  -> Result Picture::load(const uint32_t* data, uint32_t w, uint32_t h, ColorSpace cs, bool copy = false)
* SwCanvas* SwCanvas::gen()
  -> SwCanvas* SwCanvas::gen(EngineOption op = EngineOption::Default)
  • C API
+ enum [TVG_ENGINE_OPTION_NONE, TVG_ENGINE_OPTION_DEFAULT, TVG_ENGINE_OPTION_SMART_RENDER]
* Tvg_Result tvg_picture_load_raw(Tvg_Paint* picture, uint32_t *data, uint32_t w, uint32_t h, Tvg_Colorspace cs, bool copy)
  -> Tvg_Result tvg_picture_load_raw(Tvg_Paint* picture, const uint32_t *data, uint32_t w, uint32_t h, Tvg_Colorspace cs, bool copy)
* Tvg_Canvas* tvg_swcanvas_create()
  -> Tvg_Canvas* tvg_swcanvas_create(Tvg_Engine_Option op)

✅ Additional Notes

  • PR #3773 This update may introduce backward compatibility issues in scenarios where applications previously depended on stricter failure checks. Developers are advised to review error-handling logic accordingly.
  • PR #3537 The C API interfaces have been updated to use opaque pointer types, resulting in intentional breaking changes. This redesign improves encapsulation but requires updates in all C-based integrations.

Full Changelog: v1.0-pre27...v1.0-pre28

ThorVG v0.15.15

05 Sep 08:06
Compare
Choose a tag to compare

In this release, core stability has been improved with fixes to paint effect duplication and clipping logic. The CPU engine received performance and memory optimizations, including a fix for a DropShadow memory violation. Lottie features were updated to better align with the spec, and JPEG decoding, Web/WASM bundling, and cross-platform compatibility were also enhanced.

🔧 Core

  • Ensured correct duplication of paint effects. (#3631)
  • Fixed incorrect clipping logic in fast-track rendering paths.

🚀 Engines

  • [cpu] Improved memory efficiency when handling stroke and fill operations.
  • [cpu] Fine-tuned image composition performance.
  • [cpu] Resolved memory violation in DropShadow. #3764
  • [cpu] Enhanced to support scalable CLAA logic. #3307
  • [cpu] Fixed a clipping issue. #3713

✨Lottie

  • Fixed loop() expression behavior. #3652
  • Aligned with Lottie spec: skipped time stretch when time remap is defined. #3591
  • Corrected evaluation of the value property in Lottie expressions. #3693
  • Stabilized GradientFill slot overrides. #3766

🖼️ Jpeg

  • Fine-tuned jpg decoder with size and performance.
  • Fixed MCU block offset handling. #3699

🌐 Web

  • Reduced WASM bundle size by omitting default TTF font data when the TTF loader is disabled. #3481

🛠️ Portability

  • Fixed compilation issues on Windows when building ThorVG as a subproject using static libraries.
  • Corrected directory path parsing issues that prevented Lottie resources from loading properly on MSYS2. #3542

Full Changelog: v0.15.14...v0.15.15

ThorVG 1.0.0-pre27

28 Aug 15:46
Compare
Choose a tag to compare
ThorVG 1.0.0-pre27 Pre-release
Pre-release

The ThorVG canvas and text features have been significantly enhanced, with new support for text outlines, alignment, and picture origin.
Rendering engines (CPU, GL/ES, WGPU) have received performance and stability improvements, while Lottie support is now more robust with refactored slots and better expression handling.

🔧 Core

  • Revised the ThorVG canvas interface for greater flexibility and improved efficiency. #3116
  • Introduced support for rendering text outlines. #3397
  • Added support for horizontal and vertical text alignment. #3397
  • Enabled setting the origin point for picture elements. #1506

🚀 Engines

  • [cpu] Resolved performance regressions introduced in v1.0-pre26.
  • [cpu] Improved memory efficiency when handling stroke and fill operations.
  • [gl/es] Implemented comprehensive scene-level blending support, including HSL-based blend modes. #3072
  • [wgpu] Addressed rendering issues where fill and stroke data were sometimes omitted. #3716
  • [wgpu/gl/es] Enhanced bounding box calculations for stroked paths. #3725

✨Lottie

  • Simplified and standardized slot handling with reusable interfaces. #2591 #3099
  • Corrected evaluation of the "value" property in Lottie expressions. #3693
  • Various fixes to improve overall runtime stability.

🛠️ Portability

  • Corrected directory path parsing issues that prevented Lottie resources from loading properly on MSYS2. #3542

🧩 API Updates

  • C++ API
+ Result Text::outline(float width, uint8_t r, uint8_t g, uint8_t b)
+ Result Text::align(float x, float y)
+ Result Text::layout(float w, float h)
+ Result Picture::origin(float x, float y)
+ Result Picture::origin(float* x, float* y)
  • C API
+ Tvg_Result tvg_text_set_outline(Tvg_Paint* paint, float width, uint8_t r, uint8_t g, uint8_t b)
+ Tvg_Result tvg_text_align(Tvg_Paint* paint, float x, float y)
+ Tvg_Result tvg_text_layout(Tvg_Paint* paint, float w, float h)
+ Tvg_Result tvg_picture_set_origin(Tvg_Paint* picture, float x, float y)
+ Tvg_Result tvg_picture_get_origin(Tvg_Paint* picture, float* x, float* y)
* Tvg_Result tvg_text_set_fill_color() -> Tvg_Result tvg_text_set_color()

✅ Additional Notes

  • PR #3695 This change may break backward compatibility in cases where stricter failure checks were previously expected or relied upon.

Full Changelog: v1.0-pre26...v1.0-pre27

ThorVG 1.0.0-pre26

14 Aug 16:11
Compare
Choose a tag to compare
ThorVG 1.0.0-pre26 Pre-release
Pre-release

This release enhances rendering stability, introduces HSL blending modes, and improves Lottie compliance. It also optimizes the Web build with reduced bundle size and better TypeScript support, while fixing Windows build issues in the infrastructure.

🔧 Core

  • Added a new API to control the visibility of Paint objects.
  • Improved stability for partial rendering behavior. #3679, #3696
  • Fixed incorrect clipping logic in fast-track rendering paths.
  • Refined AABB/OBB bounding box behavior to more accurately include stroke regions in size calculations.

🚀 Engines

  • [wgpu, gl/es] Fixed incorrect Gaussian blur border clamping. #3677
  • [wgpu, gl/es] Added support for HSL-based blend modes: Hue, Saturation, Color, and Luminosity. #2701
  • [gl/es] Adjusted blending logic to align with web standards. #3072
  • [cpu] Improved multi-threaded clipping stability through proper synchronization.
  • [cpu] Ensured rendering updates are triggered only when opacity changes occur.

✨Lottie

  • Fixed loop() expression behavior. #3652
  • Aligned with Lottie spec: skipped time stretch when time remap is defined. #3591

🖼️ GIF

  • Fixed minor memory leaks of background paints.

🌐 Web

  • Reduced WASM bundle size by omitting default TTF font data when the TTF loader is disabled. #3481
  • Enabled closure optimization, reducing JavaScript code size by up to ~45%.
  • Improved TypeScript compatibility by explicitly defining data types. thorvg.web#16

🛠️ Infra

  • Fixed compilation issues on Windows when building ThorVG as a subproject using static libraries.

🧩 API Updates

  • C++ API
+ Result Paint::visible(bool on)
+ bool Paint::visible()
  • C API
+ Tvg_Result tvg_paint_set_visible(Tvg_Paint* paint, bool visible)
+ bool tvg_paint_get_visible(const Tvg_Paint* paint)

✅ Additional Notes

  • Please note that the improvements to the bounds() APIs for AABB/OBB are currently applied only to the software engine. The GL and WebGPU engines still use the legacy behavior.

Full Changelog: v1.0-pre25...v1.0-pre26

ThorVG 1.0.0-pre25

31 Jul 15:26
Compare
Choose a tag to compare
ThorVG 1.0.0-pre25 Pre-release
Pre-release

This release improves stroke rendering quality and performance, adds new blend mode support across CPU and GPU engines, and enhances SVG and hit detection accuracy. Web compliance and effect duplication are now properly handled. Notable optimizations include a 5–25% FPS boost in the WGPU engine.

🔧 Core

  • Improved bounding box calculation to properly account for stroke scalability.
  • Ensured correct duplication of paint effects. (#3631)
  • Added support for region-based hit detection.

🚀 Engines

  • [cpu] Added support for Hue, Color, Saturation, and Luminosity blend modes. (#2701)
  • [wgpu] Optimized the stroke tessellator, improving FPS by approximately 5–25%. (#3557)
  • [wgpu] Enhanced the quality of stroke round joins. (#3288)
  • [wgpu] Improved the visual quality of stroke dashes. (#3273)
  • [wgpu] Revised blending functions to align with web standards. (#3072)
  • [wgpu, gl/es] Introduced support for the Composition blend mode. (#3621)
  • [wgpu, gl/es] Fixed handling of zero-size blur DropShadow. (#3602)

🖼️ SVG

  • Fixed issues with nested node handling. (#3615)

🧩 API Updates

  • C++ API
+BlendMethod::Composition
+bool Paint::intersects(int32_t x, int32_t y, int32_t w, int32_t h)
  • C API
+Tvg_Blend_Method::TVG_BLEND_METHOD_COMPOSITION
+bool tvg_paint_intersects(Tvg_Paint* paint, int32_t x, int32_t y, int32_t w, int32_t h)

Full Changelog: v1.0-pre25...v1.0-pre25

ThorVG v0.15.14

23 Jul 07:15
Compare
Choose a tag to compare

This release includes several improvements and minor bug fixes:

🔧 Core

  • Corrected an incorrect fill rule option in text rendering.
  • Fixed incorrect calculation in multiple mask applications. #3600
  • Improved radial gradient handling to conform with SVG 1.1 and address edge cases.

🚀 Engines

  • [cpu] Improved the DropShadow effect stability
  • [cpu] Updated the SoftLight blending equation to align with the W3C specification.
  • [cpu] Added proper support for zero-size blur in DropShadow effects. #3602
  • [cpu] Revised texture clipping logic to correctly support shapes with inner corners. #3520
  • [cpu] Fixed an issue where lines were missing when a picture was rotated 90 degrees. #3452
  • [gl/es] Fixed broken clipping behavior. #3448

✨Lottie

  • Increased the quality level of GaussianBlur and DropShadow from low to medium.
  • Adjusted DropShadow distance to match Adobe After Effects behavior.
  • Fixed missing offset corners when using miter joins.
  • Ensured proper star/polygon closure to prevent artifacts from inaccurate point comparisons.
  • Corrected an issue causing inaccurate opacity when using the Repeater property.
  • Fixed a specification mismatch when a null layer was applied to layer masking.

🌀 Svg

  • Fix the nested use nodes #3615

✅ Additional Notes

Removed Lena resources previously used in ThorVG. #3499

Full Changelog: v0.15.13...v0.15.14

ThorVG 1.0.0-pre24

17 Jul 13:36
Compare
Choose a tag to compare
ThorVG 1.0.0-pre24 Pre-release
Pre-release

This release brings improved rendering quality, refined visual effects, and better Lottie compatibility. Updates to effects like Tritone, DropShadow, and SoftLight ensure more accurate behavior across platforms. Key adjustments were also made to better match Adobe After Effects, while internal engine tweaks enhance overall stability and performance.

🔧 Core

  • Introduced a blending factor parameter for the Tritone effect.
  • Fixed incorrect calculation in multiple mask applications. #3600
  • Corrected an incorrect fill rule option in text rendering.
  • Improved support for blending methods in the Picture instance.

🚀 Engines

  • [cpu] Fixed a regression in partial rendering that omitted updates for zero opacity. #3570
  • [cpu] Updated the SoftLight blending equation to align with the W3C specification.
  • [cpu] Corrected blending pre-multiplication behavior to improve rendering quality. #1944
  • [cpu] Added proper support for zero-size blur in DropShadow effects. #3602
  • [gl/es] Fixed incorrect alpha multiplication in Tint and Tritone effects.
  • [wgpu] Fixed incorrect alpha multiplication in Tint and Tritone effects.

✨Lottie

  • Increased the quality level of Gaussian Blur and DropShadow from low to medium.
  • Adjusted DropShadow distance to match Adobe After Effects behavior.
  • Added proper support for the blending property in the Tritone layer effect.

🧩 API Updates

  • C++ API
* Result Shape::fill(FillRule r)
  -> Result Shape::fillRule(FillRule r)
  • C API
+ Tvg_Result tvg_scene_reset_effects(Tvg_Paint* scene)
+ Tvg_Result tvg_scene_push_effect_gaussian_blur(Tvg_Paint* scene, double sigma, int direction, int border, int quality)
+ Tvg_Result tvg_scene_push_effect_drop_shadow(Tvg_Paint* scene, int r, int g, int b, int a, double angle, double distance, double sigma, int quality)
+ Tvg_Result tvg_scene_push_effect_fill(Tvg_Paint* scene, int r, int g, int b, int a)
+ Tvg_Result tvg_scene_push_effect_tint(Tvg_Paint* scene, int black_r, int black_g, int black_b, int white_r, int white_g, int white_b, double intensity)
+ Tvg_Result tvg_scene_push_effect_tritone(Tvg_Paint* scene, int shadow_r, int shadow_g, int shadow_b, int midtone_r, int midtone_g, int midtone_b, int highlight_r, int highlight_g, int highlight_b, int blend);

Full Changelog: v1.0-pre23...v1.0-pre24

ThorVG 1.0.0-pre23

03 Jul 15:11
Compare
Choose a tag to compare
ThorVG 1.0.0-pre23 Pre-release
Pre-release

In this release, the partial rendering feature has been added. Since this includes a major internal change along with the new functionality, a dedicated build option is provided to enable or disable it. Please check Additional Notes.

🔧 Renderer & Engines

  • [renderer] Refined condition checks to better determine when to bypass picture composition acceleration.
  • [renderer] Revised paint render update flags for more accurate conditional rendering.
  • [renderer] Enhanced dash pattern handling with support for zero-size dashes. #3205
  • [renderer] Improved radial gradient handling to conform with SVG 1.1 and address edge cases.
  • [software] Fixed a potential memory violation when drawing images partially or entirely off-screen.
  • [software] Added partial rendering support. #1747
  • [software] Fixed an AVX/NEON regression caused by double RLE span increments. #3547
  • [software] Minor clipping performance improvements via faster region access.
  • [software] Adjusted blending operations to better match intended behavior. #3072
  • [wgpu] Skipped forced texture flushes, improving rendering performance by approximately 10%.
  • [gl/es] Fixed broken clipping behavior. #3448

🌀 Lottie

  • [lottie] Fixed missing offset corners when using miter joins.
  • [lottie] Ensured proper star/polygon closure to prevent artifacts from inaccurate point comparisons.
  • [lottie] Improved blending by adding group-level support. #1944
  • [lottie] Resolved excessive memory usage at the masking feature usage.

🧩 API Updates

  • C++ API
* Result Canvas::update(Paint* paint) 
  -> Result Canvas::update()
* uint8_t Paint::unref()
  -> uint16_t Paint::ref()
* uint8_t Paint::ref()
  -> uint16_t Paint::unref()
* uint8_t Paint::refCnt()
  -> uint16_t Paint::refCnt()
  • C API
- tvg_canvas_update_paint()
* uint8_t tvg_paint_ref(...)
  -> uint16_t tvg_paint_ref(...)
* uint8_t tvg_paint_unref(...)
  -> uint16_t tvg_paint_unref(...)
* uint8_t tvg_paint_get_ref(...)
  -> uint16_t tvg_paint_get_ref(...)

✅ Additional Notes

  • [infra] Switched to using Meson-provided build summaries.
  • [infra] Added -Dpartial={true/false} Meson option to toggle partial rendering support.
  • In this release, partial rendering has been applied only to the software engine. To use partial rendering, paint objects must be retained within the canvas, and the buffer clear operation should be skipped during the draw call Result Canvas::draw(bool clear = false).

Full Changelog: v1.0-pre22...v1.0-pre23

ThorVG 1.0.0-pre22

12 Jun 15:22
Compare
Choose a tag to compare
ThorVG 1.0.0-pre22 Pre-release
Pre-release

As we move closer to the ThorVG 1.0.0 milestone, this pre-release represents another significant step toward stabilization and refinement. Please review the release notes carefully, as this version includes behavior corrections, robustness improvements, and various internal fixes across multiple modules.

🔧 Renderer & Engines

  • [software] Improved stability by addressing a potential RLE clipping memory overflow issue.
  • [software] Fixed an issue where lines were missing when a picture was rotated 90 degrees. #3452
  • [software] Improved general texture mapping performance by up to ~15%.
  • [software] Revised texture clipping logic to correctly support shapes with inner corners. #3520
  • [gl/es] Fixed a memory leak triggered by target resizing. #3210
  • [gl/es] Corrected the Canvas buffer clear behavior to properly reflect user intent.
  • [wgpu] Achieved significant performance optimization by reducing internal context-switching overhead, and improving memory efficiency with the uniform stage buffers.

🌀 Lottie

  • [lottie] Fixed a bug in pre-composition masking behavior.
  • [lottie] Corrected an issue causing inaccurate opacity when using the Repeater property.
  • [lottie] Fixed a specification mismatch when a null layer was applied to layer masking.

🧩 API Updates

  • C++ API
+ Shape* Paint::clip()
* Result Paint::clip(Paint* clipper) 
  -> Result Paint::clip(Shape* clipper)
  • C API
+ Tvg_Paint* tvg_paint_get_clip(const Tvg_Paint* paint)
* Tvg_Result tvg_paint_clip(Tvg_Paint* paint, Tvg_Paint* clipper) 
  -> Tvg_Result tvg_paint_set_clip(Tvg_Paint* paint, Tvg_Paint* clipper);

✅ Additional Notes

  • Removed all Lena resources previously used in ThorVG. #3499

Full Changelog: v1.0-pre21...v1.0-pre22