SVG 1.1 Full Static Support

About

This page contains results of the resvg test suite which is specifically designed for the resvg library.

What we do not test

  • Features that isn’t yet implemented in the resvg.

  • XML parsing. Except some DTD and namespace resolving we assume that SVG library supports full XML 1.0 spec.

  • Extended CSS support.

  • Extended raster image formats features. We assume that underlying PNG and JPEG libraries are good.

  • Pointer events.

  • Animations.

  • Scripting.

Tests summary

resvg 0.40.0 Chrome 123 Firefox 124 Safari 17.3.1 librsvg 2.58.0 Inkscape 1.3.2 Batik 1.17 SVG.NET 3.2.3 QtSvg 6.7.0 0 404 807 1211 1614 1518 1421 1383 1339 1168 983 976 530 589 Tests passed

Legend

Passed
Failed
Crashed
? Undefined behavior

Tests

Structure

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
a 100% 100% 100% 100% 100% 100% 100% 60% 100%
Inside text
Inside `tspan`
On shape
On text
On `tspan`
defs 100% 100% 100% 100% 100% 100% 100% 86% 100%
Ignore shapes inside `defs`
Multiple `defs`
Nested `defs`
Out of order
Simple case
Style inheritance on text
Style inheritance
g 100% 100% 100% 100% 50% 100% 100% 100% 100%
Deeply nested groups
Recursive inheritance
image 93% 80% 93% 78% 80% 49% 40% 87% 31%
Embedded 16bit PNG ?
Embedded GIF ?
Embedded JPEG as image/jpeg
Embedded JPEG as image/jpg
Embedded JPEG without mime
Embedded PNG
Embedded SVG with text ?
Embedded SVG without mime
Embedded SVG
Embedded SVGZ
External GIF ?
External JPEG
External PNG
External SVG with transform
External SVG
External SVGZ
Float size (UB) ? ? ? ? ? ? ? ? ?
Image with float size scaling ?
No `height` non square ?
No `height` on SVG (UB) ? ? ? ? ? ? ? ?
No `height` (SVG 2) ?
No `width` and `height` on SVG (UB) ? ? ? ? ? ? ? ?
No `width` and `height` (SVG 2) ?
No `width` on SVG (UB) ? ? ? ? ? ? ? ?
No `width` (SVG 2) ?
preserveAspectRatio=none on SVG
preserveAspectRatio=none
preserveAspectRatio='xMaxYMax meet' on SVG
preserveAspectRatio='xMaxYMax meet'
preserveAspectRatio='xMaxYMax slice' on SVG
preserveAspectRatio='xMaxYMax slice'
preserveAspectRatio='xMidYMid meet' on SVG
preserveAspectRatio='xMidYMid meet'
preserveAspectRatio='xMidYMid slice' on SVG
preserveAspectRatio='xMidYMid slice'
preserveAspectRatio='xMinYMin meet' on SVG
preserveAspectRatio='xMinYMin meet'
preserveAspectRatio='xMinYMin slice' on SVG
preserveAspectRatio='xMinYMin slice'
Raster image and size with odd numbers
Recursive (1)
Recursive (2)
URL to PNG ?
URL to SVG ?
`width` and `height` set to `auto` (SVG 2) ?
With transform ?
With zero `width` and `height`
Zero `height`
Zero `width`
style 88% 94% 94% 94% 88% 81% 81% 75% 62%
Attribute selector
Class selector
Combined selectors
External CSS
ID selector
`!important` ?
Invalid type
Non-presentational attribute
Resolve order
Rule specificity
Style after usage
Style inside CDATA
`transform`
Type selector
Universal selector
Unresolved class selector
style-attribute 100% 75% 75% 75% 50% 75% 75% 75% 75%
Comments
Non-presentational attribute
Simple case
`transform`
svg 97% 100% 100% 100% 74% 66% 100% 66% 24%
Attribute value via ENTITY reference
Deeply nested svg
Elements via ENTITY reference (1)
Elements via ENTITY reference (2)
Elements via ENTITY reference (3)
Explicit `svg` namespace
`FuncIRI` parsing (UB) ? ? ? ? ? ? ? ? ?
`FuncIRI` with invalid characters (UB)
`FuncIRI` with quotes (SVG 2) ?
Invalid `id` attribute (UB) (1) ? ? ? ? ? ? ? ? ?
Invalid `id` attribute (UB) (2) ? ? ? ? ? ? ? ? ?
Mixed namespaces
Negative size
Nested svg, one with rect and one with viewBox ?
Nested svg with overflow:auto
Nested svg with overflow:visible
Nested svg with rect and percent values ?
Nested svg with rect and viewBox (1)
Nested svg with rect and viewBox (2)
Nested svg with rect and viewBox (3)
Nested svg with rect and viewBox and percent values ?
Nested svg with rect
Nested svg with relative width and height ?
Nested svg with viewBox and percent values ?
Nested svg with viewBox
Nested svg
No children
No size
Not UTF-8 encoding
`preserveAspectRatio` with `viewBox` not at zero pos
preserveAspectRatio=none
preserveAspectRatio='xMaxYMax slice'
preserveAspectRatio=xMaxYMax
preserveAspectRatio='xMidYMid slice'
preserveAspectRatio=xMidYMid
preserveAspectRatio='xMinYMin slice'
preserveAspectRatio=xMinYMin
Proportional `viewBox`
`rect` inside a non-SVG element
`viewBox` not at zero pos
`xmlns` validation
Zero size
switch 100% 92% 92% 69% 92% 69% 62% 8% 77%
Comment as first child
`display:none` on child
Non-SVG child
`requiredFeatures`
Simple case
Single child
`systemLanguage`
systemLanguage='en-GB'
systemLanguage='en-US'
systemLanguage='en'
systemLanguage='ru-Ru'
systemLanguage='ru, en'
With attributes
symbol 100% 100% 94% 100% 100% 56% 81% 56% 50%
Content outside the viewbox ?
Indirect `symbol` reference
`opacity` on `symbol` with `viewBox` ?
`opacity` on `symbol` ?
`opacity` on `use` and `symbol` ?
`opacity` on `use` ?
Simple case
Unused symbol
With custom `use` size
With overflow:visible
With `transform` on `use`, no size ?
With `transform` on `use`
With `transform`
With `viewBox` and custom `use` rect
With `viewBox` and custom `use` size
With `viewBox`
systemLanguage 100% 80% 100% 40% 90% 50% 70% 70% 60%
en-GB
en-US
en
on `clipPath`
on `defs`
on `linearGradient`
on `svg`
on `tspan`
ru-Ru
ru, en
transform 100% 100% 100% 100% 100% 100% 100% 100% 100%
Default
Direct transform
Empty
Extra spaces
`matrix`, no commas
`matrix`
Nested transforms (1)
Nested transforms (2)
Numeric character references
`rotate-at-position`
`rotate`
`scale` without Y
`scale`
`skewX`
`skewY`
Transform list
`translate` without Y
`translate`
Zeroed matrix
transform-origin 100% 100% 83% 74% 0% 0% 0% 100% 0%
`bottom` (SVG 2) ?
`center` (SVG 2) ?
keyword + length (SVG 2) ?
`left` (SVG 2) ?
length `percent` (SVG 2) ?
length `px` (SVG 2) ?
no transform (SVG 2) ?
on `clipPath` with `clipPathUnits=objectBoundingBox` (SVG 2) ?
on `clipPath` (SVG 2) ?
on `gradient` with `gradientUnits=objectBoundingBox` (SVG 2) ?
on `gradient` with `gradientUnits=userSpaceOnUse` (SVG 2) ?
on `group` (SVG 2) ?
on `image` (SVG 2) ?
on `pattern` with `patternUnits` and `patternContentUnits=objectBoundingBox` (SVG 2) ?
on `pattern` with `userSpaceOnUse` (SVG 2) ?
on `shape` (SVG 2) ?
on `text-path` (SVG 2) ?
on `text` (SVG 2) ?
`right` + `bottom` (SVG 2) ?
`right` (SVG 2) ?
`top` + `left` (SVG 2) ?
`top` (SVG 2) ?
no transform (SVG 2) ?
use 98% 98% 98% 98% 71% 85% 85% 98% 63%
CSS rules
Complex style resolving order
Display inheritance
Duplicated ID's
`fill-opacity` inheritance
From `defs`
`href` without the `xlink` namespace (SVG 2)
Indirect recursive (1)
Indirect recursive (2)
Indirect recursive (3)
Indirect ?
Nested recursive (1)
Nested recursive (2)
Nested xlink to `svg` element with rect and size ?
Non-linear order
Opacity inheritance
Position inheritance
Recursive
Self-recursive
Simple case
`stroke-opacity` inheritance
Style inheritance (1)
Style inheritance (2)
Style inheritance (3)
`transform` attribute (1)
`transform` attribute (2)
Transform inheritance
With `currentColor`
With size
xlink to a child of a non-SVG element
xlink to a child of an invalid element
xlink to an external file
xlink to an invalid element (1)
xlink to an invalid element (2)
xlink to an invalid element (3)
xlink to `svg` element with rect, only `width` ?
xlink to `svg` element with rect ?
xlink to `svg` element with `viewBox` ?
xlink to `svg` element with width/height on `use` ?
xlink to `svg` element with x/y on `use` ?
xlink to `svg` element ?

