NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1805 most downloaded on crates.io
An SVG simplification library.
Last release 2 months ago
02 Aug 2026
Release timing varies
gaps range from 1 weeks to 9 months
Nearly every release is documented
notes for 55 of 57 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
57 releases · first in 2018
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependencies
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
This release has an MSRV of 1.85.0 for usvg and resvg and the C API.
as_mut_slice future-compatibility warning. (#1108)resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependencies
One column per quarter.
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
This release has an MSRV of 1.89.0 for usvg and resvg and the C API.
The big change in this release is that text support is now backed by
skrifa and
harfrust rather than
ttf-parser and
rustybuzz:
svgz and writer feature gates to reduce the number of required dependencies. (#1088 by @reed-smout)Display implementation for Units. (#986)font-types.harfrust instead of rustybuzz, and font parsing uses skrifa (fontations) instead of ttf-parser. (#922 by @nicoburns)abs_transform. (#1056 by @fundon)fr is now resolved for radial gradients referenced via href. (#1098 by @T1mVo)feComposite with the arithmetic operator when the filter region is larger than the clamped layer. (#1021, #1007)transform (and other group properties like opacity) on a nested svg
element.svg with only width or height specified is now computed from its viewBox aspect ratio. (#1045)wght variation coordinate is now set even when font-weight has its default value. (#1099)href attribute now takes precedence over the deprecated xlink:href when both are present, as required by SVG 2. (#1015)feSpotLight sources. (#1052)resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependencies
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
This release has an MSRV of 1.87.0 for usvg and resvg and the C API.
fr) supported for Radial Gradients. (#1014 by @wmedrano)tiny-skia has a major version bump from 0.11 to 0.12.resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependencies
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
This release has an MSRV of 1.87.0 for usvg and resvg and the C API.
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependencies
resvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
viewsvg is a simple application that showcases resvg capabilities
viewsvg is a simple application that showcases resvg capabilitiesresvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
This is the first release under the stewardship of [Linebender][], who is now responsible for maintenance of this crate. Many thanks to Yevhenii Reizner for the years of hard work that he has poured into this and other crates.
Please note that the license of this project changed from MPL-2.0 to Apache-2.0 OR MIT.
See resvg#838 for more information.
This release has an MSRV of 1.65 for usvg and 1.67.1 for resvg and the C API.
background-color attribute.image-rendering attributes.!important CSS flag.resvg_options_set_stylesheet.
Thanks to [@michabay05][].hsl() and hsla().Apache-2.0 OR MIT.
See resvg#838 for more information.fontdb and rustybuzz have been updated.markers but no actual markers.use references symbol.viewsvg is a simple application that showcases resvg capabilities
viewsvg is a simple application that showcases resvg capabilitiesresvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
resvg_get_object_bboxcargo-c metadata.
Thanks to @lu-zero.From for fontdb and usvg font types.
Thanks to @dhardy.resvg_get_image_bbox returns a layer and not object bounding box now.
Use resvg_get_object_bbox to preserve the old behavior.S or T segments after A.viewBox flattening.viewsvg is a simple application that showcases resvg capabilities
viewsvg is a simple application that showcases resvg capabilitiesresvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows ExplorerCheck CHANGELOG.
zune-jpeg instead of jpeg-decoder.
Thanks to @mattfbacon.viewsvg is a simple application that showcases resvg capabilities
viewsvg is a simple application that showcases resvg capabilitiesresvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows Explorerresvg can render color fonts now, aka Emojis.<br>
In TrueType terms, COLRv0, COLRv1 (mostly), sbix, CBDT and SVG tables are supported.<br>
Thanks to @LaurenzV.usvg::FontResolver now.
Thanks to @LaurenzV.usvg::Options::font_resolver. Similar to usvg::Options::image_href_resolver we already had.usvg::Options::fontdburl("#id").image element viewbox flattening.<br>
Instead of having usvg::Image::view_box that the caller should handle themselves,
we instead replace it with transform and optional clip-path.
This greatly simplifies image rendering.usvg::Image::sizeimage above, but affects the root svg element instead.pattern viewbox flattening.<br>
Similar to image above, but for patterns.usvg::fontdb::Database should be set in usvg::Options and not passed
to the parser separately now.usvg::Options and usvg::ImageHrefResolver have a lifetime now.usvg::Visibility enum with just bool.usvg::Path::visibility() is replaced with usvg::Path::is_visible()usvg::Image::visibility() is replaced with usvg::Image::is_visible()usvg::TextSpan::visibility() is replaced with usvg::TextSpan::is_visible()feImage content as a link to an element.<br>
In SVG, feImage can contain a link to an element or a base64 image data, just like image.
From now, the inlined base64 data will always be represented by a link to an actual image element.<filter>
<feImage xlink:href="data:image/png;base64,..."/>
</filter>
will be parsed as<image id="image1" xlink:href="data:image/png;base64,..."/>
<filter>
<feImage xlink:href="#image1"/>
</filter>
This simplifies feImage rendering, since we don't have to handle both cases now.--list-fonts resvg argument can be used without providing an SVG file now.
Can simply call resvg --list-fonts now.--list-fonts resvg argument includes generic font family names as well now.usvg::ViewBox, usvg::AspectRatio, usvg::Align types. Nol longer used.usvg::filter::Image::aspect. No longer needed.usvg::filter::Image::rendering_mode. No longer needed.usvg::filter::Image::data. Use usvg::filter::Image::root instead.usvg::Tree::view_box. No longer needed.usvg::Image::view_box. No longer needed.usvg::Image::pattern. No longer needed.usvg::utils::align_pos. No longer needed.usvg::Visibility. No longer needed.resvg_get_image_viewbox. Use resvg_get_image_size instead.context-fill handling.
Thanks to @LaurenzV.viewsvg is a simple application that showcases resvg capabilities
viewsvg is a simple application that showcases resvg capabilitiesresvg-0.*.0.tar.xz is a sources archive with vendored Rust dependenciesresvg-explorer-extension.exe is an SVG thumbnailer for Windows Explorercontext-fill and context-stroke support.
Thanks to @LaurenzV.usvg::Text::layouted(), which returns a list of glyph IDs.
It can be used to manually draw glyphs, unlike with usvg::Text::flattened(), which returns
just vector paths.
Thanks to @LaurenzV.text element uses multiple fonts and one of them produces ligatures.use resolving.svg resolving.Node::abs_transform documentation. The current element's transform is included.usvg::Tree is Send + Sync compatible now.
usvg::Tree is Send + Sync compatible now.usvg::WriteOptions::preserve_text to control how usvg generates an SVG.usvg::Image::abs_bounding_boxusvg are immutable now. Meaning that usvg::Tree cannot be modified
after creation anymore.usvg are private now. Use getters instead.usvg::Tree parsing methods require the fontdb argument now.defs children like gradients, patterns, clipPaths, masks and filters are guarantee
to have a unique, non-empty ID.defs children like gradients, patterns, clipPaths, masks and filters are guarantee
to have userSpaceOnUse units now. No objectBoundingBox units anymore.usvg::Mask is allowed to have no children now.text build feature isn't enabled.usvg::Tree::clip_paths, usvg::Tree::masks, usvg::Tree::filters returns
a pre-collected slice of unique nodes now.
It's no longer a closure and you do not have to deduplicate nodes by yourself.usvg::filter::Primitive::x, y, width and height methods were replaced
with usvg::filter::Primitive::rect.usvg::Tree::paint_servers into usvg::Tree::linear_gradients,
usvg::Tree::radial_gradients, usvg::Tree::patterns.
All three returns pre-collected slices now.usvg::Path no longer can have an invalid bbox. Paths with an invalid bbox will be
rejected during parsing.usvg methods that return bounding boxes return non-optional Rect now.
No NonZeroRect as well.usvg::Text::flattened returns &Group and not Option<&Group> now.usvg::ImageHrefDataResolverFn and usvg::ImageHrefStringResolverFn
require fontdb::Database argument.Arc and not Rc<RefCell> now.resvg::render_node now includes filters bounding box. Meaning that a node with a blur filter
no longer be clipped.usvg::utils::view_box_to_transform with usvg::ViewBox::to_transform.usvg::XmlOptions into usvg::WriteOptions and embed xmlwriter::Options.usvg::Tree::postprocess() and usvg::PostProcessingSteps. No longer needed.usvg::ClipPath::units(), usvg::Mask::units(), usvg::Mask::content_units(),
usvg::Filter::units(), usvg::Filter::content_units(), usvg::LinearGradient::units(),
usvg::RadialGradient::units(), usvg::Pattern::units(), usvg::Pattern::content_units()
and usvg::Paint::units(). They are always userSpaceOnUse now.usvg::Units. No longer needed.image aspect ratio when only width or height are present.
Thanks to @LaurenzV.font shorthand parsing. Thanks to @LaurenzV.
font shorthand parsing.
Thanks to @LaurenzV.usvg::Group::abs_bounding_boxusvg::Group::abs_stroke_bounding_boxusvg::Path::abs_bounding_boxusvg::Path::abs_stroke_bounding_boxusvg::Text::abs_bounding_boxusvg::Text::abs_stroke_bounding_boxusvg-* crates merged into one. There is just the usvg crate now, as before.usvg::Group::abs_bounding_box() method. It's a field now.usvg::Group::abs_filters_bounding_box()usvg::TreeParsing, usvg::TreePostProc and usvg::TreeWriting traits.
They are no longer needed.font-family parsing.
Thanks to @LaurenzV.Each usvg::Node stores its absolute transform now. Node::abs_transform() executes in constant time now.
usvg::Node stores its absolute transform now.
Node::abs_transform() executes in constant time now.usvg::Tree::calculate_bounding_boxes to calculate all bounding boxes beforehand.usvg::Node::bounding_box which returns a precalculated node's bounding box in object coordinates.usvg::Node::abs_bounding_box which returns a precalculated node's bounding box in canvas coordinates.usvg::Node::stroke_bounding_box which returns a precalculated node's bounding box,
including stroke, in object coordinates.usvg::Node::abs_stroke_bounding_box which returns a precalculated node's bounding box,
including stroke, in canvas coordinates.resvg_get_node_stroke_bboxusvg::Node::filters_bounding_boxusvg::Node::abs_filters_bounding_boxusvg::Tree::postprocessresvg renders usvg::Tree directly again. resvg::Tree is gone.usvg no longer uses rctree for the nodes tree implementation.
The tree is a regular enum now.
*node.borrow().Rc<RefCell> access.Rc<RefCell> provides a shared mutable access.Rc<RefCell<T>> instead of Rc<T>.
This is required for proper mutability since Node itself is no longer an Rc.usvg::NodeKind into usvg::Node.resvg::Tree. No longer needed. resvg can render usvg::Tree directly once again.rctree::Node methods. The Node API is completely different now.usvg::NodeExt. No longer needed.usvg::Node::calculate_bbox. Use usvg::Node::abs_bounding_box instead.usvg::Tree::convert_text. Use usvg::Tree::postprocess instead.usvg::TreeTextToPath trait. No longer needed.mask-type as a presentation attribute.feImage rendering with a non-default position.
Thanks to @LaurenzV.usvg can write text back to SVG now. Thanks to @LaurenzV.
usvg can write text back to SVG now.
Thanks to @LaurenzV.--preserve-text flag to the usvg CLI tool.
Thanks to @LaurenzV.transform-origin
property.
Thanks to @LaurenzV.paint-order.
Previously, only fill and stroke could have been swapped.
Thanks to @LaurenzV.usvg_tree::Text::flattened that will contain a flattened/outlined text.usvg_tree::Text::bounding_box. Will be set only after text flattening.usvg_tree::NodeExt::abs_transform by storing absolute transforms in the tree
instead of calculating them each time.usvg_tree::Text::positions was replaced with usvg_tree::Text::dx and usvg_tree::Text::dy.<br>
usvg_tree::CharacterPosition::x and usvg_tree::CharacterPosition::y are gone.
They were redundant and you should use usvg_tree::TextChunk::x
and usvg_tree::TextChunk::y instead.usvg_tree::LinearGradient::id and usvg_tree::RadialGradient::id are moved to
usvg_tree::BaseGradient::id.clipPaths
and filters could have generated IDs, but it wasn't very reliable and mostly unnecessary.
Renderer doesn't rely on them and usvg writer would generate them anyway.usvg_text_layout::Tree::convert_text no longer replaces
original text elements with paths, but instead puts them into usvg_tree::Text::flattened.transform field from usvg_tree::Path, usvg_tree::Image and usvg_tree::Text.
Only usvg_tree::Group can have it.<br>
It doesn't break anything, because those properties were never used before anyway.<br>
Thanks to @LaurenzV.usvg_tree::CharacterPositionusvg_tree::Path::text_bbox. Use usvg_tree::Text::bounding_box instead.usvg_text_layout::TextToPath trait for Text nodes.
Only the whole tree can be converted at once.Image node.
Thanks to @LaurenzV.text-decoration resolving in some cases.
Thanks to @LaurenzV.stroke-linejoin=miter-clip support. SVG2. Thanks to @torokati44.
stroke-linejoin=miter-clip support. SVG2.
Thanks to @torokati44.fill="url('#gradient')". SVG2.
Thanks to @romanzes.rgb() and rgba() colors. SVG2.
Thanks to @yisibl.auto-start-reverse variant support to orient in markers. SVG2.
Thanks to @EpicEricEE.Panic when an element is completely outside the viewbox.
FillPaint and StrokePaint filter inputs support.
It's a mostly undocumented SVG feature that no one supports and no one uses.
And it was adding a significant complexity to the codebase.usvg::filter::Filter::fill_paint and usvg::filter::Filter::stroke_paint.BackgroundImage, BackgroundAlpha, FillPaint and StrokePaint from usvg::filter::Input.usvg::Group::filter_fill_paint and usvg::Group::filter_stroke_paint.Transform components order. Affects only usvg SVG output and C API.
usvg SVG output and C API.usvg uses tiny-skia geometry primitives now, including the Path container. The main difference compared to the old usvg primitives is that tiny-skia u
usvg uses tiny-skia geometry primitives now, including the Path container.<br>
The main difference compared to the old usvg primitives
is that tiny-skia uses f32 instead of f64.
So while in theory we could loose some precision, in practice, f32 is used mainly
as a storage type and precise math operations are still done using f64.<br>
tiny-skia primitives are move robust, strict and have a nicer API.<br>
More importantly, this change reduces the peak memory usages for SVGs with large paths
(in terms of the number of segments).
And removes the need to convert usvg::PathData into tiny-skia::Path before rendering.
Which was just a useless reallocation.f32 instead of f64 now.tiny-skia::Path now, we allow quadratic curves as well.
This includes usvg CLI output.usvg::Path no longer implements Default. Use usvg::Path::new instead.usvg::Rect with tiny_skia::NonZeroRect.usvg::PathBbox with tiny_skia::Rect.usvg::PathBbox, tiny_skia::Rect allows both width and height to be zero.
This is not an error.usvg::filter::Turbulence::base_frequency was split into base_frequency_x and base_frequency_y.usvg::NodeExt::calculate_bbox no longer includes stroke bbox.float instead of double everywhere.svgfilters crate was merged into resvg.rosvgtree crate was merged into usvg-parser.usvg::Group::filter_fill moved to usvg::filter::Filter::fill_paint.usvg::Group::filter_stroke moved to usvg::filter::Filter::stroke_paint.usvg::Point. Use tiny_skia::Point instead.usvg::FuzzyEq. Use usvg::ApproxEqUlps instead.usvg::FuzzyZero. Use usvg::ApproxZeroUlps instead.resvg_path_bbox. Use resvg_rect instead.svgfilters crate.rosvgtree crate.transform on clipPath children in usvg SVG output.usvg SVG output and doesn't affect rendering.A new rendering algorithm. When rendering isolated groups, aka layers, we have to know the layer bounding box beforehand, which is ridiculously hard i
paris-30k.svg content,
then we're 13 times faster. From ~3252ms down to ~253ms.resvg::Tree, aka a render tree, which is an even simpler version of usvg::Tree.
usvg::Tree had to be converted into resvg::Tree before rendering now.crates directory now.resvg::Tree::render instead of resvg::render.--export-area-drawing option uses calculated bounds instead of trimming
excessive alpha now. It's faster, but can lead to a slightly different output.fit_to argument from resvg_render.fit_to argument from resvg_render_node.usvg::ScreenSize moved to resvg.usvg::ScreenRect moved to resvg.resvg::ScreenSize into resvg::IntSize.resvg::ScreenRect into resvg::IntRect.filter build feature from resvg. Filters are always enabled now.resvg::FitTousvg::utils::view_box_to_transform_with_clipusvg::Size::to_screen_size. Use resvg::IntSize::from_usvg instead.usvg::Rect::to_screen_size. Use resvg::IntSize::from_usvg(rect.size()) instead.usvg::Rect::to_screen_rect. Use resvg::IntRect::from_usvg instead.resvg_fit_toresvg_fit_to_typefont-family.enable-background support. This feature was never supported by browsers and was deprecated in SVG 2. To my knowledge, only Batik has a good support of…
mask-type property support. SVG2usvg_tree::MaskTypeusvg_tree::Mask::kindBackgroundImage and BackgroundAlpha filter inputs will produce the same output
as SourceGraphic and SourceAlpha respectively.enable-background support. This feature was never supported by browsers
and was deprecated in SVG 2. To my knowledge, only Batik has a good support of it.
Also, it's a performance nightmare, which caused multiple issues in resvg already.usvg_tree::EnableBackgroundusvg_tree::Group::enable_backgroundusvg_tree::NodeExt::filter_background_start_node(usvg) --coordinates-precision and --transforms-precision writing options. Thanks to @flxzt.
usvg::Tree::paint_serversusvg::Tree::clip_pathsusvg::Tree::masksusvg::Tree::filtersusvg::Node::subroots--coordinates-precision and --transforms-precision writing options.
Thanks to @flxzt.fill-opacity and stroke-opacity resolving.transform when resolving symbol.symbol clipping when its viewbox is the same as the document one.Readd usvg CLI tool. Can be installed via cargo as before.
usvg CLI tool. Can be installed via cargo as before.usvg internals into new usvg-tree and usvg-parser crates.
usvg-tree contains just the SVG tree and all the types.
usvg-parser parsers SVG into usvg-tree.
And usvg is just an umbrella crate now.usvg::Tree::from* methods one should import the usvg::TreeParsing trait now.usvg-text-layout manually anymore. It is part of usvg now.rosvgtree no longer reexports svgtypes.rosvgtree::Node::attribute returns just a string now.rosvgtree::Node::find_attribute returns just a rosvgtree::Node now.usvg::Stretch into usvg::FontStretch.usvg::Style into usvg::FontStyle.usvg::FitTo moved to resvg::FitTo.usvg::IsDefault trait is private now.rosvgtree::FromValue. Due to Rust's orphan rules this trait is pretty useless.transform attributes without skipping the whole element.svg elements.
Thanks to @LaurenzV.text-decoration on text with only one cluster.
Thanks to @LaurenzV.resvg CLI allows files with XML DTD again.resvg CLI loads system fonts only when an input SVG has text nodes now. Fonts loading is an IO-heavy operation and by avoiding it we can speed up resv
resvg CLI loads system fonts only when an input SVG has text nodes now.
Fonts loading is an IO-heavy operation and by avoiding it we can speed up resvg execution.usvg::Group::should_isolateusvg::Tree::has_text_nodesusvg internals were moved into the new rosvgtree crate.usvg::Group::should_isolate to check
if a group affects rendering.usvg-text-layout::TreeTextToPath::convert_text no longer has the keep_named_groups argument.usvg::Options::keep_named_groups. Dummy groups are no longer removed.resvg_options_set_keep_named_groupsResvgOptions::setKeepNamedGroupsfont-family handling.font-weight resolving.usvg::Text and usvg::NodeKind::Text.
usvg::Text and usvg::NodeKind::Text.usvg isn't converting text to paths by default now. A caller must call
usvg::Tree::convert_text or usvg::Text::convert from usvg-text-layout crate on demand.usvg text layout implementation moved into usvg-text-layout crate.width, height and viewBox attributes have been set,
text nodes are no longer taken into an account. This is because a text node has no bbox
before conversion into path(s), which we no longer doing during parsing.usvg is purely an SVG parser now. It doesn't convert text to paths
and doesn't write SVG anymore.usvg::filter::ConvolveMatrixData methods are fields now.usvg CLI binary. No alternatives for now.usvg build features.
filter. Filter elements are always parsed by usvg now.text. Text elements are always parsed by usvg now.export. usvg cannot write an SVG anymore.usvg::Tree::to_string. usvg cannot write an SVG anymore.usvg::TransformFromBBox trait. This is just a regular usvg::Transform method now.usvg::OptionsRef. usvg::Options is enough from now.usvg::Options::fontdb. Used only by usvg-text-layout now.--dump-svg from resvg.lengthAdjust and textLength attributes support.
lengthAdjust and textLength attributes support.image size detection.
width and height attributes can be omitted or set to auto on image now. SVG2--query-all flag in resvg CLI.Allow dominant-baseline and alignment-baseline to be set via CSS.
dominant-baseline and alignment-baseline to be set via CSS.Minimal dominant-baseline and alignment-baseline support.
dominant-baseline and alignment-baseline support.mix-blend-mode and isolation support. SVG2kerning="0" and style="font-kerning:none". SVG2<percentage> values for opacity, fill-opacity, stroke-opacity,
flood-opacity and stop-opacity attributes.<br>
You can write opacity="50%" now. SVG2feMorphology radius value resolving.svg when only the viewBox attribute is present.Partial paint-order attribute support. Markers can only be under or above the shape.
paint-order attribute support.
Markers can only be under or above the shape.rustybuzz update.CSS3 writing-mode variants vertical-rl and vertical-lr. Thanks to yisibl.
writing-mode variants vertical-rl and vertical-lr.
Thanks to yisibl.usvg::Tree stores only Group, Path and Image nodes now.
Instead of emulating an SVG file structure, where gradients, patterns, filters, clips and masks
are part of the nodes tree (usually inside the defs element), we reference them using Rc
from now.
This change makes usvg a bit simpler. Makes usvg API way easier, since instead of
looking for a node via usvg::Tree::defs_by_id the caller can access the type directly via Rc.
And makes creation of custom usvg::Trees way easier.clip_path, mask and filters usvg::Group fields store Rc instead of String now.usvg::NodeExt::units was moved to usvg::Paint::units.usvg::filter::ImageKind::Use stores usvg::Node instead of String.usvg::PathData stores commands and points separately now to reduce overall memory usage.usvg::PathData segments should be accessed via segments() now.strict-num crate.NormalizedValue into NormalizedF64.PositiveNumber into PositiveF64.get() method instead of value() now.usvg::TextSpan::font_size is NonZeroPositiveF64 instead of f64 now.usvg and tiny-skia dependencies in resvg.roxmltree dependency in usvg.usvg::Tree::create. usvg::Tree is an open struct now.usvg::Tree::root. It's a public field now.usvg::Tree::svg_node. Replaced with usvg::Tree public fields.defs, is_in_defs, append_to_defs and defs_by_id from usvg::Tree.
We no longer emulate SVG structure. No alternative.usvg::Tree::is_in_defs. There are no defs anymore.usvg::Paint::Link. We store gradient and patterns directly in usvg::Paint now.usvg::Svg. No longer needed. size and view_box are usvg::Tree fields now.usvg::SubPathIter and usvg::PathData::subpaths. No longer used.resvg_is_image_empty output was inverted.Panic during recursive pattern resolving. Thanks to FylmTM.
#RRGGBBAA and #RGBA color notation support.
Thanks to demurgos.pattern resolving.
Thanks to FylmTM.--export-id.
Thanks to benoit-pierre.Support svg referenced by use. External SVG files are still not supported.
svg referenced by use. External SVG files are still not supported.ttf-parser, fontdb and rustybuzz have been updated.usvg::ImageHrefResolver that allows a custom xlink:href handling. Thanks to antmelnyk.
usvg::ImageHrefResolver that allows a custom xlink:href handling.
Thanks to antmelnyk.usvg::Options::image_href_resolver<image> element.usvg::ImageKind stores data as Arc<Vec<u8>> and not just Vec<u8> now.svg element defines a new viewBox now. Previously, we were always using the root one.resvg::render and resvg::render_node accept a transform now.
resvg::render and resvg::render_node accept a transform now.resvg_render and resvg_render_node accept a transform now.usvg::Color is a custom type and not a svgtypes::Color reexport now.usvg::Color doesn't contain alpha anymore, which have been added in v0.16
Alpha would be automatically flattened.
This makes Micro SVG
compatible with SVG 1.1 again.RESVG_FIT_TO_* into RESVG_FIT_TO_TYPE_*.--background argument in resvg correctly handles alpha now.Better text-on-path converter accuracy by accounting the current transform.
usvg::NodeExt::abs_transform includes current node transform now.filter build feature. Enabled by default.
filter build feature. Enabled by default.usvg::PathBbox and resvg_path_bbox (to C API).filter module now.Fe prefix from all filter types.resvg_get_node_bbox returns resvg_path_bbox now.text feature.tiny-skia updated with support of images larger than 8000x8000 pixels.
tiny-skia updated with support of images larger than 8000x8000 pixels.feDropShadow support. SVG2<filter-value-list> support.
Meaning that the filter attribute can have multiple values now.
Like url(#filter1) blur(2). SVG2feBlend modes. SVG2width/height/viewBox is not set.
Thanks to reknih.usvg::Options::default_size--default-width and --default-height to usvg.usvg::Group::filter is a list of filter IDs now.usvg::FeColorMatrixKind::Saturate accepts any positive f64 value now.svgfilters::ColorMatrix::Saturate accepts any positive f64 value now.memmap-fonts.
Now you can build resvg/usvg with system-fonts, but without memmap-fonts.
Enabled by default.--dump-svg argument in resvg CLI tool should be enabled using --features dump-svg now.
No enabled by default.usvg::Tree::to_string is behind the export build feature now.usvg will use rgba() notations for colors instead of #RRGGBB.CSS3 colors support. Specifically rgba, hsl, hsla and transparent. SVG2
rgba, hsl, hsla and transparent. SVG2rx/ry attributes on ellipse. SVG2textPath can reference basic shapes now. SVG2usvg::OptionsRef, which is a non-owned usvg::Options variant.simplecss updated with CSS specificity support.turn angle unit support. SVG2font-variant=small-caps support. No font fallback.--export-area-page to resvg.--export-area-drawing to resvg.resvg::render_node requires usvg::Tree now.usvg::Color gained an alpha field.usvg::Node::tree. Cannot be implemented efficiently anymore.usvg::SystemFontDB. No longer needed.pattern scaling.symbol resolving speed in usvg.tspan.Allow reading SVG from stdin in resvg binary.
resvg binary.--id-prefix to usvg.FitTo::Sizeresvg binary accepts --width and --height args together now.
Previously, only --width or --height were allowed.usvg::Path::text_bboxusvg::Error::ElementsLimitReachedresvg --perf.usvg::XmlOptions rewritten.usvg::Tree::to_string requires a reference to XmlOptions now.usvg::Tree::from_file. Use from_data or from_str instead.usvg::Error::InvalidFileSuffixusvg::Error::FileOpenFailedRESVG_ERROR_INVALID_FILE_SUFFIXuse style propagation when used with symbol.usvg uses font metrics instead of path bbox now.Allow href without the xlink namespace. This feature is part of SVG 2 (which we do not support), but there are more and more files like this in the wi
href without the xlink namespace.
This feature is part of SVG 2 (which we do not support),
but there are more and more files like this in the wild.usvg:version to the output SVG.overflow='inherit' resolving.startOffset property in textPath.feImage resolving when the linked element has
opacity, clip-path, mask and/or filter attributes.feImage resolving.Multiple critical bugs in tiny-skia.
tiny-skia.### Fixed - image with float size scaling. - Critical bug in tiny-skia.
image with float size scaling.tiny-skia.--resources-dir option to CLI tools.
--resources-dir option to CLI tools.Tree::from_xmltreeImage struct. render() and render_node() methods now accept tiny_skia::PixmapMut.fontdb.tiny-skia.resvg_size uses double instead of uint32_t now.defaultSize() and defaultSizeF() methods now return SVG size
and not SVG viewbox size.Options::path changed to Options::resources_dir and requires a directory now.resvg_options_set_file_path changed to resvg_options_set_resources_dir
and requires a directory now.ResvgOptions::setFilePath changed to ResvgOptions::setResourcesDir
and requires a directory now.text-decoration attribute.Image. Use tiny_skia::PixmapMut instead.resvg_image struct and resvg_image_* methods. resvg renders onto
the provided buffer now.resvg_color, because unused.resvg no longer requires a C++ compiler!
tiny-skia was updated to a pure Rust version, which means that resvg no longer
depends on clang and should work on 32bit targets.rustybuzz was updated to a pure Rust version.tools/explorer-thumbnailer is back and written in Rust now.
Thanks to gentoo90.textPath processing fixes by chubei-oppen.boundsOnElement and boundingBox were returning transposed bounds.All backends except Skia were removed. Skia is the only official one from now.
--serif-family, --sans-serif-family, --cursive-family, --fantasy-family
--monospace-family, --use-font-file, --use-fonts-dir, --skip-system-fonts and --list-fonts
options to all CLI tools.cargo test.harfbuzz_rs with rustybuzz.usvg::Options now.fontdb module moved into its own crate.fontconfig is no longer used for matching
generic fonts
on Linux. Mainly because it's very slow.image element contains a file path, the file will be loaded into memory now,
instead of simply storing a file path. And will be dumped as base64 on SVG save.
In case of an SVG image, it will be loaded as a Tree and saved as base64 encoded XML on save.ImageData replaced with ImageKind.Options from all backends. We don't use it anymore.ImageFormat.The resvg crate has been split into four: resvg-cairo, resvg-qt, resvg-skia and resvg-raqote. So from now, instead of enabling a required backend via
resvg crate has been split into four: resvg-cairo, resvg-qt, resvg-skia and resvg-raqote.<br/>
So from now, instead of enabling a required backend via cargo features,
you should select a required backend-specific crate.<br/>
This allows us to have a better integration with a selected 2D library.<br/>
And we also have separated C API implementations now.<br/>
And each backend has its own vendored archive too.QImage instead of Rust libraries for raster images loading.resvg crate. Use backend-specific crates.tools/rendersvg. Each backend has its own CLI tool now.tools/usvg. usvg implements CLI by default now.resvg_*_render_to_file methods.jpeg-decoder and png dependencies.Stack overflow when enable-background and filter are set on the same element.
enable-background and filter are set on the same element.letter-spacing processing.marker-end rendering when the last segment is a curve with the second control point
that coincides with end point.image data without mime.dy calculation for textPath thanks to StoeoeftextPath resolving when a referenced path has a transform.<br/>
Thanks to Stoeoef.feConvolveMatrix, feMorphology, feDisplacementMap, feTurbulence, feDiffuseLighting and feSpecularLighting support.
feConvolveMatrix, feMorphology, feDisplacementMap, feTurbulence,
feDiffuseLighting and feSpecularLighting support.BackgroundImage, BackgroundAlpha, FillPaint and StrokePaint support as a filter input.enable-background support.OutputImage::make_vec and OutputImage::make_rgba_vec.feImage with a reference to an internal element.feComposite k1-4 coefficients can have any number now.
This matches browsers behaviour.flate2 instead of libflate for GZip decoding.fill and stroke attributes will always be set for path now.g, path and image can now be set inside defs. Required by feImage.resvg_*_render_to_image into resvg_*_render_to_file.feComposite with fully transparent region was producing an invalid result.matrix in feColorMatrix when type is not set or invalid.use elements.feFlood with subregion and primitiveUnits=objectBoundingBox.A Skia backend thanks to JaFenix.
feComponentTransfer support.feColorMatrix support.*.otf fonts support.dx, dy are supported inside textPath now.feGaussianBlur with stdDeviation>=2.
This is 4-8 times faster than IIR blur.
Thanks to Shnatsel.pico-args instead of gumdrop to reduced the build time of tools/rendersvg
and tools/usvg.xmlwriter is used for SVG generation now.
Almost 2x faster than generating an svgdom.OutputImage::save -> OutputImage::save_png.Path::segments -> Path::data.baseline-shift processing inside textPath.tref element children.tref with xml:space resolving.tref.clipPath children that were referenced via use.currentColor will always fallback to black now.
Previously, stroke was set to none which is incorrect.use can reference an element inside a non-SVG element now.style element and attribute.gdk-pixbuf dependency.svgdom dependency.New text layout implementation:
textPath support.writing-mode support, aka vertical text.word-spacing is supported for all backends now.harfbuzz dependency.shape-rendering, text-rendering and image-rendering support.arithmetic operator for feComposite.--quiet argument.resvg_get_image_bbox.ResvgRenderer::boundingBox.usvg side now.image element with a zero or negative size will be skipped now.
Previously, a linked image size was used, which is incorrect.Rect, Size, etc) are immutable and always valid now.color-interpolation-filters attribute will not be exported now.Path now.InitObject and init() because they are no longer needed.resvg_handle, resvg_init, resvg_destroy.resvg_cairo_get_node_bbox and resvg_qt_get_node_bbox.
Use backend-independent resvg_get_node_bbox instead.pango dependency.Backend::calc_node_bbox. Use Node::calculate_bbox() instead.letter-spacing on cursive scripts (like Arabic).resvg_is_image_empty was always returning false.filter with objectBoundingBox was set on an empty group.mask with objectBoundingBox resolving.pattern's viewBox attribute resolving via href.(usvg) transform multiplication.
transform multiplication.use inside clipPath resolving.(usvg) A better algorithm for unused defs (defs element children, like gradients) removal.
baseline-shift support.renderToImage.defs element children, like gradients) removal.Error::InvalidSize.RESVG_ERROR_INVALID_SIZE.baseline-shift with sub, super and percent values calculation.usvg.render methods are const now.use now.tspan rendering, the text bbox will be used instead
of the tspan bbox itself. This is the correct behaviour by the SVG spec.font-family parsing.filter:none processing.text inside text processing.use resolving.xlink:href links.marker-* links.use resolving.dx/dy processing on text.textAnchor resolving.fill-rule on text.Partial baseline-shift support.
marker support.baseline-shift support.letter-spacing support.word-spacing support.
Does not work on the cairo backend.objectBoundingBox support.color on use resolving.offset attribute resolving inside the stop element.rotate attribute resolving.userSpaceOnUse.clipPath
that had filter on a child.svg element.SmoothCurveTo and SmoothQuadratic conversion.symbol resolving.stroke-miterlimit attribute parsing.length and number attribute types parsing.offset attribute parsing.(resvg) Initial filters support.
clipPath and mask support.font-family, font-size and languages to args.systemLanguage attribute support.RESVG_ERROR_PARSING_FAILED.font_family, font_size and languages to resvg_options.ResvgRenderer::setDevicePixelRatio.gumdrop instead of getopts.image tag.display attribute processing.mask resolving.inherit attribute value resolving.failure dependency.(resvg) Advanced text layout support (lists of x, y, dx, dy and rotate).
resvg_is_image_empty.resvg_error enum.image element.symbol element support.svg elements support.resvg_parse_tree_from_file, resvg_parse_tree_from_data
resvg_cairo_render_to_image and resvg_qt_render_to_image
will return an error code now.gdk-pixbuf crate instead of image.Render::render_to_image and Render::render_node_to_image will return
Option and not Result now.render_* modules to backend_.getopts instead of clap to reduce the executable size.StreamExt::parse_iri and StreamExt::parse_func_iri will parse
not only well-formed data now.objectBoundingBox rendering.image element clipping.resvg_get_node_transform will return a correct transform now.text-decoration thickness.pattern scaling.image without size rendering.visibility resolving.use attributes resolving.clipPath and mask attributes resolving.offset attribute in stop element resolving.font-size attribute resolving.switch element resolving.xml:space processing.Paint::from_span poor performance.resvg_error_msg_destroy.parse_rtree_* methods. Use usvg::Tree::from_ instead.Error.(svg) Partial clipPath support.
clipPath support.mask support.pattern support.preserveAspectRatio support.--query-all and --export-id arguments to render SVG items by ID.--perf argument for a simple performance stats.font-size attribute inheritance during use resolving.Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →