This page contains results of the resvg test suite which is specifically designed for the resvg library.
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.
Passed | |
Failed | |
Crashed | |
? | Undefined behavior |
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 | ? |
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 |
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 |
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` |
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) |
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` | ? |
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 |
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.