Shapes

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
circle 100% 100% 100% 100% 67% 100% 100% 100% 100%
Missing `cx` and `cy` attributes
Missing `cx` attribute
Missing `cy` attribute
Missing `r` attribute
Negative `r` attribute
Simple case
ellipse 100% 83% 100% 92% 42% 50% 100% 100% 58%
Missing `cx` and `cy` attributes
Missing `cx` attribute
Missing `cy` attribute
Missing `rx` and `ry` attributes
Missing `rx` attribute (SVG 2)
Missing `ry` attribute (SVG 2)
Negative `rx` and `ry` attributes
Negative `rx` attribute (SVG 2)
Negative `ry` attribute (SVG 2)
Percent values, missing `ry` (SVG 2) ?
Percent values ?
Simple case
line 100% 100% 100% 100% 90% 100% 100% 100% 90%
No coordinates
No `x1` and `y1` coordinates
No `x1` coordinate
No `x2` and `y2` coordinates
No `x2` coordinate
No `y1` coordinate
No `y2` coordinate
Percent units ?
Simple case
With `transform`
path 100% 100% 100% 98% 79% 96% 100% 100% 98%
A ?
M A s ?
M A t ?
M A trimmed ?
M A ?
M C S ?
M C ?
M H (H) ?
M H H ?
M H ?
M L L Z ?
M L L z ?
M L (L) ?
M L M L ?
M L M Z ?
M L M ?
M L z A ?
M L z L L ?
M L ?
M (M) (M) ?
M m ?
M M ?
M Q t ?
M Q T ?
M q t ?
M Q ?
M S S ?
M S ?
M T q ?
M T Q ?
M T s ?
M T S ?
M T t ?
M T T ?
M T ?
M V (V) ?
M V V ?
M V ?
M Z ?
m (m) (m) ?
m M ?
M ?
Empty
Extra spaces
Invalid data in L
Invalid transform ?
Missing coordinate in L
Multi-line data
Negative large-arc-flag value
Negative sweep-flag value
No commawsp after sweep-flag
No commawsp before arc flags
No commawsp between and after arc flags
No commawsp between arc flags
Numeric character references
Out of range large-arc-flag value
Out of range sweep-flag value
polygon 100% 100% 100% 100% 40% 100% 60% 100% 100%
Ignore odd points
Missing `points` attribute
Not enough points
Simple case
Stop processing on invalid data
polyline 100% 100% 100% 100% 40% 100% 60% 100% 100%
Ignore odd points
Missing `points` attribute
Not enough points
Simple case
Stop processing on invalid data
rect 87% 100% 97% 92% 45% 82% 84% 84% 68%
`cap` values (SVG 2) ? ? ? ? ? ? ? ?
`ch` values (SVG 2) ?
`em` values
`ex` values
`ic` values (SVG 2) ? ? ? ? ? ? ? ?
Invalid coordinates
Invalid length
`lh` values (SVG 2) ? ? ? ? ? ? ? ?
Missing `height` attribute processing
Missing `width` attribute processing
`mm` values
Negative `height` attribute processing
Negative `rx` and `ry` attributes resolving
Negative `rx` attribute resolving
Negative `ry` attribute resolving
Negative `width` attribute processing
Percentage values (1)
Percentage values (2) ?
`Q` values (SVG 2) ?
`rem` values (SVG 2) ?
`rlh` values (SVG 2) ? ? ? ? ? ? ? ?
Rounded rect
`rx` and `ry` attributes clamping order
`rx` attribute clamping
`rx` attribute resolving
`ry` attribute clamping
`ry` attribute resolving
Simple case
`vi` and `vb` values (SVG 2) ? ? ? ? ? ? ? ?
`vmin` and `vmax` values (SVG 2) ?
`vw` and `vh` values (SVG 2) ?
With child
`x` attribute resolving
`y` attribute resolving
Zero `height` attribute processing
Zero `rx` attribute resolving
Zero `ry` attribute resolving
Zero `width` attribute processing

