This page contains results of the resvg test suite which is specifically designed for the resvg library.
One file - one test.
In the official test suite, one file can have a lot of tests.
More edge-cases.
Unlike the official SVG test suite.
Only supported SVG subset.
resvg trying to support only the static SVG subset.
Tests are grouped by the element and attribute names.
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.
In the resvg case CSS parsing is done on the svgdom side.
And we support only a minimal CSS subset.
Extended raster image formats features.
We assume that underlying PNG and JPEG libraries are good.
a element. We treating it as g.
Pointer events.
Animations.
Scripting.
Embedded fonts.
We are testing/comparing resvg with Chrome, Inkscape, librsvg and QtSvg for a reason.
Chrome has the best SVG support so far.
Batik is the most popular Java library for SVG rendering.
Inkscape is an obvious choice on Linux.
librsvg is the main resvg rival. Used in GNOME, XFCE for SVG rendering.
QtSvg is used by all the Qt applications and KDE.
| Passed | |
| Failed | |
| Crashed | |
| ? | Unknown |
| # | Feature | resvg | Chrome | Firefox | Batik | Inkscape | librsvg | QtSvg | |
|---|---|---|---|---|---|---|---|---|---|
| Document Structure | |||||||||
| svg | 97% | 100% | 100% | 70% | 76% | 94% | 36% | ||
| 1 | Explicit `svg` namespace | ||||||||
| 2 | `xmlns` validation | ||||||||
| 3 | Mixed namespaces | ||||||||
| 4 | Elements via ENTITY reference (1) | ||||||||
| 31 | Elements via ENTITY reference (2) | ||||||||
| 32 | Elements via ENTITY reference (3) | ||||||||
| 5 | Attribute value via ENTITY reference | ||||||||
| 6 | Empty (no children) | ||||||||
| 7 | Not UTF-8 encoding | ||||||||
| 8 | preserveAspectRatio=none | ||||||||
| 9 | preserveAspectRatio=xMinYMin | ||||||||
| 10 | preserveAspectRatio=xMidYMid | ||||||||
| 11 | preserveAspectRatio=xMaxYMax | ||||||||
| 12 | preserveAspectRatio='xMinYMin slice' | ||||||||
| 13 | preserveAspectRatio='xMidYMid slice' | ||||||||
| 14 | preserveAspectRatio='xMaxYMax slice' | ||||||||
| 15 | `preserveAspectRatio` with `viewBox` not at zero pos | ||||||||
| 16 | `viewBox` not at zero pos | ||||||||
| 17 | Proportional `viewBox` | ||||||||
| 18 | Invalid `id` attribute (UB) (1) | ? | ? | ? | ? | ? | ? | ? | |
| 19 | Invalid `id` attribute (UB) (2) | ? | ? | ? | ? | ? | ? | ? | |
| 20 | `FuncIRI` parsing (UB) | ? | ? | ? | ? | ? | ? | ? | |
| 21 | `FuncIRI` with invalid characters (UB) | ||||||||
| 22 | Nested svg | ||||||||
| 23 | Nested svg with viewBox | ||||||||
| 24 | Nested svg with rect | ||||||||
| 25 | Nested svg with rect and viewBox (1) | ||||||||
| 26 | Nested svg with rect and viewBox (2) | ||||||||
| 27 | Nested svg with rect and viewBox (3) | ||||||||
| 28 | Nested svg with overflow:visible | ||||||||
| 29 | Nested svg with overflow:auto | ||||||||
| 30 | Deeply nested svg | ||||||||
| 33 | `rect` inside a non-SVG element | ||||||||
| g | 100% | 100% | 100% | 100% | 100% | 100% | 100% | ||
| 1 | Deeply nested groups | ||||||||
| defs | 100% | 100% | 100% | 100% | 100% | 100% | 100% | ||
| 1 | Simple case | ||||||||
| 2 | Out of order | ||||||||
| 3 | Multiple `defs` | ||||||||
| 4 | Nested `defs` | ||||||||
| 5 | Ignore shapes inside `defs` | ||||||||
| 6 | Style inheritance | ||||||||
| 7 | Style inheritance on text | ||||||||
| desc | |||||||||
| title | |||||||||
| symbol | 100% | 100% | 100% | 100% | 50% | 50% | 25% | ||
| 1 | Simple case | ||||||||
| 2 | Unused symbol | ||||||||
| 3 | With `viewBox` | ||||||||
| 4 | With `viewBox` and custom `use` size | ||||||||
| 5 | With custom `use` size | ||||||||
| 6 | With `viewBox` and custom `use` rect | ||||||||
| 7 | With overflow:visible | ||||||||
| 8 | With `use` transform | ||||||||
| use | 95% | 95% | 95% | 82% | 100% | 77% | 86% | ||
| 1 | Simple case | ||||||||
| 2 | From `defs` | ||||||||
| 3 | Style inheritance (1) | ||||||||
| 4 | Style inheritance (2) | ||||||||
| 5 | Style inheritance (3) | ||||||||
| 15 | Opacity inheritance | ||||||||
| 16 | `fill-opacity` inheritance | ||||||||
| 17 | `stroke-opacity` inheritance | ||||||||
| 18 | Transform inheritance | ||||||||
| 19 | Display inheritance | ||||||||
| 6 | `transform` attribute (1) | ||||||||
| 7 | `transform` attribute (2) | ||||||||
| 8 | xlink to an external file | ||||||||
| 9 | CSS rules | ||||||||
| 10 | Recursive | ||||||||
| 11 | Self-recursive | ||||||||
| 12 | Nested recursive | ||||||||
| 13 | Indirect recursive | ||||||||
| 14 | Non-linear order | ||||||||
| 20 | With size | ||||||||
| 21 | Position inheritance | ||||||||
| 22 | Complex style resolving order | ||||||||
| image | 100% | 79% | 82% | 53% | 65% | 44% | 26% | ||
| 1 | External JPEG | ||||||||
| 2 | External PNG | ||||||||
| 3 | External SVG | ||||||||
| 17 | External SVG with transform | ||||||||
| 6 | External SVGZ | ||||||||
| 4 | Embedded JPEG as image/jpg | ||||||||
| 9 | Embedded JPEG as image/jpeg | ||||||||
| 5 | Embedded PNG | ||||||||
| 7 | Embedded SVG | ||||||||
| 8 | Embedded SVGZ | ||||||||
| 10 | preserveAspectRatio=none | ||||||||
| 11 | preserveAspectRatio='xMinYMin meet' | ||||||||
| 12 | preserveAspectRatio='xMidYMid meet' | ||||||||
| 13 | preserveAspectRatio='xMaxYMax meet' | ||||||||
| 14 | preserveAspectRatio='xMinYMin slice' | ||||||||
| 15 | preserveAspectRatio='xMidYMid slice' | ||||||||
| 16 | preserveAspectRatio='xMaxYMax slice' | ||||||||
| 18 | preserveAspectRatio=none on SVG | ||||||||
| 19 | preserveAspectRatio='xMinYMin meet' on SVG | ||||||||
| 20 | preserveAspectRatio='xMidYMid meet' on SVG | ||||||||
| 21 | preserveAspectRatio='xMaxYMax meet' on SVG | ||||||||
| 22 | preserveAspectRatio='xMinYMin slice' on SVG | ||||||||
| 23 | preserveAspectRatio='xMidYMid slice' on SVG | ||||||||
| 24 | preserveAspectRatio='xMaxYMax slice' on SVG | ||||||||
| 25 | Raster image with an odd size | ||||||||
| 26 | No `width` and `height` | ||||||||
| 27 | No `width` | ||||||||
| 28 | No `height` | ||||||||
| 29 | No `width` and `height` on SVG (UB) | ? | ? | ? | ? | ? | ? | ||
| 30 | No `width` on SVG (UB) | ? | ? | ? | ? | ? | ? | ||
| 31 | No `height` on SVG (UB) | ? | ? | ? | ? | ? | ? | ||
| 32 | Float size (UB) | ? | ? | ? | ? | ? | ? | ? | |
| 33 | Recursive (1) | ||||||||
| 34 | Recursive (2) | ||||||||
| switch | 100% | 56% | 100% | 100% | 89% | 100% | 78% | ||
| 1 | Simple case | ||||||||
| 2 | `systemLanguage` | ||||||||
| 3 | `requiredFeatures` | ||||||||
| 4 | With attributes | ||||||||
| 5 | systemLanguage='en' | ||||||||
| 6 | systemLanguage='en-US' | ||||||||
| 7 | systemLanguage='en-GB' | ||||||||
| 8 | systemLanguage='ru-Ru' | ||||||||
| 9 | systemLanguage='ru, en' | ||||||||
| Styling | |||||||||
| style | 82% | 100% | 100% | 100% | 82% | 73% | 27% | ||
| 1 | Class selector | ||||||||
| 2 | Type selector | ||||||||
| 3 | ID selector | ||||||||
| 4 | Attribute selector | ||||||||
| 5 | Universal selector | ||||||||
| 6 | Combined selectors | ||||||||
| 7 | Unresolved class selector | ||||||||
| 8 | Style inside CDATA | ||||||||
| 9 | Resolve order | ||||||||
| 10 | Style after usage | ||||||||
| 11 | Invalid type | ||||||||
| Paths | |||||||||
| path | 98% | 100% | 100% | 80% | 93% | 98% | 82% | ||
| 1 | Empty | ||||||||
| 2 | M | ||||||||
| 3 | M L | ||||||||
| 4 | M H | ||||||||
| 5 | M V | ||||||||
| 6 | M C | ||||||||
| 7 | M S | ||||||||
| 8 | M Q | ||||||||
| 9 | M T | ||||||||
| 10 | M A | ||||||||
| 11 | M A trimmed | ||||||||
| 12 | M L (L) | ||||||||
| 13 | M C S | ||||||||
| 14 | M Q T | ||||||||
| 15 | M S S | ||||||||
| 16 | M H H | ||||||||
| 17 | M H (H) | ||||||||
| 18 | M V V | ||||||||
| 19 | M V (V) | ||||||||
| 20 | M Z | ||||||||
| 21 | M L L Z | ||||||||
| 22 | M L L z | ||||||||
| 23 | M M | ||||||||
| 24 | M m | ||||||||
| 25 | m M | ||||||||
| 26 | M (M) (M) | ||||||||
| 27 | m (m) (m) | ||||||||
| 28 | M L M L | ||||||||
| 29 | M L M | ||||||||
| 30 | M L M Z | ||||||||
| 31 | Numeric character references | ||||||||
| 32 | No commawsp between arc flags | ||||||||
| 33 | No commawsp between and after arc flags | ||||||||
| 34 | Out of range large-arc-flag value | ||||||||
| 35 | Negative sweep-flag value | ||||||||
| 36 | No commawsp after sweep-flag | ||||||||
| 37 | No commawsp before arc flags | ||||||||
| 38 | Out of range sweep-flag value | ||||||||
| 39 | Negative large-arc-flag value | ||||||||
| 40 | Multi-line data | ||||||||
| 41 | Extra spaces | ||||||||
| 42 | Missing coordinate in L | ||||||||
| 43 | Invalid data in L | ||||||||
| 44 | Control points validation with stroke | ||||||||
| Basic Shapes | |||||||||
| rect | 100% | 100% | 92% | 68% | 92% | 84% | 64% | ||
| 1 | Simple case | ||||||||
| 2 | `x` attribute resolving | ||||||||
| 3 | `y` attribute resolving | ||||||||
| 4 | Rounded rect | ||||||||
| 5 | `rx` attribute resolving | ||||||||
| 6 | `ry` attribute resolving | ||||||||
| 7 | Missing `width` attribute processing | ||||||||
| 8 | Missing `height` attribute processing | ||||||||
| 9 | Zero `width` attribute processing | ||||||||
| 10 | Zero `height` attribute processing | ||||||||
| 11 | Negative `width` attribute processing | ||||||||
| 12 | Negative `height` attribute processing | ||||||||
| 13 | Negative `rx` attribute resolving | ||||||||
| 14 | Negative `ry` attribute resolving | ||||||||
| 15 | Negative `rx` and `ry` attributes resolving | ||||||||
| 16 | Zero `rx` attribute resolving | ||||||||
| 17 | Zero `ry` attribute resolving | ||||||||
| 18 | `rx` attribute clamping | ||||||||
| 19 | `ry` attribute clamping | ||||||||
| 20 | `rx` and `ry` attributes clamping order | ||||||||
| 21 | Percentage values | ||||||||
| 22 | `em` values | ||||||||
| 23 | `ex` values | ||||||||
| 24 | `mm` values | ||||||||
| 25 | Invalid length | ||||||||
| circle | 100% | 100% | 100% | 67% | 100% | 100% | 83% | ||
| 1 | Simple case | ||||||||
| 2 | Missing `r` attribute | ||||||||
| 3 | Missing `cx` attribute | ||||||||
| 4 | Missing `cy` attribute | ||||||||
| 5 | Missing `cx` and `cy` attributes | ||||||||
| 6 | Negative `r` attribute | ||||||||
| ellipse | 100% | 80% | 100% | 40% | 100% | 100% | 70% | ||
| 1 | Simple case | ||||||||
| 2 | Missing `rx` attribute | ||||||||
| 3 | Missing `ry` attribute | ||||||||
| 4 | Missing `rx` and `ry` attributes | ||||||||
| 5 | Missing `cx` attribute | ||||||||
| 6 | Missing `cy` attribute | ||||||||
| 7 | Missing `cx` and `cy` attributes | ||||||||
| 8 | Negative `rx` attribute | ||||||||
| 9 | Negative `ry` attribute | ||||||||
| 10 | Negative `rx` and `ry` attributes | ||||||||
| line | 100% | 100% | 100% | 89% | 100% | 100% | 100% | ||
| 1 | Simple case | ||||||||
| 2 | No coordinates | ||||||||
| 3 | No `x1` coordinate | ||||||||
| 4 | No `y1` coordinate | ||||||||
| 5 | No `x2` coordinate | ||||||||
| 6 | No `y2` coordinate | ||||||||
| 7 | No `x1` and `y1` coordinates | ||||||||
| 8 | No `x2` and `y2` coordinates | ||||||||
| 9 | With `transform` | ||||||||
| polyline | 100% | 100% | 100% | 40% | 100% | 60% | 100% | ||
| 1 | Simple case | ||||||||
| 2 | Not enough points | ||||||||
| 3 | Ignore odd points | ||||||||
| 4 | Stop processing on invalid data | ||||||||
| 5 | Missing `points` attribute | ||||||||
| polygon | 100% | 100% | 100% | 40% | 100% | 60% | 100% | ||
| 1 | Simple case | ||||||||
| 2 | Not enough points | ||||||||
| 3 | Ignore odd points | ||||||||
| 4 | Stop processing on invalid data | ||||||||
| 5 | Missing `points` attribute | ||||||||
| Text | |||||||||
| text | 91% | 85% | 91% | 68% | 76% | 47% | 29% | ||
| 1 | Simple case | ||||||||
| 2 | `x` and `y` with multiple values | ||||||||
| 3 | `x` and `y` with less values than characters | ||||||||
| 4 | `x` and `y` with more values than characters | ||||||||
| 24 | `x` and `y` with multiple values and `tspan` | ||||||||
| 30 | `x` and `y` with multiple values and arabic text | ||||||||
| 5 | `dx` and `dy` instead of `x` and `y` | ||||||||
| 6 | `dx` and `dy` with multiple values | ||||||||
| 7 | `dx` and `dy` with less values than characters | ||||||||
| 8 | `dx` and `dy` with more values than characters | ||||||||
| 9 | `x` and `y` with `dx` and `dy` | ||||||||
| 10 | `x` and `y` with `dx` and `dy` lists | ||||||||
| 11 | `rotate` | ||||||||
| 12 | `rotate` with multiple values | ||||||||
| 13 | `rotate` with less values than characters | ||||||||
| 14 | `rotate` with more values than characters | ||||||||
| 32 | `rotate` with multiple values and underline | ||||||||
| 33 | `rotate` with multiple values, underline and pattern | ||||||||
| 34 | `rotate` with multiple values and complex text | ||||||||
| 15 | Percent coordinates | ||||||||
| 16 | `em` and `ex` coordinates | ||||||||
| 17 | `mm` coordinates | ||||||||
| 18 | Escaped text (1) | ||||||||
| 19 | Escaped text (2) | ||||||||
| 20 | Escaped text (3) | ||||||||
| 21 | Escaped text (4) | ||||||||
| 22 | `xml:space` | ||||||||
| 23 | `transform` | ||||||||
| 25 | Complex graphemes | ||||||||
| 26 | Complex graphemes and coordinates list | ||||||||
| 27 | Emojis | ||||||||
| 28 | Compound emojis | ||||||||
| 29 | Compound emojis and coordinates list | ||||||||
| 31 | Zalgo | ||||||||
| tspan | 100% | 100% | 82% | 94% | 71% | 71% | 47% | ||
| 1 | Without attributes | ||||||||
| 2 | With `x` and `y` | ||||||||
| 14 | With `dy` | ||||||||
| 15 | Only with `y` | ||||||||
| 3 | Style override | ||||||||
| 4 | Sequential | ||||||||
| 5 | Mixed | ||||||||
| 6 | Nested | ||||||||
| 7 | `xml:space` (1) | ||||||||
| 8 | `xml:space` (2) | ||||||||
| 9 | Mixed `xml:space` (1) | ||||||||
| 10 | Mixed `xml:space` (2) | ||||||||
| 11 | Mixed `xml:space` (3) | ||||||||
| 12 | `transform` | ||||||||
| 13 | Pseudo-multi-line | ||||||||
| 16 | Nested `rotate` | ||||||||
| 17 | Rotate on child | ||||||||
| tref | 75% | 0% | 0% | 50% | 75% | 50% | 0% | ||
| 1 | Link to `text` | ||||||||
| 2 | Link to complex `text` | ||||||||
| 3 | Link to non-SVG element | ||||||||
| 4 | Link to external file element | ||||||||
| 5 | Nested | ||||||||
| 6 | Position attributes | ||||||||
| 7 | Style attributes | ||||||||
| 8 | `xml:space` | ||||||||
| textPath | |||||||||
| altGlyph | |||||||||
| altGlyphDef | |||||||||
| altGlyphItem | |||||||||
| glyphRef | |||||||||
| Painting: Filling, Stroking and Marker Symbols | |||||||||
| marker | |||||||||
| Color | |||||||||
| color-profile | |||||||||
| Gradients and Patterns | |||||||||
| linearGradient | 100% | 100% | 100% | 77% | 87% | 93% | 73% | ||
| 1 | Default attributes | ||||||||
| 2 | spreadMethod=pad | ||||||||
| 3 | spreadMethod=reflect | ||||||||
| 4 | spreadMethod=repeat | ||||||||
| 5 | Invalid `spreadMethod` | ||||||||
| 6 | gradientUnits=userSpaceOnUse | ||||||||
| 29 | gradientUnits=userSpaceOnUse with % | ||||||||
| 30 | gradientUnits=objectBoundingBox with % | ||||||||
| 7 | Stops via `xlink:href` | ||||||||
| 8 | Stops via `xlink:href` from `radialGradient` | ||||||||
| 9 | Stops via `xlink:href` from `rect` | ||||||||
| 10 | Stops via `xlink:href`. Complex order (1) | ||||||||
| 28 | Stops via `xlink:href`. Complex order (2) | ||||||||
| 11 | Attributes via `xlink:href` | ||||||||
| 12 | Attributes via `xlink:href` from `radialGradient` | ||||||||
| 13 | Attributes via `xlink:href` from `rect` | ||||||||
| 14 | Attributes via `xlink:href`. Only required | ||||||||
| 15 | Attributes via `xlink:href`. Complex order | ||||||||
| 16 | Unresolved `xlink:href` | ||||||||
| 17 | Invalid `xlink:href` | ||||||||
| 18 | Self-recursive `xlink:href` | ||||||||
| 19 | Recursive `xlink:href` | ||||||||
| 20 | gradientTransform | ||||||||
| 21 | gradientTransform + transform | ||||||||
| 22 | Many stops | ||||||||
| 23 | Single stop | ||||||||
| 25 | Single stop with opacity used by `fill` | ||||||||
| 26 | Single stop with opacity used by `stroke` | ||||||||
| 27 | Single stop with opacity used by `fill` and `stroke` | ||||||||
| 24 | No stops | ||||||||
| radialGradient | 100% | 92% | 97% | 76% | 71% | 89% | 61% | ||
| 1 | Default attributes | ||||||||
| 2 | spreadMethod=pad | ||||||||
| 3 | spreadMethod=reflect | ||||||||
| 4 | spreadMethod=repeat | ||||||||
| 5 | Invalid `spreadMethod` | ||||||||
| 6 | gradientUnits=userSpaceOnUse | ||||||||
| 35 | gradientUnits=userSpaceOnUse with % | ||||||||
| 34 | gradientUnits=objectBoundingBox with % | ||||||||
| 7 | Stops via `xlink:href` | ||||||||
| 8 | Stops via `xlink:href`. Complex order | ||||||||
| 9 | Stops via `xlink:href` from `linearGradient` | ||||||||
| 10 | Stops via `xlink:href` from `rect` | ||||||||
| 11 | Attributes via `xlink:href` | ||||||||
| 12 | Attributes via `xlink:href`. Only required | ||||||||
| 13 | Attributes via `xlink:href`. Complex order | ||||||||
| 14 | Attributes via `xlink:href` from `linearGradient` | ||||||||
| 15 | Attributes via `xlink:href` from `rect` | ||||||||
| 16 | Unresolved `xlink:href` | ||||||||
| 17 | `xlink:href` not to gradient | ||||||||
| 38 | Invalid `xlink:href` | ||||||||
| 18 | Self-recursive `xlink:href` | ||||||||
| 19 | Recursive `xlink:href` | ||||||||
| 20 | gradientTransform | ||||||||
| 21 | gradientTransform + transform | ||||||||
| 22 | Many stops | ||||||||
| 23 | Single stop | ||||||||
| 24 | No stops | ||||||||
| 25 | `fx` resolving (1) | ||||||||
| 26 | `fx` resolving (2) | ||||||||
| 27 | `fx` resolving (3) | ||||||||
| 28 | `fy` resolving (1) | ||||||||
| 29 | `fy` resolving (2) | ||||||||
| 30 | `fy` resolving (3) | ||||||||
| 31 | Focal point correction | ||||||||
| 32 | Negative `r` (UB) | ? | ? | ? | ? | ? | ? | ||
| 33 | Zero `r` | ||||||||
| 36 | Zero `r` with `stop-opacity` (1) | ? | |||||||
| 37 | Zero `r` with `stop-opacity` (2) | ||||||||
| stop | 100% | 100% | 100% | 67% | 81% | 93% | 85% | ||
| 1 | `offset` clamping | ||||||||
| 2 | `offset` clamping with % | ||||||||
| 3 | Stop with smaller `offset` | ||||||||
| 4 | Stops with equal `offset` (1) | ||||||||
| 5 | Stops with equal `offset` (2) | ||||||||
| 6 | Stops with equal `offset` (3) | ||||||||
| 15 | Stops with equal `offset` (4) | ||||||||
| 16 | Stops with equal `offset` (5) | ||||||||
| 17 | Stops with equal `offset` (6) | ||||||||
| 7 | `stop-color` with `currentColor` (1) | ||||||||
| 8 | `stop-color` with `currentColor` (2) | ||||||||
| 9 | `stop-color` with `currentColor` (3) | ||||||||
| 10 | `stop-color` with `currentColor` (4) | ||||||||
| 11 | `stop-color` with `inherit` (1) | ||||||||
| 12 | `stop-color` with `inherit` (2) | ||||||||
| 13 | `stop-color` with `inherit` (3) | ||||||||
| 14 | `stop-color` with `inherit` (4) | ||||||||
| 18 | `stop-color` with `inherit` (5) | ||||||||
| 19 | Invalid `offset` (1) | ||||||||
| 20 | Invalid `offset` (2) | ||||||||
| 21 | Missing `offset` (1) | ||||||||
| 22 | Missing `offset` (2) | ||||||||
| 23 | Missing `offset` (3) | ||||||||
| 24 | Missing `offset` (4) | ||||||||
| 25 | Missing `offset` (5) | ||||||||
| 26 | Missing `offset` (6) | ||||||||
| 27 | Missing `offset` (7) | ||||||||
| pattern | 92% | 100% | 100% | 65% | 65% | 96% | 4% | ||
| 1 | Simple case | ||||||||
| 2 | display=none on child | ||||||||
| 3 | overflow=visible (UB) | ? | ? | ? | ? | ? | ? | ? | |
| 4 | With `patternTransform` | ||||||||
| 5 | `transform` + `patternTransform` | ||||||||
| 6 | With `x` and `y` | ||||||||
| 7 | patternUnits=objectBoundingBox | ||||||||
| 25 | patternUnits=objectBoundingBox with % | ||||||||
| 26 | patternUnits=userSpaceOnUse with % | ||||||||
| 8 | patternContentUnits=objectBoundingBox | ||||||||
| 9 | With `viewBox` | ||||||||
| 10 | `patternContentUnits` with `viewBox` | ||||||||
| 11 | `preserveAspectRatio` | ||||||||
| 12 | Missing `width` | ||||||||
| 13 | Missing `height` | ||||||||
| 14 | Everything via `xlink:href` | ||||||||
| 15 | Children via `xlink:href` | ||||||||
| 16 | Attributes via `xlink:href` | ||||||||
| 17 | No children | ||||||||
| 18 | Text child | ||||||||
| 19 | Pattern on child | ||||||||
| 20 | Out of order referencing | ||||||||
| 21 | Recursive on child | ||||||||
| 22 | Self-recursive | ||||||||
| 23 | Self-recursive on child | ||||||||
| 24 | Nested `objectBoundingBox` | ||||||||
| Clipping, Masking and Compositing | |||||||||
| clipPath | 100% | 100% | 81% | 51% | 68% | 57% | 5% | ||
| 1 | Simple case | ||||||||
| 2 | `stroke` has no effect | ||||||||
| 3 | `fill` has no effect | ||||||||
| 4 | `opacity` has no effect | ||||||||
| 5 | clipPathUnits=objectBoundingBox | ||||||||
| 6 | `clip-path` with `transform` | ||||||||
| 7 | `clip-path` with `transform` on text | ||||||||
| 8 | `transform` on `clipPath` | ||||||||
| 9 | Clipping with text | ||||||||
| 10 | Clipping with complex text (1) | ||||||||
| 11 | Clipping with complex text (2) | ||||||||
| 12 | Clipping with complex text and `clip-rule` | ||||||||
| 13 | clip-rule=evenodd | ||||||||
| 14 | Mixed `clip-rule` | ||||||||
| 15 | Multiple children | ||||||||
| 17 | Overlapped shapes with `evenodd` | ||||||||
| 18 | `clip-rule` from parent node | ||||||||
| 19 | `clip-path` on child | ||||||||
| 34 | `clip-path` on children | ||||||||
| 31 | `clip-path` on child with transform | ||||||||
| 20 | `clip-path` on self | ||||||||
| 36 | `clip-path` on self (2) | ||||||||
| 32 | Invalid `clip-path` on self | ||||||||
| 33 | Invalid `clip-path` on child | ||||||||
| 21 | Nested `clip-path` | ||||||||
| 22 | No children | ||||||||
| 16 | Invalid child (1) | ||||||||
| 23 | Invalid child (2) | ||||||||
| 26 | Invalid child (3) | ||||||||
| 24 | Invisible child (1) | ||||||||
| 25 | Invisible child (2) | ||||||||
| 27 | `none` | ||||||||
| 28 | Invalid FuncIRI | ||||||||
| 29 | Recursive on child | ||||||||
| 30 | Self-recursive | ||||||||
| 35 | Recursive | ||||||||
| 37 | Recursive on self | ||||||||
| mask | 89% | 96% | 89% | 7% | 67% | 63% | 7% | ||
| 1 | Simple case | ||||||||
| 2 | maskUnits=userSpaceOnUse without rect | ||||||||
| 3 | maskUnits=userSpaceOnUse with `width` only | ||||||||
| 4 | maskUnits=userSpaceOnUse with rect | ||||||||
| 5 | maskContentUnits=objectBoundingBox | ||||||||
| 20 | maskUnits=objectBoundingBox with % | ||||||||
| 21 | maskUnits=userSpaceOnUse with % | ||||||||
| 6 | `transform` has no effect | ||||||||
| 7 | `transform` on shape | ||||||||
| 8 | No children | ||||||||
| 9 | Invalid child | ||||||||
| 10 | Invisible child (1) | ||||||||
| 11 | Invisible child (2) | ||||||||
| 12 | With opacity (1) | ||||||||
| 13 | With opacity (2) | ||||||||
| 14 | With opacity (3) | ||||||||
| 15 | With `clip-path` | ||||||||
| 16 | Nested `objectBoundingBox` | ||||||||
| 17 | color-interpolation=linearRGB | ||||||||
| 18 | `none` | ||||||||
| 19 | Invalid FuncIRI | ||||||||
| 22 | Recursive on child (UB) | ||||||||
| 23 | Self-recursive | ||||||||
| 24 | Recursive | ||||||||
| 25 | Recursive on self | ||||||||
| 26 | `mask` on self | ||||||||
| 27 | `mask` on child | ||||||||
| Filter Effects | |||||||||
| filter | 82% | 68% | 91% | 52% | 64% | 70% | 0% | ||
| 1 | Simple case | ||||||||
| 2 | With region | ||||||||
| 3 | With region and filterUnits=userSpaceOnUse | ||||||||
| 4 | With region and subregion | ||||||||
| 5 | Invalid region | ||||||||
| 6 | Huge region | ||||||||
| 7 | With region outside the canvas | ||||||||
| 8 | With region outside the viewbox | ||||||||
| 9 | With subregion (1) | ||||||||
| 10 | With subregion (2) | ||||||||
| 11 | With subregion (3) | ||||||||
| 12 | With subregion and primitiveUnits=objectBoundingBox (1) | ||||||||
| 55 | With subregion and primitiveUnits=objectBoundingBox (2) | ||||||||
| 13 | Zero-sized subregion | ||||||||
| 14 | Negative subregion | ||||||||
| 15 | Subregion bigger that region | ||||||||
| 16 | Invalid subregion | ||||||||
| 17 | Everything via `xlink:href` | ||||||||
| 18 | Some attributes via `xlink:href` | ||||||||
| 19 | Complex order and `xlink:href` | ||||||||
| 20 | Unresolved `xlink:href` | ||||||||
| 21 | Invalid `xlink:href` | ||||||||
| 22 | Self-recursive `xlink:href` | ||||||||
| 23 | Recursive `xlink:href` | ||||||||
| 24 | No children | ||||||||
| 25 | `transform` on filter | ||||||||
| 26 | `transform` on shape | ||||||||
| 27 | `transform` on shape with filter region | ||||||||
| 28 | Initial `transform` | ||||||||
| 29 | Global `transform` | ||||||||
| 30 | primitiveUnits=objectBoundingBox | ||||||||
| 31 | in=SourceAlpha | ||||||||
| 32 | in=BackgroundImage | ||||||||
| 33 | in=BackgroundAlpha | ||||||||
| 34 | in=FillPaint | ||||||||
| 35 | in=StrokePaint | ||||||||
| 36 | in=FillPaint with gradient | ||||||||
| 37 | in=FillPaint with pattern | ||||||||
| 38 | in=FillPaint with target on `g` | ||||||||
| 39 | Multiple primitives (1) | ||||||||
| 40 | Multiple primitives (2) | ||||||||
| 41 | Multiple primitives (3) | ||||||||
| 42 | Multiple primitives (4) | ||||||||
| 43 | `in` to invalid (1) | ||||||||
| 56 | `in` to invalid (2) | ||||||||
| 44 | Invalid primitive (1) | ||||||||
| 45 | Invalid primitive (2) | ||||||||
| 46 | Default color-interpolation-filters | ||||||||
| 47 | color-interpolation-filters=sRGB | ||||||||
| 48 | On an empty group | ||||||||
| 49 | Invalid `filterUnits` | ||||||||
| 50 | On zero-sized shape | ||||||||
| 51 | Invalid FuncIRI | ||||||||
| 52 | With `clip-path` | ||||||||
| 53 | With `mask` | ||||||||
| 54 | With `clip-path` and `mask` | ||||||||
| feDistantLight | |||||||||
| fePointLight | |||||||||
| feSpotLight | |||||||||
| feBlend | 100% | 100% | 100% | 88% | 100% | 100% | 0% | ||
| 1 | mode=normal | ||||||||
| 2 | mode=multiply | ||||||||
| 3 | mode=screen | ||||||||
| 4 | mode=darken | ||||||||
| 5 | mode=lighten | ||||||||
| 6 | Empty | ||||||||
| 7 | With subregion on input (1) | ||||||||
| 8 | With subregion on input (2) | ||||||||
| feColorMatrix | |||||||||
| feComponentTransfer | |||||||||
| feComposite | 91% | 91% | 91% | 73% | 91% | 82% | 0% | ||
| 1 | operator=over | ||||||||
| 2 | operator=in | ||||||||
| 3 | operator=out | ||||||||
| 4 | operator=atop | ||||||||
| 5 | operator=xor | ||||||||
| 9 | operator=arithmetic | ||||||||
| 10 | Invalid `operator` | ||||||||
| 11 | Default `operator` | ||||||||
| 6 | Empty | ||||||||
| 7 | With subregion on input (1) | ||||||||
| 8 | With subregion on input (2) | ||||||||
| feConvolveMatrix | |||||||||
| feDiffuseLighting | |||||||||
| feDisplacementMap | |||||||||
| feFlood | 83% | 100% | 100% | 100% | 83% | 100% | 0% | ||
| 1 | Default values | ||||||||
| 2 | Green | ||||||||
| 3 | With opacity | ||||||||
| 4 | With opacity on target element | ||||||||
| 5 | Subregion inheritance (1) | ||||||||
| 6 | Partial subregion | ||||||||
| feGaussianBlur | 100% | 100% | 90% | 80% | 90% | 70% | 0% | ||
| 1 | Simple case | ||||||||
| 2 | Huge `stdDeviation` | ||||||||
| 3 | No `stdDeviation` | ||||||||
| 4 | Empty `stdDeviation` | ||||||||
| 5 | Negative `stdDeviation` | ||||||||
| 6 | `stdDeviation` with multiple values | ||||||||
| 7 | `stdDeviation` with two values | ||||||||
| 8 | `stdDeviation` with two different values | ||||||||
| 9 | stdDeviation=0 5 | ||||||||
| 10 | stdDeviation=5 0 | ||||||||
| feImage | 82% | 91% | 82% | 36% | 18% | 64% | 0% | ||
| 1 | Simple case | ||||||||
| 2 | SVG | ||||||||
| 3 | Embedded PNG | ||||||||
| 4 | preserveAspectRatio=none | ||||||||
| 5 | Empty | ||||||||
| 6 | Link to an element | ||||||||
| 7 | With subregion (1) | ||||||||
| 8 | With subregion (2) | ||||||||
| 9 | With subregion (3) | ||||||||
| 10 | With subregion (4) | ||||||||
| 11 | With subregion (5) | ||||||||
| feMerge | 100% | 100% | 100% | 100% | 100% | 50% | 0% | ||
| 1 | color-interpolation-filters=linearRGB | ||||||||
| 2 | color-interpolation-filters=sRGB | ||||||||
| feMorphology | |||||||||
| feOffset | 86% | 86% | 86% | 86% | 86% | 100% | 0% | ||
| 1 | Simple case | ||||||||
| 2 | Only `dx` | ||||||||
| 3 | Only `dy` | ||||||||
| 4 | No offset | ||||||||
| 5 | Negative offset | ||||||||
| 6 | Fractional offset | ||||||||
| 7 | With primitiveUnits=objectBoundingBox | ||||||||
| feSpecularLighting | |||||||||
| feTile | 100% | 83% | 100% | 50% | 17% | 83% | 0% | ||
| 1 | Simple case | ||||||||
| 2 | With region | ||||||||
| 3 | Empty region | ||||||||
| 4 | With subregion (1) | ||||||||
| 5 | With subregion (2) | ||||||||
| 6 | With subregion (3) | ||||||||
| feTurbulence | |||||||||
| feFuncR | |||||||||
| feFuncG | |||||||||
| feFuncB | |||||||||
| feFuncA | |||||||||
| Interactivity | |||||||||
| cursor | |||||||||
| Linking | |||||||||
| a | 100% | 100% | 100% | 100% | 100% | 40% | 80% | ||
| 1 | On shape | ||||||||
| 2 | On text | ||||||||
| 3 | Inside text | ||||||||
| 4 | Inside `tspan` | ||||||||
| 5 | On `tspan` | ||||||||
| view | |||||||||
| Scripting | |||||||||
| script | |||||||||
| Animation | |||||||||
| animate | |||||||||
| set | |||||||||
| animateMotion | |||||||||
| animateColor | |||||||||
| animateTransform | |||||||||
| mpath | |||||||||
| Fonts | |||||||||
| font | |||||||||
| glyph | |||||||||
| missing-glyph | |||||||||
| hkern | |||||||||
| vkern | |||||||||
| font-face | |||||||||
| font-face-src | |||||||||
| font-face-uri | |||||||||
| font-face-format | |||||||||
| font-face-name | |||||||||
| Metadata | |||||||||
| metadata | |||||||||
| Extensibility | |||||||||
| foreignObject | |||||||||
Test files can be found here.
Naming convention: type-name-###.svg
type can be either a(attribute) or e(element).
For example the polyline - 3. Ignore odd points will lead to e-polyline-003.svg.
batik doesn’t support anti-aliasing during clipPath, but we are ignoring this.
batik doesn’t support text kerning, 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.