Paint servers

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
linearGradient 100% 100% 100% 100% 70% 89% 84% 68% 73%
Attributes via `xlink:href`. Complex order ?
Attributes via `xlink:href` from `radialGradient`
Attributes via `xlink:href` from `rect`
Attributes via `xlink:href`. Only required ?
Attributes via `xlink:href`
Default attributes
gradientTransform and transform ?
gradientTransform
gradientUnits=objectBoundingBox with %
gradientUnits=userSpaceOnUse with %
gradientUnits=userSpaceOnUse
`hsla` color (SVG 2) ?
Invalid child (1)
Invalid child (2)
Invalid child (3)
Invalid `gradientTransform` (UB) ? ? ? ? ? ? ? ?
Invalid `gradientUnits`
Invalid `spreadMethod`
Invalid `xlink:href`
Many stops
No stops
Recursive `xlink:href` (1)
Recursive `xlink:href` (2)
Recursive `xlink:href` (3)
Self-recursive `xlink:href`
Single stop with opacity used by `fill` and `stroke`
Single stop with opacity used by `fill`
Single stop with opacity used by `stroke`
Single stop
spreadMethod=pad
spreadMethod=reflect
spreadMethod=repeat
Stops via `xlink:href`. Complex order (1) ?
Stops via `xlink:href`. Complex order (2) ?
Stops via `xlink:href` from `radialGradient`
Stops via `xlink:href` from `rect`
Stops via `xlink:href`
Unresolved `xlink:href`
pattern 100% 100% 100% 86% 59% 69% 93% 21% 38%
Attributes via `xlink:href`
Child with invalid FuncIRI ?
Children via `xlink:href`
display=none on child
Everything via `xlink:href`
Invalid `patternTransform` (UB) ? ? ? ? ? ? ? ?
Invalid `patternUnits` and `patternContentUnits`
Missing `height`
Missing `width`
Nested `objectBoundingBox`
No children
Out of order referencing
overflow=visible (UB) ? ? ? ? ? ? ? ? ?
Pattern on child
`patternContentUnits` with `viewBox`
patternContentUnits=objectBoundingBox
patternUnits=objectBoundingBox with %
patternUnits=objectBoundingBox
patternUnits=userSpaceOnUse with %
`preserveAspectRatio`
Recursive on child
Self-recursive on child
Self-recursive
Simple case
Text child
Tiny pattern upscaled ?
`transform` + `patternTransform` ?
`viewBox` via `xlink:href`
With `patternTransform`
With `viewBox`
With `x` and `y`
radialGradient 95% 100% 100% 90% 70% 70% 80% 60% 57%
Attributes via `xlink:href`. Complex order ?
Attributes via `xlink:href` from `linearGradient`
Attributes via `xlink:href` from `rect`
Attributes via `xlink:href`. Only required ?
Attributes via `xlink:href`
Default attributes
Focal point correction
fr=-1 (SVG 2) (UB) ? ? ? ? ? ? ? ? ?
fr=0.2 (SVG 2) ?
fr=0.5 (SVG 2) (UB) ? ? ? ? ? ? ? ? ?
fr=0.7 (SVG 2) ?
`fx` resolving (1)
`fx` resolving (2)
`fx` resolving (3)
`fy` resolving (1)
`fy` resolving (2)
`fy` resolving (3)
gradientTransform + transform ?
gradientTransform
gradientUnits=objectBoundingBox with %
gradientUnits=userSpaceOnUse with %
gradientUnits=userSpaceOnUse
`hsla` color (SVG 2) ?
Invalid `gradientTransform` (UB) ? ? ? ? ? ? ? ?
Invalid `gradientUnits` (UB) ? ? ? ? ? ? ? ?
Invalid `spreadMethod`
Invalid `xlink:href`
Many stops
Negative `r` (UB) ? ? ? ? ? ? ? ?
No stops
Recursive `xlink:href`
Self-recursive `xlink:href`
Single stop
spreadMethod=pad
spreadMethod=reflect
spreadMethod=repeat
Stops via `xlink:href`. Complex order ?
Stops via `xlink:href` from `linearGradient`
Stops via `xlink:href` from `rect`
Stops via `xlink:href`
Unresolved `xlink:href`
`xlink:href` not to gradient
Zero `r` with `stop-opacity` (1)
Zero `r` with `stop-opacity` (2)
Zero `r`
stop 100% 100% 100% 88% 69% 91% 100% 56% 84%
Equal `stop-color`
`hsla` color (SVG 2) ?
Invalid `offset` (1)
Invalid `offset` (2)
Missing `offset` (1)
Missing `offset` (2)
Missing `offset` (3)
Missing `offset` (4)
Missing `offset` (5)
Missing `offset` (6)
Missing `offset` (7)
No `stop-color`
`offset` clamping with %
`offset` clamping
`offset` with %
`stop-color` with `currentColor` (1)
`stop-color` with `currentColor` (2)
`stop-color` with `currentColor` (3)
`stop-color` with `currentColor` (4)
`stop-color` with `inherit` (1)
`stop-color` with `inherit` (2)
`stop-color` with `inherit` (3)
`stop-color` with `inherit` (4)
`stop-color` with `inherit` (5)
Stop with smaller `offset`
Stops with equal `offset` (1)
Stops with equal `offset` (2)
Stops with equal `offset` (3)
Stops with equal `offset` (4)
Stops with equal `offset` (5)
Stops with equal `offset` (6)
Zero `offset` in the middle
stop-color 100% 100% 100% 100% 100% 100% 100% 100% 100%
Simple case
stop-opacity 100% 100% 100% 100% 50% 50% 100% 50% 50%
50% (SVG 2) ?
Simple case

Painting

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
color 100% 50% 50% 50% 50% 75% 100% 100% 50%
`inherit`
Recursive nested context without color (SVG 2) ?
Recursive nested context (SVG 2) ?
Simple case
context 100% 0% 20% 0% 0% 20% 53% 100% 0%
`context-fill` and `context-stroke` with marker (SVG 2) ?
`context-fill` and `context-stroke` with nested markers (SVG 2) ?
`context-fill` and `context-stroke` with nested use and markers (SVG 2) ?
`context-fill` and `context-stroke` with nested use (SVG 2) ?
`context-fill` and `context-stroke` with use (SVG 2) ?
`context-stroke` on shape with zero-size bbox (SVG 2) ?
`context-fill` with gradient and gradient transform (SVG 2) ?
`context-fill` with gradient in use (SVG 2) ?
`context-fill` with gradient on marker (SVG 2) ?
`context-fill` with pattern and transform (SVG 2) ?
`context-fill` and `context-stroke` with pattern (SVG 2) ?
`context-fill` with pattern with objectBoundingBox (SVG 2) ?
`context-fill` with pattern on marker (SVG 2) ?
`context-fill` on text with decoration (SVG 2) ?
`context-fill` and `context-stroke` without context element (SVG 2) ?
display 100% 44% 56% 56% 78% 100% 89% 67% 44%
BBox impact
`none` on `clipPath`
`none` on `defs`
`none` on `linearGradient`
`none` on `rect`
`none` on `svg`
`none` on `tref`
`none` on `tspan` (1)
`none` on `tspan` (2)
fill 97% 95% 95% 93% 67% 69% 95% 86% 60%
#RGB color
#RGBA (SVG 2) ?
#RRGGBB color
#RRGGBB uppercase color
#RRGGBBAA (SVG 2) ?
`currentColor` without parent
`currentColor`
Double `inherit`
FuncIRI to a missing element with a fallback color
FuncIRI to a missing element with a `none` fallback
FuncIRI to an invalid element with a `none` fallback
FuncIRI to an unsupported element
FuncIRI with a fallback color
`hsl(120, 100%, 25%)` (SVG 2) ?
`hsl(120, 200%, 25%)` (SVG 2) ?
`hsl(360, 100%, 25%)` (SVG 2) ?
`hsl(999, 100%, 25%)` (SVG 2) ?
`hsl` with alpha (SVG 2) ?
`hsla` with percentage `s` and `l` values (SVG 2) ?
ICC color (UB) ? ? ? ? ? ? ? ? ?
`inherit` without parent
`inherit`
Invalid #RRGGBB (1)
Invalid #RRGGBB (2)
Invalid #RRGGBB (3)
Invalid FuncIRI with a `currentColor` fallback
Invalid FuncIRI with a fallback color
Linear gradient on shape
Linear gradient on text
Missing FuncIRI with a `currentColor` fallback
Named color in mixedcase
Named color in uppercase
Named color
`none`
Not trimmed attribute value
Pattern on shape
Pattern on text
Radial gradient on shape
Radial gradient on text
Random value
`rgb(0, 127, 0, 0.5)` (SVG 2) ?
`rgb` color with a big fraction part
`rgb` color with extra spaces
`rgb` color with float percentage values
`rgb` color with float values (SVG 2) ?
`rgb` color with percentage overflow
`rgb` color with percentage values
`rgb` color
`rgb(int int int)` (UB) ? ? ? ? ? ? ? ? ?
`rgba(0, 127, 0, -1)` (SVG 2) ?
`rgba(0, 127, 0, 0.5)` (SVG 2) ?
`rgba(0, 127, 0, 0)` (SVG 2) ?
`rgba(0, 127, 0, 1)` (SVG 2) ?
`rgba(0, 127, 0, 2)` (SVG 2) ?
`rgba(0, 127, 0, 50%)` (SVG 2) ?
`rgba(0, 50%, 0, 0.5)` (SVG 2) ?
`rgba(0%, 50%, 0%, 0.5)` (SVG 2) ?
`transparent` (SVG 2) ?
uppercase `rgb` color
Valid FuncIRI with a fallback ICC color
fill-opacity 100% 100% 100% 100% 88% 88% 100% 75% 75%
50% (SVG 2) ?
Half opacity
Nested
On parent ?
On text
With `linearGradient`
With `opacity`
With `pattern`
fill-rule 100% 100% 100% 100% 100% 100% 100% 100% 100%
`evenodd`
`nonzero`
image-rendering 100% 33% 100% 33% 67% 33% 67% 33% 33%
On `feImage`
`optimizeSpeed` on SVG
`optimizeSpeed`
isolation 100% 100% 100% 50% 0% 50% 100% 100% 0%
As property (SVG 2) ?
`isolate` (SVG 2) ?
marker 98% 92% 92% 79% 67% 79% 82% 11% 57%
Default clip
Empty
Inheritance (1)
Inheritance (2)
Invalid child
Marker on circle (SVG 2)
Marker on line
Marker on polygon
Marker on polyline
Marker on rect (SVG 2)
Marker on rounded rect (SVG 2) ?
Marker on text
Marker with a negative size
Nested
No stroke on target
On ArcTo
Only `marker-end`
Only `marker-mid`
Only `marker-start`
orient=-45
orient=0.25turn (SVG 2) ?
orient=1.5rad
orient=30
orient=40grad
orient=9999
orient=auto on M C C (1)
orient=auto on M C C (2)
orient=auto on M C C (3)
orient=auto on M C C (4)
orient=auto on M C C (5)
orient=auto on M C C (6)
orient=auto on M C C (7)
orient=auto on M C C (8) ?
orient=auto on M C L
orient=auto on M C M L
orient=auto on M L C
orient=auto on M L L Z Z Z
orient=auto on M L L
orient=auto on M L M C
orient=auto on M L Z
orient=auto on M L
orient=auto-start-reverse ?
Percent values ?
Recursive (1)
Recursive (2)
Recursive (3)
Recursive (4)
Recursive (5) ?
Target with subpaths (1)
Target with subpaths (2) (UB) ? ? ? ? ? ? ? ? ?
The `marker` property in CSS
The `marker` property
With a large stroke
With a text child
With an image child
With invalid `markerUnits`
With markerUnits=userSpaceOnUse
With `viewBox` (1) (UB) ? ? ? ? ? ? ? ? ?
With `viewBox` (2)
Zero-length path (1)
Zero-length path (2)
Zero-sized stroke
Zero-sized
mix-blend-mode 100% 100% 100% 30% 0% 95% 100% 100% 10%
As property (SVG 2) ?
`color-burn` (SVG 2) ?
`color-dodge` (SVG 2) ?
`color` (SVG 2) ?
`darken` (SVG 2) ?
`difference` (SVG 2) ?
`exclusion` (SVG 2) ?
`hard-light` (SVG 2) ?
`hue` (SVG 2) ?
`lighten` (SVG 2) ?
`luminosity` (SVG 2) ?
`multiply` (SVG 2) ?
`normal` (SVG 2) ?
`opacity` on element (SVG 2) ?
`opacity` on group (SVG 2) ?
`overlay` (SVG 2) ?
`saturation` (SVG 2) ?
`screen` (SVG 2) ?
`soft-light` (SVG 2) ?
`xor` (SVG 2) ?
opacity 100% 100% 100% 100% 89% 78% 100% 89% 56%
50% (SVG 2)
BBox impact
Clamp value (1)
Clamp value (2)
Group opacity
Invalid value (2)
Mixed group opacity
On an invalid element
On the root `svg`
overflow 100% 100% 80% 100% 80% 80% 100% 40% 40%
`auto` on `marker`
`inherit` on `marker` without parent ?
`inherit` on `marker` ?
`scroll` on `marker`
`visible` on `marker`
paint-order 100% 100% 100% 100% 0% 79% 100% 100% 0%
duplicates (SVG 2) ?
fill markers stroke (SVG 2) ?
fill (SVG 2) ?
invalid (SVG 2) ?
markers stroke (SVG 2) ?
markers (SVG 2) ?
normal (SVG 2) ?
on text (SVG 2) ?
on tspan (SVG 2) ?
stroke invalid (SVG 2) ?
stroke markers fill (SVG 2) ?
stroke markers (SVG 2) ?
stroke (SVG 2) ?
trailing data (SVG 2) ?
shape-rendering 100% 100% 100% 100% 88% 0% 100% 62% 0%
`auto` on circle
`crispEdges` on circle
`geometricPrecision` on circle
Inheritance
On horizontal line
`optimizeSpeed` on circle
`optimizeSpeed` on text
Path with marker
stroke 100% 100% 100% 85% 75% 70% 90% 60% 35%
Control points clamping (1)
Control points clamping (2)
`currentColor` without a parent
FuncIRI to unsupported element
Gradient with `objectBoundingBox` and fallback on lines
Gradient with `objectBoundingBox` on path without a bbox (1)
Gradient with `objectBoundingBox` on path without a bbox (2)
Gradient with `objectBoundingBox` on shape without a bbox
Line as curve (1)
Line as curve (2)
Linear gradient on text
Linear gradient
Named color
`none`
Pattern on text
Pattern with `objectBoundingBox` fallback on zero bbox shape
Pattern with `objectBoundingBox` on zero bbox shape
Pattern
Radial gradient on text
Radial gradient
stroke-dasharray 94% 94% 94% 100% 88% 82% 82% 71% 53%
0 N with round caps ?
0 N with round caps ?
0 N with square caps ?
comma-ws separator
`em` units
Even count
`mm` units
Multiple subpaths ?
N 0 ?
Negative sum
Negative values ?
None
Odd count
On a circle
% units
ws separator
Zero sum
stroke-dashoffset 100% 100% 100% 100% 100% 100% 100% 83% 67%
Default value
`em` units ?
`mm` units ?
Negative value
`%` units ?
`px` units ?
stroke-linecap 100% 100% 100% 89% 100% 89% 100% 78% 44%
`butt`
Open path with `butt`
Open path with `round`
Open path with `square`
`round`
`square`
Zero length path with `butt`
Zero length path with `round`
Zero length path with `square`
stroke-linejoin 100% 75% 75% 75% 75% 75% 75% 100% 75%
`arcs` (SVG 2) (UB) ? ? ? ? ? ? ? ? ?
`bevel`
`miter-clip` (SVG 2) ?
`miter`
`round`
stroke-miterlimit 100% 100% 100% 100% 100% 40% 80% 40% 60%
Default
Invalid value
Valid value
Value with mm
Value with %
stroke-opacity 100% 100% 100% 100% 88% 88% 100% 38% 62%
50% (SVG 2) ?
Half opacity
Nested
On parent ?
On text
With `linearGradient`
With `opacity`
With `pattern`
stroke-width 100% 100% 100% 100% 100% 100% 100% 100% 75%
Bold
Default
Negative (UB) ? ? ? ? ? ? ? ?
Percentage
Zero
visibility 100% 100% 100% 86% 100% 0% 100% 57% 14%
BBox impact (1)
BBox impact (2)
BBox impact (3)
`collapse` on `tspan`
`hidden` on group
`hidden` on shape
`hidden` on `tspan`

Masking

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
clip 0% 0% 0% 0% 100% 0% 0% 100% 0%
Simple case
clip-rule 100% 100% 100% 100% 100% 100% 100% 100% 0%
clip-rule=evenodd
clipPath 94% 100% 92% 96% 49% 63% 65% 49% 0%
Circle shorthand with `stroke-box` (SVG 2) ?
Circle shorthand with `view-box` (SVG 2) ?
Circle shorthand (SVG 2) ?
`clip-path` on child with transform
`clip-path` on child
`clip-path` on children
`clip-path` on self (2)
`clip-path` on self
`clip-path` with `transform` on text
`clip-path` with `transform`
`clip-rule` from parent node
clip-rule=evenodd
clipPathUnits=objectBoundingBox
Clipping with complex text (1)
Clipping with complex text (2)
Clipping with complex text and `clip-rule`
Clipping with text
`fill` has no effect
`filter` has no effect
`g` is not a valid child
`image` is not a valid child
Invalid FuncIRI
Invalid `clip-path` on child
Invalid `clip-path` on self
Invalid `transform` on `clipPath`
Invisible child (1)
Invisible child (2)
`line` is not a valid child
Malformed `path` child
`mask` has no effect
Mixed `clip-rule`
Multiple children
Nested `clip-path`
No children
`none`
On a horizontal line ?
On the root `svg` with size
On the root `svg` without size (UB) ? ? ? ? ? ? ? ?
`opacity` has no effect
Overlapped shapes with `evenodd`
Recursive on child
Recursive on self
Recursive
Self-recursive
Simple case
`stroke` has no effect
`switch` is not a valid child
`symbol` via `use` is not a valid child
`transform` on `clipPath`
With invalid child via `use`
With marker on clip
With `use` child
mask 97% 92% 92% 92% 11% 66% 89% 34% 66%
color-interpolation=linearRGB
Half width region with rotation ?
Invalid FuncIRI
Invalid child
Invisible child (1)
Invisible child (2)
`mask` on child
`mask` on self with mask-type=alpha (SVG 2) ?
`mask` on self with mixed mask-type (SVG 2) ?
`mask` on self
`mask-type` in `style` (SVG 2) ?
mask-type=alpha (SVG 2) ?
mask-type=invalid (SVG 2) ?
mask-type=luminance (SVG 2) ?
maskContentUnits=objectBoundingBox
maskUnits=objectBoundingBox with %
maskUnits=userSpaceOnUse with %
maskUnits=userSpaceOnUse with rect
maskUnits=userSpaceOnUse with `width` only
maskUnits=userSpaceOnUse without rect
Nested `objectBoundingBox`
No children
`none`
On a horizontal line ?
On a small object
On group with `transform` ?
Recursive on child (UB) ? ? ? ? ? ? ?
Recursive on self
Recursive
Self-recursive
Simple case
`transform` has no effect
`transform` on shape
With `clip-path`
With grayscale `image` ?
With `image` ?
With opacity (1)
With opacity (2)
With opacity (3)

Text

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
alignment-baseline 93% 100% 0% 100% 0% 0% 0% 100% 0%
`after-edge` (UB) ? ? ? ? ? ? ? ? ?
`alphabetic` ?
`auto` ?
`baseline` (UB) ? ? ? ? ? ? ? ? ?
`before-edge` ?
`central` ?
`hanging` and baseline-shift=-20 on `tspan` ?
`hanging` on `tspan` ?
`hanging` on vertical ?
`hanging` with underline ?
`hanging` ?
`ideographic` (UB) ? ? ? ? ? ? ? ? ?
`inherit` ?
`mathematical` ?
`middle` on `textPath` ?
`middle` ?
`text-after-edge` (UB) ? ? ? ? ? ? ? ? ?
`text-before-edge` ?
Two `textPath`, `middle` on first ?
baseline-shift 100% 91% 0% 68% 64% 77% 73% 64% 0%
`-10`
`-50%`
`0`
`10`
`2mm`
`50%`
`baseline`
Deeply nested `super`
Inheritance (1)
Inheritance (2)
Inheritance (3)
Inheritance (4)
Inheritance (5)
Invalid value
Mixed nested
Nested length
Nested `super`
Nested with `baseline` (1)
Nested with `baseline` (2)
`sub`
`super`
With rotate
direction 0% 100% 100% 100% 0% 100% 100% 0% 0%
`rtl` with vertical `writing-mode` (UB) ? ? ? ? ? ? ? ? ?
`rtl`
dominant-baseline 100% 100% 58% 89% 0% 58% 0% 0% 0%
alignment-baseline and baseline-shift on tspans
alignment-baseline=baseline on tspan
`alphabetic`
`auto`
`central`
Complex
Different alignment-baseline on tspan
Dummy tspan
Equal alignment-baseline on tspan
`hanging`
`ideographic`
`inherit`
`mathematical`
`middle`
Nested
`no-change`
`reset-size` (UB) ? ? ? ? ? ? ? ? ?
Sequential
`text-after-edge`
`text-before-edge`
`use-script` (UB) ? ? ? ? ? ? ? ? ?
font 50% 50% 50% 50% 100% 50% 50% 50% 0%
`font` shorthand ?
Simple case
font-family 100% 100% 100% 100% 83% 100% 92% 75% 58%
Bold `sans-serif`
`cursive`
Double quoted ?
Fallback (1)
Fallback (2)
`fantasy`
Font list
`monospace`
`Noto Sans`
`sans-serif`
`serif`
`Source Sans Pro`
font-kerning 100% 100% 100% 100% 0% 0% 0% 100% 0%
Arabic script ?
As property ?
none ?
font-size 100% 100% 100% 100% 100% 100% 100% 47% 26%
`em` nested and mixed
`em` on the root element
`em`
`ex` nested and mixed
`ex` on the root element
`ex`
Inheritance
Mixed values
Named value without a parent
Named value
Negative size (UB) ? ? ? ? ? ? ? ?
Nested percent values (1)
Nested percent values (2)
Percent value without a parent
Percent value
Simple case
Zero size on parent (1)
Zero size on parent (2)
Zero size on parent (3)
Zero size
font-size-adjust 0% 0% 100% 100% 0% 0% 0% 0% 0%
Simple case
font-stretch 100% 67% 67% 67% 67% 67% 33% 33% 0%
`extra-condensed` ?
`inherit`
`narrower`
font-style 100% 100% 100% 100% 100% 100% 100% 100% 100%
`inherit`
`italic`
`oblique`
font-variant 100% 100% 100% 100% 0% 100% 0% 0% 0%
`inherit`
`small-caps`
font-weight 92% 100% 100% 100% 67% 83% 100% 92% 83%
650
`700`
`bold`
`bolder` with clamping
`bolder` without parent
`bolder`
`inherit`
Invalid number (1)
`lighter` with clamping
`lighter` without parent
`lighter`
`normal`
glyph-orientation-horizontal 0% 0% 0% 0% 100% 0% 0% 0% 0%
Simple case
glyph-orientation-vertical 0% 0% 0% 100% 100% 0% 0% 0% 0%
Simple case
kerning 50% 0% 0% 0% 50% 0% 0% 50% 0%
0 ?
10%
lengthAdjust 100% 100% 75% 75% 75% 25% 0% 100% 0%
`spacingAndGlyphs` ?
Text on path ?
Vertical ?
With underline ?
letter-spacing 100% 55% 55% 82% 64% 64% 64% 64% 9%
`-3`
`0`
`1mm`
`3`
`5%`
Filter bounding box ?
Large negative (UB) ? ? ? ? ? ? ? ? ?
Mixed scripts
Mixed spacing
Non-ASCII character
`normal`
on Arabic
text 89% 93% 98% 82% 59% 73% 45% 73% 34%
BIDI reordering
Complex grapheme split by `tspan` (UB) ? ? ? ? ? ? ? ? ?
Complex graphemes and coordinates list
Complex graphemes
Compound emojis and coordinates list
Compound emojis
`dx` and `dy` instead of `x` and `y`
`dx` and `dy` with less values than characters
`dx` and `dy` with more values than characters
`dx` and `dy` with multiple values
`em` and `ex` coordinates
Emojis
Escaped text (1)
Escaped text (2)
Escaped text (3)
Escaped text (4)
fill-rule=evenodd
Filter bounding box ?
Ligatures handling in mixed fonts (1) ?
Ligatures handling in mixed fonts (2) ?
`mm` coordinates
Nested
No coordinates
Percent value on `dx` and `dy` ?
Percent value on `x` and `y`
Real text height ?
`rotate` on Arabic (UB) ? ? ? ? ?
`rotate` with an invalid angle
`rotate` with less values than characters
`rotate` with more values than characters
`rotate` with multiple values and complex text
`rotate` with multiple values, underline and pattern
`rotate` with multiple values
`rotate`
Simple case
`transform`
`x` and `y` with `dx` and `dy` lists
`x` and `y` with `dx` and `dy`
`x` and `y` with less values than characters
`x` and `y` with more values than characters
`x` and `y` with multiple values and arabic text
`x` and `y` with multiple values and `tspan`
`x` and `y` with multiple values
xml:lang=ja ?
`xml:space`
Zalgo
text-anchor 92% 85% 69% 77% 77% 69% 69% 54% 46%
Coordinates list
`end` on `text`
`end` with `letter-spacing` ?
Inheritance (1)
Inheritance (2)
Inheritance (3)
Invalid value on `text`
`middle` on `text`
On the first `tspan`
On `tspan` with arabic
On `tspan`
`start` on `text`
`text-anchor` not on text chunk
text-decoration 95% 81% 71% 86% 52% 52% 29% 67% 0%
All types inline, comma-separated ?
All types inline, no spaces ?
All types inline ?
All types nested
Indirect with multiple colors ?
Indirect ?
`line-through`
Outside the `text` element
`overline`
Style resolving (1)
Style resolving (2)
Style resolving (3)
Style resolving (4) ?
`tspan` decoration
`underline` with `dy` list (1)
`underline` with `dy` list (2)
`underline` with `rotate` list (3)
`underline` with `rotate` list (4)
`underline` with `y` list
`underline`
With `textLength` on a single character ?
text-rendering 80% 0% 60% 60% 80% 0% 20% 80% 0%
`geometricPrecision`
On `tspan`
`optimizeLegibility`
`optimizeSpeed`
With underline
textLength 100% 83% 67% 75% 67% 42% 0% 100% 0%
150 on parent ?
150 on `tspan` ?
150 ?
40mm ?
75% ?
Arabic with lengthAdjust ?
Arabic ?
`inherit` ?
Negative ?
On a single `tspan` ?
On `text` and `tspan` ?
Zero ?
textPath 83% 67% 67% 79% 60% 50% 0% 40% 0%
Closed path
Complex (UB) ? ? ? ? ? ?
`dy` with tiny coordinates
Invalid link
Invalid `textPath` in the middle
Link to `rect` (SVG 2)
M A path
M L Z path
method=stretch
Mixed children (1)
Mixed children (2)
Nested
No link
Path with ClosePath
Path with subpaths and `startOffset`
Path with subpaths
side=right (SVG 2) ?
Simple case
spacing=auto
startOffset=-100
startOffset=10%
startOffset=30
startOffset=5mm
startOffset=9999
`tspan` with absolute position
`tspan` with relative position
Two paths
Very long text
With `baseline-shift` and `rotate` (UB) ? ? ? ? ? ? ? ?
With `baseline-shift`
With big `letter-spacing`
With coordinates on `text`
With coordinates on `textPath`
With `filter` (SVG 2) ?
With invalid `path` and `xlink:href` (SVG 2) ?
With `letter-spacing`
With `path` and `xlink:href` (SVG 2) ?
With `path` (SVG 2) ?
With `rotate`
With `text-anchor`
With `transform` on a referenced path
With `transform` outside a referenced path
With underline
writing-mode=tb
tref 91% 0% 0% 82% 73% 82% 73% 64% 0%
Link to a complex `text`
Link to a non-SVG element
Link to a non-`text` element
Link to an external file element
Link to `text`
Nested
Position attributes
Style attributes
With a `title` child
With text
`xml:space`
tspan 87% 87% 65% 84% 77% 68% 55% 42% 29%
BIDI reordering
Mixed `font-size`
Mixed `xml:space` (1)
Mixed `xml:space` (2)
Mixed `xml:space` (3)
Mixed
Multiple coordinates
Nested `rotate`
Nested whitespaces ?
Nested
Only with `y`
Outside the `text`
Pseudo-multi-line
`rotate` and `display:none`
Rotate on child
Sequential
Style override
Text shaping across multiple `tspan` (1)
Text shaping across multiple `tspan` (2)
`transform`
`tspan` bbox (1)
`tspan` bbox (2) ?
With `clip-path` (SVG 2)
With `dy`
With `filter` (SVG 2)
With `mask` (SVG 2)
With opacity (SVG 2)
With `x` and `y`
Without attributes
`xml:space` (1)
`xml:space` (2)
unicode-bidi 0% 100% 100% 100% 100% 0% 100% 0% 0%
`bidi-override`
word-spacing 100% 83% 83% 83% 100% 83% 0% 83% 0%
`-5`
`0`
`10`
`2mm`
`5%`
Large negative (UB) ? ? ? ? ? ? ? ? ?
`normal`
writing-mode 95% 95% 95% 76% 57% 86% 43% 48% 5%
Arabic with `rl`
`horizontal-tb` ?
Inheritance
Invalid value
Japanese with `tb`
`lr-tb`
`lr`
Mixed languages with `tb` and underline
Mixed languages with `tb`
On `tspan`
`rl-tb`
`rl`
`tb` and punctuation
`tb-rl`
`tb` with alignment
`tb` with `dx` on second `tspan`
`tb` with `dx` on `tspan`
`tb` with `dy` on second `tspan`
`tb` with rotate and underline (UB) ? ? ? ? ? ? ? ? ?
`tb` with rotate (UB) ? ? ? ? ? ? ? ? ?
`tb`
`vertical-lr` ?
`vertical-rl` ?

Filters

Test resvg Chrome Firefox Safari Batik Inkscape librsvg SVG.NET QtSvg
enable-background 0% 0% 0% 0% 95% 20% 60% 5% 0%
`accumulate` with `new`
`accumulate`
Filter on shape
`inherit`
`new` with invalid region (1)
`new` with invalid region (2)
`new` with invalid region (3)
`new` with region
`new`
Shapes after filter
Stop on the first `new` (1)
Stop on the first `new` (2)
With clip-path
With `filter` on the same element ?
With filter
With mask (UB) ? ? ? ? ? ? ? ? ?
With opacity (1)
With opacity (2)
With opacity (3)
With opacity (4)
With transform
feBlend 100% 100% 100% 100% 70% 30% 100% 20% 0%
Empty
mode=color-burn (SVG 2) ?
mode=darken
mode=hue (SVG 2) ?
mode=lighten
mode=multiply
mode=normal
mode=screen
With subregion on input (1)
With subregion on input (2)
feColorMatrix 100% 100% 100% 79% 57% 86% 93% 14% 0%
Invalid `type`
type=hueRotate without an angle
type=hueRotate
type=luminanceToAlpha
type=matrix with empty values
type=matrix with non-normalized values
type=matrix with not enough values
type=matrix with too many values
type=matrix without values
type=matrix
type=saturate with a large coefficient (UB) ? ? ? ? ? ? ? ? ?
type=saturate with negative coefficient (UB) ? ? ? ? ? ? ? ? ?
type=saturate without a coefficient
type=saturate
Without a `type`
Without attributes
feComponentTransfer 100% 95% 91% 77% 55% 64% 91% 0% 0%
Invalid `type`
Mixed types
No children
type=discrete on blue
type=gamma on blue
type=gamma with an invalid `offset`
type=gamma with invalid values
type=identity on all
type=linear on blue
type=linear with invalid values
type=linear with large values
type=table and tableValues="1 0 1"
type=table and tableValues=1
type=table and tableValues="100 -100"
type=table and tableValues=1px
type=table on alpha
type=table on blue twice
type=table on blue with sRGB interpolation
type=table on blue
type=table with an empty `tableValues`
type=table with large values
type=table without `tableValues`
feComposite 100% 100% 100% 100% 89% 56% 100% 0% 0%
Default `operator`
Empty
Invalid `operator`
operator=arithmetic and invalid `k1-4`
operator=arithmetic on sRGB
operator=arithmetic with large `k1-4`
operator=arithmetic with opacity on sRGB
operator=arithmetic with opacity
operator=arithmetic with some `k1-4`
operator=arithmetic without `k1-4`
operator=arithmetic
operator=atop
operator=in
operator=out
operator=over
operator=xor
With subregion on input (1)
With subregion on input (2)
feConvolveMatrix 100% 95% 95% 90% 0% 38% 57% 5% 0%
bias=-0.5 (UB) ? ? ? ? ? ? ? ? ?
bias=0.5 (UB) ? ? ? ? ? ? ? ? ?
bias=9999 (UB) ? ? ? ? ? ? ? ? ?
Custom `divisor`
divisor=0
edgeMode=none
edgeMode=wrap with matrix larger than target (UB) ? ? ? ? ? ? ? ? ?
edgeMode=wrap
Empty `kernelMatrix`
`kernelMatrix` with not enough values
`kernelMatrix` with too many values
`kernelMatrix` with zero sum and no `divisor`
No `kernelMatrix`
`order` with a negative value (1)
`order` with a negative value (2)
order=0
order=4 2
order=4 4
order=4
preserveAlpha=true
targetX=-1
targetX=0
targetX=2
targetX=3
Unset `order`
feDiffuseLighting 95% 27% 95% 100% 23% 5% 82% 5% 0%
Complex transform
diffuseConstant=-1
diffuseConstant=0
diffuseConstant=5
lighting-color=currentColor without `color`
lighting-color=currentColor
lighting-color=hsla (SVG 2) ?
lighting-color=inherit
lighting-color=seagreen
`linearRGB` color interpolation
Multiple light sources
No light source
Single light source with comment
Single light source with desc
Single light source with invalid child
Single light source with title and desc
Single light source with title
Single light source
surfaceScale=-10
surfaceScale=0
surfaceScale=1.33
surfaceScale=5
feDisplacementMap 200% 0% 0% 0% 0% 0% 0% 0% 0%
Simple case
feDistantLight 100% 25% 100% 100% 25% 0% 100% 0% 0%
Default attributes
Negative `azimuth` and `elevation`
Only `azimuth`
Only `elevation`
feDropShadow 100% 100% 100% 88% 0% 0% 100% 100% 0%
`hsla` color (SVG 2) ?
Only `stdDeviation` (SVG 2) ?
stdDeviation=0 (SVG 2) ?
With `flood-color` (SVG 2) ?
With `flood-opacity` (SVG 2) ?
With offset, clipped (SVG 2) ?
With offset (SVG 2) ?
With percent offset (SVG 2) ?
feFlood 75% 100% 100% 100% 88% 12% 88% 0% 88%
Complex transform
Default values
Partial subregion
Seagreen
Subregion inheritance
Subregion with primitiveUnits=objectBoundingBox
With opacity on target element
With opacity
feGaussianBlur 92% 100% 92% 85% 85% 77% 85% 0% 85%
Complex transform
Empty `stdDeviation`
Huge `stdDeviation`
Negative `stdDeviation`
No `stdDeviation`
Simple case
Small `stdDeviation`
`stdDeviation` with multiple values
`stdDeviation` with two different values
`stdDeviation` with two values
stdDeviation=0 5
stdDeviation=5 0
Tiny `stdDeviation`
feImage 93% 96% 44% 89% 70% 19% 41% 22% 0%
Chained `feImage` ?
Embedded PNG
Empty
Link on an element with complex `transform`
Link on an element with `transform`
Link to an element outside `defs` (1)
Link to an element outside `defs` (2)
Link to an element with opacity ?
Link to an element with `transform`
Link to an element
Link to an invalid element
Link to `g`
Link to `use`
preserveAspectRatio=none
Recursive links (1)
Recursive links (2) ?
Self-recursive
Simple case
SVG
With subregion (1)
With subregion (2)
With subregion (3)
With subregion (4)
With subregion (5)
With x and y and protruding subregion (1) ?
With x and y and protruding subregion (2) ?
With x and y ?
feMerge 67% 100% 100% 100% 100% 100% 100% 0% 0%
color-interpolation-filters=linearRGB
color-interpolation-filters=sRGB
Complex transform
feMorphology 100% 100% 93% 100% 57% 21% 36% 7% 0%
Empty `radius`
Huge radius
Negative `radius`
No `radius`
operator=dilate
`radius` with too many values
radius=0.5 with `objectBoundingBox`
radius=0.5
radius=1 10
radius=10 0
radius=10 1
Simple case
Source with opacity
Zero `radius`
feOffset 78% 100% 89% 78% 78% 22% 89% 11% 78%
Complex transform
Fractional offset
Negative offset
No offset
Only `dx`
Only `dy`
Percentage values ?
Simple case
With primitiveUnits=objectBoundingBox
fePointLight 50% 0% 100% 100% 0% 0% 75% 0% 0%
Complex transform
Custom attributes
Default attributes
primitiveUnits=objectBoundingBox
feSpecularLighting 100% 25% 62% 25% 12% 0% 88% 12% 0%
lighting-color=hsla (SVG 2) ?
specularExponent=0
specularExponent=256
With `feDistantLight`
With `fePointLight`
With `feSpotLight` and specular and exponent
With `feSpotLight` and specularConstant=5
With `feSpotLight`
feSpotLight 75% 8% 17% 83% 17% 0% 75% 0% 0%
Complex transform
Custom attributes
Default attributes
limitingConeAngle anti-aliasing
limitingConeAngle=-30
limitingConeAngle=0
limitingConeAngle=30
primitiveUnits=objectBoundingBox
specularExponent=-10
specularExponent=0.5
specularExponent=10
With all `pointsAt`
feTile 100% 100% 100% 100% 50% 17% 83% 0% 0%
Complex transform (UB) ? ? ? ? ? ? ? ? ?
Empty region
Simple case
With region
With subregion (1)
With subregion (2)
With subregion (3)
feTurbulence 94% 100% 83% 100% 67% 11% 78% 0% 0%
baseFrequency=-0.05
baseFrequency=0.01
baseFrequency=0.05 -0.01
baseFrequency=0.05 0.01
baseFrequency=0.05 0.05
baseFrequency=0.05 0
color-interpolation-filters=sRGB
Complex transform
No attributes
numOctaves=-1
numOctaves=0
numOctaves=5
primitiveUnits=objectBoundingBox
seed=-20
seed=1.5
seed=20
stitchTiles=stitch (UB) ? ? ? ? ? ? ? ? ?
type=fractalNoise
type=invalid
filter 90% 82% 87% 76% 67% 57% 76% 21% 42%
color-interpolation-filters=sRGB
Complex order and `xlink:href`
Content outside the canvas 2 ?
Content outside the canvas ?
Default color-interpolation-filters
Everything via `xlink:href`
Global `transform`
Huge region
`in` to invalid (1)
`in` to invalid (2)
in=BackgroundAlpha with enable-background
in=BackgroundAlpha ?
in=BackgroundImage with enable-background
in=BackgroundImage ?
in=FillPaint on `g` without children (UB) ? ? ? ? ? ? ? ? ?
in=FillPaint with gradient (UB) ? ? ? ? ? ? ? ? ?
in=FillPaint with pattern (UB) ? ? ? ? ? ? ? ? ?
in=FillPaint with target on `g` (UB) ? ? ? ? ? ? ? ? ?
in=FillPaint (UB) ? ? ? ? ? ? ? ? ?
in=SourceAlpha
in=StrokePaint (UB) ? ? ? ? ? ? ? ? ?
Initial `transform`
Invalid FuncIRI
Invalid `filterUnits`
Invalid primitive (1)
Invalid primitive (2)
Invalid region
Invalid subregion
Invalid `xlink:href`
Multiple primitives (1)
Multiple primitives (2)
Multiple primitives (3)
Multiple primitives (4)
Negative subregion
No children
`none`
On a thin rect
On a vertical line
On an empty group (1)
On an empty group (2)
On group with child outside of canvas ?
On the root `svg` (UB) ? ? ? ? ? ? ? ? ?
On zero-sized shape
Path bounding box ? ?
primitiveUnits=objectBoundingBox
Recursive `xlink:href`
Region with stroke ?
Self-recursive `xlink:href`
Simple case
Some attributes via `xlink:href`
Subregion and primitiveUnits=objectBoundingBox (1)
Subregion and primitiveUnits=objectBoundingBox (2)
Subregion bigger that region
`transform` on filter
`transform` on shape with filter region
`transform` on shape
Unresolved `xlink:href`
With `clip-path` and `mask`
With `clip-path`
With `mask` on the parent group ?
With `mask`
With multiple transforms (1)
With multiple transforms (2)
With region and filterUnits=userSpaceOnUse
With region and subregion
With region outside the canvas
With region outside the viewbox
With region
With subregion (1)
With subregion (2)
With subregion (3)
With transform outside of canvas ?
Without region and filterUnits=userSpaceOnUse
Zero-sized subregion
filter-functions 100% 98% 98% 2% 2% 2% 52% 98% 0%
`blur` function, `mm` value (SVG 2) ?
`blur` function, negative value (SVG 2) ?
`blur` function, no values (SVG 2) ?
`blur` function, `%` value (SVG 2) ?
`blur` function, two values (SVG 2) ?
`blur` function (SVG 2) ?
Color adjust functions, 0% (SVG 2) ?
Color adjust functions, 100% (SVG 2) ?
Color adjust functions, 2 (SVG 2) ?
Color adjust functions, 200% (SVG 2) ?
Color adjust functions, 50% (SVG 2) ?
Color adjust functions, default value (SVG 2) ?
Color adjust functions, negative (SVG 2) ?
`drop-shadow` function, color as attribute (SVG 2) ?
`drop-shadow` function, color last (SVG 2) ?
`drop-shadow` function, comma spearated (SVG 2) ?
`drop-shadow` function, `currentColor` (SVG 2) ?
`drop-shadow` function, `em` values (SVG 2) ?
`drop-shadow` function, extra value (SVG 2) ?
`drop-shadow` function, filter region (SVG 2) ?
`drop-shadow` function, `mm` values (SVG 2) ?
`drop-shadow` function, no color (SVG 2) ?
`drop-shadow` function, no values (SVG 2) ?
`drop-shadow` function, only X offset (SVG 2) ?
`drop-shadow` function, only offset (SVG 2) ?
`drop-shadow` function, `%` values (SVG 2) ?
`drop-shadow` function (SVG 2) ?
grayscale and opacity (SVG 2) ?
`hue-rotate` function, 0.25turn (SVG 2) ?
`hue-rotate` function, 45 (SVG 2) ?
`hue-rotate` function, 45deg (SVG 2) ?
`hue-rotate` function, 45grad (SVG 2) ?
`hue-rotate` function, 45rad (SVG 2) ?
`hue-rotate` function, 999deg (SVG 2) ?
`hue-rotate` function, default value (SVG 2) ?
`hue-rotate` function, zero (SVG 2) ?
Nested filters
One invalid function in list (SVG 2) ?
One invalid url in list (SVG 2) ?
Two `drop-shadow` function (SVG 2) ?
Two exact urls (SVG 2) (UB) ? ? ? ? ? ? ? ? ?
Two urls (SVG 2) ?
url and grayscale (SVG 2) ?
flood-color 100% 100% 100% 100% 86% 14% 100% 14% 71%
`hsla` color (SVG 2) ?
Inheritance (1)
Inheritance (2)
Inheritance (3)
Inheritance (4)
Inheritance (5)
Simple case
flood-opacity 100% 100% 100% 100% 50% 0% 100% 50% 50%
50% (SVG 2) ?
Simple case

Additional notes

  • batik doesn’t support anti-aliasing during clipPath, but we are ignoring this.

  • batik doesn’t support text shaping, so characters will be aligned incorrectly, but we are ignoring this because otherwise we have to mark all text-based test as failed, which is not fair.

  • All libraries are rendering text a bit different. We do not treat this as an error.

  • Some tests are marked as UB (undefined behavior). This means that I don’t know how the correct result should look like. Usually, all libraries will render those files differently. Those tests are marked as Unknown, but they must not crash anyway.

  • Every application and library are rendering the basic shapes a bit differently. We do not treat this as an error. shapes diff